@nywqs/scada-engine 1.1.12 → 1.1.13

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.
@@ -1,4 +1,9 @@
1
- (function(U,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@antv/x6"),require("@antv/x6-plugin-selection"),require("@antv/x6-plugin-snapline")):typeof define=="function"&&define.amd?define(["exports","vue","@antv/x6","@antv/x6-plugin-selection","@antv/x6-plugin-snapline"],e):(U=typeof globalThis<"u"?globalThis:U||self,e(U.ScadaEngine={},U.Vue,U.X6,U.X6PluginSelection,U.X6PluginSnapline))})(this,function(U,e,ge,Gt,nn){"use strict";var vp=Object.defineProperty;var bp=(U,e,ge)=>e in U?vp(U,e,{enumerable:!0,configurable:!0,writable:!0,value:ge}):U[e]=ge;var Ue=(U,e,ge)=>bp(U,typeof e!="symbol"?e+"":e,ge);const an={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},rn=e.defineComponent({name:"AlignHorizontalCenter",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",an,o[0]||(o[0]=[e.createElementVNode("path",{d:"M24 18h-7v-4h3a2.002 2.002 0 0 0 2-2V8a2.002 2.002 0 0 0-2-2h-3V2h-2v4h-3a2.002 2.002 0 0 0-2 2v4a2.002 2.002 0 0 0 2 2h3v4H8a2.002 2.002 0 0 0-2 2v4a2.002 2.002 0 0 0 2 2h7v4h2v-4h7a2.002 2.002 0 0 0 2-2v-4a2.002 2.002 0 0 0-2-2zM12 8h8v4h-8zm12 16H8v-4h16z",fill:"currentColor"},null,-1)]))}}),ln={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},sn=e.defineComponent({name:"AlignHorizontalLeft",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",ln,o[0]||(o[0]=[e.createElementVNode("path",{d:"M26 26H11a2.002 2.002 0 0 1-2-2v-4a2.002 2.002 0 0 1 2-2h15a2.002 2.002 0 0 1 2 2v4a2.002 2.002 0 0 1-2 2zm0-6.001L11 20v4h15z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M18 14h-7a2.002 2.002 0 0 1-2-2V8a2.002 2.002 0 0 1 2-2h7a2.002 2.002 0 0 1 2 2v4a2.002 2.002 0 0 1-2 2zm0-6.001L11 8v4h7z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M4 2h2v28H4z",fill:"currentColor"},null,-1)]))}}),cn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},dn=e.defineComponent({name:"AlignHorizontalRight",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",cn,o[0]||(o[0]=[e.createElementVNode("path",{d:"M4 24v-4a2.002 2.002 0 0 1 2-2h15a2.002 2.002 0 0 1 2 2v4a2.002 2.002 0 0 1-2 2H6a2.002 2.002 0 0 1-2-2zm2 0h15v-4l-15-.001z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M12 12V8a2.002 2.002 0 0 1 2-2h7a2.002 2.002 0 0 1 2 2v4a2.002 2.002 0 0 1-2 2h-7a2.002 2.002 0 0 1-2-2zm2 0h7V8l-7-.001z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M28 30h-2V2h2z",fill:"currentColor"},null,-1)]))}}),pn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},xn=e.defineComponent({name:"AlignVerticalBottom",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",pn,o[0]||(o[0]=[e.createElementVNode("path",{d:"M2 26h28v2H2z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M24 23h-4a2.002 2.002 0 0 1-2-2v-7a2.002 2.002 0 0 1 2-2h4a2.002 2.002 0 0 1 2 2v7a2.002 2.002 0 0 1-2 2zm-4-9v7h4.001L24 14z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M12 23H8a2.002 2.002 0 0 1-2-2V6a2.002 2.002 0 0 1 2-2h4a2.002 2.002 0 0 1 2 2v15a2.002 2.002 0 0 1-2 2zM8 6v15h4.001L12 6z",fill:"currentColor"},null,-1)]))}}),fn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},mn=e.defineComponent({name:"AlignVerticalCenter",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",fn,o[0]||(o[0]=[e.createElementVNode("path",{d:"M30 15h-4v-3a2.002 2.002 0 0 0-2-2h-4a2.002 2.002 0 0 0-2 2v3h-4V8a2.002 2.002 0 0 0-2-2H8a2.002 2.002 0 0 0-2 2v7H2v2h4v7a2.002 2.002 0 0 0 2 2h4a2.002 2.002 0 0 0 2-2v-7h4v3a2.002 2.002 0 0 0 2 2h4a2.002 2.002 0 0 0 2-2v-3h4zM8 24V8h4l.001 16zm12-4v-8h4l.001 8z",fill:"currentColor"},null,-1)]))}}),un={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},gn=e.defineComponent({name:"AlignVerticalTop",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",un,o[0]||(o[0]=[e.createElementVNode("path",{d:"M24 20h-4a2.002 2.002 0 0 1-2-2v-7a2.002 2.002 0 0 1 2-2h4a2.002 2.002 0 0 1 2 2v7a2.002 2.002 0 0 1-2 2zm-4-9v7h4.001L24 11z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M12 28H8a2.002 2.002 0 0 1-2-2V11a2.002 2.002 0 0 1 2-2h4a2.002 2.002 0 0 1 2 2v15a2.002 2.002 0 0 1-2 2zM8 11v15h4.001L12 11z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M2 4h28v2H2z",fill:"currentColor"},null,-1)]))}}),En={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},hn=e.defineComponent({name:"DistributeHorizontalCenter",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",En,o[0]||(o[0]=[e.createElementVNode("path",{d:"M24 10h-1V2h-2v8h-1a2.002 2.002 0 0 0-2 2v8a2.002 2.002 0 0 0 2 2h1v8h2v-8h1a2.002 2.002 0 0 0 2-2v-8a2.002 2.002 0 0 0-2-2zm0 10h-4v-8h4z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M12 6h-1V2H9v4H8a2.002 2.002 0 0 0-2 2v16a2.002 2.002 0 0 0 2 2h1v4h2v-4h1a2.002 2.002 0 0 0 2-2V8a2.002 2.002 0 0 0-2-2zm0 18H8V8h4z",fill:"currentColor"},null,-1)]))}}),vn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},bn=e.defineComponent({name:"DistributeVerticalCenter",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",vn,o[0]||(o[0]=[e.createElementVNode("path",{d:"M30 21h-4v-1a2.002 2.002 0 0 0-2-2H8a2.002 2.002 0 0 0-2 2v1H2v2h4v1a2.002 2.002 0 0 0 2 2h16a2.002 2.002 0 0 0 2-2v-1h4zm-6 3H8v-4l16-.001z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M30 9h-8V8a2.002 2.002 0 0 0-2-2h-8a2.002 2.002 0 0 0-2 2v1H2v2h8v1a2.002 2.002 0 0 0 2 2h8a2.002 2.002 0 0 0 2-2v-1h8zm-10 3h-8V8l8-.001z",fill:"currentColor"},null,-1)]))}}),yn={class:"scada-header"},Cn={class:"header-left"},Bn={class:"header-center"},kn={class:"tool-group"},Nn={key:0,class:"divider"},Vn={key:1,class:"tool-group"},Dn={key:2,class:"divider"},An={key:3,class:"tool-group"},_n={class:"header-right"},Fn={class:"tool-group"},$n=e.defineComponent({__name:"Header",props:{selectedNodesCount:{default:0}},emits:["save","import","workflow","preview","export","zoomIn","zoomOut","clearAll","alignLeft","alignCenter","alignRight","alignTop","alignMiddle","alignBottom","distributeHorizontal","distributeVertical"],setup(g,{emit:h}){const o=g,r=h;return(n,l)=>(e.openBlock(),e.createElementBlock("header",yn,[e.createElementVNode("div",Cn,[e.renderSlot(n.$slots,"left",{},()=>[l[16]||(l[16]=e.createElementVNode("h1",{class:"logo"},"SCADA 组态引擎",-1)),l[17]||(l[17]=e.createElementVNode("span",{class:"version"},"v1.0.0",-1))],!0)]),e.createElementVNode("div",Bn,[e.createElementVNode("div",kn,[e.createElementVNode("button",{class:"toolbar-btn",onClick:l[0]||(l[0]=E=>r("zoomIn")),title:"放大"},[...l[18]||(l[18]=[e.createElementVNode("span",{class:"icon"},"+",-1)])]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[1]||(l[1]=E=>r("zoomOut")),title:"缩小"},[...l[19]||(l[19]=[e.createElementVNode("span",{class:"icon"},"-",-1)])]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[2]||(l[2]=E=>r("clearAll")),title:"清空画布"},[...l[20]||(l[20]=[e.createElementVNode("span",{class:"icon"},"🗑",-1)])])]),o.selectedNodesCount>=2?(e.openBlock(),e.createElementBlock("div",Nn)):e.createCommentVNode("",!0),o.selectedNodesCount>=2?(e.openBlock(),e.createElementBlock("div",Vn,[e.createElementVNode("button",{class:"toolbar-btn",onClick:l[3]||(l[3]=E=>r("alignLeft")),title:"左对齐"},[e.createVNode(e.unref(sn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[4]||(l[4]=E=>r("alignCenter")),title:"水平居中"},[e.createVNode(e.unref(rn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[5]||(l[5]=E=>r("alignRight")),title:"右对齐"},[e.createVNode(e.unref(dn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[6]||(l[6]=E=>r("alignTop")),title:"顶部对齐"},[e.createVNode(e.unref(gn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[7]||(l[7]=E=>r("alignMiddle")),title:"垂直居中"},[e.createVNode(e.unref(mn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[8]||(l[8]=E=>r("alignBottom")),title:"底部对齐"},[e.createVNode(e.unref(xn),{class:"icon-svg"})])])):e.createCommentVNode("",!0),o.selectedNodesCount>=3?(e.openBlock(),e.createElementBlock("div",Dn)):e.createCommentVNode("",!0),o.selectedNodesCount>=3?(e.openBlock(),e.createElementBlock("div",An,[e.createElementVNode("button",{class:"toolbar-btn",onClick:l[9]||(l[9]=E=>r("distributeHorizontal")),title:"横向分布"},[e.createVNode(e.unref(hn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[10]||(l[10]=E=>r("distributeVertical")),title:"纵向分布"},[e.createVNode(e.unref(bn),{class:"icon-svg"})])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",_n,[e.createElementVNode("div",Fn,[e.createElementVNode("button",{class:"header-btn",onClick:l[11]||(l[11]=E=>r("workflow")),title:"流程编排"},[...l[21]||(l[21]=[e.createElementVNode("span",{class:"icon"},"⚡",-1),e.createElementVNode("span",null,"流程编排",-1)])]),e.createElementVNode("button",{class:"header-btn",onClick:l[12]||(l[12]=E=>r("import")),title:"导入"},[...l[22]||(l[22]=[e.createElementVNode("span",{class:"icon"},"📂",-1),e.createElementVNode("span",null,"导入",-1)])]),e.createElementVNode("button",{class:"header-btn",onClick:l[13]||(l[13]=E=>r("export")),title:"导出"},[...l[23]||(l[23]=[e.createElementVNode("span",{class:"icon"},"📤",-1),e.createElementVNode("span",null,"导出",-1)])]),e.createElementVNode("button",{class:"header-btn",onClick:l[14]||(l[14]=E=>r("preview")),title:"预览"},[...l[24]||(l[24]=[e.createElementVNode("span",{class:"icon"},"👁",-1),e.createElementVNode("span",null,"预览",-1)])]),e.createElementVNode("button",{class:"header-btn",onClick:l[15]||(l[15]=E=>r("save")),title:"保存"},[...l[25]||(l[25]=[e.createElementVNode("span",{class:"icon"},"💾",-1),e.createElementVNode("span",null,"保存",-1)])])])])]))}}),re=(g,h)=>{const o=g.__vccOpts||g;for(const[r,n]of h)o[r]=n;return o},Ge=re($n,[["__scopeId","data-v-9bbedc41"]]),Se=[{key:"animationEnabled",label:"启用动画",type:"boolean",path:"data.animation.enabled",defaultValue:!1,description:"是否启用动画效果",bindable:!0},{key:"animationType",label:"动画类型",type:"select",path:"data.animation.type",defaultValue:"none",options:[{label:"无动画",value:"none"},{label:"闪烁",value:"blink"},{label:"缩放",value:"scale"},{label:"旋转",value:"rotate"},{label:"浮动",value:"float"},{label:"脉冲",value:"pulse"}],description:"组件动画效果类型",bindable:!1},{key:"animationDuration",label:"动画时长(ms)",type:"number",path:"data.animation.duration",defaultValue:1e3,min:100,max:5e3,step:100,description:"动画完成一次所需时间",bindable:!1},{key:"animationLoop",label:"循环播放",type:"boolean",path:"data.animation.loop",defaultValue:!0,description:"是否循环播放动画",bindable:!1}],jt={metadata:{id:"rect",name:"矩形",category:"basic",icon:"▢",description:"基础矩形图形组件",version:"1.0.0"},shape:"rect",width:120,height:60,label:"矩形",attrs:{body:{fill:"#3b82f6",stroke:"#2563eb",strokeWidth:2},label:{fill:"#fff",fontSize:14}},ports:{groups:{top:{position:"top",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},bottom:{position:"bottom",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-top",group:"top"},{id:"port-right",group:"right"},{id:"port-bottom",group:"bottom"},{id:"port-left",group:"left"}]},props:[{key:"name",label:"按钮文本",type:"text",path:"attrs.label.text",defaultValue:"矩形",description:"矩形名称"},{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#3b82f6",description:"矩形填充颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#2563eb",description:"矩形边框颜色"},{key:"strokeWidth",label:"边框宽度",type:"number",path:"attrs.body.strokeWidth",defaultValue:2,min:0,max:10,description:"矩形边框宽度"},{key:"opacity",label:"透明度",type:"slider",path:"attrs.body.opacity",defaultValue:1,min:0,max:1,step:.1,description:"矩形透明度"},...Se]},Xt={metadata:{id:"circle",name:"圆形",category:"basic",icon:"○",description:"基础圆形图形组件",version:"1.0.0"},shape:"circle",width:80,height:80,label:"圆形",attrs:{body:{fill:"#10b981",stroke:"#059669",strokeWidth:2},label:{fill:"#fff",fontSize:14}},ports:{groups:{top:{position:"top",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},bottom:{position:"bottom",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-top",group:"top"},{id:"port-right",group:"right"},{id:"port-bottom",group:"bottom"},{id:"port-left",group:"left"}]},props:[{key:"text",label:"初始文本",type:"text",path:"attrs.label.text",defaultValue:"圆形",description:"圆形初始文本"},{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#10b981",description:"圆形填充颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#059669",description:"圆形边框颜色"},{key:"strokeWidth",label:"边框宽度",type:"number",path:"attrs.body.strokeWidth",defaultValue:2,min:0,max:10,description:"圆形边框宽度"},{key:"opacity",label:"透明度",type:"slider",path:"attrs.body.opacity",defaultValue:1,min:0,max:1,step:.1,description:"圆形透明度"},...Se]},Yt={metadata:{id:"text",name:"文本",category:"basic",icon:"T",description:"文本标签组件",version:"1.0.0"},shape:"rect",width:100,height:40,label:"文本",attrs:{body:{fill:"transparent",stroke:"#64748b",strokeWidth:1,strokeDasharray:"5 5"},label:{fill:"#e2e8f0",fontSize:16}},props:[{key:"label",label:"文本内容",type:"text",path:"attrs.label.text",defaultValue:"文本",description:"显示的文本内容"},{key:"fontSize",label:"字体大小",type:"number",path:"attrs.label.fontSize",defaultValue:16,min:12,max:48,description:"文本字体大小"},{key:"fontColor",label:"字体颜色",type:"color",path:"attrs.label.fill",defaultValue:"#e2e8f0",description:"文本字体颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#64748b",description:"边框颜色"},...Se]},wn=Object.freeze(Object.defineProperty({__proto__:null,CircleComponent:Xt,RectComponent:jt,TextComponent:Yt},Symbol.toStringTag,{value:"Module"})),Kt={metadata:{id:"light",name:"灯泡",category:"iot",icon:"💡",description:"IoT灯泡控制组件",version:"1.0.0"},shape:"circle",width:60,height:60,label:"💡",attrs:{body:{fill:"#fbbf24",stroke:"#f59e0b",strokeWidth:2},label:{fill:"#fff",fontSize:24}},data:{type:"light",deviceId:"",property:""},ports:{groups:{left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-left",group:"left"},{id:"port-right",group:"right"}]},props:[{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#fbbf24",description:"灯泡颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#f59e0b",description:"边框颜色"},{key:"deviceId",label:"设备ID",type:"text",path:"data.deviceId",defaultValue:"",description:"绑定的设备ID"},{key:"property",label:"设备属性",type:"text",path:"data.property",defaultValue:"",description:"绑定的设备属性名称"},...Se]},Jt={metadata:{id:"switch",name:"开关",category:"iot",icon:"🔘",description:"IoT开关控制组件",version:"1.0.0"},shape:"rect",width:100,height:50,label:"开关",attrs:{body:{fill:"#64748b",stroke:"#475569",strokeWidth:2,rx:25,ry:25},label:{fill:"#fff",fontSize:14}},data:{type:"switch",deviceId:"",property:"",state:!1},ports:{groups:{left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-left",group:"left"},{id:"port-right",group:"right"}]},props:[{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#64748b",description:"开关颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#475569",description:"边框颜色"},{key:"deviceId",label:"设备ID",type:"text",path:"data.deviceId",defaultValue:"",description:"绑定的设备ID"},{key:"property",label:"设备属性",type:"text",path:"data.property",defaultValue:"",description:"绑定的设备属性名称"},{key:"state",label:"开关状态",type:"boolean",path:"data.state",defaultValue:!1,description:"开关当前状态"},...Se]},Zt={metadata:{id:"gauge",name:"仪表",category:"iot",icon:"📊",description:"IoT仪表盘数据展示组件",version:"1.0.0"},shape:"circle",width:100,height:100,label:"📊",attrs:{body:{fill:"#8b5cf6",stroke:"#7c3aed",strokeWidth:2},label:{fill:"#fff",fontSize:32}},data:{type:"gauge",deviceId:"",property:"",value:0},ports:{groups:{top:{position:"top",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},bottom:{position:"bottom",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-top",group:"top"},{id:"port-right",group:"right"},{id:"port-bottom",group:"bottom"},{id:"port-left",group:"left"}]},props:[{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#8b5cf6",description:"仪表颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#7c3aed",description:"边框颜色"},{key:"deviceId",label:"设备ID",type:"text",path:"data.deviceId",defaultValue:"",description:"绑定的设备ID"},{key:"property",label:"设备属性",type:"text",path:"data.property",defaultValue:"",description:"绑定的设备属性名称"},{key:"value",label:"当前值",type:"number",path:"data.value",defaultValue:0,min:0,max:100,description:"仪表当前显示值"},...Se]},Sn=Object.freeze(Object.defineProperty({__proto__:null,GaugeComponent:Zt,LightComponent:Kt,SwitchComponent:Jt},Symbol.toStringTag,{value:"Module"}));class In{constructor(){Ue(this,"registry",{});this.registerDefaultComponents()}registerDefaultComponents(){this.register(jt),this.register(Xt),this.register(Yt),this.register(Kt),this.register(Jt),this.register(Zt)}register(h){const{id:o}=h.metadata;this.registry[o]&&console.warn(`组件 ${o} 已存在,将被覆盖`),this.registry[o]=h,console.log(`✓ 组件注册成功: ${h.metadata.name} (${o})`)}registerBatch(h){h.forEach(o=>this.register(o))}getComponent(h){return this.registry[h]}getAllComponents(){return{...this.registry}}getComponentsByCategory(h){return Object.values(this.registry).filter(o=>o.metadata.category===h)}getComponentList(){return Object.values(this.registry)}hasComponent(h){return h in this.registry}unregister(h){return this.registry[h]?(delete this.registry[h],console.log(`✓ 组件注销成功: ${h}`),!0):(console.warn(`组件 ${h} 不存在`),!1)}getCount(){return Object.keys(this.registry).length}clear(){this.registry={},console.log("✓ 组件注册表已清空")}}const Pe=new In,je={size:{width:1920,height:1080,preset:"1920*1080"},zoom:{scale:1,min:.1,max:5},offset:{x:0,y:0},background:{color:"#1e293b",size:"origin",repeat:"repeat"},grid:{enabled:!0,size:10,color:"#475569",type:"dot"},snap:{enabled:!0,threshold:10},guides:{enabled:!1,color:"#3b82f6"},magnetism:{enabled:!0,threshold:10}},zn=[{key:"sizePreset",label:"画布尺寸",type:"select",category:"basic",path:"size.preset",defaultValue:"1920*1080",options:[{label:"1920*1080",value:"1920*1080"},{label:"1366*768",value:"1366*768"},{label:"1280*720",value:"1280*720"},{label:"800*600",value:"800*600"}],description:"预设画布尺寸"},{key:"scale",label:"缩放倍数",type:"slider",category:"transform",path:"zoom.scale",defaultValue:1,min:.1,max:5,step:.1,description:"画布缩放比例"},{key:"offsetX",label:"画布X轴偏移",type:"number",category:"transform",path:"offset.x",defaultValue:0,description:"X轴偏移量"},{key:"offsetY",label:"画布Y轴偏移",type:"number",category:"transform",path:"offset.y",defaultValue:0,description:"Y轴偏移量"},{key:"backgroundColor",label:"背景颜色",type:"color",category:"background",path:"background.color",defaultValue:"#1e293b",description:"画布背景颜色"},{key:"backgroundImage",label:"背景图片",type:"image",category:"background",path:"background.image",defaultValue:"",description:"背景图片URL"},{key:"backgroundSize",label:"背景大小",type:"select",category:"background",path:"background.size",defaultValue:"origin",options:[{label:"原始",value:"origin"},{label:"包含",value:"contain"},{label:"覆盖",value:"cover"},{label:"拉伸",value:"stretch"}],description:"背景图片尺寸模式"},{key:"backgroundRepeat",label:"图像重复",type:"select",category:"background",path:"background.repeat",defaultValue:"repeat",options:[{label:"重复",value:"repeat"},{label:"X轴重复",value:"repeat-x"},{label:"Y轴重复",value:"repeat-y"},{label:"不重复",value:"no-repeat"}],description:"背景图片重复模式"},{key:"gridEnabled",label:"网格",type:"boolean",category:"assist",path:"grid.enabled",defaultValue:!0,description:"显示网格"},{key:"gridSize",label:"网格大小",type:"number",category:"assist",path:"grid.size",defaultValue:10,min:5,max:50,description:"网格单元格大小"},{key:"snapEnabled",label:"网格对齐",type:"boolean",category:"assist",path:"snap.enabled",defaultValue:!0,description:"启用网格对齐"},{key:"guidesEnabled",label:"参考线",type:"boolean",category:"assist",path:"guides.enabled",defaultValue:!0,description:"显示参考线"},{key:"magnetismEnabled",label:"吸附",type:"boolean",category:"assist",path:"magnetism.enabled",defaultValue:!0,description:"启用吸附功能"}],Re={"1920*1080":{width:1920,height:1080},"1366*768":{width:1366,height:768},"1280*720":{width:1280,height:720},"800*600":{width:800,height:600}};class Tn{constructor(){Ue(this,"config");this.config=e.reactive({...je})}getConfig(){return this.config}updateConfig(h){Object.assign(this.config,h)}updateByPath(h,o){const r=h.split(".");let n=this.config;for(let l=0;l<r.length-1;l++)n=n[r[l]];if(n[r[r.length-1]]=o,h==="size.preset"&&o in Re){const{width:l,height:E}=Re[o];this.config.size.width=l,this.config.size.height=E}}getByPath(h){const o=h.split(".");let r=this.config;for(const n of o)r=r==null?void 0:r[n];return r}setSize(h,o,r){this.config.size.width=h,this.config.size.height=o,r&&(this.config.size.preset=r)}updateSize(h){this.config.size.width=h.width,this.config.size.height=h.height}setZoom(h){const{min:o=.1,max:r=5}=this.config.zoom;this.config.zoom.scale=Math.max(o,Math.min(r,h))}setOffset(h,o){this.config.offset.x=h,this.config.offset.y=o}setBackgroundColor(h){this.config.background.color=h}updateBackground(h){h.color!==void 0&&(this.config.background.color=h.color),h.image!==void 0&&(this.config.background.image=h.image),h.size!==void 0&&(this.config.background.size=h.size),h.repeat!==void 0&&(this.config.background.repeat=h.repeat)}setBackgroundImage(h){this.config.background.image=h}toggleGrid(h){this.config.grid.enabled=h??!this.config.grid.enabled}setGridSize(h){this.config.grid.size=h}toggleSnap(h){this.config.snap.enabled=h??!this.config.snap.enabled}toggleGuides(h){this.config.guides.enabled=h??!this.config.guides.enabled}toggleMagnetism(h){this.config.magnetism.enabled=h??!this.config.magnetism.enabled}reset(){Object.assign(this.config,je)}export(){return JSON.stringify(this.config,null,2)}import(h){try{const o=JSON.parse(h);Object.assign(this.config,o)}catch(o){console.error("导入画布配置失败:",o)}}}const J=new Tn,Pn={class:"component-library"},Rn={class:"library-content"},Mn={key:0,class:"component-section"},Hn={class:"component-grid"},On=["onClick","title"],Un={class:"component-icon"},Ln={class:"component-name"},Wn={key:1,class:"component-section"},qn={class:"component-grid"},Gn=["onClick","title"],jn={class:"component-icon"},Xn={class:"component-name"},Xe=re(e.defineComponent({__name:"ComponentLibrary",emits:["addComponent"],setup(g,{emit:h}){const o=h,r=e.computed(()=>Pe.getComponentsByCategory("basic")),n=e.computed(()=>Pe.getComponentsByCategory("iot")),l=E=>{o("addComponent",E.metadata.id)};return(E,c)=>(e.openBlock(),e.createElementBlock("aside",Pn,[c[2]||(c[2]=e.createElementVNode("div",{class:"library-header"},[e.createElementVNode("h3",null,"组件库")],-1)),e.createElementVNode("div",Rn,[r.value.length>0?(e.openBlock(),e.createElementBlock("div",Mn,[c[0]||(c[0]=e.createElementVNode("h4",{class:"section-title"},"基础组件",-1)),e.createElementVNode("div",Hn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,x=>(e.openBlock(),e.createElementBlock("div",{key:x.metadata.id,class:"component-item",onClick:s=>l(x),title:x.metadata.description||x.metadata.name},[e.createElementVNode("span",Un,e.toDisplayString(x.metadata.icon),1),e.createElementVNode("span",Ln,e.toDisplayString(x.metadata.name),1)],8,On))),128))])])):e.createCommentVNode("",!0),n.value.length>0?(e.openBlock(),e.createElementBlock("div",Wn,[c[1]||(c[1]=e.createElementVNode("h4",{class:"section-title"},"IoT组件",-1)),e.createElementVNode("div",qn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,x=>(e.openBlock(),e.createElementBlock("div",{key:x.metadata.id,class:"component-item",onClick:s=>l(x),title:x.metadata.description||x.metadata.name},[e.createElementVNode("span",jn,e.toDisplayString(x.metadata.icon),1),e.createElementVNode("span",Xn,e.toDisplayString(x.metadata.name),1)],8,Gn))),128))])])):e.createCommentVNode("",!0)])]))}}),[["__scopeId","data-v-92bb4e17"]]),Yn={class:"canvas-area"},Kn=re(e.defineComponent({__name:"CanvasArea",setup(g,{expose:h}){const o=e.ref();return h({containerRef:o}),(r,n)=>(e.openBlock(),e.createElementBlock("div",Yn,[e.createElementVNode("div",{ref_key:"containerRef",ref:o,class:"canvas-container"},null,512)]))}}),[["__scopeId","data-v-a869f6aa"]]),Jn={class:"canvas-config-panel"},Zn={class:"panel-content"},Qn={class:"config-section"},e0={class:"config-item"},t0={class:"config-section"},o0={class:"config-item"},n0={class:"slider-group"},a0={class:"value-display"},r0={class:"config-item"},l0={class:"number-input-group"},s0={class:"config-item"},i0={class:"number-input-group"},c0={class:"config-section"},d0={class:"config-item"},p0={class:"config-item"},x0={class:"image-upload"},f0={class:"config-item"},m0={class:"config-item"},u0={class:"config-section"},g0={class:"config-item"},E0={class:"switch"},h0={class:"config-item"},v0={class:"switch"},b0={class:"config-item"},y0={class:"switch"},C0={key:0,class:"config-item"},B0={class:"number-input-group"},Ye=re(e.defineComponent({__name:"CanvasConfigPanel",setup(g){const h=e.computed(()=>J.getConfig()),o=e.ref(),r=()=>{const s=h.value.size.preset;if(s&&s in Re){const{width:a,height:t}=Re[s];J.setSize(a,t,s)}},n=(s,a)=>{const t=h.value.offset[s];J.setOffset(s==="x"?t+a:h.value.offset.x,s==="y"?t+a:h.value.offset.y)},l=s=>{const a=Math.max(5,Math.min(50,h.value.grid.size+s));J.setGridSize(a)},E=()=>{var s;(s=o.value)==null||s.click()},c=s=>{var i;const t=(i=s.target.files)==null?void 0:i[0];if(t){const m=new FileReader;m.onload=u=>{var k;const y=(k=u.target)==null?void 0:k.result;J.updateByPath("background.image",y)},m.readAsDataURL(t)}},x=()=>{J.updateByPath("background.image",""),o.value&&(o.value.value="")};return(s,a)=>(e.openBlock(),e.createElementBlock("div",Jn,[a[40]||(a[40]=e.createElementVNode("div",{class:"panel-header"},[e.createElementVNode("h3",null,"画布配置")],-1)),e.createElementVNode("div",Zn,[e.createElementVNode("div",Qn,[a[19]||(a[19]=e.createElementVNode("h4",{class:"section-title"},"基础配置",-1)),e.createElementVNode("div",e0,[a[18]||(a[18]=e.createElementVNode("label",null,"画布尺寸",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":a[0]||(a[0]=t=>h.value.size.preset=t),onChange:r,class:"config-select"},[...a[17]||(a[17]=[e.createElementVNode("option",{value:"1920*1080"},"1920*1080",-1),e.createElementVNode("option",{value:"1366*768"},"1366*768",-1),e.createElementVNode("option",{value:"1280*720"},"1280*720",-1),e.createElementVNode("option",{value:"800*600"},"800*600",-1)])],544),[[e.vModelSelect,h.value.size.preset]])])]),e.createElementVNode("div",t0,[a[23]||(a[23]=e.createElementVNode("h4",{class:"section-title"},"变换",-1)),e.createElementVNode("div",o0,[a[20]||(a[20]=e.createElementVNode("label",null,"缩放倍数",-1)),e.createElementVNode("div",n0,[e.withDirectives(e.createElementVNode("input",{type:"range","onUpdate:modelValue":a[1]||(a[1]=t=>h.value.zoom.scale=t),min:.1,max:5,step:.1,class:"config-slider"},null,512),[[e.vModelText,h.value.zoom.scale,void 0,{number:!0}]]),e.createElementVNode("span",a0,e.toDisplayString(h.value.zoom.scale.toFixed(1)),1)])]),e.createElementVNode("div",r0,[a[21]||(a[21]=e.createElementVNode("label",null,"画布X轴偏移",-1)),e.createElementVNode("div",l0,[e.createElementVNode("button",{onClick:a[2]||(a[2]=t=>n("x",-10)),class:"adjust-btn"},"-"),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":a[3]||(a[3]=t=>h.value.offset.x=t),class:"config-number"},null,512),[[e.vModelText,h.value.offset.x,void 0,{number:!0}]]),e.createElementVNode("button",{onClick:a[4]||(a[4]=t=>n("x",10)),class:"adjust-btn"},"+")])]),e.createElementVNode("div",s0,[a[22]||(a[22]=e.createElementVNode("label",null,"画布Y轴偏移",-1)),e.createElementVNode("div",i0,[e.createElementVNode("button",{onClick:a[5]||(a[5]=t=>n("y",-10)),class:"adjust-btn"},"-"),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":a[6]||(a[6]=t=>h.value.offset.y=t),class:"config-number"},null,512),[[e.vModelText,h.value.offset.y,void 0,{number:!0}]]),e.createElementVNode("button",{onClick:a[7]||(a[7]=t=>n("y",10)),class:"adjust-btn"},"+")])])]),e.createElementVNode("div",c0,[a[31]||(a[31]=e.createElementVNode("h4",{class:"section-title"},"背景",-1)),e.createElementVNode("div",d0,[a[24]||(a[24]=e.createElementVNode("label",null,"背景颜色",-1)),e.withDirectives(e.createElementVNode("input",{type:"color","onUpdate:modelValue":a[8]||(a[8]=t=>h.value.background.color=t),class:"config-color"},null,512),[[e.vModelText,h.value.background.color]])]),e.createElementVNode("div",p0,[a[26]||(a[26]=e.createElementVNode("label",null,"背景图片",-1)),e.createElementVNode("div",x0,[e.createElementVNode("input",{type:"file",accept:"image/*",onChange:c,ref_key:"fileInput",ref:o,style:{display:"none"}},null,544),e.createElementVNode("button",{onClick:E,class:"upload-btn"},[...a[25]||(a[25]=[e.createElementVNode("span",null,"📄",-1)])]),h.value.background.image?(e.openBlock(),e.createElementBlock("button",{key:0,onClick:x,class:"clear-btn",title:"清除背景图"}," ✕ ")):e.createCommentVNode("",!0)])]),e.createElementVNode("div",f0,[a[28]||(a[28]=e.createElementVNode("label",null,"背景大小",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":a[9]||(a[9]=t=>h.value.background.size=t),class:"config-select"},[...a[27]||(a[27]=[e.createElementVNode("option",{value:"origin"},"原始",-1),e.createElementVNode("option",{value:"contain"},"包含",-1),e.createElementVNode("option",{value:"cover"},"覆盖",-1),e.createElementVNode("option",{value:"stretch"},"拉伸",-1)])],512),[[e.vModelSelect,h.value.background.size]])]),e.createElementVNode("div",m0,[a[30]||(a[30]=e.createElementVNode("label",null,"图像重复",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":a[10]||(a[10]=t=>h.value.background.repeat=t),class:"config-select"},[...a[29]||(a[29]=[e.createElementVNode("option",{value:"repeat"},"重复",-1),e.createElementVNode("option",{value:"repeat-x"},"X轴重复",-1),e.createElementVNode("option",{value:"repeat-y"},"Y轴重复",-1),e.createElementVNode("option",{value:"no-repeat"},"不重复",-1)])],512),[[e.vModelSelect,h.value.background.repeat]])])]),e.createElementVNode("div",u0,[a[39]||(a[39]=e.createElementVNode("h4",{class:"section-title"},"辅助",-1)),e.createElementVNode("div",g0,[a[33]||(a[33]=e.createElementVNode("label",null,"吸附",-1)),e.createElementVNode("label",E0,[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":a[11]||(a[11]=t=>h.value.magnetism.enabled=t)},null,512),[[e.vModelCheckbox,h.value.magnetism.enabled]]),a[32]||(a[32]=e.createElementVNode("span",{class:"slider"},null,-1))])]),e.createElementVNode("div",h0,[a[35]||(a[35]=e.createElementVNode("label",null,"网格",-1)),e.createElementVNode("label",v0,[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":a[12]||(a[12]=t=>h.value.grid.enabled=t)},null,512),[[e.vModelCheckbox,h.value.grid.enabled]]),a[34]||(a[34]=e.createElementVNode("span",{class:"slider"},null,-1))])]),e.createElementVNode("div",b0,[a[37]||(a[37]=e.createElementVNode("label",null,"网格对齐",-1)),e.createElementVNode("label",y0,[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":a[13]||(a[13]=t=>h.value.snap.enabled=t)},null,512),[[e.vModelCheckbox,h.value.snap.enabled]]),a[36]||(a[36]=e.createElementVNode("span",{class:"slider"},null,-1))])]),h.value.grid.enabled?(e.openBlock(),e.createElementBlock("div",C0,[a[38]||(a[38]=e.createElementVNode("label",null,"网格大小",-1)),e.createElementVNode("div",B0,[e.createElementVNode("button",{onClick:a[14]||(a[14]=t=>l(-5)),class:"adjust-btn"},"-"),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":a[15]||(a[15]=t=>h.value.grid.size=t),min:5,max:50,class:"config-number"},null,512),[[e.vModelText,h.value.grid.size,void 0,{number:!0}]]),e.createElementVNode("button",{onClick:a[16]||(a[16]=t=>l(5)),class:"adjust-btn"},"+")])])):e.createCommentVNode("",!0)])])]))}}),[["__scopeId","data-v-f309895b"]]),k0={class:"tab-pane"},N0={class:"property-section"},V0={class:"property-item-inline"},D0=["value"],A0={class:"property-item-inline"},_0=["value"],F0={class:"property-item-inline"},$0=["value"],w0={class:"property-section"},S0={class:"property-row"},I0={class:"property-item"},z0=["value"],T0={class:"property-item"},P0=["value"],R0={class:"property-row"},M0={class:"property-item"},H0=["value"],O0={class:"property-item"},U0=["value"],L0={class:"property-section"},W0={class:"property-item-inline"},q0=["value"],G0={class:"property-item-inline"},j0={class:"color-input-wrapper"},X0=["value"],Y0={class:"color-value"},K0={class:"property-item-inline"},J0={class:"color-input-wrapper"},Z0=["value"],Q0={class:"color-value"},ea={class:"property-item-inline"},ta=["value"],oa={class:"property-item-inline"},na=["value"],aa={key:0,class:"property-section"},ra={key:0,class:"property-hint"},la=["value","onInput","placeholder"],sa=["value","onInput","min","max","step"],ia={key:2,class:"color-input-wrapper"},ca=["value","onInput"],da={class:"color-value"},pa={key:3,class:"checkbox-wrapper"},xa=["checked","onChange"],fa={class:"checkbox-label"},ma=["value","onChange"],ua=["value"],Ke=re(e.defineComponent({__name:"BasicPropertiesTab",props:{selectedNode:{},nodePosition:{},nodeSize:{},nodeAttrs:{}},emits:["update-position","update-size","update-label","update-fill","update-stroke","update-stroke-width","update-opacity","update-component-name","update-dynamic-prop"],setup(g,{emit:h}){const o=g,r=h,n=e.computed(()=>{var x,s;if(!((s=(x=o.selectedNode)==null?void 0:x.data)!=null&&s.props))return[];const c=["label","fill","stroke","strokeWidth","opacity"];return o.selectedNode.data.props.filter(a=>!c.includes(a.key))}),l=c=>{if(!c.path)return c.defaultValue;const x=c.path.split(".");let s=o.selectedNode;for(const a of x)if(s&&typeof s=="object")s=s[a];else return c.defaultValue;return s!==void 0?s:c.defaultValue},E=(c,x)=>{const s=x.target;let a;c.type==="number"?a=Number(s.value):c.type==="boolean"?a=s.checked:a=s.value,r("update-dynamic-prop",c.path,a)};return(c,x)=>{var s,a,t,i,m,u,y,k,V,d,p,f,C,b,A,$,S;return e.openBlock(),e.createElementBlock("div",k0,[e.createElementVNode("div",N0,[x[13]||(x[13]=e.createElementVNode("h4",null,"基础信息",-1)),e.createElementVNode("div",V0,[x[10]||(x[10]=e.createElementVNode("label",null,"组件名称",-1)),e.createElementVNode("input",{type:"text",value:((s=g.selectedNode.getData())==null?void 0:s.componentName)||"",onInput:x[0]||(x[0]=B=>c.$emit("update-component-name",B)),placeholder:"请输入组件名称"},null,40,D0)]),e.createElementVNode("div",A0,[x[11]||(x[11]=e.createElementVNode("label",null,"ID",-1)),e.createElementVNode("input",{type:"text",value:g.selectedNode.id,disabled:""},null,8,_0)]),e.createElementVNode("div",F0,[x[12]||(x[12]=e.createElementVNode("label",null,"类型",-1)),e.createElementVNode("input",{type:"text",value:g.selectedNode.shape,disabled:""},null,8,$0)])]),e.createElementVNode("div",w0,[x[18]||(x[18]=e.createElementVNode("h4",null,"位置和尺寸",-1)),e.createElementVNode("div",S0,[e.createElementVNode("div",I0,[x[14]||(x[14]=e.createElementVNode("label",null,"X",-1)),e.createElementVNode("input",{type:"number",value:g.nodePosition.x,onInput:x[1]||(x[1]=B=>c.$emit("update-position","x",B))},null,40,z0)]),e.createElementVNode("div",T0,[x[15]||(x[15]=e.createElementVNode("label",null,"Y",-1)),e.createElementVNode("input",{type:"number",value:g.nodePosition.y,onInput:x[2]||(x[2]=B=>c.$emit("update-position","y",B))},null,40,P0)])]),e.createElementVNode("div",R0,[e.createElementVNode("div",M0,[x[16]||(x[16]=e.createElementVNode("label",null,"宽度",-1)),e.createElementVNode("input",{type:"number",value:g.nodeSize.width,onInput:x[3]||(x[3]=B=>c.$emit("update-size","width",B))},null,40,H0)]),e.createElementVNode("div",O0,[x[17]||(x[17]=e.createElementVNode("label",null,"高度",-1)),e.createElementVNode("input",{type:"number",value:g.nodeSize.height,onInput:x[4]||(x[4]=B=>c.$emit("update-size","height",B))},null,40,U0)])])]),e.createElementVNode("div",L0,[x[24]||(x[24]=e.createElementVNode("h4",null,"样式",-1)),e.createElementVNode("div",W0,[x[19]||(x[19]=e.createElementVNode("label",null,"初始文本",-1)),e.createElementVNode("input",{type:"text",value:((t=(a=g.nodeAttrs)==null?void 0:a.text)==null?void 0:t.text)||((m=(i=g.nodeAttrs)==null?void 0:i.label)==null?void 0:m.text)||g.selectedNode.getProp("label")||"",onInput:x[5]||(x[5]=B=>c.$emit("update-label",B)),placeholder:"设置默认显示文本"},null,40,q0)]),e.createElementVNode("div",G0,[x[20]||(x[20]=e.createElementVNode("label",null,"填充颜色",-1)),e.createElementVNode("div",j0,[e.createElementVNode("input",{type:"color",value:((y=(u=g.nodeAttrs)==null?void 0:u.body)==null?void 0:y.fill)||"#3b82f6",onInput:x[6]||(x[6]=B=>c.$emit("update-fill",B))},null,40,X0),e.createElementVNode("span",Y0,e.toDisplayString(((V=(k=g.nodeAttrs)==null?void 0:k.body)==null?void 0:V.fill)||"#3b82f6"),1)])]),e.createElementVNode("div",K0,[x[21]||(x[21]=e.createElementVNode("label",null,"边框颜色",-1)),e.createElementVNode("div",J0,[e.createElementVNode("input",{type:"color",value:((p=(d=g.nodeAttrs)==null?void 0:d.body)==null?void 0:p.stroke)||"#2563eb",onInput:x[7]||(x[7]=B=>c.$emit("update-stroke",B))},null,40,Z0),e.createElementVNode("span",Q0,e.toDisplayString(((C=(f=g.nodeAttrs)==null?void 0:f.body)==null?void 0:C.stroke)||"#2563eb"),1)])]),e.createElementVNode("div",ea,[x[22]||(x[22]=e.createElementVNode("label",null,"边框宽度",-1)),e.createElementVNode("input",{type:"number",min:"0",max:"10",value:((A=(b=g.nodeAttrs)==null?void 0:b.body)==null?void 0:A.strokeWidth)||2,onInput:x[8]||(x[8]=B=>c.$emit("update-stroke-width",B))},null,40,ta)]),e.createElementVNode("div",oa,[x[23]||(x[23]=e.createElementVNode("label",null,"透明度",-1)),e.createElementVNode("input",{type:"number",min:"0",max:"1",step:"0.1",value:((S=($=g.nodeAttrs)==null?void 0:$.body)==null?void 0:S.opacity)!==void 0?g.nodeAttrs.body.opacity:1,onInput:x[9]||(x[9]=B=>c.$emit("update-opacity",B))},null,40,na)])]),n.value.length>0?(e.openBlock(),e.createElementBlock("div",aa,[x[25]||(x[25]=e.createElementVNode("h4",null,"组件属性",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,B=>(e.openBlock(),e.createElementBlock("div",{key:B.key,class:"property-item-inline"},[e.createElementVNode("label",null,[e.createTextVNode(e.toDisplayString(B.label)+" ",1),B.description?(e.openBlock(),e.createElementBlock("span",ra,e.toDisplayString(B.description),1)):e.createCommentVNode("",!0)]),B.type==="text"?(e.openBlock(),e.createElementBlock("input",{key:0,type:"text",value:l(B),onInput:N=>E(B,N),placeholder:B.defaultValue},null,40,la)):B.type==="number"?(e.openBlock(),e.createElementBlock("input",{key:1,type:"number",value:l(B),onInput:N=>E(B,N),min:B.min,max:B.max,step:B.step},null,40,sa)):B.type==="color"?(e.openBlock(),e.createElementBlock("div",ia,[e.createElementVNode("input",{type:"color",value:l(B),onInput:N=>E(B,N)},null,40,ca),e.createElementVNode("span",da,e.toDisplayString(l(B)),1)])):B.type==="boolean"?(e.openBlock(),e.createElementBlock("div",pa,[e.createElementVNode("input",{type:"checkbox",checked:l(B),onChange:N=>E(B,N)},null,40,xa),e.createElementVNode("span",fa,e.toDisplayString(l(B)?"是":"否"),1)])):B.type==="select"?(e.openBlock(),e.createElementBlock("select",{key:4,value:l(B),onChange:N=>E(B,N)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(B.options,N=>(e.openBlock(),e.createElementBlock("option",{key:N.value,value:N.value},e.toDisplayString(N.label),9,ua))),128))],40,ma)):e.createCommentVNode("",!0)]))),128))])):e.createCommentVNode("",!0)])}}}),[["__scopeId","data-v-def84c5f"]]),ga={class:"tab-pane"},Ea={class:"property-section"},ha={class:"property-item-inline"},va=["value"],ba={key:0,class:"property-section"},ya={class:"property-item-inline"},Ca=["value"],Ba={class:"property-item-inline"},ka=["value"],Na={class:"property-item-inline"},Va=["value"],Da={class:"property-item-inline"},Aa=["value"],_a={class:"property-item-inline"},Fa=["value"],$a={class:"property-item-inline"},wa=["value"],Sa={key:1,class:"property-section"},Ia={class:"property-item-inline"},za=["value"],Ta={class:"property-item-inline"},Pa=["value"],Ra={class:"property-item-inline"},Ma=["value"],Ha={class:"property-item-inline"},Oa=["value"],Ua={class:"property-item-inline"},La=["value"],Wa={class:"property-item-inline"},qa=["value"],Ga={key:2,class:"property-section"},ja={class:"property-item-inline"},Xa=["value"],Ya={class:"property-item-inline"},Ka=["value"],Ja={class:"property-item-inline"},Za=["value"],Qa={class:"property-item-inline"},er=["value"],tr={class:"property-item-inline"},or={class:"checkbox-wrapper"},nr=["checked"],ar={class:"checkbox-label"},rr={key:3,class:"property-section"},lr={class:"property-item-inline"},sr=["value"],ir={class:"property-item-inline"},cr=["value"],dr={class:"property-item-inline"},pr=["value"],xr={key:4,class:"property-section"},fr={class:"property-item-inline"},mr=["value"],ur={class:"property-item-inline"},gr=["value"],Er={key:5,class:"property-section"},hr={class:"property-item-inline"},vr={class:"checkbox-wrapper"},br=["checked"],yr={class:"checkbox-label"},Cr={class:"property-item-inline"},Br=["value"],kr=re(e.defineComponent({__name:"DataPropertiesTab",props:{selectedNode:{}},emits:["update-data-source"],setup(g,{emit:h}){const o=g,r=h,n=e.ref({type:"none",enabled:!0,retryCount:3});e.watch(()=>o.selectedNode,a=>{if(a){const t=a.getData();t!=null&&t.dataSource?n.value={...t.dataSource}:n.value={type:"none",enabled:!0,retryCount:3}}},{immediate:!0});const l=a=>{const t=a.target.value;let i={type:t,enabled:!0,retryCount:3};t==="http"?(i.pollInterval=5e3,i.method="GET"):t==="sse"&&(i.autoReconnect=!0),n.value=i,s()},E=(a,t)=>{const i=t.target;let m;i.type==="number"?m=Number(i.value):m=i.value,n.value={...n.value,[a]:m},s()},c=(a,t)=>{const i=t.target.checked;n.value={...n.value,[a]:i},s()},x=a=>{const t=a.target.checked;n.value={...n.value,enabled:t},s()},s=()=>{r("update-data-source",n.value)};return(a,t)=>(e.openBlock(),e.createElementBlock("div",ga,[e.createElementVNode("div",Ea,[t[25]||(t[25]=e.createElementVNode("h4",null,"数据来源",-1)),e.createElementVNode("div",ha,[t[24]||(t[24]=e.createElementVNode("label",null,"来源类型",-1)),e.createElementVNode("select",{value:n.value.type,onChange:l},[...t[23]||(t[23]=[e.createStaticVNode('<option value="none" data-v-5b515f8a>无数据源</option><option value="mqtt" data-v-5b515f8a>MQTT</option><option value="websocket" data-v-5b515f8a>WebSocket</option><option value="http" data-v-5b515f8a>HTTP</option><option value="sse" data-v-5b515f8a>SSE</option><option value="static" data-v-5b515f8a>静态数据</option>',6)])],40,va)])]),n.value.type==="mqtt"?(e.openBlock(),e.createElementBlock("div",ba,[t[32]||(t[32]=e.createElementVNode("h4",null,"MQTT配置",-1)),e.createElementVNode("div",ya,[t[26]||(t[26]=e.createElementVNode("label",null,"服务器",-1)),e.createElementVNode("input",{type:"text",value:n.value.broker||"",onInput:t[0]||(t[0]=i=>E("broker",i)),placeholder:"mqtt://localhost:1883"},null,40,Ca)]),e.createElementVNode("div",Ba,[t[27]||(t[27]=e.createElementVNode("label",null,"客户端ID",-1)),e.createElementVNode("input",{type:"text",value:n.value.clientId||"",onInput:t[1]||(t[1]=i=>E("clientId",i)),placeholder:"自动生成"},null,40,ka)]),e.createElementVNode("div",Na,[t[28]||(t[28]=e.createElementVNode("label",null,"订阅主题",-1)),e.createElementVNode("input",{type:"text",value:n.value.topic||"",onInput:t[2]||(t[2]=i=>E("topic",i)),placeholder:"例如: sensor/temperature"},null,40,Va)]),e.createElementVNode("div",Da,[t[29]||(t[29]=e.createElementVNode("label",null,"用户名",-1)),e.createElementVNode("input",{type:"text",value:n.value.username||"",onInput:t[3]||(t[3]=i=>E("username",i)),placeholder:"可选"},null,40,Aa)]),e.createElementVNode("div",_a,[t[30]||(t[30]=e.createElementVNode("label",null,"密码",-1)),e.createElementVNode("input",{type:"password",value:n.value.password||"",onInput:t[4]||(t[4]=i=>E("password",i)),placeholder:"可选"},null,40,Fa)]),e.createElementVNode("div",$a,[t[31]||(t[31]=e.createElementVNode("label",null,"数据路径",-1)),e.createElementVNode("input",{type:"text",value:n.value.dataPath||"",onInput:t[5]||(t[5]=i=>E("dataPath",i)),placeholder:"例如: value"},null,40,wa)])])):e.createCommentVNode("",!0),n.value.type==="http"?(e.openBlock(),e.createElementBlock("div",Sa,[t[40]||(t[40]=e.createElementVNode("h4",null,"HTTP配置",-1)),e.createElementVNode("div",Ia,[t[33]||(t[33]=e.createElementVNode("label",null,"接口地址",-1)),e.createElementVNode("input",{type:"text",value:n.value.url||"",onInput:t[6]||(t[6]=i=>E("url",i)),placeholder:"https://api.example.com/data"},null,40,za)]),e.createElementVNode("div",Ta,[t[35]||(t[35]=e.createElementVNode("label",null,"请求方法",-1)),e.createElementVNode("select",{value:n.value.method||"GET",onChange:t[7]||(t[7]=i=>E("method",i))},[...t[34]||(t[34]=[e.createElementVNode("option",{value:"GET"},"GET",-1),e.createElementVNode("option",{value:"POST"},"POST",-1),e.createElementVNode("option",{value:"PUT"},"PUT",-1),e.createElementVNode("option",{value:"DELETE"},"DELETE",-1)])],40,Pa)]),e.createElementVNode("div",Ra,[t[36]||(t[36]=e.createElementVNode("label",null,"请求头",-1)),e.createElementVNode("input",{type:"text",value:n.value.headers||"",onInput:t[8]||(t[8]=i=>E("headers",i)),placeholder:"JSON格式"},null,40,Ma)]),e.createElementVNode("div",Ha,[t[37]||(t[37]=e.createElementVNode("label",null,"请求体",-1)),e.createElementVNode("input",{type:"text",value:n.value.body||"",onInput:t[9]||(t[9]=i=>E("body",i)),placeholder:"POST/PUT请求的数据"},null,40,Oa)]),e.createElementVNode("div",Ua,[t[38]||(t[38]=e.createElementVNode("label",null,"数据路径",-1)),e.createElementVNode("input",{type:"text",value:n.value.dataPath||"",onInput:t[10]||(t[10]=i=>E("dataPath",i)),placeholder:"例如: data.value"},null,40,La)]),e.createElementVNode("div",Wa,[t[39]||(t[39]=e.createElementVNode("label",null,"轮询间隔(ms)",-1)),e.createElementVNode("input",{type:"number",value:n.value.pollInterval||5e3,onInput:t[11]||(t[11]=i=>E("pollInterval",i)),min:"1000",step:"1000"},null,40,qa)])])):e.createCommentVNode("",!0),n.value.type==="sse"?(e.openBlock(),e.createElementBlock("div",Ga,[t[46]||(t[46]=e.createElementVNode("h4",null,"SSE配置",-1)),e.createElementVNode("div",ja,[t[41]||(t[41]=e.createElementVNode("label",null,"服务地址",-1)),e.createElementVNode("input",{type:"text",value:n.value.sseUrl||"",onInput:t[12]||(t[12]=i=>E("sseUrl",i)),placeholder:"https://api.example.com/events"},null,40,Xa)]),e.createElementVNode("div",Ya,[t[42]||(t[42]=e.createElementVNode("label",null,"事件类型",-1)),e.createElementVNode("input",{type:"text",value:n.value.eventType||"",onInput:t[13]||(t[13]=i=>E("eventType",i)),placeholder:"留空表示所有事件"},null,40,Ka)]),e.createElementVNode("div",Ja,[t[43]||(t[43]=e.createElementVNode("label",null,"请求头",-1)),e.createElementVNode("input",{type:"text",value:n.value.headers||"",onInput:t[14]||(t[14]=i=>E("headers",i)),placeholder:"JSON格式"},null,40,Za)]),e.createElementVNode("div",Qa,[t[44]||(t[44]=e.createElementVNode("label",null,"数据路径",-1)),e.createElementVNode("input",{type:"text",value:n.value.dataPath||"",onInput:t[15]||(t[15]=i=>E("dataPath",i)),placeholder:"例如: data.value"},null,40,er)]),e.createElementVNode("div",tr,[t[45]||(t[45]=e.createElementVNode("label",null,"自动重连",-1)),e.createElementVNode("div",or,[e.createElementVNode("input",{type:"checkbox",checked:n.value.autoReconnect!==!1,onChange:t[16]||(t[16]=i=>c("autoReconnect",i))},null,40,nr),e.createElementVNode("span",ar,e.toDisplayString(n.value.autoReconnect!==!1?"是":"否"),1)])])])):e.createCommentVNode("",!0),n.value.type==="websocket"?(e.openBlock(),e.createElementBlock("div",rr,[t[50]||(t[50]=e.createElementVNode("h4",null,"WebSocket配置",-1)),e.createElementVNode("div",lr,[t[47]||(t[47]=e.createElementVNode("label",null,"服务地址",-1)),e.createElementVNode("input",{type:"text",value:n.value.wsUrl||"",onInput:t[17]||(t[17]=i=>E("wsUrl",i)),placeholder:"ws://localhost:8080"},null,40,sr)]),e.createElementVNode("div",ir,[t[48]||(t[48]=e.createElementVNode("label",null,"订阅主题",-1)),e.createElementVNode("input",{type:"text",value:n.value.topic||"",onInput:t[18]||(t[18]=i=>E("topic",i)),placeholder:"例如: device/status"},null,40,cr)]),e.createElementVNode("div",dr,[t[49]||(t[49]=e.createElementVNode("label",null,"数据路径",-1)),e.createElementVNode("input",{type:"text",value:n.value.dataPath||"",onInput:t[19]||(t[19]=i=>E("dataPath",i)),placeholder:"例如: payload.value"},null,40,pr)])])):e.createCommentVNode("",!0),n.value.type==="static"?(e.openBlock(),e.createElementBlock("div",xr,[t[54]||(t[54]=e.createElementVNode("h4",null,"静态数据配置",-1)),e.createElementVNode("div",fr,[t[51]||(t[51]=e.createElementVNode("label",null,"数据值",-1)),e.createElementVNode("input",{type:"text",value:n.value.value||"",onInput:t[20]||(t[20]=i=>E("value",i)),placeholder:"请输入数据值"},null,40,mr)]),e.createElementVNode("div",ur,[t[53]||(t[53]=e.createElementVNode("label",null,"数据类型",-1)),e.createElementVNode("select",{value:n.value.valueType||"string",onChange:t[21]||(t[21]=i=>E("valueType",i))},[...t[52]||(t[52]=[e.createElementVNode("option",{value:"string"},"字符串",-1),e.createElementVNode("option",{value:"number"},"数字",-1),e.createElementVNode("option",{value:"boolean"},"布尔值",-1),e.createElementVNode("option",{value:"json"},"JSON对象",-1)])],40,gr)])])):e.createCommentVNode("",!0),n.value.type!=="none"?(e.openBlock(),e.createElementBlock("div",Er,[t[57]||(t[57]=e.createElementVNode("h4",null,"通用配置",-1)),e.createElementVNode("div",hr,[t[55]||(t[55]=e.createElementVNode("label",null,"启用状态",-1)),e.createElementVNode("div",vr,[e.createElementVNode("input",{type:"checkbox",checked:n.value.enabled!==!1,onChange:x},null,40,br),e.createElementVNode("span",yr,e.toDisplayString(n.value.enabled!==!1?"启用":"禁用"),1)])]),e.createElementVNode("div",Cr,[t[56]||(t[56]=e.createElementVNode("label",null,"错误重试",-1)),e.createElementVNode("input",{type:"number",value:n.value.retryCount||3,onInput:t[22]||(t[22]=i=>E("retryCount",i)),min:"0",max:"10"},null,40,Br)])])):e.createCommentVNode("",!0)]))}}),[["__scopeId","data-v-5b515f8a"]]),Nr={class:"edge-properties-tab"},Vr={class:"property-section"},Dr={class:"property-item"},Ar={class:"color-input-wrapper"},_r=["value"],Fr=["value"],$r={class:"property-item"},wr={class:"number-input-wrapper"},Sr=["value"],Ir={class:"property-item"},zr=["value"],Tr={class:"property-item"},Pr={class:"slider-wrapper"},Rr=["value"],Mr={class:"slider-value"},Hr={class:"property-item"},Or=["value"],Ur={key:0,class:"property-item"},Lr={class:"number-input-wrapper"},Wr=["value"],qr={class:"property-section"},Gr={class:"property-item"},jr=["value"],Xr={class:"property-item"},Yr=["value"],Kr={class:"property-section"},Jr={class:"property-item"},Zr=["value"],Qr={class:"property-item"},el=["value"],tl=re(e.defineComponent({__name:"EdgePropertiesTab",props:{selectedEdge:{}},emits:["updateEdge","deleteEdge"],setup(g,{emit:h}){const o=g,r=h,n=e.computed(()=>{var C;return((C=o.selectedEdge)==null?void 0:C.getAttrs())||{}}),l=C=>{const b=C.target.value;r("updateEdge",{attrs:{line:{stroke:b}}})},E=C=>{const b=Number(C.target.value);r("updateEdge",{attrs:{line:{strokeWidth:b}}})},c=()=>{var b;const C=(b=n.value.line)==null?void 0:b.strokeDasharray;return C?C==="5,5"?"5,5":C==="2,2"?"2,2":C==="10,5,2,5"?"10,5,2,5":"none":"none"},x=C=>{const b=C.target.value;r("updateEdge",{attrs:{line:{strokeDasharray:b==="none"?void 0:b}}})},s=C=>{const b=Number(C.target.value);r("updateEdge",{attrs:{line:{opacity:b}}})},a=C=>{var A;const b=(A=n.value.line)==null?void 0:A[`${C}Marker`];return!b||typeof b!="object"||!b.name?"none":b.name},t=()=>{var A;const C=(A=n.value.line)==null?void 0:A.opacity;return((C!==void 0&&typeof C=="number"?C:1)*100).toFixed(0)},i=C=>{const b=C.target.value;r("updateEdge",{attrs:{line:{sourceMarker:b==="none"?void 0:{name:b,width:8,height:6}}}})},m=C=>{const b=C.target.value;r("updateEdge",{attrs:{line:{targetMarker:b==="none"?void 0:{name:b,width:8,height:6}}}})},u=C=>{const b=C.target.value;r("updateEdge",{router:b})},y=C=>{const b=C.target.value;r("updateEdge",{connector:{name:b,args:b==="rounded"?{radius:8}:void 0}})},k=()=>{r("deleteEdge")},V=()=>{var b,A;const C=(A=(b=o.selectedEdge)==null?void 0:b.data)==null?void 0:A.animation;return C!=null&&C.enabled?"true":"false"},d=()=>{var b,A;const C=(A=(b=o.selectedEdge)==null?void 0:b.data)==null?void 0:A.animation;return C!=null&&C.duration?C.duration/1e3:2},p=C=>{if(!(C.target.value==="true"))r("updateEdge",{data:{animation:{enabled:!1}},animation:{enabled:!1}});else{const A=d()*1e3;r("updateEdge",{data:{animation:{enabled:!0,duration:A}},animation:{enabled:!0,duration:A}})}},f=C=>{const A=Number(C.target.value)*1e3;r("updateEdge",{data:{animation:{enabled:!0,duration:A}},animation:{enabled:!0,duration:A}})};return(C,b)=>{var A,$,S,B,N,w,I,R;return e.openBlock(),e.createElementBlock("div",Nr,[e.createElementVNode("div",Vr,[b[10]||(b[10]=e.createElementVNode("h4",{class:"section-title"},"线条样式",-1)),e.createElementVNode("div",Dr,[b[0]||(b[0]=e.createElementVNode("label",{class:"property-label"},"线条颜色",-1)),e.createElementVNode("div",Ar,[e.createElementVNode("input",{type:"color",class:"color-input",value:((A=n.value.line)==null?void 0:A.stroke)||"#10b981",onInput:l},null,40,_r),e.createElementVNode("input",{type:"text",class:"color-text",value:(($=n.value.line)==null?void 0:$.stroke)||"#10b981",onInput:l},null,40,Fr)])]),e.createElementVNode("div",$r,[b[2]||(b[2]=e.createElementVNode("label",{class:"property-label"},"线条粗细",-1)),e.createElementVNode("div",wr,[e.createElementVNode("input",{type:"number",class:"property-input",min:"1",max:"20",step:"1",value:((S=n.value.line)==null?void 0:S.strokeWidth)||2,onInput:E},null,40,Sr),b[1]||(b[1]=e.createElementVNode("span",{class:"input-unit"},"px",-1))])]),e.createElementVNode("div",Ir,[b[4]||(b[4]=e.createElementVNode("label",{class:"property-label"},"线条样式",-1)),e.createElementVNode("select",{class:"property-select",value:c(),onChange:x},[...b[3]||(b[3]=[e.createElementVNode("option",{value:"none"},"实线",-1),e.createElementVNode("option",{value:"5,5"},"虚线",-1),e.createElementVNode("option",{value:"2,2"},"点线",-1),e.createElementVNode("option",{value:"10,5,2,5"},"点划线",-1)])],40,zr)]),e.createElementVNode("div",Tr,[b[5]||(b[5]=e.createElementVNode("label",{class:"property-label"},"透明度",-1)),e.createElementVNode("div",Pr,[e.createElementVNode("input",{type:"range",class:"property-slider",min:"0",max:"1",step:"0.1",value:((B=n.value.line)==null?void 0:B.opacity)!==void 0?n.value.line.opacity:1,onInput:s},null,40,Rr),e.createElementVNode("span",Mr,e.toDisplayString(t())+"%",1)])]),e.createElementVNode("div",Hr,[b[7]||(b[7]=e.createElementVNode("label",{class:"property-label"},"流动动画",-1)),e.createElementVNode("select",{class:"property-select",value:V(),onChange:p},[...b[6]||(b[6]=[e.createElementVNode("option",{value:"false"},"关闭",-1),e.createElementVNode("option",{value:"true"},"开启",-1)])],40,Or)]),V()==="true"?(e.openBlock(),e.createElementBlock("div",Ur,[b[9]||(b[9]=e.createElementVNode("label",{class:"property-label"},"动画速度",-1)),e.createElementVNode("div",Lr,[e.createElementVNode("input",{type:"number",class:"property-input",min:"0.5",max:"10",step:"0.5",value:d(),onInput:f},null,40,Wr),b[8]||(b[8]=e.createElementVNode("span",{class:"input-unit"},"秒",-1))])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",qr,[b[15]||(b[15]=e.createElementVNode("h4",{class:"section-title"},"箭头样式",-1)),e.createElementVNode("div",Gr,[b[12]||(b[12]=e.createElementVNode("label",{class:"property-label"},"起点箭头",-1)),e.createElementVNode("select",{class:"property-select",value:a("source"),onChange:i},[...b[11]||(b[11]=[e.createStaticVNode('<option value="none" data-v-e47f1784>无</option><option value="block" data-v-e47f1784>实心箭头</option><option value="classic" data-v-e47f1784>经典箭头</option><option value="diamond" data-v-e47f1784>菱形</option><option value="circle" data-v-e47f1784>圆形</option>',5)])],40,jr)]),e.createElementVNode("div",Xr,[b[14]||(b[14]=e.createElementVNode("label",{class:"property-label"},"终点箭头",-1)),e.createElementVNode("select",{class:"property-select",value:a("target"),onChange:m},[...b[13]||(b[13]=[e.createStaticVNode('<option value="none" data-v-e47f1784>无</option><option value="block" data-v-e47f1784>实心箭头</option><option value="classic" data-v-e47f1784>经典箭头</option><option value="diamond" data-v-e47f1784>菱形</option><option value="circle" data-v-e47f1784>圆形</option>',5)])],40,Yr)])]),e.createElementVNode("div",Kr,[b[20]||(b[20]=e.createElementVNode("h4",{class:"section-title"},"连接器",-1)),e.createElementVNode("div",Jr,[b[17]||(b[17]=e.createElementVNode("label",{class:"property-label"},"路由方式",-1)),e.createElementVNode("select",{class:"property-select",value:((w=(N=g.selectedEdge)==null?void 0:N.getRouter())==null?void 0:w.name)||"manhattan",onChange:u},[...b[16]||(b[16]=[e.createElementVNode("option",{value:"manhattan"},"曼哈顿",-1),e.createElementVNode("option",{value:"orth"},"正交",-1),e.createElementVNode("option",{value:"normal"},"直线",-1)])],40,Zr)]),e.createElementVNode("div",Qr,[b[19]||(b[19]=e.createElementVNode("label",{class:"property-label"},"连接器类型",-1)),e.createElementVNode("select",{class:"property-select",value:((R=(I=g.selectedEdge)==null?void 0:I.getConnector())==null?void 0:R.name)||"rounded",onChange:y},[...b[18]||(b[18]=[e.createElementVNode("option",{value:"rounded"},"圆角",-1),e.createElementVNode("option",{value:"smooth"},"平滑",-1),e.createElementVNode("option",{value:"normal"},"普通",-1)])],40,el)])]),e.createElementVNode("div",{class:"property-section"},[e.createElementVNode("button",{class:"delete-btn",onClick:k}," 删除连线 ")])])}}}),[["__scopeId","data-v-e47f1784"]]),ol={class:"event-card"},nl={class:"header-left"},al={class:"collapse-icon"},rl={class:"event-title"},ll={class:"event-card-body"},sl={class:"event-field"},il=["value"],cl={class:"event-field"},dl=["value"],pl={class:"event-field"},xl=["value"],fl={class:"condition-config"},ml=["value"],ul=["value"],gl=["value"],El=["value"],hl={key:0,class:"config-section"},vl={key:1,class:"config-section"},bl={key:2,class:"config-section"},yl={key:0,class:"selected-workflow-info"},Cl={class:"info-row"},Bl={class:"info-value"},kl={class:"event-field"},Nl=["value"],Je=re(e.defineComponent({__name:"EventCard",props:{event:{},index:{},isCollapsed:{type:Boolean},nodeProperties:{}},emits:["toggle-collapse","remove","update-field","update-condition","update-params","open-attribute-config","open-custom-code","open-workflow-selector"],setup(g){return(h,o)=>{var r,n,l,E,c,x,s;return e.openBlock(),e.createElementBlock("div",ol,[e.createElementVNode("div",{class:"event-card-header",onClick:o[1]||(o[1]=a=>h.$emit("toggle-collapse"))},[e.createElementVNode("div",nl,[e.createElementVNode("span",al,e.toDisplayString(g.isCollapsed?"▶":"▼"),1),e.createElementVNode("span",rl,"事件"+e.toDisplayString(g.index+1),1)]),e.createElementVNode("button",{class:"btn-remove",onClick:o[0]||(o[0]=e.withModifiers(a=>h.$emit("remove"),["stop"])),title:"删除事件"},"🗑")]),e.withDirectives(e.createElementVNode("div",ll,[e.createElementVNode("div",sl,[o[12]||(o[12]=e.createElementVNode("label",null,"事件名称",-1)),e.createElementVNode("input",{type:"text",value:g.event.name||"",onInput:o[2]||(o[2]=a=>h.$emit("update-field","name",a)),placeholder:"输入事件名称,如:温度报警、湿度预警"},null,40,il)]),e.createElementVNode("div",cl,[o[14]||(o[14]=e.createElementVNode("label",null,"事件类型",-1)),e.createElementVNode("select",{value:g.event.type,onChange:o[3]||(o[3]=a=>h.$emit("update-field","type",a))},[...o[13]||(o[13]=[e.createStaticVNode('<option value="click" data-v-af7c633a>单击</option><option value="dblclick" data-v-af7c633a>双击</option><option value="mouseenter" data-v-af7c633a>鼠标移入</option><option value="mouseleave" data-v-af7c633a>鼠标移出</option><option value="focus" data-v-af7c633a>获取焦点</option><option value="blur" data-v-af7c633a>失去焦点</option><option value="input" data-v-af7c633a>输入</option><option value="change" data-v-af7c633a>值变化</option>',8)])],40,dl)]),e.createElementVNode("div",pl,[o[16]||(o[16]=e.createElementVNode("label",null,"事件行为",-1)),e.createElementVNode("select",{value:g.event.action,onChange:o[4]||(o[4]=a=>h.$emit("update-field","action",a))},[...o[15]||(o[15]=[e.createElementVNode("option",{value:"attributeChange"},"更改属性",-1),e.createElementVNode("option",{value:"customCode"},"自定义代码",-1),e.createElementVNode("option",{value:"callProcess"},"调用流程",-1)])],40,xl)]),o[30]||(o[30]=e.createElementVNode("div",{class:"section-title"},"形参配置",-1)),o[31]||(o[31]=e.createElementVNode("div",{class:"field-hint"},"(不填直接触发)",-1)),o[32]||(o[32]=e.createElementVNode("div",{class:"section-title"},"触发规则",-1)),o[33]||(o[33]=e.createElementVNode("div",{class:"field-hint"},"(不填写条件则直接触发,填写后按条件触发)",-1)),e.createElementVNode("div",fl,[o[19]||(o[19]=e.createElementVNode("div",{class:"condition-label"},"当",-1)),o[20]||(o[20]=e.createElementVNode("div",{class:"condition-label"},"当前节点属性",-1)),e.createElementVNode("select",{class:"condition-select",value:((r=g.event.condition)==null?void 0:r.attribute)||"",onChange:o[5]||(o[5]=a=>h.$emit("update-condition","attribute",a))},[o[17]||(o[17]=e.createElementVNode("option",{value:""},"选择属性",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.nodeProperties,a=>(e.openBlock(),e.createElementBlock("option",{key:a.key,value:a.key},e.toDisplayString(a.label),9,ul))),128))],40,ml),o[21]||(o[21]=e.createElementVNode("div",{class:"condition-label"},"运算符",-1)),e.createElementVNode("select",{class:"condition-select",value:((n=g.event.condition)==null?void 0:n.operator)||"==",onChange:o[6]||(o[6]=a=>h.$emit("update-condition","operator",a))},[...o[18]||(o[18]=[e.createStaticVNode('<option value="==" data-v-af7c633a>等于</option><option value="!=" data-v-af7c633a>不等于</option><option value="&gt;" data-v-af7c633a>大于</option><option value="&gt;=" data-v-af7c633a>大于等于</option><option value="&lt;" data-v-af7c633a>小于</option><option value="&lt;=" data-v-af7c633a>小于等于</option><option value="contains" data-v-af7c633a>包含</option>',7)])],40,gl),o[22]||(o[22]=e.createElementVNode("div",{class:"condition-label"},"值",-1)),e.createElementVNode("input",{type:"text",class:"condition-input",value:((l=g.event.condition)==null?void 0:l.value)||"",onInput:o[7]||(o[7]=a=>h.$emit("update-condition","value",a)),placeholder:"输入值"},null,40,El),o[23]||(o[23]=e.createElementVNode("div",{class:"condition-label"},"时",-1)),o[24]||(o[24]=e.createElementVNode("div",{class:"condition-label"},"触发该事件",-1))]),g.event.action==="attributeChange"?(e.openBlock(),e.createElementBlock("div",hl,[o[25]||(o[25]=e.createElementVNode("div",{class:"section-title"},"属性更改",-1)),e.createElementVNode("button",{class:"btn-config",onClick:o[8]||(o[8]=a=>h.$emit("open-attribute-config"))},"点击配置")])):e.createCommentVNode("",!0),g.event.action==="customCode"?(e.openBlock(),e.createElementBlock("div",vl,[o[26]||(o[26]=e.createElementVNode("div",{class:"section-title"},"自定义代码",-1)),e.createElementVNode("button",{class:"btn-config",onClick:o[9]||(o[9]=a=>h.$emit("open-custom-code"))},"点击配置")])):e.createCommentVNode("",!0),g.event.action==="callProcess"?(e.openBlock(),e.createElementBlock("div",bl,[o[29]||(o[29]=e.createElementVNode("div",{class:"section-title"},"调用流程",-1)),e.createElementVNode("button",{class:"btn-config",onClick:o[10]||(o[10]=a=>h.$emit("open-workflow-selector"))},"选择流程"),(E=g.event.params)!=null&&E.processId?(e.openBlock(),e.createElementBlock("div",yl,[e.createElementVNode("div",Cl,[o[27]||(o[27]=e.createElementVNode("span",{class:"info-label"},"已选择:",-1)),e.createElementVNode("span",Bl,e.toDisplayString(((c=g.event.params)==null?void 0:c.processName)||((x=g.event.params)==null?void 0:x.processId)),1)]),e.createElementVNode("div",kl,[o[28]||(o[28]=e.createElementVNode("label",null,"传入参数",-1)),e.createElementVNode("textarea",{value:((s=g.event.params)==null?void 0:s.processParams)||"",onInput:o[11]||(o[11]=a=>h.$emit("update-params","processParams",a)),placeholder:'JSON格式: {"param1":"value1","param2":"value2"}',rows:"3"},null,40,Nl)])])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)],512),[[e.vShow,!g.isCollapsed]])])}}}),[["__scopeId","data-v-af7c633a"]]);var pe=(g=>(g.BOOLEAN="boolean",g.NUMBER="number",g.STRING="string",g))(pe||{}),xe=(g=>(g.READ="read",g.WRITE="write",g.READ_WRITE="readWrite",g))(xe||{}),Me=(g=>(g.ONLINE="online",g.OFFLINE="offline",g.ERROR="error",g.MAINTENANCE="maintenance",g))(Me||{}),He=(g=>(g.PLC="plc",g.SENSOR="sensor",g.ACTUATOR="actuator",g.METER="meter",g.CAMERA="camera",g.OTHER="other",g))(He||{});const Ze=[{id:"device_001",name:"1号温控设备",code:"TC-001",type:He.PLC,description:"车间1号温控PLC",status:Me.ONLINE,ipAddress:"192.168.1.101",port:502,protocol:"Modbus TCP",enabled:!0,tags:["车间1","温控","PLC"],points:[{id:"point_001_01",name:"当前温度",code:"40001",description:"实时温度采集",dataType:pe.NUMBER,accessMode:xe.READ,value:25.5,unit:"°C",minValue:-20,maxValue:100,precision:1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_001_02",name:"设定温度",code:"40002",description:"目标温度设定值",dataType:pe.NUMBER,accessMode:xe.READ_WRITE,value:28,unit:"°C",minValue:0,maxValue:50,precision:1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_001_03",name:"加热状态",code:"40003",description:"加热器运行状态",dataType:pe.BOOLEAN,accessMode:xe.READ,value:!0,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_001_04",name:"告警状态",code:"40004",description:"设备告警状态",dataType:pe.BOOLEAN,accessMode:xe.READ,value:!1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"}],createTime:"2025-01-01 00:00:00",updateTime:"2025-12-17 08:15:00"},{id:"device_002",name:"主管道压力传感器",code:"PS-001",type:He.SENSOR,description:"主管道压力监测",status:Me.ONLINE,ipAddress:"192.168.1.102",port:502,protocol:"Modbus TCP",enabled:!0,tags:["管道","压力","传感器"],points:[{id:"point_002_01",name:"当前压力",code:"40001",description:"实时压力值",dataType:pe.NUMBER,accessMode:xe.READ,value:1.25,unit:"MPa",minValue:0,maxValue:5,precision:2,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_002_02",name:"压力上限",code:"40002",description:"压力告警上限",dataType:pe.NUMBER,accessMode:xe.READ_WRITE,value:2,unit:"MPa",minValue:0,maxValue:5,precision:2,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_002_03",name:"压力下限",code:"40003",description:"压力告警下限",dataType:pe.NUMBER,accessMode:xe.READ_WRITE,value:.5,unit:"MPa",minValue:0,maxValue:5,precision:2,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"}],createTime:"2025-01-01 00:00:00",updateTime:"2025-12-17 08:15:00"},{id:"device_003",name:"1号电机控制器",code:"MC-001",type:He.ACTUATOR,description:"主传送带电机控制",status:Me.ONLINE,ipAddress:"192.168.1.103",port:502,protocol:"Modbus TCP",enabled:!0,tags:["电机","控制器","传送带"],points:[{id:"point_003_01",name:"运行状态",code:"40001",description:"电机运行状态",dataType:pe.BOOLEAN,accessMode:xe.READ,value:!0,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_02",name:"启动命令",code:"40002",description:"电机启动控制",dataType:pe.BOOLEAN,accessMode:xe.WRITE,value:!1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_03",name:"停止命令",code:"40003",description:"电机停止控制",dataType:pe.BOOLEAN,accessMode:xe.WRITE,value:!1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_04",name:"当前转速",code:"40004",description:"电机实时转速",dataType:pe.NUMBER,accessMode:xe.READ,value:1450,unit:"RPM",minValue:0,maxValue:3e3,precision:0,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_05",name:"设定转速",code:"40005",description:"目标转速设定",dataType:pe.NUMBER,accessMode:xe.READ_WRITE,value:1500,unit:"RPM",minValue:0,maxValue:3e3,precision:0,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_06",name:"电流",code:"40006",description:"电机运行电流",dataType:pe.NUMBER,accessMode:xe.READ,value:12.5,unit:"A",minValue:0,maxValue:50,precision:1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"}],createTime:"2025-01-01 00:00:00",updateTime:"2025-12-17 08:15:00"},{id:"device_004",name:"进水流量计",code:"FM-001",type:He.METER,description:"进水管道流量监测",status:Me.OFFLINE,ipAddress:"192.168.1.104",port:502,protocol:"Modbus TCP",enabled:!0,tags:["流量","仪表","进水"],points:[{id:"point_004_01",name:"瞬时流量",code:"40001",description:"当前流量值",dataType:pe.NUMBER,accessMode:xe.READ,value:0,unit:"m³/h",minValue:0,maxValue:100,precision:2,enabled:!0,quality:"bad",updateTime:"2025-12-17 07:30:00"},{id:"point_004_02",name:"累计流量",code:"40002",description:"累计流量统计",dataType:pe.NUMBER,accessMode:xe.READ,value:12345.67,unit:"m³",minValue:0,maxValue:999999,precision:2,enabled:!0,quality:"bad",updateTime:"2025-12-17 07:30:00"}],createTime:"2025-01-01 00:00:00",updateTime:"2025-12-17 07:30:00"}];Ze.length;const Qt=g=>Ze.find(h=>h.id===g),Vl=(g,h)=>{const o=Qt(g);if(o)return o.points.find(r=>r.id===h)},Dl={class:"device-point-selector"},Al={class:"device-list-panel"},_l={class:"panel-header"},Fl={class:"device-count"},$l={class:"search-box"},wl={class:"device-list"},Sl=["onClick"],Il={class:"device-info"},zl={class:"device-name"},Tl={class:"device-meta"},Pl={class:"device-code"},Rl={class:"point-count"},Ml={key:0,class:"empty-hint"},Hl={class:"point-list-panel"},Ol={class:"panel-header"},Ul={key:0,class:"point-count"},Ll={key:0,class:"search-box"},Wl={class:"point-list"},ql={key:0,class:"empty-hint"},Gl={key:1,class:"empty-hint"},jl=["onClick"],Xl={class:"point-info"},Yl={class:"point-name"},Kl={class:"point-meta"},Jl={class:"point-code"},Zl={key:0,class:"point-unit"},Ql={class:"point-type"},es={key:0,class:"point-value"},ts={class:"value"},os={class:"modal-footer"},ns=["disabled"],as=re(e.defineComponent({__name:"DevicePointSelector",props:{visible:{type:Boolean},modelValue:{}},emits:["update:visible","update:modelValue","confirm"],setup(g,{emit:h}){const o=g,r=h,n=e.ref(Ze),l=e.ref(null),E=e.ref(null),c=e.ref(""),x=e.ref("");if(o.modelValue){const[d,p]=o.modelValue.split(":"),f=n.value.find(C=>C.id===d);f&&(l.value=f,E.value=f.points.find(C=>C.id===p)||null)}const s=e.computed(()=>{if(!c.value)return n.value;const d=c.value.toLowerCase();return n.value.filter(p=>p.name.toLowerCase().includes(d)||p.code.toLowerCase().includes(d))}),a=e.computed(()=>{if(!l.value)return[];if(!x.value)return l.value.points;const d=x.value.toLowerCase();return l.value.points.filter(p=>p.name.toLowerCase().includes(d)||p.code.toLowerCase().includes(d))}),t=d=>{l.value=d,E.value=null,x.value=""},i=d=>{d.enabled&&(E.value=d)},m=()=>{r("update:visible",!1)},u=()=>{if(!l.value||!E.value)return;const d=`${l.value.id}:${E.value.id}`;r("update:modelValue",d),r("confirm",l.value.id,E.value.id,l.value,E.value),r("update:visible",!1)},y=d=>({read:"只读",write:"只写",readWrite:"读写"})[d]||d,k=d=>({boolean:"布尔",number:"数值",string:"字符",json:"JSON"})[d]||d,V=d=>d.value===void 0||d.value===null?"-":d.dataType==="boolean"?d.value?"是":"否":d.dataType==="number"&&d.precision!==void 0?Number(d.value).toFixed(d.precision):String(d.value);return(d,p)=>g.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"modal-overlay",onClick:m},[e.createElementVNode("div",{class:"modal-container",onClick:p[2]||(p[2]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",{class:"modal-header"},[p[3]||(p[3]=e.createElementVNode("h3",null,"选择设备点位",-1)),e.createElementVNode("button",{class:"btn-close",onClick:m},"✕")]),e.createElementVNode("div",Dl,[e.createElementVNode("div",Al,[e.createElementVNode("div",_l,[p[4]||(p[4]=e.createElementVNode("h4",null,"设备列表",-1)),e.createElementVNode("span",Fl,e.toDisplayString(n.value.length),1)]),e.createElementVNode("div",$l,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[0]||(p[0]=f=>c.value=f),type:"text",placeholder:"搜索设备...",class:"search-input"},null,512),[[e.vModelText,c.value]])]),e.createElementVNode("div",wl,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,f=>{var C;return e.openBlock(),e.createElementBlock("div",{key:f.id,class:e.normalizeClass(["device-item",{active:((C=l.value)==null?void 0:C.id)===f.id,offline:f.status==="offline"}]),onClick:b=>t(f)},[e.createElementVNode("div",Il,[e.createElementVNode("div",zl,[e.createElementVNode("span",{class:e.normalizeClass(["status-dot",f.status])},null,2),e.createTextVNode(" "+e.toDisplayString(f.name),1)]),e.createElementVNode("div",Tl,[e.createElementVNode("span",Pl,e.toDisplayString(f.code),1),e.createElementVNode("span",Rl,e.toDisplayString(f.points.length)+" 点",1)])]),p[5]||(p[5]=e.createElementVNode("div",{class:"device-arrow"},"›",-1))],10,Sl)}),128)),s.value.length===0?(e.openBlock(),e.createElementBlock("div",Ml," 暂无设备 ")):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Hl,[e.createElementVNode("div",Ol,[e.createElementVNode("h4",null,e.toDisplayString(l.value?l.value.name:"点位列表"),1),l.value?(e.openBlock(),e.createElementBlock("span",Ul,e.toDisplayString(a.value.length),1)):e.createCommentVNode("",!0)]),l.value?(e.openBlock(),e.createElementBlock("div",Ll,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[1]||(p[1]=f=>x.value=f),type:"text",placeholder:"搜索点位...",class:"search-input"},null,512),[[e.vModelText,x.value]])])):e.createCommentVNode("",!0),e.createElementVNode("div",Wl,[l.value?a.value.length===0?(e.openBlock(),e.createElementBlock("div",Gl," 暂无点位 ")):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(a.value,f=>{var C;return e.openBlock(),e.createElementBlock("div",{key:f.id,class:e.normalizeClass(["point-item",{active:((C=E.value)==null?void 0:C.id)===f.id,disabled:!f.enabled}]),onClick:b=>i(f)},[e.createElementVNode("div",Xl,[e.createElementVNode("div",Yl,[e.createTextVNode(e.toDisplayString(f.name)+" ",1),e.createElementVNode("span",{class:e.normalizeClass(["access-mode",f.accessMode])},e.toDisplayString(y(f.accessMode)),3)]),e.createElementVNode("div",Kl,[e.createElementVNode("span",Jl,e.toDisplayString(f.code),1),f.unit?(e.openBlock(),e.createElementBlock("span",Zl,e.toDisplayString(f.unit),1)):e.createCommentVNode("",!0),e.createElementVNode("span",Ql,e.toDisplayString(k(f.dataType)),1)]),f.value!==void 0?(e.openBlock(),e.createElementBlock("div",es,[p[6]||(p[6]=e.createTextVNode(" 当前值: ",-1)),e.createElementVNode("span",ts,e.toDisplayString(V(f)),1),e.createElementVNode("span",{class:e.normalizeClass(["quality",f.quality])},e.toDisplayString(f.quality),3)])):e.createCommentVNode("",!0)])],10,jl)}),128)):(e.openBlock(),e.createElementBlock("div",ql," ← 请先选择设备 "))])])]),e.createElementVNode("div",os,[e.createElementVNode("button",{class:"btn-cancel",onClick:m},"取消"),e.createElementVNode("button",{class:"btn-confirm",disabled:!E.value,onClick:u}," 确定 ",8,ns)])])])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-7884b850"]]);var Ve=(g=>(g.DIRECT="direct",g.BOOLEAN="boolean",g.RANGE="range",g.ENUM="enum",g))(Ve||{}),Oe=(g=>(g.BOOLEAN="boolean",g.NUMBER="number",g.STRING="string",g))(Oe||{});const rs={class:"mapping-configurator"},ls={class:"config-item"},ss={key:0,class:"field-hint error"},is={key:1,class:"field-hint"},cs={class:"config-item"},ds={key:0,class:"field-hint error"},ps={key:1,class:"field-hint"},xs={key:0,class:"config-item"},fs={class:"unit-config"},ms={class:"checkbox-label"},us={key:0,class:"custom-unit"},gs={key:1,class:"mapping-details"},Es={class:"config-item"},hs={class:"config-item"},vs={key:2,class:"mapping-details"},bs={class:"range-rules"},ys=["onUpdate:modelValue"],Cs=["onUpdate:modelValue"],Bs=["onUpdate:modelValue"],ks=["onClick"],Ns={key:3,class:"mapping-details"},Vs={class:"enum-mappings"},Ds=["value","onInput"],As=["onUpdate:modelValue"],_s=["onClick"],Fs={key:4,class:"mapping-preview"},$s={class:"preview-content"},ws={class:"preview-item"},Ss={class:"preview-output"},Is={class:"preview-item"},zs={class:"preview-output"},Ts={class:"preview-input"},Ps={class:"preview-output"},Rs={class:"preview-input"},Ms={class:"preview-output"},Hs=re(e.defineComponent({__name:"MappingConfigurator",props:{visible:{type:Boolean},modelValue:{}},emits:["update:visible","update:modelValue","confirm"],setup(g,{emit:h}){const o=g,r=h,n=e.ref(o.modelValue||{type:"",valueType:""});e.watch(()=>o.modelValue,V=>{V&&(n.value={...V})},{deep:!0});const l=()=>{n.value.type||(n.value.valueType===Oe.BOOLEAN?n.value.type=Ve.BOOLEAN:n.value.valueType===Oe.NUMBER?n.value.type=Ve.RANGE:n.value.type=Ve.DIRECT),n.value.valueType!==Oe.NUMBER&&(delete n.value.keepOriginalUnit,delete n.value.customUnit)},E=V=>({boolean:"适用于开关状态、是否判断等场景",number:"适用于温度、压力、流量等数值型数据",string:"适用于文本、状态码等字符型数据"})[V]||"",c=V=>({direct:"不做任何转换,直接使用原始值",boolean:"根据 true/false 转换为不同的值",range:"根据数值范围转换为对应值",enum:"根据枚举键值对转换"})[V]||"",x=()=>{const V=n.value.valueType;n.value={type:n.value.type,valueType:V},n.value.type===Ve.RANGE?n.value.rangeRules=[]:n.value.type===Ve.ENUM&&(n.value.enumMappings={})},s=()=>{n.value.rangeRules||(n.value.rangeRules=[]),n.value.rangeRules.push({min:0,max:100,value:""})},a=V=>{var d;(d=n.value.rangeRules)==null||d.splice(V,1)},t=()=>{n.value.enumMappings||(n.value.enumMappings={});const V=`key_${Object.keys(n.value.enumMappings).length+1}`;n.value.enumMappings[V]=""},i=V=>{n.value.enumMappings&&delete n.value.enumMappings[V]},m=(V,d)=>{const p=V.target.value;if(!n.value.enumMappings||p===d)return;const f=n.value.enumMappings[d];delete n.value.enumMappings[d],n.value.enumMappings[p]=f},u=()=>{},y=()=>{r("update:visible",!1)},k=()=>{if(!n.value.valueType){alert("请选择值类型!");return}if(!n.value.type){alert("请选择映射类型!");return}r("update:modelValue",{...n.value}),r("confirm",{...n.value}),r("update:visible",!1)};return(V,d)=>g.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"modal-overlay",onClick:y},[e.createElementVNode("div",{class:"modal-container",onClick:d[6]||(d[6]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",{class:"modal-header"},[d[7]||(d[7]=e.createElementVNode("h3",null,"值映射配置",-1)),e.createElementVNode("button",{class:"btn-close",onClick:y},"✕")]),e.createElementVNode("div",rs,[e.createElementVNode("div",ls,[d[9]||(d[9]=e.createElementVNode("label",null,[e.createTextVNode("值类型 "),e.createElementVNode("span",{class:"required"},"*")],-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":d[0]||(d[0]=p=>n.value.valueType=p),onChange:l},[...d[8]||(d[8]=[e.createElementVNode("option",{value:""},"请选择值类型",-1),e.createElementVNode("option",{value:"boolean"},"布尔型 (true/false)",-1),e.createElementVNode("option",{value:"number"},"数值型 (123, 45.6)",-1),e.createElementVNode("option",{value:"string"},'字符串型 ("abc")',-1)])],544),[[e.vModelSelect,n.value.valueType]]),n.value.valueType?(e.openBlock(),e.createElementBlock("div",is,e.toDisplayString(E(n.value.valueType)),1)):(e.openBlock(),e.createElementBlock("div",ss," 值类型为必填项 "))]),e.createElementVNode("div",cs,[d[11]||(d[11]=e.createElementVNode("label",null,[e.createTextVNode("映射类型 "),e.createElementVNode("span",{class:"required"},"*")],-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":d[1]||(d[1]=p=>n.value.type=p),onChange:x},[...d[10]||(d[10]=[e.createStaticVNode('<option value="" data-v-ef9e0ee1>请选择映射类型</option><option value="direct" data-v-ef9e0ee1>直接映射(无转换)</option><option value="boolean" data-v-ef9e0ee1>布尔映射</option><option value="range" data-v-ef9e0ee1>范围映射</option><option value="enum" data-v-ef9e0ee1>枚举映射</option>',5)])],544),[[e.vModelSelect,n.value.type]]),n.value.type?(e.openBlock(),e.createElementBlock("div",ps,e.toDisplayString(c(n.value.type)),1)):(e.openBlock(),e.createElementBlock("div",ds," 映射类型为必填项 "))]),n.value.valueType==="number"?(e.openBlock(),e.createElementBlock("div",xs,[d[13]||(d[13]=e.createElementVNode("label",null,"单位配置",-1)),e.createElementVNode("div",fs,[e.createElementVNode("label",ms,[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":d[2]||(d[2]=p=>n.value.keepOriginalUnit=p),onChange:u},null,544),[[e.vModelCheckbox,n.value.keepOriginalUnit]]),d[12]||(d[12]=e.createTextVNode(" 保留点位原始单位 ",-1))]),n.value.keepOriginalUnit?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",us,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":d[3]||(d[3]=p=>n.value.customUnit=p),type:"text",placeholder:"自定义单位,如: °C, MPa, %",onInput:u},null,544),[[e.vModelText,n.value.customUnit]])]))])])):e.createCommentVNode("",!0),n.value.type==="boolean"?(e.openBlock(),e.createElementBlock("div",gs,[e.createElementVNode("div",Es,[d[14]||(d[14]=e.createElementVNode("label",null,"True 时的值",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":d[4]||(d[4]=p=>n.value.trueValue=p),type:"text",placeholder:"例如: 运行、#00ff00",onInput:u},null,544),[[e.vModelText,n.value.trueValue]])]),e.createElementVNode("div",hs,[d[15]||(d[15]=e.createElementVNode("label",null,"False 时的值",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":d[5]||(d[5]=p=>n.value.falseValue=p),type:"text",placeholder:"例如: 停止、#ff0000",onInput:u},null,544),[[e.vModelText,n.value.falseValue]])])])):e.createCommentVNode("",!0),n.value.type==="range"?(e.openBlock(),e.createElementBlock("div",vs,[e.createElementVNode("div",bs,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value.rangeRules,(p,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"range-rule"},[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":C=>p.min=C,type:"number",placeholder:"最小值",onInput:u},null,40,ys),[[e.vModelText,p.min,void 0,{number:!0}]]),d[16]||(d[16]=e.createElementVNode("span",{class:"range-separator"},"~",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":C=>p.max=C,type:"number",placeholder:"最大值",onInput:u},null,40,Cs),[[e.vModelText,p.max,void 0,{number:!0}]]),d[17]||(d[17]=e.createElementVNode("span",{class:"range-arrow"},"→",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":C=>p.value=C,type:"text",placeholder:"映射值",onInput:u},null,40,Bs),[[e.vModelText,p.value]]),e.createElementVNode("button",{class:"btn-remove-rule",onClick:C=>a(f),title:"删除规则"}," ✕ ",8,ks)]))),128))]),e.createElementVNode("button",{class:"btn-add-rule",onClick:s}," + 添加范围规则 ")])):e.createCommentVNode("",!0),n.value.type==="enum"?(e.openBlock(),e.createElementBlock("div",Ns,[e.createElementVNode("div",Vs,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value.enumMappings,(p,f,C)=>(e.openBlock(),e.createElementBlock("div",{key:C,class:"enum-mapping"},[e.createElementVNode("input",{value:f,type:"text",placeholder:"原始值",onInput:b=>m(b,f)},null,40,Ds),d[18]||(d[18]=e.createElementVNode("span",{class:"enum-arrow"},"→",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":b=>n.value.enumMappings[f]=b,type:"text",placeholder:"映射值",onInput:u},null,40,As),[[e.vModelText,n.value.enumMappings[f]]]),e.createElementVNode("button",{class:"btn-remove-rule",onClick:b=>i(f),title:"删除映射"}," ✕ ",8,_s)]))),128))]),e.createElementVNode("button",{class:"btn-add-rule",onClick:t}," + 添加枚举映射 ")])):e.createCommentVNode("",!0),n.value.type!=="direct"?(e.openBlock(),e.createElementBlock("div",Fs,[d[25]||(d[25]=e.createElementVNode("label",null,"映射预览",-1)),e.createElementVNode("div",$s,[n.value.type==="boolean"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("div",ws,[d[19]||(d[19]=e.createElementVNode("span",{class:"preview-input"},"true",-1)),d[20]||(d[20]=e.createElementVNode("span",{class:"preview-arrow"},"→",-1)),e.createElementVNode("span",Ss,e.toDisplayString(n.value.trueValue||"true"),1)]),e.createElementVNode("div",Is,[d[21]||(d[21]=e.createElementVNode("span",{class:"preview-input"},"false",-1)),d[22]||(d[22]=e.createElementVNode("span",{class:"preview-arrow"},"→",-1)),e.createElementVNode("span",zs,e.toDisplayString(n.value.falseValue||"false"),1)])],64)):n.value.type==="range"?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(n.value.rangeRules,(p,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"preview-item"},[e.createElementVNode("span",Ts,"["+e.toDisplayString(p.min)+" ~ "+e.toDisplayString(p.max)+"]",1),d[23]||(d[23]=e.createElementVNode("span",{class:"preview-arrow"},"→",-1)),e.createElementVNode("span",Ps,e.toDisplayString(p.value),1)]))),128)):n.value.type==="enum"?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(n.value.enumMappings,(p,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"preview-item"},[e.createElementVNode("span",Rs,e.toDisplayString(f),1),d[24]||(d[24]=e.createElementVNode("span",{class:"preview-arrow"},"→",-1)),e.createElementVNode("span",Ms,e.toDisplayString(p),1)]))),128)):e.createCommentVNode("",!0)])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",{class:"modal-footer"},[e.createElementVNode("button",{class:"btn-cancel",onClick:y},"取消"),e.createElementVNode("button",{class:"btn-confirm",onClick:k},"确定")])])])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-ef9e0ee1"]]),Os={class:"event-card"},Us={class:"header-left"},Ls={class:"collapse-icon"},Ws={class:"event-title"},qs={class:"event-card-body"},Gs={class:"property-item"},js={key:0,class:"selected-point"},Xs={class:"point-main"},Ys={class:"device-name"},Ks={class:"point-name"},Js={class:"point-details"},Zs={class:"point-code"},Qs={key:0,class:"point-unit"},ei={key:1,class:"placeholder"},ti={class:"property-item"},oi=["value"],ni=["value"],ai={class:"property-item"},ri={key:0,class:"mapping-summary"},li={class:"mapping-type-label"},si={class:"mapping-detail"},ii={key:1,class:"placeholder"},Qe=re(e.defineComponent({__name:"BindingCard",props:{binding:{},index:{},isCollapsed:{type:Boolean},nodeProperties:{}},emits:["toggle-collapse","remove","update-field"],setup(g,{emit:h}){const o=g,r=h,n=e.ref(o.binding.devicePointId||""),l=e.ref(!1),E=e.ref(!1),c=e.ref(o.binding.mapping||{type:Ve.DIRECT,valueType:Oe.NUMBER});e.watch(()=>o.binding.devicePointId,m=>{n.value=m||""}),e.watch(()=>o.binding.mapping,m=>{m&&(c.value=m)},{deep:!0});const x=e.computed(()=>{if(!n.value)return null;const[m,u]=n.value.split(":");if(!m||!u)return null;const y=Qt(m),k=y?Vl(m,u):null;return!y||!k?null:{deviceName:y.name,pointName:k.name,pointCode:k.code,pointUnit:k.unit}}),s=(m,u,y,k)=>{const V=new Event("change");Object.defineProperty(V,"target",{value:{value:`${m}:${u}`},writable:!1}),r("update-field","devicePointId",V),console.log("选择了点位:",{device:y.name,point:k.name,dataType:k.dataType,accessMode:k.accessMode})},a=m=>{const u=new Event("change");Object.defineProperty(u,"target",{value:{value:m},writable:!1}),r("update-field","mapping",u)},t=m=>({direct:"直接映射",boolean:"布尔映射",range:"范围映射",enum:"枚举映射"})[m]||m,i=()=>{const m=c.value;return m.type==="boolean"?`True:${m.trueValue||"true"} / False:${m.falseValue||"false"}`:m.type==="range"&&m.rangeRules?`${m.rangeRules.length} 个范围规则`:m.type==="enum"&&m.enumMappings?`${Object.keys(m.enumMappings).length} 个枚举映射`:""};return(m,u)=>(e.openBlock(),e.createElementBlock("div",Os,[e.createElementVNode("div",{class:"event-card-header",onClick:u[1]||(u[1]=y=>m.$emit("toggle-collapse"))},[e.createElementVNode("div",Us,[e.createElementVNode("span",Ls,e.toDisplayString(g.isCollapsed?"▶":"▼"),1),e.createElementVNode("span",Ws,"绑定"+e.toDisplayString(g.index+1),1)]),e.createElementVNode("button",{class:"btn-remove",onClick:u[0]||(u[0]=e.withModifiers(y=>m.$emit("remove"),["stop"])),title:"删除绑定"},"🗑")]),e.withDirectives(e.createElementVNode("div",qs,[e.createElementVNode("div",Gs,[u[10]||(u[10]=e.createElementVNode("label",null,"设备点位",-1)),e.createElementVNode("div",{class:"point-selector-trigger",onClick:u[2]||(u[2]=y=>l.value=!0)},[x.value?(e.openBlock(),e.createElementBlock("div",js,[e.createElementVNode("div",Xs,[e.createElementVNode("span",Ys,e.toDisplayString(x.value.deviceName),1),e.createElementVNode("span",Ks,e.toDisplayString(x.value.pointName),1)]),e.createElementVNode("div",Js,[e.createElementVNode("span",Zs,e.toDisplayString(x.value.pointCode),1),x.value.pointUnit?(e.openBlock(),e.createElementBlock("span",Qs,e.toDisplayString(x.value.pointUnit),1)):e.createCommentVNode("",!0)])])):(e.openBlock(),e.createElementBlock("div",ei," 点击选择设备点位 ")),u[9]||(u[9]=e.createElementVNode("span",{class:"selector-arrow"},"›",-1))])]),e.createVNode(as,{visible:l.value,"onUpdate:visible":u[3]||(u[3]=y=>l.value=y),modelValue:n.value,"onUpdate:modelValue":u[4]||(u[4]=y=>n.value=y),onConfirm:s},null,8,["visible","modelValue"]),e.createElementVNode("div",ti,[u[12]||(u[12]=e.createElementVNode("label",null,"目标属性",-1)),e.createElementVNode("select",{value:g.binding.targetProperty||"",onChange:u[5]||(u[5]=y=>m.$emit("update-field","targetProperty",y))},[u[11]||(u[11]=e.createElementVNode("option",{value:""},"选择属性",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.nodeProperties,y=>(e.openBlock(),e.createElementBlock("option",{key:y.key,value:y.key},e.toDisplayString(y.label),9,ni))),128))],40,oi)]),e.createElementVNode("div",ai,[u[14]||(u[14]=e.createElementVNode("label",null,"值映射配置",-1)),e.createElementVNode("div",{class:"mapping-trigger",onClick:u[6]||(u[6]=y=>E.value=!0)},[c.value.type!=="direct"?(e.openBlock(),e.createElementBlock("div",ri,[e.createElementVNode("span",li,e.toDisplayString(t(c.value.type)),1),e.createElementVNode("span",si,e.toDisplayString(i()),1)])):(e.openBlock(),e.createElementBlock("div",ii," 点击配置值映射 ")),u[13]||(u[13]=e.createElementVNode("span",{class:"selector-arrow"},"›",-1))])]),e.createVNode(Hs,{visible:E.value,"onUpdate:visible":u[7]||(u[7]=y=>E.value=y),modelValue:c.value,"onUpdate:modelValue":u[8]||(u[8]=y=>c.value=y),onConfirm:a},null,8,["visible","modelValue"])],512),[[e.vShow,!g.isCollapsed]])]))}}),[["__scopeId","data-v-3731c19a"]]),ci={class:"dialog-content"},di={class:"dialog-header"},pi={class:"dialog-body"},xi={class:"group-row"},fi={class:"group-field"},mi=["value","onChange"],ui=["value"],gi={class:"group-field group-field-value"},Ei=["value","onInput"],hi=["value","onInput"],vi={key:2,class:"color-input-wrapper"},bi=["value","onInput"],yi={class:"color-value"},Ci=["value","onChange"],Bi=["onClick"],ki={key:0,class:"empty-hint"},Ni={class:"dialog-footer"},et=re(e.defineComponent({__name:"AttributeConfigDialog",props:{attributeGroups:{},nodeProperties:{}},emits:["close","save","add-group","remove-group","update-group"],setup(g,{emit:h}){const o=g,r=h,n=c=>{const x=o.nodeProperties.find(s=>s.key===c);return(x==null?void 0:x.type)||"text"},l=(c,x,s)=>{const a=s.target.value;r("update-group",c,x,a)},E=()=>{for(const c of o.attributeGroups)if(!c.property){alert("请为每组配置选择目标属性");return}r("save")};return(c,x)=>(e.openBlock(),e.createElementBlock("div",{class:"dialog-overlay",onClick:x[3]||(x[3]=e.withModifiers(s=>c.$emit("close"),["self"]))},[e.createElementVNode("div",ci,[e.createElementVNode("div",di,[x[4]||(x[4]=e.createElementVNode("h3",null,"事件属性更改配置",-1)),e.createElementVNode("button",{class:"btn-close",onClick:x[0]||(x[0]=s=>c.$emit("close"))},"×")]),e.createElementVNode("div",pi,[e.createElementVNode("button",{class:"btn-add-group",onClick:x[1]||(x[1]=s=>c.$emit("add-group"))},"新增一组"),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.attributeGroups,(s,a)=>(e.openBlock(),e.createElementBlock("div",{key:a,class:"attribute-group"},[e.createElementVNode("div",xi,[e.createElementVNode("div",fi,[x[6]||(x[6]=e.createElementVNode("label",null,"目标属性",-1)),e.createElementVNode("select",{value:s.property,onChange:t=>l(a,"property",t)},[x[5]||(x[5]=e.createElementVNode("option",{value:""},"选择目标属性",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.nodeProperties,t=>(e.openBlock(),e.createElementBlock("option",{key:t.key,value:t.key},e.toDisplayString(t.label),9,ui))),128))],40,mi)]),e.createElementVNode("div",gi,[x[8]||(x[8]=e.createElementVNode("label",null,"期望值",-1)),!s.property||n(s.property)==="text"?(e.openBlock(),e.createElementBlock("input",{key:0,value:s.value,type:"text",onInput:t=>l(a,"value",t),placeholder:"输入值"},null,40,Ei)):n(s.property)==="number"?(e.openBlock(),e.createElementBlock("input",{key:1,value:s.value,type:"number",onInput:t=>l(a,"value",t),placeholder:"输入数字"},null,40,hi)):n(s.property)==="color"?(e.openBlock(),e.createElementBlock("div",vi,[e.createElementVNode("input",{value:s.value,type:"color",onInput:t=>l(a,"value",t)},null,40,bi),e.createElementVNode("span",yi,e.toDisplayString(s.value||"#000000"),1)])):n(s.property)==="boolean"?(e.openBlock(),e.createElementBlock("select",{key:3,value:s.value,onChange:t=>l(a,"value",t)},[...x[7]||(x[7]=[e.createElementVNode("option",{value:"true"},"是",-1),e.createElementVNode("option",{value:"false"},"否",-1)])],40,Ci)):e.createCommentVNode("",!0)]),e.createElementVNode("button",{class:"btn-delete-group",onClick:t=>c.$emit("remove-group",a),title:"删除"}," 🗑 ",8,Bi)])]))),128)),g.attributeGroups.length===0?(e.openBlock(),e.createElementBlock("div",ki,' 请点击"新增一组"按钮添加属性配置 ')):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ni,[e.createElementVNode("button",{class:"btn-cancel",onClick:x[2]||(x[2]=s=>c.$emit("close"))},"取消"),e.createElementVNode("button",{class:"btn-confirm",onClick:E},"确定")])])]))}}),[["__scopeId","data-v-90af9944"]]),Vi={class:"dialog-content dialog-large"},Di={class:"dialog-header"},Ai={class:"dialog-body dialog-body-split"},_i={class:"code-editor-section"},Fi=["value"],$i={class:"code-preview-section"},wi={class:"section-header"},Si={class:"preview-status"},Ii={key:0,class:"status-success"},zi={key:1,class:"status-error"},Ti={class:"preview-canvas"},Pi={key:0,class:"preview-empty"},Ri={key:1,class:"preview-error-box"},Mi={class:"error-message"},Hi={key:2,class:"preview-node-container"},Oi={key:0,class:"console-output"},Ui={class:"console-logs"},Li={class:"dialog-footer"},Wi=`function execute(node) {
1
+ (function(U,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue"),require("@antv/x6"),require("@antv/x6-plugin-selection"),require("@antv/x6-plugin-snapline")):typeof define=="function"&&define.amd?define(["exports","vue","@antv/x6","@antv/x6-plugin-selection","@antv/x6-plugin-snapline"],e):(U=typeof globalThis<"u"?globalThis:U||self,e(U.ScadaEngine={},U.Vue,U.X6,U.X6PluginSelection,U.X6PluginSnapline))})(this,function(U,e,ge,Gt,nn){"use strict";var vp=Object.defineProperty;var bp=(U,e,ge)=>e in U?vp(U,e,{enumerable:!0,configurable:!0,writable:!0,value:ge}):U[e]=ge;var Ue=(U,e,ge)=>bp(U,typeof e!="symbol"?e+"":e,ge);/*!
2
+ * @nywqs/scada-engine v1.1.13
3
+ * Copyright (c) 2025 leoncheng
4
+ * Licensed under proprietary license - see LICENSE file
5
+ * Contact: nywqs@outlook.com
6
+ */const an={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},rn=e.defineComponent({name:"AlignHorizontalCenter",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",an,o[0]||(o[0]=[e.createElementVNode("path",{d:"M24 18h-7v-4h3a2.002 2.002 0 0 0 2-2V8a2.002 2.002 0 0 0-2-2h-3V2h-2v4h-3a2.002 2.002 0 0 0-2 2v4a2.002 2.002 0 0 0 2 2h3v4H8a2.002 2.002 0 0 0-2 2v4a2.002 2.002 0 0 0 2 2h7v4h2v-4h7a2.002 2.002 0 0 0 2-2v-4a2.002 2.002 0 0 0-2-2zM12 8h8v4h-8zm12 16H8v-4h16z",fill:"currentColor"},null,-1)]))}}),ln={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},sn=e.defineComponent({name:"AlignHorizontalLeft",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",ln,o[0]||(o[0]=[e.createElementVNode("path",{d:"M26 26H11a2.002 2.002 0 0 1-2-2v-4a2.002 2.002 0 0 1 2-2h15a2.002 2.002 0 0 1 2 2v4a2.002 2.002 0 0 1-2 2zm0-6.001L11 20v4h15z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M18 14h-7a2.002 2.002 0 0 1-2-2V8a2.002 2.002 0 0 1 2-2h7a2.002 2.002 0 0 1 2 2v4a2.002 2.002 0 0 1-2 2zm0-6.001L11 8v4h7z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M4 2h2v28H4z",fill:"currentColor"},null,-1)]))}}),cn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},dn=e.defineComponent({name:"AlignHorizontalRight",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",cn,o[0]||(o[0]=[e.createElementVNode("path",{d:"M4 24v-4a2.002 2.002 0 0 1 2-2h15a2.002 2.002 0 0 1 2 2v4a2.002 2.002 0 0 1-2 2H6a2.002 2.002 0 0 1-2-2zm2 0h15v-4l-15-.001z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M12 12V8a2.002 2.002 0 0 1 2-2h7a2.002 2.002 0 0 1 2 2v4a2.002 2.002 0 0 1-2 2h-7a2.002 2.002 0 0 1-2-2zm2 0h7V8l-7-.001z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M28 30h-2V2h2z",fill:"currentColor"},null,-1)]))}}),pn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},xn=e.defineComponent({name:"AlignVerticalBottom",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",pn,o[0]||(o[0]=[e.createElementVNode("path",{d:"M2 26h28v2H2z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M24 23h-4a2.002 2.002 0 0 1-2-2v-7a2.002 2.002 0 0 1 2-2h4a2.002 2.002 0 0 1 2 2v7a2.002 2.002 0 0 1-2 2zm-4-9v7h4.001L24 14z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M12 23H8a2.002 2.002 0 0 1-2-2V6a2.002 2.002 0 0 1 2-2h4a2.002 2.002 0 0 1 2 2v15a2.002 2.002 0 0 1-2 2zM8 6v15h4.001L12 6z",fill:"currentColor"},null,-1)]))}}),fn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},mn=e.defineComponent({name:"AlignVerticalCenter",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",fn,o[0]||(o[0]=[e.createElementVNode("path",{d:"M30 15h-4v-3a2.002 2.002 0 0 0-2-2h-4a2.002 2.002 0 0 0-2 2v3h-4V8a2.002 2.002 0 0 0-2-2H8a2.002 2.002 0 0 0-2 2v7H2v2h4v7a2.002 2.002 0 0 0 2 2h4a2.002 2.002 0 0 0 2-2v-7h4v3a2.002 2.002 0 0 0 2 2h4a2.002 2.002 0 0 0 2-2v-3h4zM8 24V8h4l.001 16zm12-4v-8h4l.001 8z",fill:"currentColor"},null,-1)]))}}),un={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},gn=e.defineComponent({name:"AlignVerticalTop",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",un,o[0]||(o[0]=[e.createElementVNode("path",{d:"M24 20h-4a2.002 2.002 0 0 1-2-2v-7a2.002 2.002 0 0 1 2-2h4a2.002 2.002 0 0 1 2 2v7a2.002 2.002 0 0 1-2 2zm-4-9v7h4.001L24 11z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M12 28H8a2.002 2.002 0 0 1-2-2V11a2.002 2.002 0 0 1 2-2h4a2.002 2.002 0 0 1 2 2v15a2.002 2.002 0 0 1-2 2zM8 11v15h4.001L12 11z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M2 4h28v2H2z",fill:"currentColor"},null,-1)]))}}),En={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},hn=e.defineComponent({name:"DistributeHorizontalCenter",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",En,o[0]||(o[0]=[e.createElementVNode("path",{d:"M24 10h-1V2h-2v8h-1a2.002 2.002 0 0 0-2 2v8a2.002 2.002 0 0 0 2 2h1v8h2v-8h1a2.002 2.002 0 0 0 2-2v-8a2.002 2.002 0 0 0-2-2zm0 10h-4v-8h4z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M12 6h-1V2H9v4H8a2.002 2.002 0 0 0-2 2v16a2.002 2.002 0 0 0 2 2h1v4h2v-4h1a2.002 2.002 0 0 0 2-2V8a2.002 2.002 0 0 0-2-2zm0 18H8V8h4z",fill:"currentColor"},null,-1)]))}}),vn={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",viewBox:"0 0 32 32"},bn=e.defineComponent({name:"DistributeVerticalCenter",render:function(h,o){return e.openBlock(),e.createElementBlock("svg",vn,o[0]||(o[0]=[e.createElementVNode("path",{d:"M30 21h-4v-1a2.002 2.002 0 0 0-2-2H8a2.002 2.002 0 0 0-2 2v1H2v2h4v1a2.002 2.002 0 0 0 2 2h16a2.002 2.002 0 0 0 2-2v-1h4zm-6 3H8v-4l16-.001z",fill:"currentColor"},null,-1),e.createElementVNode("path",{d:"M30 9h-8V8a2.002 2.002 0 0 0-2-2h-8a2.002 2.002 0 0 0-2 2v1H2v2h8v1a2.002 2.002 0 0 0 2 2h8a2.002 2.002 0 0 0 2-2v-1h8zm-10 3h-8V8l8-.001z",fill:"currentColor"},null,-1)]))}}),yn={class:"scada-header"},Cn={class:"header-left"},Bn={class:"header-center"},kn={class:"tool-group"},Nn={key:0,class:"divider"},Vn={key:1,class:"tool-group"},Dn={key:2,class:"divider"},An={key:3,class:"tool-group"},_n={class:"header-right"},Fn={class:"tool-group"},$n=e.defineComponent({__name:"Header",props:{selectedNodesCount:{default:0}},emits:["save","import","workflow","preview","export","zoomIn","zoomOut","clearAll","alignLeft","alignCenter","alignRight","alignTop","alignMiddle","alignBottom","distributeHorizontal","distributeVertical"],setup(g,{emit:h}){const o=g,r=h;return(n,l)=>(e.openBlock(),e.createElementBlock("header",yn,[e.createElementVNode("div",Cn,[e.renderSlot(n.$slots,"left",{},()=>[l[16]||(l[16]=e.createElementVNode("h1",{class:"logo"},"SCADA 组态引擎",-1)),l[17]||(l[17]=e.createElementVNode("span",{class:"version"},"v1.0.0",-1))],!0)]),e.createElementVNode("div",Bn,[e.createElementVNode("div",kn,[e.createElementVNode("button",{class:"toolbar-btn",onClick:l[0]||(l[0]=E=>r("zoomIn")),title:"放大"},[...l[18]||(l[18]=[e.createElementVNode("span",{class:"icon"},"+",-1)])]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[1]||(l[1]=E=>r("zoomOut")),title:"缩小"},[...l[19]||(l[19]=[e.createElementVNode("span",{class:"icon"},"-",-1)])]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[2]||(l[2]=E=>r("clearAll")),title:"清空画布"},[...l[20]||(l[20]=[e.createElementVNode("span",{class:"icon"},"🗑",-1)])])]),o.selectedNodesCount>=2?(e.openBlock(),e.createElementBlock("div",Nn)):e.createCommentVNode("",!0),o.selectedNodesCount>=2?(e.openBlock(),e.createElementBlock("div",Vn,[e.createElementVNode("button",{class:"toolbar-btn",onClick:l[3]||(l[3]=E=>r("alignLeft")),title:"左对齐"},[e.createVNode(e.unref(sn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[4]||(l[4]=E=>r("alignCenter")),title:"水平居中"},[e.createVNode(e.unref(rn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[5]||(l[5]=E=>r("alignRight")),title:"右对齐"},[e.createVNode(e.unref(dn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[6]||(l[6]=E=>r("alignTop")),title:"顶部对齐"},[e.createVNode(e.unref(gn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[7]||(l[7]=E=>r("alignMiddle")),title:"垂直居中"},[e.createVNode(e.unref(mn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[8]||(l[8]=E=>r("alignBottom")),title:"底部对齐"},[e.createVNode(e.unref(xn),{class:"icon-svg"})])])):e.createCommentVNode("",!0),o.selectedNodesCount>=3?(e.openBlock(),e.createElementBlock("div",Dn)):e.createCommentVNode("",!0),o.selectedNodesCount>=3?(e.openBlock(),e.createElementBlock("div",An,[e.createElementVNode("button",{class:"toolbar-btn",onClick:l[9]||(l[9]=E=>r("distributeHorizontal")),title:"横向分布"},[e.createVNode(e.unref(hn),{class:"icon-svg"})]),e.createElementVNode("button",{class:"toolbar-btn",onClick:l[10]||(l[10]=E=>r("distributeVertical")),title:"纵向分布"},[e.createVNode(e.unref(bn),{class:"icon-svg"})])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",_n,[e.createElementVNode("div",Fn,[e.createElementVNode("button",{class:"header-btn",onClick:l[11]||(l[11]=E=>r("workflow")),title:"流程编排"},[...l[21]||(l[21]=[e.createElementVNode("span",{class:"icon"},"⚡",-1),e.createElementVNode("span",null,"流程编排",-1)])]),e.createElementVNode("button",{class:"header-btn",onClick:l[12]||(l[12]=E=>r("import")),title:"导入"},[...l[22]||(l[22]=[e.createElementVNode("span",{class:"icon"},"📂",-1),e.createElementVNode("span",null,"导入",-1)])]),e.createElementVNode("button",{class:"header-btn",onClick:l[13]||(l[13]=E=>r("export")),title:"导出"},[...l[23]||(l[23]=[e.createElementVNode("span",{class:"icon"},"📤",-1),e.createElementVNode("span",null,"导出",-1)])]),e.createElementVNode("button",{class:"header-btn",onClick:l[14]||(l[14]=E=>r("preview")),title:"预览"},[...l[24]||(l[24]=[e.createElementVNode("span",{class:"icon"},"👁",-1),e.createElementVNode("span",null,"预览",-1)])]),e.createElementVNode("button",{class:"header-btn",onClick:l[15]||(l[15]=E=>r("save")),title:"保存"},[...l[25]||(l[25]=[e.createElementVNode("span",{class:"icon"},"💾",-1),e.createElementVNode("span",null,"保存",-1)])])])])]))}}),re=(g,h)=>{const o=g.__vccOpts||g;for(const[r,n]of h)o[r]=n;return o},Ge=re($n,[["__scopeId","data-v-9bbedc41"]]),Se=[{key:"animationEnabled",label:"启用动画",type:"boolean",path:"data.animation.enabled",defaultValue:!1,description:"是否启用动画效果",bindable:!0},{key:"animationType",label:"动画类型",type:"select",path:"data.animation.type",defaultValue:"none",options:[{label:"无动画",value:"none"},{label:"闪烁",value:"blink"},{label:"缩放",value:"scale"},{label:"旋转",value:"rotate"},{label:"浮动",value:"float"},{label:"脉冲",value:"pulse"}],description:"组件动画效果类型",bindable:!1},{key:"animationDuration",label:"动画时长(ms)",type:"number",path:"data.animation.duration",defaultValue:1e3,min:100,max:5e3,step:100,description:"动画完成一次所需时间",bindable:!1},{key:"animationLoop",label:"循环播放",type:"boolean",path:"data.animation.loop",defaultValue:!0,description:"是否循环播放动画",bindable:!1}],jt={metadata:{id:"rect",name:"矩形",category:"basic",icon:"▢",description:"基础矩形图形组件",version:"1.0.0"},shape:"rect",width:120,height:60,label:"矩形",attrs:{body:{fill:"#3b82f6",stroke:"#2563eb",strokeWidth:2},label:{fill:"#fff",fontSize:14}},ports:{groups:{top:{position:"top",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},bottom:{position:"bottom",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-top",group:"top"},{id:"port-right",group:"right"},{id:"port-bottom",group:"bottom"},{id:"port-left",group:"left"}]},props:[{key:"name",label:"按钮文本",type:"text",path:"attrs.label.text",defaultValue:"矩形",description:"矩形名称"},{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#3b82f6",description:"矩形填充颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#2563eb",description:"矩形边框颜色"},{key:"strokeWidth",label:"边框宽度",type:"number",path:"attrs.body.strokeWidth",defaultValue:2,min:0,max:10,description:"矩形边框宽度"},{key:"opacity",label:"透明度",type:"slider",path:"attrs.body.opacity",defaultValue:1,min:0,max:1,step:.1,description:"矩形透明度"},...Se]},Xt={metadata:{id:"circle",name:"圆形",category:"basic",icon:"○",description:"基础圆形图形组件",version:"1.0.0"},shape:"circle",width:80,height:80,label:"圆形",attrs:{body:{fill:"#10b981",stroke:"#059669",strokeWidth:2},label:{fill:"#fff",fontSize:14}},ports:{groups:{top:{position:"top",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},bottom:{position:"bottom",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-top",group:"top"},{id:"port-right",group:"right"},{id:"port-bottom",group:"bottom"},{id:"port-left",group:"left"}]},props:[{key:"text",label:"初始文本",type:"text",path:"attrs.label.text",defaultValue:"圆形",description:"圆形初始文本"},{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#10b981",description:"圆形填充颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#059669",description:"圆形边框颜色"},{key:"strokeWidth",label:"边框宽度",type:"number",path:"attrs.body.strokeWidth",defaultValue:2,min:0,max:10,description:"圆形边框宽度"},{key:"opacity",label:"透明度",type:"slider",path:"attrs.body.opacity",defaultValue:1,min:0,max:1,step:.1,description:"圆形透明度"},...Se]},Yt={metadata:{id:"text",name:"文本",category:"basic",icon:"T",description:"文本标签组件",version:"1.0.0"},shape:"rect",width:100,height:40,label:"文本",attrs:{body:{fill:"transparent",stroke:"#64748b",strokeWidth:1,strokeDasharray:"5 5"},label:{fill:"#e2e8f0",fontSize:16}},props:[{key:"label",label:"文本内容",type:"text",path:"attrs.label.text",defaultValue:"文本",description:"显示的文本内容"},{key:"fontSize",label:"字体大小",type:"number",path:"attrs.label.fontSize",defaultValue:16,min:12,max:48,description:"文本字体大小"},{key:"fontColor",label:"字体颜色",type:"color",path:"attrs.label.fill",defaultValue:"#e2e8f0",description:"文本字体颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#64748b",description:"边框颜色"},...Se]},wn=Object.freeze(Object.defineProperty({__proto__:null,CircleComponent:Xt,RectComponent:jt,TextComponent:Yt},Symbol.toStringTag,{value:"Module"})),Kt={metadata:{id:"light",name:"灯泡",category:"iot",icon:"💡",description:"IoT灯泡控制组件",version:"1.0.0"},shape:"circle",width:60,height:60,label:"💡",attrs:{body:{fill:"#fbbf24",stroke:"#f59e0b",strokeWidth:2},label:{fill:"#fff",fontSize:24}},data:{type:"light",deviceId:"",property:""},ports:{groups:{left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-left",group:"left"},{id:"port-right",group:"right"}]},props:[{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#fbbf24",description:"灯泡颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#f59e0b",description:"边框颜色"},{key:"deviceId",label:"设备ID",type:"text",path:"data.deviceId",defaultValue:"",description:"绑定的设备ID"},{key:"property",label:"设备属性",type:"text",path:"data.property",defaultValue:"",description:"绑定的设备属性名称"},...Se]},Jt={metadata:{id:"switch",name:"开关",category:"iot",icon:"🔘",description:"IoT开关控制组件",version:"1.0.0"},shape:"rect",width:100,height:50,label:"开关",attrs:{body:{fill:"#64748b",stroke:"#475569",strokeWidth:2,rx:25,ry:25},label:{fill:"#fff",fontSize:14}},data:{type:"switch",deviceId:"",property:"",state:!1},ports:{groups:{left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-left",group:"left"},{id:"port-right",group:"right"}]},props:[{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#64748b",description:"开关颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#475569",description:"边框颜色"},{key:"deviceId",label:"设备ID",type:"text",path:"data.deviceId",defaultValue:"",description:"绑定的设备ID"},{key:"property",label:"设备属性",type:"text",path:"data.property",defaultValue:"",description:"绑定的设备属性名称"},{key:"state",label:"开关状态",type:"boolean",path:"data.state",defaultValue:!1,description:"开关当前状态"},...Se]},Zt={metadata:{id:"gauge",name:"仪表",category:"iot",icon:"📊",description:"IoT仪表盘数据展示组件",version:"1.0.0"},shape:"circle",width:100,height:100,label:"📊",attrs:{body:{fill:"#8b5cf6",stroke:"#7c3aed",strokeWidth:2},label:{fill:"#fff",fontSize:32}},data:{type:"gauge",deviceId:"",property:"",value:0},ports:{groups:{top:{position:"top",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},right:{position:"right",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},bottom:{position:"bottom",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}},left:{position:"left",attrs:{circle:{r:4,magnet:!0,stroke:"#31d0c6",strokeWidth:2,fill:"#fff"}}}},items:[{id:"port-top",group:"top"},{id:"port-right",group:"right"},{id:"port-bottom",group:"bottom"},{id:"port-left",group:"left"}]},props:[{key:"fill",label:"填充色",type:"color",path:"attrs.body.fill",defaultValue:"#8b5cf6",description:"仪表颜色"},{key:"stroke",label:"边框色",type:"color",path:"attrs.body.stroke",defaultValue:"#7c3aed",description:"边框颜色"},{key:"deviceId",label:"设备ID",type:"text",path:"data.deviceId",defaultValue:"",description:"绑定的设备ID"},{key:"property",label:"设备属性",type:"text",path:"data.property",defaultValue:"",description:"绑定的设备属性名称"},{key:"value",label:"当前值",type:"number",path:"data.value",defaultValue:0,min:0,max:100,description:"仪表当前显示值"},...Se]},Sn=Object.freeze(Object.defineProperty({__proto__:null,GaugeComponent:Zt,LightComponent:Kt,SwitchComponent:Jt},Symbol.toStringTag,{value:"Module"}));class In{constructor(){Ue(this,"registry",{});this.registerDefaultComponents()}registerDefaultComponents(){this.register(jt),this.register(Xt),this.register(Yt),this.register(Kt),this.register(Jt),this.register(Zt)}register(h){const{id:o}=h.metadata;this.registry[o]&&console.warn(`组件 ${o} 已存在,将被覆盖`),this.registry[o]=h,console.log(`✓ 组件注册成功: ${h.metadata.name} (${o})`)}registerBatch(h){h.forEach(o=>this.register(o))}getComponent(h){return this.registry[h]}getAllComponents(){return{...this.registry}}getComponentsByCategory(h){return Object.values(this.registry).filter(o=>o.metadata.category===h)}getComponentList(){return Object.values(this.registry)}hasComponent(h){return h in this.registry}unregister(h){return this.registry[h]?(delete this.registry[h],console.log(`✓ 组件注销成功: ${h}`),!0):(console.warn(`组件 ${h} 不存在`),!1)}getCount(){return Object.keys(this.registry).length}clear(){this.registry={},console.log("✓ 组件注册表已清空")}}const Pe=new In,je={size:{width:1920,height:1080,preset:"1920*1080"},zoom:{scale:1,min:.1,max:5},offset:{x:0,y:0},background:{color:"#1e293b",size:"origin",repeat:"repeat"},grid:{enabled:!0,size:10,color:"#475569",type:"dot"},snap:{enabled:!0,threshold:10},guides:{enabled:!1,color:"#3b82f6"},magnetism:{enabled:!0,threshold:10}},zn=[{key:"sizePreset",label:"画布尺寸",type:"select",category:"basic",path:"size.preset",defaultValue:"1920*1080",options:[{label:"1920*1080",value:"1920*1080"},{label:"1366*768",value:"1366*768"},{label:"1280*720",value:"1280*720"},{label:"800*600",value:"800*600"}],description:"预设画布尺寸"},{key:"scale",label:"缩放倍数",type:"slider",category:"transform",path:"zoom.scale",defaultValue:1,min:.1,max:5,step:.1,description:"画布缩放比例"},{key:"offsetX",label:"画布X轴偏移",type:"number",category:"transform",path:"offset.x",defaultValue:0,description:"X轴偏移量"},{key:"offsetY",label:"画布Y轴偏移",type:"number",category:"transform",path:"offset.y",defaultValue:0,description:"Y轴偏移量"},{key:"backgroundColor",label:"背景颜色",type:"color",category:"background",path:"background.color",defaultValue:"#1e293b",description:"画布背景颜色"},{key:"backgroundImage",label:"背景图片",type:"image",category:"background",path:"background.image",defaultValue:"",description:"背景图片URL"},{key:"backgroundSize",label:"背景大小",type:"select",category:"background",path:"background.size",defaultValue:"origin",options:[{label:"原始",value:"origin"},{label:"包含",value:"contain"},{label:"覆盖",value:"cover"},{label:"拉伸",value:"stretch"}],description:"背景图片尺寸模式"},{key:"backgroundRepeat",label:"图像重复",type:"select",category:"background",path:"background.repeat",defaultValue:"repeat",options:[{label:"重复",value:"repeat"},{label:"X轴重复",value:"repeat-x"},{label:"Y轴重复",value:"repeat-y"},{label:"不重复",value:"no-repeat"}],description:"背景图片重复模式"},{key:"gridEnabled",label:"网格",type:"boolean",category:"assist",path:"grid.enabled",defaultValue:!0,description:"显示网格"},{key:"gridSize",label:"网格大小",type:"number",category:"assist",path:"grid.size",defaultValue:10,min:5,max:50,description:"网格单元格大小"},{key:"snapEnabled",label:"网格对齐",type:"boolean",category:"assist",path:"snap.enabled",defaultValue:!0,description:"启用网格对齐"},{key:"guidesEnabled",label:"参考线",type:"boolean",category:"assist",path:"guides.enabled",defaultValue:!0,description:"显示参考线"},{key:"magnetismEnabled",label:"吸附",type:"boolean",category:"assist",path:"magnetism.enabled",defaultValue:!0,description:"启用吸附功能"}],Re={"1920*1080":{width:1920,height:1080},"1366*768":{width:1366,height:768},"1280*720":{width:1280,height:720},"800*600":{width:800,height:600}};class Tn{constructor(){Ue(this,"config");this.config=e.reactive({...je})}getConfig(){return this.config}updateConfig(h){Object.assign(this.config,h)}updateByPath(h,o){const r=h.split(".");let n=this.config;for(let l=0;l<r.length-1;l++)n=n[r[l]];if(n[r[r.length-1]]=o,h==="size.preset"&&o in Re){const{width:l,height:E}=Re[o];this.config.size.width=l,this.config.size.height=E}}getByPath(h){const o=h.split(".");let r=this.config;for(const n of o)r=r==null?void 0:r[n];return r}setSize(h,o,r){this.config.size.width=h,this.config.size.height=o,r&&(this.config.size.preset=r)}updateSize(h){this.config.size.width=h.width,this.config.size.height=h.height}setZoom(h){const{min:o=.1,max:r=5}=this.config.zoom;this.config.zoom.scale=Math.max(o,Math.min(r,h))}setOffset(h,o){this.config.offset.x=h,this.config.offset.y=o}setBackgroundColor(h){this.config.background.color=h}updateBackground(h){h.color!==void 0&&(this.config.background.color=h.color),h.image!==void 0&&(this.config.background.image=h.image),h.size!==void 0&&(this.config.background.size=h.size),h.repeat!==void 0&&(this.config.background.repeat=h.repeat)}setBackgroundImage(h){this.config.background.image=h}toggleGrid(h){this.config.grid.enabled=h??!this.config.grid.enabled}setGridSize(h){this.config.grid.size=h}toggleSnap(h){this.config.snap.enabled=h??!this.config.snap.enabled}toggleGuides(h){this.config.guides.enabled=h??!this.config.guides.enabled}toggleMagnetism(h){this.config.magnetism.enabled=h??!this.config.magnetism.enabled}reset(){Object.assign(this.config,je)}export(){return JSON.stringify(this.config,null,2)}import(h){try{const o=JSON.parse(h);Object.assign(this.config,o)}catch(o){console.error("导入画布配置失败:",o)}}}const J=new Tn,Pn={class:"component-library"},Rn={class:"library-content"},Mn={key:0,class:"component-section"},Hn={class:"component-grid"},On=["onClick","title"],Un={class:"component-icon"},Ln={class:"component-name"},Wn={key:1,class:"component-section"},qn={class:"component-grid"},Gn=["onClick","title"],jn={class:"component-icon"},Xn={class:"component-name"},Xe=re(e.defineComponent({__name:"ComponentLibrary",emits:["addComponent"],setup(g,{emit:h}){const o=h,r=e.computed(()=>Pe.getComponentsByCategory("basic")),n=e.computed(()=>Pe.getComponentsByCategory("iot")),l=E=>{o("addComponent",E.metadata.id)};return(E,c)=>(e.openBlock(),e.createElementBlock("aside",Pn,[c[2]||(c[2]=e.createElementVNode("div",{class:"library-header"},[e.createElementVNode("h3",null,"组件库")],-1)),e.createElementVNode("div",Rn,[r.value.length>0?(e.openBlock(),e.createElementBlock("div",Mn,[c[0]||(c[0]=e.createElementVNode("h4",{class:"section-title"},"基础组件",-1)),e.createElementVNode("div",Hn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(r.value,x=>(e.openBlock(),e.createElementBlock("div",{key:x.metadata.id,class:"component-item",onClick:s=>l(x),title:x.metadata.description||x.metadata.name},[e.createElementVNode("span",Un,e.toDisplayString(x.metadata.icon),1),e.createElementVNode("span",Ln,e.toDisplayString(x.metadata.name),1)],8,On))),128))])])):e.createCommentVNode("",!0),n.value.length>0?(e.openBlock(),e.createElementBlock("div",Wn,[c[1]||(c[1]=e.createElementVNode("h4",{class:"section-title"},"IoT组件",-1)),e.createElementVNode("div",qn,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,x=>(e.openBlock(),e.createElementBlock("div",{key:x.metadata.id,class:"component-item",onClick:s=>l(x),title:x.metadata.description||x.metadata.name},[e.createElementVNode("span",jn,e.toDisplayString(x.metadata.icon),1),e.createElementVNode("span",Xn,e.toDisplayString(x.metadata.name),1)],8,Gn))),128))])])):e.createCommentVNode("",!0)])]))}}),[["__scopeId","data-v-92bb4e17"]]),Yn={class:"canvas-area"},Kn=re(e.defineComponent({__name:"CanvasArea",setup(g,{expose:h}){const o=e.ref();return h({containerRef:o}),(r,n)=>(e.openBlock(),e.createElementBlock("div",Yn,[e.createElementVNode("div",{ref_key:"containerRef",ref:o,class:"canvas-container"},null,512)]))}}),[["__scopeId","data-v-a869f6aa"]]),Jn={class:"canvas-config-panel"},Zn={class:"panel-content"},Qn={class:"config-section"},e0={class:"config-item"},t0={class:"config-section"},o0={class:"config-item"},n0={class:"slider-group"},a0={class:"value-display"},r0={class:"config-item"},l0={class:"number-input-group"},s0={class:"config-item"},i0={class:"number-input-group"},c0={class:"config-section"},d0={class:"config-item"},p0={class:"config-item"},x0={class:"image-upload"},f0={class:"config-item"},m0={class:"config-item"},u0={class:"config-section"},g0={class:"config-item"},E0={class:"switch"},h0={class:"config-item"},v0={class:"switch"},b0={class:"config-item"},y0={class:"switch"},C0={key:0,class:"config-item"},B0={class:"number-input-group"},Ye=re(e.defineComponent({__name:"CanvasConfigPanel",setup(g){const h=e.computed(()=>J.getConfig()),o=e.ref(),r=()=>{const s=h.value.size.preset;if(s&&s in Re){const{width:a,height:t}=Re[s];J.setSize(a,t,s)}},n=(s,a)=>{const t=h.value.offset[s];J.setOffset(s==="x"?t+a:h.value.offset.x,s==="y"?t+a:h.value.offset.y)},l=s=>{const a=Math.max(5,Math.min(50,h.value.grid.size+s));J.setGridSize(a)},E=()=>{var s;(s=o.value)==null||s.click()},c=s=>{var i;const t=(i=s.target.files)==null?void 0:i[0];if(t){const m=new FileReader;m.onload=u=>{var k;const y=(k=u.target)==null?void 0:k.result;J.updateByPath("background.image",y)},m.readAsDataURL(t)}},x=()=>{J.updateByPath("background.image",""),o.value&&(o.value.value="")};return(s,a)=>(e.openBlock(),e.createElementBlock("div",Jn,[a[40]||(a[40]=e.createElementVNode("div",{class:"panel-header"},[e.createElementVNode("h3",null,"画布配置")],-1)),e.createElementVNode("div",Zn,[e.createElementVNode("div",Qn,[a[19]||(a[19]=e.createElementVNode("h4",{class:"section-title"},"基础配置",-1)),e.createElementVNode("div",e0,[a[18]||(a[18]=e.createElementVNode("label",null,"画布尺寸",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":a[0]||(a[0]=t=>h.value.size.preset=t),onChange:r,class:"config-select"},[...a[17]||(a[17]=[e.createElementVNode("option",{value:"1920*1080"},"1920*1080",-1),e.createElementVNode("option",{value:"1366*768"},"1366*768",-1),e.createElementVNode("option",{value:"1280*720"},"1280*720",-1),e.createElementVNode("option",{value:"800*600"},"800*600",-1)])],544),[[e.vModelSelect,h.value.size.preset]])])]),e.createElementVNode("div",t0,[a[23]||(a[23]=e.createElementVNode("h4",{class:"section-title"},"变换",-1)),e.createElementVNode("div",o0,[a[20]||(a[20]=e.createElementVNode("label",null,"缩放倍数",-1)),e.createElementVNode("div",n0,[e.withDirectives(e.createElementVNode("input",{type:"range","onUpdate:modelValue":a[1]||(a[1]=t=>h.value.zoom.scale=t),min:.1,max:5,step:.1,class:"config-slider"},null,512),[[e.vModelText,h.value.zoom.scale,void 0,{number:!0}]]),e.createElementVNode("span",a0,e.toDisplayString(h.value.zoom.scale.toFixed(1)),1)])]),e.createElementVNode("div",r0,[a[21]||(a[21]=e.createElementVNode("label",null,"画布X轴偏移",-1)),e.createElementVNode("div",l0,[e.createElementVNode("button",{onClick:a[2]||(a[2]=t=>n("x",-10)),class:"adjust-btn"},"-"),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":a[3]||(a[3]=t=>h.value.offset.x=t),class:"config-number"},null,512),[[e.vModelText,h.value.offset.x,void 0,{number:!0}]]),e.createElementVNode("button",{onClick:a[4]||(a[4]=t=>n("x",10)),class:"adjust-btn"},"+")])]),e.createElementVNode("div",s0,[a[22]||(a[22]=e.createElementVNode("label",null,"画布Y轴偏移",-1)),e.createElementVNode("div",i0,[e.createElementVNode("button",{onClick:a[5]||(a[5]=t=>n("y",-10)),class:"adjust-btn"},"-"),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":a[6]||(a[6]=t=>h.value.offset.y=t),class:"config-number"},null,512),[[e.vModelText,h.value.offset.y,void 0,{number:!0}]]),e.createElementVNode("button",{onClick:a[7]||(a[7]=t=>n("y",10)),class:"adjust-btn"},"+")])])]),e.createElementVNode("div",c0,[a[31]||(a[31]=e.createElementVNode("h4",{class:"section-title"},"背景",-1)),e.createElementVNode("div",d0,[a[24]||(a[24]=e.createElementVNode("label",null,"背景颜色",-1)),e.withDirectives(e.createElementVNode("input",{type:"color","onUpdate:modelValue":a[8]||(a[8]=t=>h.value.background.color=t),class:"config-color"},null,512),[[e.vModelText,h.value.background.color]])]),e.createElementVNode("div",p0,[a[26]||(a[26]=e.createElementVNode("label",null,"背景图片",-1)),e.createElementVNode("div",x0,[e.createElementVNode("input",{type:"file",accept:"image/*",onChange:c,ref_key:"fileInput",ref:o,style:{display:"none"}},null,544),e.createElementVNode("button",{onClick:E,class:"upload-btn"},[...a[25]||(a[25]=[e.createElementVNode("span",null,"📄",-1)])]),h.value.background.image?(e.openBlock(),e.createElementBlock("button",{key:0,onClick:x,class:"clear-btn",title:"清除背景图"}," ✕ ")):e.createCommentVNode("",!0)])]),e.createElementVNode("div",f0,[a[28]||(a[28]=e.createElementVNode("label",null,"背景大小",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":a[9]||(a[9]=t=>h.value.background.size=t),class:"config-select"},[...a[27]||(a[27]=[e.createElementVNode("option",{value:"origin"},"原始",-1),e.createElementVNode("option",{value:"contain"},"包含",-1),e.createElementVNode("option",{value:"cover"},"覆盖",-1),e.createElementVNode("option",{value:"stretch"},"拉伸",-1)])],512),[[e.vModelSelect,h.value.background.size]])]),e.createElementVNode("div",m0,[a[30]||(a[30]=e.createElementVNode("label",null,"图像重复",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":a[10]||(a[10]=t=>h.value.background.repeat=t),class:"config-select"},[...a[29]||(a[29]=[e.createElementVNode("option",{value:"repeat"},"重复",-1),e.createElementVNode("option",{value:"repeat-x"},"X轴重复",-1),e.createElementVNode("option",{value:"repeat-y"},"Y轴重复",-1),e.createElementVNode("option",{value:"no-repeat"},"不重复",-1)])],512),[[e.vModelSelect,h.value.background.repeat]])])]),e.createElementVNode("div",u0,[a[39]||(a[39]=e.createElementVNode("h4",{class:"section-title"},"辅助",-1)),e.createElementVNode("div",g0,[a[33]||(a[33]=e.createElementVNode("label",null,"吸附",-1)),e.createElementVNode("label",E0,[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":a[11]||(a[11]=t=>h.value.magnetism.enabled=t)},null,512),[[e.vModelCheckbox,h.value.magnetism.enabled]]),a[32]||(a[32]=e.createElementVNode("span",{class:"slider"},null,-1))])]),e.createElementVNode("div",h0,[a[35]||(a[35]=e.createElementVNode("label",null,"网格",-1)),e.createElementVNode("label",v0,[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":a[12]||(a[12]=t=>h.value.grid.enabled=t)},null,512),[[e.vModelCheckbox,h.value.grid.enabled]]),a[34]||(a[34]=e.createElementVNode("span",{class:"slider"},null,-1))])]),e.createElementVNode("div",b0,[a[37]||(a[37]=e.createElementVNode("label",null,"网格对齐",-1)),e.createElementVNode("label",y0,[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":a[13]||(a[13]=t=>h.value.snap.enabled=t)},null,512),[[e.vModelCheckbox,h.value.snap.enabled]]),a[36]||(a[36]=e.createElementVNode("span",{class:"slider"},null,-1))])]),h.value.grid.enabled?(e.openBlock(),e.createElementBlock("div",C0,[a[38]||(a[38]=e.createElementVNode("label",null,"网格大小",-1)),e.createElementVNode("div",B0,[e.createElementVNode("button",{onClick:a[14]||(a[14]=t=>l(-5)),class:"adjust-btn"},"-"),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":a[15]||(a[15]=t=>h.value.grid.size=t),min:5,max:50,class:"config-number"},null,512),[[e.vModelText,h.value.grid.size,void 0,{number:!0}]]),e.createElementVNode("button",{onClick:a[16]||(a[16]=t=>l(5)),class:"adjust-btn"},"+")])])):e.createCommentVNode("",!0)])])]))}}),[["__scopeId","data-v-f309895b"]]),k0={class:"tab-pane"},N0={class:"property-section"},V0={class:"property-item-inline"},D0=["value"],A0={class:"property-item-inline"},_0=["value"],F0={class:"property-item-inline"},$0=["value"],w0={class:"property-section"},S0={class:"property-row"},I0={class:"property-item"},z0=["value"],T0={class:"property-item"},P0=["value"],R0={class:"property-row"},M0={class:"property-item"},H0=["value"],O0={class:"property-item"},U0=["value"],L0={class:"property-section"},W0={class:"property-item-inline"},q0=["value"],G0={class:"property-item-inline"},j0={class:"color-input-wrapper"},X0=["value"],Y0={class:"color-value"},K0={class:"property-item-inline"},J0={class:"color-input-wrapper"},Z0=["value"],Q0={class:"color-value"},ea={class:"property-item-inline"},ta=["value"],oa={class:"property-item-inline"},na=["value"],aa={key:0,class:"property-section"},ra={key:0,class:"property-hint"},la=["value","onInput","placeholder"],sa=["value","onInput","min","max","step"],ia={key:2,class:"color-input-wrapper"},ca=["value","onInput"],da={class:"color-value"},pa={key:3,class:"checkbox-wrapper"},xa=["checked","onChange"],fa={class:"checkbox-label"},ma=["value","onChange"],ua=["value"],Ke=re(e.defineComponent({__name:"BasicPropertiesTab",props:{selectedNode:{},nodePosition:{},nodeSize:{},nodeAttrs:{}},emits:["update-position","update-size","update-label","update-fill","update-stroke","update-stroke-width","update-opacity","update-component-name","update-dynamic-prop"],setup(g,{emit:h}){const o=g,r=h,n=e.computed(()=>{var x,s;if(!((s=(x=o.selectedNode)==null?void 0:x.data)!=null&&s.props))return[];const c=["label","fill","stroke","strokeWidth","opacity"];return o.selectedNode.data.props.filter(a=>!c.includes(a.key))}),l=c=>{if(!c.path)return c.defaultValue;const x=c.path.split(".");let s=o.selectedNode;for(const a of x)if(s&&typeof s=="object")s=s[a];else return c.defaultValue;return s!==void 0?s:c.defaultValue},E=(c,x)=>{const s=x.target;let a;c.type==="number"?a=Number(s.value):c.type==="boolean"?a=s.checked:a=s.value,r("update-dynamic-prop",c.path,a)};return(c,x)=>{var s,a,t,i,m,u,y,k,V,d,p,f,C,b,A,$,S;return e.openBlock(),e.createElementBlock("div",k0,[e.createElementVNode("div",N0,[x[13]||(x[13]=e.createElementVNode("h4",null,"基础信息",-1)),e.createElementVNode("div",V0,[x[10]||(x[10]=e.createElementVNode("label",null,"组件名称",-1)),e.createElementVNode("input",{type:"text",value:((s=g.selectedNode.getData())==null?void 0:s.componentName)||"",onInput:x[0]||(x[0]=B=>c.$emit("update-component-name",B)),placeholder:"请输入组件名称"},null,40,D0)]),e.createElementVNode("div",A0,[x[11]||(x[11]=e.createElementVNode("label",null,"ID",-1)),e.createElementVNode("input",{type:"text",value:g.selectedNode.id,disabled:""},null,8,_0)]),e.createElementVNode("div",F0,[x[12]||(x[12]=e.createElementVNode("label",null,"类型",-1)),e.createElementVNode("input",{type:"text",value:g.selectedNode.shape,disabled:""},null,8,$0)])]),e.createElementVNode("div",w0,[x[18]||(x[18]=e.createElementVNode("h4",null,"位置和尺寸",-1)),e.createElementVNode("div",S0,[e.createElementVNode("div",I0,[x[14]||(x[14]=e.createElementVNode("label",null,"X",-1)),e.createElementVNode("input",{type:"number",value:g.nodePosition.x,onInput:x[1]||(x[1]=B=>c.$emit("update-position","x",B))},null,40,z0)]),e.createElementVNode("div",T0,[x[15]||(x[15]=e.createElementVNode("label",null,"Y",-1)),e.createElementVNode("input",{type:"number",value:g.nodePosition.y,onInput:x[2]||(x[2]=B=>c.$emit("update-position","y",B))},null,40,P0)])]),e.createElementVNode("div",R0,[e.createElementVNode("div",M0,[x[16]||(x[16]=e.createElementVNode("label",null,"宽度",-1)),e.createElementVNode("input",{type:"number",value:g.nodeSize.width,onInput:x[3]||(x[3]=B=>c.$emit("update-size","width",B))},null,40,H0)]),e.createElementVNode("div",O0,[x[17]||(x[17]=e.createElementVNode("label",null,"高度",-1)),e.createElementVNode("input",{type:"number",value:g.nodeSize.height,onInput:x[4]||(x[4]=B=>c.$emit("update-size","height",B))},null,40,U0)])])]),e.createElementVNode("div",L0,[x[24]||(x[24]=e.createElementVNode("h4",null,"样式",-1)),e.createElementVNode("div",W0,[x[19]||(x[19]=e.createElementVNode("label",null,"初始文本",-1)),e.createElementVNode("input",{type:"text",value:((t=(a=g.nodeAttrs)==null?void 0:a.text)==null?void 0:t.text)||((m=(i=g.nodeAttrs)==null?void 0:i.label)==null?void 0:m.text)||g.selectedNode.getProp("label")||"",onInput:x[5]||(x[5]=B=>c.$emit("update-label",B)),placeholder:"设置默认显示文本"},null,40,q0)]),e.createElementVNode("div",G0,[x[20]||(x[20]=e.createElementVNode("label",null,"填充颜色",-1)),e.createElementVNode("div",j0,[e.createElementVNode("input",{type:"color",value:((y=(u=g.nodeAttrs)==null?void 0:u.body)==null?void 0:y.fill)||"#3b82f6",onInput:x[6]||(x[6]=B=>c.$emit("update-fill",B))},null,40,X0),e.createElementVNode("span",Y0,e.toDisplayString(((V=(k=g.nodeAttrs)==null?void 0:k.body)==null?void 0:V.fill)||"#3b82f6"),1)])]),e.createElementVNode("div",K0,[x[21]||(x[21]=e.createElementVNode("label",null,"边框颜色",-1)),e.createElementVNode("div",J0,[e.createElementVNode("input",{type:"color",value:((p=(d=g.nodeAttrs)==null?void 0:d.body)==null?void 0:p.stroke)||"#2563eb",onInput:x[7]||(x[7]=B=>c.$emit("update-stroke",B))},null,40,Z0),e.createElementVNode("span",Q0,e.toDisplayString(((C=(f=g.nodeAttrs)==null?void 0:f.body)==null?void 0:C.stroke)||"#2563eb"),1)])]),e.createElementVNode("div",ea,[x[22]||(x[22]=e.createElementVNode("label",null,"边框宽度",-1)),e.createElementVNode("input",{type:"number",min:"0",max:"10",value:((A=(b=g.nodeAttrs)==null?void 0:b.body)==null?void 0:A.strokeWidth)||2,onInput:x[8]||(x[8]=B=>c.$emit("update-stroke-width",B))},null,40,ta)]),e.createElementVNode("div",oa,[x[23]||(x[23]=e.createElementVNode("label",null,"透明度",-1)),e.createElementVNode("input",{type:"number",min:"0",max:"1",step:"0.1",value:((S=($=g.nodeAttrs)==null?void 0:$.body)==null?void 0:S.opacity)!==void 0?g.nodeAttrs.body.opacity:1,onInput:x[9]||(x[9]=B=>c.$emit("update-opacity",B))},null,40,na)])]),n.value.length>0?(e.openBlock(),e.createElementBlock("div",aa,[x[25]||(x[25]=e.createElementVNode("h4",null,"组件属性",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value,B=>(e.openBlock(),e.createElementBlock("div",{key:B.key,class:"property-item-inline"},[e.createElementVNode("label",null,[e.createTextVNode(e.toDisplayString(B.label)+" ",1),B.description?(e.openBlock(),e.createElementBlock("span",ra,e.toDisplayString(B.description),1)):e.createCommentVNode("",!0)]),B.type==="text"?(e.openBlock(),e.createElementBlock("input",{key:0,type:"text",value:l(B),onInput:N=>E(B,N),placeholder:B.defaultValue},null,40,la)):B.type==="number"?(e.openBlock(),e.createElementBlock("input",{key:1,type:"number",value:l(B),onInput:N=>E(B,N),min:B.min,max:B.max,step:B.step},null,40,sa)):B.type==="color"?(e.openBlock(),e.createElementBlock("div",ia,[e.createElementVNode("input",{type:"color",value:l(B),onInput:N=>E(B,N)},null,40,ca),e.createElementVNode("span",da,e.toDisplayString(l(B)),1)])):B.type==="boolean"?(e.openBlock(),e.createElementBlock("div",pa,[e.createElementVNode("input",{type:"checkbox",checked:l(B),onChange:N=>E(B,N)},null,40,xa),e.createElementVNode("span",fa,e.toDisplayString(l(B)?"是":"否"),1)])):B.type==="select"?(e.openBlock(),e.createElementBlock("select",{key:4,value:l(B),onChange:N=>E(B,N)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(B.options,N=>(e.openBlock(),e.createElementBlock("option",{key:N.value,value:N.value},e.toDisplayString(N.label),9,ua))),128))],40,ma)):e.createCommentVNode("",!0)]))),128))])):e.createCommentVNode("",!0)])}}}),[["__scopeId","data-v-def84c5f"]]),ga={class:"tab-pane"},Ea={class:"property-section"},ha={class:"property-item-inline"},va=["value"],ba={key:0,class:"property-section"},ya={class:"property-item-inline"},Ca=["value"],Ba={class:"property-item-inline"},ka=["value"],Na={class:"property-item-inline"},Va=["value"],Da={class:"property-item-inline"},Aa=["value"],_a={class:"property-item-inline"},Fa=["value"],$a={class:"property-item-inline"},wa=["value"],Sa={key:1,class:"property-section"},Ia={class:"property-item-inline"},za=["value"],Ta={class:"property-item-inline"},Pa=["value"],Ra={class:"property-item-inline"},Ma=["value"],Ha={class:"property-item-inline"},Oa=["value"],Ua={class:"property-item-inline"},La=["value"],Wa={class:"property-item-inline"},qa=["value"],Ga={key:2,class:"property-section"},ja={class:"property-item-inline"},Xa=["value"],Ya={class:"property-item-inline"},Ka=["value"],Ja={class:"property-item-inline"},Za=["value"],Qa={class:"property-item-inline"},er=["value"],tr={class:"property-item-inline"},or={class:"checkbox-wrapper"},nr=["checked"],ar={class:"checkbox-label"},rr={key:3,class:"property-section"},lr={class:"property-item-inline"},sr=["value"],ir={class:"property-item-inline"},cr=["value"],dr={class:"property-item-inline"},pr=["value"],xr={key:4,class:"property-section"},fr={class:"property-item-inline"},mr=["value"],ur={class:"property-item-inline"},gr=["value"],Er={key:5,class:"property-section"},hr={class:"property-item-inline"},vr={class:"checkbox-wrapper"},br=["checked"],yr={class:"checkbox-label"},Cr={class:"property-item-inline"},Br=["value"],kr=re(e.defineComponent({__name:"DataPropertiesTab",props:{selectedNode:{}},emits:["update-data-source"],setup(g,{emit:h}){const o=g,r=h,n=e.ref({type:"none",enabled:!0,retryCount:3});e.watch(()=>o.selectedNode,a=>{if(a){const t=a.getData();t!=null&&t.dataSource?n.value={...t.dataSource}:n.value={type:"none",enabled:!0,retryCount:3}}},{immediate:!0});const l=a=>{const t=a.target.value;let i={type:t,enabled:!0,retryCount:3};t==="http"?(i.pollInterval=5e3,i.method="GET"):t==="sse"&&(i.autoReconnect=!0),n.value=i,s()},E=(a,t)=>{const i=t.target;let m;i.type==="number"?m=Number(i.value):m=i.value,n.value={...n.value,[a]:m},s()},c=(a,t)=>{const i=t.target.checked;n.value={...n.value,[a]:i},s()},x=a=>{const t=a.target.checked;n.value={...n.value,enabled:t},s()},s=()=>{r("update-data-source",n.value)};return(a,t)=>(e.openBlock(),e.createElementBlock("div",ga,[e.createElementVNode("div",Ea,[t[25]||(t[25]=e.createElementVNode("h4",null,"数据来源",-1)),e.createElementVNode("div",ha,[t[24]||(t[24]=e.createElementVNode("label",null,"来源类型",-1)),e.createElementVNode("select",{value:n.value.type,onChange:l},[...t[23]||(t[23]=[e.createStaticVNode('<option value="none" data-v-5b515f8a>无数据源</option><option value="mqtt" data-v-5b515f8a>MQTT</option><option value="websocket" data-v-5b515f8a>WebSocket</option><option value="http" data-v-5b515f8a>HTTP</option><option value="sse" data-v-5b515f8a>SSE</option><option value="static" data-v-5b515f8a>静态数据</option>',6)])],40,va)])]),n.value.type==="mqtt"?(e.openBlock(),e.createElementBlock("div",ba,[t[32]||(t[32]=e.createElementVNode("h4",null,"MQTT配置",-1)),e.createElementVNode("div",ya,[t[26]||(t[26]=e.createElementVNode("label",null,"服务器",-1)),e.createElementVNode("input",{type:"text",value:n.value.broker||"",onInput:t[0]||(t[0]=i=>E("broker",i)),placeholder:"mqtt://localhost:1883"},null,40,Ca)]),e.createElementVNode("div",Ba,[t[27]||(t[27]=e.createElementVNode("label",null,"客户端ID",-1)),e.createElementVNode("input",{type:"text",value:n.value.clientId||"",onInput:t[1]||(t[1]=i=>E("clientId",i)),placeholder:"自动生成"},null,40,ka)]),e.createElementVNode("div",Na,[t[28]||(t[28]=e.createElementVNode("label",null,"订阅主题",-1)),e.createElementVNode("input",{type:"text",value:n.value.topic||"",onInput:t[2]||(t[2]=i=>E("topic",i)),placeholder:"例如: sensor/temperature"},null,40,Va)]),e.createElementVNode("div",Da,[t[29]||(t[29]=e.createElementVNode("label",null,"用户名",-1)),e.createElementVNode("input",{type:"text",value:n.value.username||"",onInput:t[3]||(t[3]=i=>E("username",i)),placeholder:"可选"},null,40,Aa)]),e.createElementVNode("div",_a,[t[30]||(t[30]=e.createElementVNode("label",null,"密码",-1)),e.createElementVNode("input",{type:"password",value:n.value.password||"",onInput:t[4]||(t[4]=i=>E("password",i)),placeholder:"可选"},null,40,Fa)]),e.createElementVNode("div",$a,[t[31]||(t[31]=e.createElementVNode("label",null,"数据路径",-1)),e.createElementVNode("input",{type:"text",value:n.value.dataPath||"",onInput:t[5]||(t[5]=i=>E("dataPath",i)),placeholder:"例如: value"},null,40,wa)])])):e.createCommentVNode("",!0),n.value.type==="http"?(e.openBlock(),e.createElementBlock("div",Sa,[t[40]||(t[40]=e.createElementVNode("h4",null,"HTTP配置",-1)),e.createElementVNode("div",Ia,[t[33]||(t[33]=e.createElementVNode("label",null,"接口地址",-1)),e.createElementVNode("input",{type:"text",value:n.value.url||"",onInput:t[6]||(t[6]=i=>E("url",i)),placeholder:"https://api.example.com/data"},null,40,za)]),e.createElementVNode("div",Ta,[t[35]||(t[35]=e.createElementVNode("label",null,"请求方法",-1)),e.createElementVNode("select",{value:n.value.method||"GET",onChange:t[7]||(t[7]=i=>E("method",i))},[...t[34]||(t[34]=[e.createElementVNode("option",{value:"GET"},"GET",-1),e.createElementVNode("option",{value:"POST"},"POST",-1),e.createElementVNode("option",{value:"PUT"},"PUT",-1),e.createElementVNode("option",{value:"DELETE"},"DELETE",-1)])],40,Pa)]),e.createElementVNode("div",Ra,[t[36]||(t[36]=e.createElementVNode("label",null,"请求头",-1)),e.createElementVNode("input",{type:"text",value:n.value.headers||"",onInput:t[8]||(t[8]=i=>E("headers",i)),placeholder:"JSON格式"},null,40,Ma)]),e.createElementVNode("div",Ha,[t[37]||(t[37]=e.createElementVNode("label",null,"请求体",-1)),e.createElementVNode("input",{type:"text",value:n.value.body||"",onInput:t[9]||(t[9]=i=>E("body",i)),placeholder:"POST/PUT请求的数据"},null,40,Oa)]),e.createElementVNode("div",Ua,[t[38]||(t[38]=e.createElementVNode("label",null,"数据路径",-1)),e.createElementVNode("input",{type:"text",value:n.value.dataPath||"",onInput:t[10]||(t[10]=i=>E("dataPath",i)),placeholder:"例如: data.value"},null,40,La)]),e.createElementVNode("div",Wa,[t[39]||(t[39]=e.createElementVNode("label",null,"轮询间隔(ms)",-1)),e.createElementVNode("input",{type:"number",value:n.value.pollInterval||5e3,onInput:t[11]||(t[11]=i=>E("pollInterval",i)),min:"1000",step:"1000"},null,40,qa)])])):e.createCommentVNode("",!0),n.value.type==="sse"?(e.openBlock(),e.createElementBlock("div",Ga,[t[46]||(t[46]=e.createElementVNode("h4",null,"SSE配置",-1)),e.createElementVNode("div",ja,[t[41]||(t[41]=e.createElementVNode("label",null,"服务地址",-1)),e.createElementVNode("input",{type:"text",value:n.value.sseUrl||"",onInput:t[12]||(t[12]=i=>E("sseUrl",i)),placeholder:"https://api.example.com/events"},null,40,Xa)]),e.createElementVNode("div",Ya,[t[42]||(t[42]=e.createElementVNode("label",null,"事件类型",-1)),e.createElementVNode("input",{type:"text",value:n.value.eventType||"",onInput:t[13]||(t[13]=i=>E("eventType",i)),placeholder:"留空表示所有事件"},null,40,Ka)]),e.createElementVNode("div",Ja,[t[43]||(t[43]=e.createElementVNode("label",null,"请求头",-1)),e.createElementVNode("input",{type:"text",value:n.value.headers||"",onInput:t[14]||(t[14]=i=>E("headers",i)),placeholder:"JSON格式"},null,40,Za)]),e.createElementVNode("div",Qa,[t[44]||(t[44]=e.createElementVNode("label",null,"数据路径",-1)),e.createElementVNode("input",{type:"text",value:n.value.dataPath||"",onInput:t[15]||(t[15]=i=>E("dataPath",i)),placeholder:"例如: data.value"},null,40,er)]),e.createElementVNode("div",tr,[t[45]||(t[45]=e.createElementVNode("label",null,"自动重连",-1)),e.createElementVNode("div",or,[e.createElementVNode("input",{type:"checkbox",checked:n.value.autoReconnect!==!1,onChange:t[16]||(t[16]=i=>c("autoReconnect",i))},null,40,nr),e.createElementVNode("span",ar,e.toDisplayString(n.value.autoReconnect!==!1?"是":"否"),1)])])])):e.createCommentVNode("",!0),n.value.type==="websocket"?(e.openBlock(),e.createElementBlock("div",rr,[t[50]||(t[50]=e.createElementVNode("h4",null,"WebSocket配置",-1)),e.createElementVNode("div",lr,[t[47]||(t[47]=e.createElementVNode("label",null,"服务地址",-1)),e.createElementVNode("input",{type:"text",value:n.value.wsUrl||"",onInput:t[17]||(t[17]=i=>E("wsUrl",i)),placeholder:"ws://localhost:8080"},null,40,sr)]),e.createElementVNode("div",ir,[t[48]||(t[48]=e.createElementVNode("label",null,"订阅主题",-1)),e.createElementVNode("input",{type:"text",value:n.value.topic||"",onInput:t[18]||(t[18]=i=>E("topic",i)),placeholder:"例如: device/status"},null,40,cr)]),e.createElementVNode("div",dr,[t[49]||(t[49]=e.createElementVNode("label",null,"数据路径",-1)),e.createElementVNode("input",{type:"text",value:n.value.dataPath||"",onInput:t[19]||(t[19]=i=>E("dataPath",i)),placeholder:"例如: payload.value"},null,40,pr)])])):e.createCommentVNode("",!0),n.value.type==="static"?(e.openBlock(),e.createElementBlock("div",xr,[t[54]||(t[54]=e.createElementVNode("h4",null,"静态数据配置",-1)),e.createElementVNode("div",fr,[t[51]||(t[51]=e.createElementVNode("label",null,"数据值",-1)),e.createElementVNode("input",{type:"text",value:n.value.value||"",onInput:t[20]||(t[20]=i=>E("value",i)),placeholder:"请输入数据值"},null,40,mr)]),e.createElementVNode("div",ur,[t[53]||(t[53]=e.createElementVNode("label",null,"数据类型",-1)),e.createElementVNode("select",{value:n.value.valueType||"string",onChange:t[21]||(t[21]=i=>E("valueType",i))},[...t[52]||(t[52]=[e.createElementVNode("option",{value:"string"},"字符串",-1),e.createElementVNode("option",{value:"number"},"数字",-1),e.createElementVNode("option",{value:"boolean"},"布尔值",-1),e.createElementVNode("option",{value:"json"},"JSON对象",-1)])],40,gr)])])):e.createCommentVNode("",!0),n.value.type!=="none"?(e.openBlock(),e.createElementBlock("div",Er,[t[57]||(t[57]=e.createElementVNode("h4",null,"通用配置",-1)),e.createElementVNode("div",hr,[t[55]||(t[55]=e.createElementVNode("label",null,"启用状态",-1)),e.createElementVNode("div",vr,[e.createElementVNode("input",{type:"checkbox",checked:n.value.enabled!==!1,onChange:x},null,40,br),e.createElementVNode("span",yr,e.toDisplayString(n.value.enabled!==!1?"启用":"禁用"),1)])]),e.createElementVNode("div",Cr,[t[56]||(t[56]=e.createElementVNode("label",null,"错误重试",-1)),e.createElementVNode("input",{type:"number",value:n.value.retryCount||3,onInput:t[22]||(t[22]=i=>E("retryCount",i)),min:"0",max:"10"},null,40,Br)])])):e.createCommentVNode("",!0)]))}}),[["__scopeId","data-v-5b515f8a"]]),Nr={class:"edge-properties-tab"},Vr={class:"property-section"},Dr={class:"property-item"},Ar={class:"color-input-wrapper"},_r=["value"],Fr=["value"],$r={class:"property-item"},wr={class:"number-input-wrapper"},Sr=["value"],Ir={class:"property-item"},zr=["value"],Tr={class:"property-item"},Pr={class:"slider-wrapper"},Rr=["value"],Mr={class:"slider-value"},Hr={class:"property-item"},Or=["value"],Ur={key:0,class:"property-item"},Lr={class:"number-input-wrapper"},Wr=["value"],qr={class:"property-section"},Gr={class:"property-item"},jr=["value"],Xr={class:"property-item"},Yr=["value"],Kr={class:"property-section"},Jr={class:"property-item"},Zr=["value"],Qr={class:"property-item"},el=["value"],tl=re(e.defineComponent({__name:"EdgePropertiesTab",props:{selectedEdge:{}},emits:["updateEdge","deleteEdge"],setup(g,{emit:h}){const o=g,r=h,n=e.computed(()=>{var C;return((C=o.selectedEdge)==null?void 0:C.getAttrs())||{}}),l=C=>{const b=C.target.value;r("updateEdge",{attrs:{line:{stroke:b}}})},E=C=>{const b=Number(C.target.value);r("updateEdge",{attrs:{line:{strokeWidth:b}}})},c=()=>{var b;const C=(b=n.value.line)==null?void 0:b.strokeDasharray;return C?C==="5,5"?"5,5":C==="2,2"?"2,2":C==="10,5,2,5"?"10,5,2,5":"none":"none"},x=C=>{const b=C.target.value;r("updateEdge",{attrs:{line:{strokeDasharray:b==="none"?void 0:b}}})},s=C=>{const b=Number(C.target.value);r("updateEdge",{attrs:{line:{opacity:b}}})},a=C=>{var A;const b=(A=n.value.line)==null?void 0:A[`${C}Marker`];return!b||typeof b!="object"||!b.name?"none":b.name},t=()=>{var A;const C=(A=n.value.line)==null?void 0:A.opacity;return((C!==void 0&&typeof C=="number"?C:1)*100).toFixed(0)},i=C=>{const b=C.target.value;r("updateEdge",{attrs:{line:{sourceMarker:b==="none"?void 0:{name:b,width:8,height:6}}}})},m=C=>{const b=C.target.value;r("updateEdge",{attrs:{line:{targetMarker:b==="none"?void 0:{name:b,width:8,height:6}}}})},u=C=>{const b=C.target.value;r("updateEdge",{router:b})},y=C=>{const b=C.target.value;r("updateEdge",{connector:{name:b,args:b==="rounded"?{radius:8}:void 0}})},k=()=>{r("deleteEdge")},V=()=>{var b,A;const C=(A=(b=o.selectedEdge)==null?void 0:b.data)==null?void 0:A.animation;return C!=null&&C.enabled?"true":"false"},d=()=>{var b,A;const C=(A=(b=o.selectedEdge)==null?void 0:b.data)==null?void 0:A.animation;return C!=null&&C.duration?C.duration/1e3:2},p=C=>{if(!(C.target.value==="true"))r("updateEdge",{data:{animation:{enabled:!1}},animation:{enabled:!1}});else{const A=d()*1e3;r("updateEdge",{data:{animation:{enabled:!0,duration:A}},animation:{enabled:!0,duration:A}})}},f=C=>{const A=Number(C.target.value)*1e3;r("updateEdge",{data:{animation:{enabled:!0,duration:A}},animation:{enabled:!0,duration:A}})};return(C,b)=>{var A,$,S,B,N,w,I,R;return e.openBlock(),e.createElementBlock("div",Nr,[e.createElementVNode("div",Vr,[b[10]||(b[10]=e.createElementVNode("h4",{class:"section-title"},"线条样式",-1)),e.createElementVNode("div",Dr,[b[0]||(b[0]=e.createElementVNode("label",{class:"property-label"},"线条颜色",-1)),e.createElementVNode("div",Ar,[e.createElementVNode("input",{type:"color",class:"color-input",value:((A=n.value.line)==null?void 0:A.stroke)||"#10b981",onInput:l},null,40,_r),e.createElementVNode("input",{type:"text",class:"color-text",value:(($=n.value.line)==null?void 0:$.stroke)||"#10b981",onInput:l},null,40,Fr)])]),e.createElementVNode("div",$r,[b[2]||(b[2]=e.createElementVNode("label",{class:"property-label"},"线条粗细",-1)),e.createElementVNode("div",wr,[e.createElementVNode("input",{type:"number",class:"property-input",min:"1",max:"20",step:"1",value:((S=n.value.line)==null?void 0:S.strokeWidth)||2,onInput:E},null,40,Sr),b[1]||(b[1]=e.createElementVNode("span",{class:"input-unit"},"px",-1))])]),e.createElementVNode("div",Ir,[b[4]||(b[4]=e.createElementVNode("label",{class:"property-label"},"线条样式",-1)),e.createElementVNode("select",{class:"property-select",value:c(),onChange:x},[...b[3]||(b[3]=[e.createElementVNode("option",{value:"none"},"实线",-1),e.createElementVNode("option",{value:"5,5"},"虚线",-1),e.createElementVNode("option",{value:"2,2"},"点线",-1),e.createElementVNode("option",{value:"10,5,2,5"},"点划线",-1)])],40,zr)]),e.createElementVNode("div",Tr,[b[5]||(b[5]=e.createElementVNode("label",{class:"property-label"},"透明度",-1)),e.createElementVNode("div",Pr,[e.createElementVNode("input",{type:"range",class:"property-slider",min:"0",max:"1",step:"0.1",value:((B=n.value.line)==null?void 0:B.opacity)!==void 0?n.value.line.opacity:1,onInput:s},null,40,Rr),e.createElementVNode("span",Mr,e.toDisplayString(t())+"%",1)])]),e.createElementVNode("div",Hr,[b[7]||(b[7]=e.createElementVNode("label",{class:"property-label"},"流动动画",-1)),e.createElementVNode("select",{class:"property-select",value:V(),onChange:p},[...b[6]||(b[6]=[e.createElementVNode("option",{value:"false"},"关闭",-1),e.createElementVNode("option",{value:"true"},"开启",-1)])],40,Or)]),V()==="true"?(e.openBlock(),e.createElementBlock("div",Ur,[b[9]||(b[9]=e.createElementVNode("label",{class:"property-label"},"动画速度",-1)),e.createElementVNode("div",Lr,[e.createElementVNode("input",{type:"number",class:"property-input",min:"0.5",max:"10",step:"0.5",value:d(),onInput:f},null,40,Wr),b[8]||(b[8]=e.createElementVNode("span",{class:"input-unit"},"秒",-1))])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",qr,[b[15]||(b[15]=e.createElementVNode("h4",{class:"section-title"},"箭头样式",-1)),e.createElementVNode("div",Gr,[b[12]||(b[12]=e.createElementVNode("label",{class:"property-label"},"起点箭头",-1)),e.createElementVNode("select",{class:"property-select",value:a("source"),onChange:i},[...b[11]||(b[11]=[e.createStaticVNode('<option value="none" data-v-e47f1784>无</option><option value="block" data-v-e47f1784>实心箭头</option><option value="classic" data-v-e47f1784>经典箭头</option><option value="diamond" data-v-e47f1784>菱形</option><option value="circle" data-v-e47f1784>圆形</option>',5)])],40,jr)]),e.createElementVNode("div",Xr,[b[14]||(b[14]=e.createElementVNode("label",{class:"property-label"},"终点箭头",-1)),e.createElementVNode("select",{class:"property-select",value:a("target"),onChange:m},[...b[13]||(b[13]=[e.createStaticVNode('<option value="none" data-v-e47f1784>无</option><option value="block" data-v-e47f1784>实心箭头</option><option value="classic" data-v-e47f1784>经典箭头</option><option value="diamond" data-v-e47f1784>菱形</option><option value="circle" data-v-e47f1784>圆形</option>',5)])],40,Yr)])]),e.createElementVNode("div",Kr,[b[20]||(b[20]=e.createElementVNode("h4",{class:"section-title"},"连接器",-1)),e.createElementVNode("div",Jr,[b[17]||(b[17]=e.createElementVNode("label",{class:"property-label"},"路由方式",-1)),e.createElementVNode("select",{class:"property-select",value:((w=(N=g.selectedEdge)==null?void 0:N.getRouter())==null?void 0:w.name)||"manhattan",onChange:u},[...b[16]||(b[16]=[e.createElementVNode("option",{value:"manhattan"},"曼哈顿",-1),e.createElementVNode("option",{value:"orth"},"正交",-1),e.createElementVNode("option",{value:"normal"},"直线",-1)])],40,Zr)]),e.createElementVNode("div",Qr,[b[19]||(b[19]=e.createElementVNode("label",{class:"property-label"},"连接器类型",-1)),e.createElementVNode("select",{class:"property-select",value:((R=(I=g.selectedEdge)==null?void 0:I.getConnector())==null?void 0:R.name)||"rounded",onChange:y},[...b[18]||(b[18]=[e.createElementVNode("option",{value:"rounded"},"圆角",-1),e.createElementVNode("option",{value:"smooth"},"平滑",-1),e.createElementVNode("option",{value:"normal"},"普通",-1)])],40,el)])]),e.createElementVNode("div",{class:"property-section"},[e.createElementVNode("button",{class:"delete-btn",onClick:k}," 删除连线 ")])])}}}),[["__scopeId","data-v-e47f1784"]]),ol={class:"event-card"},nl={class:"header-left"},al={class:"collapse-icon"},rl={class:"event-title"},ll={class:"event-card-body"},sl={class:"event-field"},il=["value"],cl={class:"event-field"},dl=["value"],pl={class:"event-field"},xl=["value"],fl={class:"condition-config"},ml=["value"],ul=["value"],gl=["value"],El=["value"],hl={key:0,class:"config-section"},vl={key:1,class:"config-section"},bl={key:2,class:"config-section"},yl={key:0,class:"selected-workflow-info"},Cl={class:"info-row"},Bl={class:"info-value"},kl={class:"event-field"},Nl=["value"],Je=re(e.defineComponent({__name:"EventCard",props:{event:{},index:{},isCollapsed:{type:Boolean},nodeProperties:{}},emits:["toggle-collapse","remove","update-field","update-condition","update-params","open-attribute-config","open-custom-code","open-workflow-selector"],setup(g){return(h,o)=>{var r,n,l,E,c,x,s;return e.openBlock(),e.createElementBlock("div",ol,[e.createElementVNode("div",{class:"event-card-header",onClick:o[1]||(o[1]=a=>h.$emit("toggle-collapse"))},[e.createElementVNode("div",nl,[e.createElementVNode("span",al,e.toDisplayString(g.isCollapsed?"▶":"▼"),1),e.createElementVNode("span",rl,"事件"+e.toDisplayString(g.index+1),1)]),e.createElementVNode("button",{class:"btn-remove",onClick:o[0]||(o[0]=e.withModifiers(a=>h.$emit("remove"),["stop"])),title:"删除事件"},"🗑")]),e.withDirectives(e.createElementVNode("div",ll,[e.createElementVNode("div",sl,[o[12]||(o[12]=e.createElementVNode("label",null,"事件名称",-1)),e.createElementVNode("input",{type:"text",value:g.event.name||"",onInput:o[2]||(o[2]=a=>h.$emit("update-field","name",a)),placeholder:"输入事件名称,如:温度报警、湿度预警"},null,40,il)]),e.createElementVNode("div",cl,[o[14]||(o[14]=e.createElementVNode("label",null,"事件类型",-1)),e.createElementVNode("select",{value:g.event.type,onChange:o[3]||(o[3]=a=>h.$emit("update-field","type",a))},[...o[13]||(o[13]=[e.createStaticVNode('<option value="click" data-v-af7c633a>单击</option><option value="dblclick" data-v-af7c633a>双击</option><option value="mouseenter" data-v-af7c633a>鼠标移入</option><option value="mouseleave" data-v-af7c633a>鼠标移出</option><option value="focus" data-v-af7c633a>获取焦点</option><option value="blur" data-v-af7c633a>失去焦点</option><option value="input" data-v-af7c633a>输入</option><option value="change" data-v-af7c633a>值变化</option>',8)])],40,dl)]),e.createElementVNode("div",pl,[o[16]||(o[16]=e.createElementVNode("label",null,"事件行为",-1)),e.createElementVNode("select",{value:g.event.action,onChange:o[4]||(o[4]=a=>h.$emit("update-field","action",a))},[...o[15]||(o[15]=[e.createElementVNode("option",{value:"attributeChange"},"更改属性",-1),e.createElementVNode("option",{value:"customCode"},"自定义代码",-1),e.createElementVNode("option",{value:"callProcess"},"调用流程",-1)])],40,xl)]),o[30]||(o[30]=e.createElementVNode("div",{class:"section-title"},"形参配置",-1)),o[31]||(o[31]=e.createElementVNode("div",{class:"field-hint"},"(不填直接触发)",-1)),o[32]||(o[32]=e.createElementVNode("div",{class:"section-title"},"触发规则",-1)),o[33]||(o[33]=e.createElementVNode("div",{class:"field-hint"},"(不填写条件则直接触发,填写后按条件触发)",-1)),e.createElementVNode("div",fl,[o[19]||(o[19]=e.createElementVNode("div",{class:"condition-label"},"当",-1)),o[20]||(o[20]=e.createElementVNode("div",{class:"condition-label"},"当前节点属性",-1)),e.createElementVNode("select",{class:"condition-select",value:((r=g.event.condition)==null?void 0:r.attribute)||"",onChange:o[5]||(o[5]=a=>h.$emit("update-condition","attribute",a))},[o[17]||(o[17]=e.createElementVNode("option",{value:""},"选择属性",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.nodeProperties,a=>(e.openBlock(),e.createElementBlock("option",{key:a.key,value:a.key},e.toDisplayString(a.label),9,ul))),128))],40,ml),o[21]||(o[21]=e.createElementVNode("div",{class:"condition-label"},"运算符",-1)),e.createElementVNode("select",{class:"condition-select",value:((n=g.event.condition)==null?void 0:n.operator)||"==",onChange:o[6]||(o[6]=a=>h.$emit("update-condition","operator",a))},[...o[18]||(o[18]=[e.createStaticVNode('<option value="==" data-v-af7c633a>等于</option><option value="!=" data-v-af7c633a>不等于</option><option value="&gt;" data-v-af7c633a>大于</option><option value="&gt;=" data-v-af7c633a>大于等于</option><option value="&lt;" data-v-af7c633a>小于</option><option value="&lt;=" data-v-af7c633a>小于等于</option><option value="contains" data-v-af7c633a>包含</option>',7)])],40,gl),o[22]||(o[22]=e.createElementVNode("div",{class:"condition-label"},"值",-1)),e.createElementVNode("input",{type:"text",class:"condition-input",value:((l=g.event.condition)==null?void 0:l.value)||"",onInput:o[7]||(o[7]=a=>h.$emit("update-condition","value",a)),placeholder:"输入值"},null,40,El),o[23]||(o[23]=e.createElementVNode("div",{class:"condition-label"},"时",-1)),o[24]||(o[24]=e.createElementVNode("div",{class:"condition-label"},"触发该事件",-1))]),g.event.action==="attributeChange"?(e.openBlock(),e.createElementBlock("div",hl,[o[25]||(o[25]=e.createElementVNode("div",{class:"section-title"},"属性更改",-1)),e.createElementVNode("button",{class:"btn-config",onClick:o[8]||(o[8]=a=>h.$emit("open-attribute-config"))},"点击配置")])):e.createCommentVNode("",!0),g.event.action==="customCode"?(e.openBlock(),e.createElementBlock("div",vl,[o[26]||(o[26]=e.createElementVNode("div",{class:"section-title"},"自定义代码",-1)),e.createElementVNode("button",{class:"btn-config",onClick:o[9]||(o[9]=a=>h.$emit("open-custom-code"))},"点击配置")])):e.createCommentVNode("",!0),g.event.action==="callProcess"?(e.openBlock(),e.createElementBlock("div",bl,[o[29]||(o[29]=e.createElementVNode("div",{class:"section-title"},"调用流程",-1)),e.createElementVNode("button",{class:"btn-config",onClick:o[10]||(o[10]=a=>h.$emit("open-workflow-selector"))},"选择流程"),(E=g.event.params)!=null&&E.processId?(e.openBlock(),e.createElementBlock("div",yl,[e.createElementVNode("div",Cl,[o[27]||(o[27]=e.createElementVNode("span",{class:"info-label"},"已选择:",-1)),e.createElementVNode("span",Bl,e.toDisplayString(((c=g.event.params)==null?void 0:c.processName)||((x=g.event.params)==null?void 0:x.processId)),1)]),e.createElementVNode("div",kl,[o[28]||(o[28]=e.createElementVNode("label",null,"传入参数",-1)),e.createElementVNode("textarea",{value:((s=g.event.params)==null?void 0:s.processParams)||"",onInput:o[11]||(o[11]=a=>h.$emit("update-params","processParams",a)),placeholder:'JSON格式: {"param1":"value1","param2":"value2"}',rows:"3"},null,40,Nl)])])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)],512),[[e.vShow,!g.isCollapsed]])])}}}),[["__scopeId","data-v-af7c633a"]]);var pe=(g=>(g.BOOLEAN="boolean",g.NUMBER="number",g.STRING="string",g))(pe||{}),xe=(g=>(g.READ="read",g.WRITE="write",g.READ_WRITE="readWrite",g))(xe||{}),Me=(g=>(g.ONLINE="online",g.OFFLINE="offline",g.ERROR="error",g.MAINTENANCE="maintenance",g))(Me||{}),He=(g=>(g.PLC="plc",g.SENSOR="sensor",g.ACTUATOR="actuator",g.METER="meter",g.CAMERA="camera",g.OTHER="other",g))(He||{});const Ze=[{id:"device_001",name:"1号温控设备",code:"TC-001",type:He.PLC,description:"车间1号温控PLC",status:Me.ONLINE,ipAddress:"192.168.1.101",port:502,protocol:"Modbus TCP",enabled:!0,tags:["车间1","温控","PLC"],points:[{id:"point_001_01",name:"当前温度",code:"40001",description:"实时温度采集",dataType:pe.NUMBER,accessMode:xe.READ,value:25.5,unit:"°C",minValue:-20,maxValue:100,precision:1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_001_02",name:"设定温度",code:"40002",description:"目标温度设定值",dataType:pe.NUMBER,accessMode:xe.READ_WRITE,value:28,unit:"°C",minValue:0,maxValue:50,precision:1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_001_03",name:"加热状态",code:"40003",description:"加热器运行状态",dataType:pe.BOOLEAN,accessMode:xe.READ,value:!0,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_001_04",name:"告警状态",code:"40004",description:"设备告警状态",dataType:pe.BOOLEAN,accessMode:xe.READ,value:!1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"}],createTime:"2025-01-01 00:00:00",updateTime:"2025-12-17 08:15:00"},{id:"device_002",name:"主管道压力传感器",code:"PS-001",type:He.SENSOR,description:"主管道压力监测",status:Me.ONLINE,ipAddress:"192.168.1.102",port:502,protocol:"Modbus TCP",enabled:!0,tags:["管道","压力","传感器"],points:[{id:"point_002_01",name:"当前压力",code:"40001",description:"实时压力值",dataType:pe.NUMBER,accessMode:xe.READ,value:1.25,unit:"MPa",minValue:0,maxValue:5,precision:2,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_002_02",name:"压力上限",code:"40002",description:"压力告警上限",dataType:pe.NUMBER,accessMode:xe.READ_WRITE,value:2,unit:"MPa",minValue:0,maxValue:5,precision:2,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_002_03",name:"压力下限",code:"40003",description:"压力告警下限",dataType:pe.NUMBER,accessMode:xe.READ_WRITE,value:.5,unit:"MPa",minValue:0,maxValue:5,precision:2,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"}],createTime:"2025-01-01 00:00:00",updateTime:"2025-12-17 08:15:00"},{id:"device_003",name:"1号电机控制器",code:"MC-001",type:He.ACTUATOR,description:"主传送带电机控制",status:Me.ONLINE,ipAddress:"192.168.1.103",port:502,protocol:"Modbus TCP",enabled:!0,tags:["电机","控制器","传送带"],points:[{id:"point_003_01",name:"运行状态",code:"40001",description:"电机运行状态",dataType:pe.BOOLEAN,accessMode:xe.READ,value:!0,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_02",name:"启动命令",code:"40002",description:"电机启动控制",dataType:pe.BOOLEAN,accessMode:xe.WRITE,value:!1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_03",name:"停止命令",code:"40003",description:"电机停止控制",dataType:pe.BOOLEAN,accessMode:xe.WRITE,value:!1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_04",name:"当前转速",code:"40004",description:"电机实时转速",dataType:pe.NUMBER,accessMode:xe.READ,value:1450,unit:"RPM",minValue:0,maxValue:3e3,precision:0,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_05",name:"设定转速",code:"40005",description:"目标转速设定",dataType:pe.NUMBER,accessMode:xe.READ_WRITE,value:1500,unit:"RPM",minValue:0,maxValue:3e3,precision:0,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"},{id:"point_003_06",name:"电流",code:"40006",description:"电机运行电流",dataType:pe.NUMBER,accessMode:xe.READ,value:12.5,unit:"A",minValue:0,maxValue:50,precision:1,enabled:!0,quality:"good",updateTime:"2025-12-17 08:15:00"}],createTime:"2025-01-01 00:00:00",updateTime:"2025-12-17 08:15:00"},{id:"device_004",name:"进水流量计",code:"FM-001",type:He.METER,description:"进水管道流量监测",status:Me.OFFLINE,ipAddress:"192.168.1.104",port:502,protocol:"Modbus TCP",enabled:!0,tags:["流量","仪表","进水"],points:[{id:"point_004_01",name:"瞬时流量",code:"40001",description:"当前流量值",dataType:pe.NUMBER,accessMode:xe.READ,value:0,unit:"m³/h",minValue:0,maxValue:100,precision:2,enabled:!0,quality:"bad",updateTime:"2025-12-17 07:30:00"},{id:"point_004_02",name:"累计流量",code:"40002",description:"累计流量统计",dataType:pe.NUMBER,accessMode:xe.READ,value:12345.67,unit:"m³",minValue:0,maxValue:999999,precision:2,enabled:!0,quality:"bad",updateTime:"2025-12-17 07:30:00"}],createTime:"2025-01-01 00:00:00",updateTime:"2025-12-17 07:30:00"}];Ze.length;const Qt=g=>Ze.find(h=>h.id===g),Vl=(g,h)=>{const o=Qt(g);if(o)return o.points.find(r=>r.id===h)},Dl={class:"device-point-selector"},Al={class:"device-list-panel"},_l={class:"panel-header"},Fl={class:"device-count"},$l={class:"search-box"},wl={class:"device-list"},Sl=["onClick"],Il={class:"device-info"},zl={class:"device-name"},Tl={class:"device-meta"},Pl={class:"device-code"},Rl={class:"point-count"},Ml={key:0,class:"empty-hint"},Hl={class:"point-list-panel"},Ol={class:"panel-header"},Ul={key:0,class:"point-count"},Ll={key:0,class:"search-box"},Wl={class:"point-list"},ql={key:0,class:"empty-hint"},Gl={key:1,class:"empty-hint"},jl=["onClick"],Xl={class:"point-info"},Yl={class:"point-name"},Kl={class:"point-meta"},Jl={class:"point-code"},Zl={key:0,class:"point-unit"},Ql={class:"point-type"},es={key:0,class:"point-value"},ts={class:"value"},os={class:"modal-footer"},ns=["disabled"],as=re(e.defineComponent({__name:"DevicePointSelector",props:{visible:{type:Boolean},modelValue:{}},emits:["update:visible","update:modelValue","confirm"],setup(g,{emit:h}){const o=g,r=h,n=e.ref(Ze),l=e.ref(null),E=e.ref(null),c=e.ref(""),x=e.ref("");if(o.modelValue){const[d,p]=o.modelValue.split(":"),f=n.value.find(C=>C.id===d);f&&(l.value=f,E.value=f.points.find(C=>C.id===p)||null)}const s=e.computed(()=>{if(!c.value)return n.value;const d=c.value.toLowerCase();return n.value.filter(p=>p.name.toLowerCase().includes(d)||p.code.toLowerCase().includes(d))}),a=e.computed(()=>{if(!l.value)return[];if(!x.value)return l.value.points;const d=x.value.toLowerCase();return l.value.points.filter(p=>p.name.toLowerCase().includes(d)||p.code.toLowerCase().includes(d))}),t=d=>{l.value=d,E.value=null,x.value=""},i=d=>{d.enabled&&(E.value=d)},m=()=>{r("update:visible",!1)},u=()=>{if(!l.value||!E.value)return;const d=`${l.value.id}:${E.value.id}`;r("update:modelValue",d),r("confirm",l.value.id,E.value.id,l.value,E.value),r("update:visible",!1)},y=d=>({read:"只读",write:"只写",readWrite:"读写"})[d]||d,k=d=>({boolean:"布尔",number:"数值",string:"字符",json:"JSON"})[d]||d,V=d=>d.value===void 0||d.value===null?"-":d.dataType==="boolean"?d.value?"是":"否":d.dataType==="number"&&d.precision!==void 0?Number(d.value).toFixed(d.precision):String(d.value);return(d,p)=>g.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"modal-overlay",onClick:m},[e.createElementVNode("div",{class:"modal-container",onClick:p[2]||(p[2]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",{class:"modal-header"},[p[3]||(p[3]=e.createElementVNode("h3",null,"选择设备点位",-1)),e.createElementVNode("button",{class:"btn-close",onClick:m},"✕")]),e.createElementVNode("div",Dl,[e.createElementVNode("div",Al,[e.createElementVNode("div",_l,[p[4]||(p[4]=e.createElementVNode("h4",null,"设备列表",-1)),e.createElementVNode("span",Fl,e.toDisplayString(n.value.length),1)]),e.createElementVNode("div",$l,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[0]||(p[0]=f=>c.value=f),type:"text",placeholder:"搜索设备...",class:"search-input"},null,512),[[e.vModelText,c.value]])]),e.createElementVNode("div",wl,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s.value,f=>{var C;return e.openBlock(),e.createElementBlock("div",{key:f.id,class:e.normalizeClass(["device-item",{active:((C=l.value)==null?void 0:C.id)===f.id,offline:f.status==="offline"}]),onClick:b=>t(f)},[e.createElementVNode("div",Il,[e.createElementVNode("div",zl,[e.createElementVNode("span",{class:e.normalizeClass(["status-dot",f.status])},null,2),e.createTextVNode(" "+e.toDisplayString(f.name),1)]),e.createElementVNode("div",Tl,[e.createElementVNode("span",Pl,e.toDisplayString(f.code),1),e.createElementVNode("span",Rl,e.toDisplayString(f.points.length)+" 点",1)])]),p[5]||(p[5]=e.createElementVNode("div",{class:"device-arrow"},"›",-1))],10,Sl)}),128)),s.value.length===0?(e.openBlock(),e.createElementBlock("div",Ml," 暂无设备 ")):e.createCommentVNode("",!0)])]),e.createElementVNode("div",Hl,[e.createElementVNode("div",Ol,[e.createElementVNode("h4",null,e.toDisplayString(l.value?l.value.name:"点位列表"),1),l.value?(e.openBlock(),e.createElementBlock("span",Ul,e.toDisplayString(a.value.length),1)):e.createCommentVNode("",!0)]),l.value?(e.openBlock(),e.createElementBlock("div",Ll,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[1]||(p[1]=f=>x.value=f),type:"text",placeholder:"搜索点位...",class:"search-input"},null,512),[[e.vModelText,x.value]])])):e.createCommentVNode("",!0),e.createElementVNode("div",Wl,[l.value?a.value.length===0?(e.openBlock(),e.createElementBlock("div",Gl," 暂无点位 ")):(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(a.value,f=>{var C;return e.openBlock(),e.createElementBlock("div",{key:f.id,class:e.normalizeClass(["point-item",{active:((C=E.value)==null?void 0:C.id)===f.id,disabled:!f.enabled}]),onClick:b=>i(f)},[e.createElementVNode("div",Xl,[e.createElementVNode("div",Yl,[e.createTextVNode(e.toDisplayString(f.name)+" ",1),e.createElementVNode("span",{class:e.normalizeClass(["access-mode",f.accessMode])},e.toDisplayString(y(f.accessMode)),3)]),e.createElementVNode("div",Kl,[e.createElementVNode("span",Jl,e.toDisplayString(f.code),1),f.unit?(e.openBlock(),e.createElementBlock("span",Zl,e.toDisplayString(f.unit),1)):e.createCommentVNode("",!0),e.createElementVNode("span",Ql,e.toDisplayString(k(f.dataType)),1)]),f.value!==void 0?(e.openBlock(),e.createElementBlock("div",es,[p[6]||(p[6]=e.createTextVNode(" 当前值: ",-1)),e.createElementVNode("span",ts,e.toDisplayString(V(f)),1),e.createElementVNode("span",{class:e.normalizeClass(["quality",f.quality])},e.toDisplayString(f.quality),3)])):e.createCommentVNode("",!0)])],10,jl)}),128)):(e.openBlock(),e.createElementBlock("div",ql," ← 请先选择设备 "))])])]),e.createElementVNode("div",os,[e.createElementVNode("button",{class:"btn-cancel",onClick:m},"取消"),e.createElementVNode("button",{class:"btn-confirm",disabled:!E.value,onClick:u}," 确定 ",8,ns)])])])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-7884b850"]]);var Ve=(g=>(g.DIRECT="direct",g.BOOLEAN="boolean",g.RANGE="range",g.ENUM="enum",g))(Ve||{}),Oe=(g=>(g.BOOLEAN="boolean",g.NUMBER="number",g.STRING="string",g))(Oe||{});const rs={class:"mapping-configurator"},ls={class:"config-item"},ss={key:0,class:"field-hint error"},is={key:1,class:"field-hint"},cs={class:"config-item"},ds={key:0,class:"field-hint error"},ps={key:1,class:"field-hint"},xs={key:0,class:"config-item"},fs={class:"unit-config"},ms={class:"checkbox-label"},us={key:0,class:"custom-unit"},gs={key:1,class:"mapping-details"},Es={class:"config-item"},hs={class:"config-item"},vs={key:2,class:"mapping-details"},bs={class:"range-rules"},ys=["onUpdate:modelValue"],Cs=["onUpdate:modelValue"],Bs=["onUpdate:modelValue"],ks=["onClick"],Ns={key:3,class:"mapping-details"},Vs={class:"enum-mappings"},Ds=["value","onInput"],As=["onUpdate:modelValue"],_s=["onClick"],Fs={key:4,class:"mapping-preview"},$s={class:"preview-content"},ws={class:"preview-item"},Ss={class:"preview-output"},Is={class:"preview-item"},zs={class:"preview-output"},Ts={class:"preview-input"},Ps={class:"preview-output"},Rs={class:"preview-input"},Ms={class:"preview-output"},Hs=re(e.defineComponent({__name:"MappingConfigurator",props:{visible:{type:Boolean},modelValue:{}},emits:["update:visible","update:modelValue","confirm"],setup(g,{emit:h}){const o=g,r=h,n=e.ref(o.modelValue||{type:"",valueType:""});e.watch(()=>o.modelValue,V=>{V&&(n.value={...V})},{deep:!0});const l=()=>{n.value.type||(n.value.valueType===Oe.BOOLEAN?n.value.type=Ve.BOOLEAN:n.value.valueType===Oe.NUMBER?n.value.type=Ve.RANGE:n.value.type=Ve.DIRECT),n.value.valueType!==Oe.NUMBER&&(delete n.value.keepOriginalUnit,delete n.value.customUnit)},E=V=>({boolean:"适用于开关状态、是否判断等场景",number:"适用于温度、压力、流量等数值型数据",string:"适用于文本、状态码等字符型数据"})[V]||"",c=V=>({direct:"不做任何转换,直接使用原始值",boolean:"根据 true/false 转换为不同的值",range:"根据数值范围转换为对应值",enum:"根据枚举键值对转换"})[V]||"",x=()=>{const V=n.value.valueType;n.value={type:n.value.type,valueType:V},n.value.type===Ve.RANGE?n.value.rangeRules=[]:n.value.type===Ve.ENUM&&(n.value.enumMappings={})},s=()=>{n.value.rangeRules||(n.value.rangeRules=[]),n.value.rangeRules.push({min:0,max:100,value:""})},a=V=>{var d;(d=n.value.rangeRules)==null||d.splice(V,1)},t=()=>{n.value.enumMappings||(n.value.enumMappings={});const V=`key_${Object.keys(n.value.enumMappings).length+1}`;n.value.enumMappings[V]=""},i=V=>{n.value.enumMappings&&delete n.value.enumMappings[V]},m=(V,d)=>{const p=V.target.value;if(!n.value.enumMappings||p===d)return;const f=n.value.enumMappings[d];delete n.value.enumMappings[d],n.value.enumMappings[p]=f},u=()=>{},y=()=>{r("update:visible",!1)},k=()=>{if(!n.value.valueType){alert("请选择值类型!");return}if(!n.value.type){alert("请选择映射类型!");return}r("update:modelValue",{...n.value}),r("confirm",{...n.value}),r("update:visible",!1)};return(V,d)=>g.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"modal-overlay",onClick:y},[e.createElementVNode("div",{class:"modal-container",onClick:d[6]||(d[6]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",{class:"modal-header"},[d[7]||(d[7]=e.createElementVNode("h3",null,"值映射配置",-1)),e.createElementVNode("button",{class:"btn-close",onClick:y},"✕")]),e.createElementVNode("div",rs,[e.createElementVNode("div",ls,[d[9]||(d[9]=e.createElementVNode("label",null,[e.createTextVNode("值类型 "),e.createElementVNode("span",{class:"required"},"*")],-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":d[0]||(d[0]=p=>n.value.valueType=p),onChange:l},[...d[8]||(d[8]=[e.createElementVNode("option",{value:""},"请选择值类型",-1),e.createElementVNode("option",{value:"boolean"},"布尔型 (true/false)",-1),e.createElementVNode("option",{value:"number"},"数值型 (123, 45.6)",-1),e.createElementVNode("option",{value:"string"},'字符串型 ("abc")',-1)])],544),[[e.vModelSelect,n.value.valueType]]),n.value.valueType?(e.openBlock(),e.createElementBlock("div",is,e.toDisplayString(E(n.value.valueType)),1)):(e.openBlock(),e.createElementBlock("div",ss," 值类型为必填项 "))]),e.createElementVNode("div",cs,[d[11]||(d[11]=e.createElementVNode("label",null,[e.createTextVNode("映射类型 "),e.createElementVNode("span",{class:"required"},"*")],-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":d[1]||(d[1]=p=>n.value.type=p),onChange:x},[...d[10]||(d[10]=[e.createStaticVNode('<option value="" data-v-ef9e0ee1>请选择映射类型</option><option value="direct" data-v-ef9e0ee1>直接映射(无转换)</option><option value="boolean" data-v-ef9e0ee1>布尔映射</option><option value="range" data-v-ef9e0ee1>范围映射</option><option value="enum" data-v-ef9e0ee1>枚举映射</option>',5)])],544),[[e.vModelSelect,n.value.type]]),n.value.type?(e.openBlock(),e.createElementBlock("div",ps,e.toDisplayString(c(n.value.type)),1)):(e.openBlock(),e.createElementBlock("div",ds," 映射类型为必填项 "))]),n.value.valueType==="number"?(e.openBlock(),e.createElementBlock("div",xs,[d[13]||(d[13]=e.createElementVNode("label",null,"单位配置",-1)),e.createElementVNode("div",fs,[e.createElementVNode("label",ms,[e.withDirectives(e.createElementVNode("input",{type:"checkbox","onUpdate:modelValue":d[2]||(d[2]=p=>n.value.keepOriginalUnit=p),onChange:u},null,544),[[e.vModelCheckbox,n.value.keepOriginalUnit]]),d[12]||(d[12]=e.createTextVNode(" 保留点位原始单位 ",-1))]),n.value.keepOriginalUnit?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("div",us,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":d[3]||(d[3]=p=>n.value.customUnit=p),type:"text",placeholder:"自定义单位,如: °C, MPa, %",onInput:u},null,544),[[e.vModelText,n.value.customUnit]])]))])])):e.createCommentVNode("",!0),n.value.type==="boolean"?(e.openBlock(),e.createElementBlock("div",gs,[e.createElementVNode("div",Es,[d[14]||(d[14]=e.createElementVNode("label",null,"True 时的值",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":d[4]||(d[4]=p=>n.value.trueValue=p),type:"text",placeholder:"例如: 运行、#00ff00",onInput:u},null,544),[[e.vModelText,n.value.trueValue]])]),e.createElementVNode("div",hs,[d[15]||(d[15]=e.createElementVNode("label",null,"False 时的值",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":d[5]||(d[5]=p=>n.value.falseValue=p),type:"text",placeholder:"例如: 停止、#ff0000",onInput:u},null,544),[[e.vModelText,n.value.falseValue]])])])):e.createCommentVNode("",!0),n.value.type==="range"?(e.openBlock(),e.createElementBlock("div",vs,[e.createElementVNode("div",bs,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value.rangeRules,(p,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"range-rule"},[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":C=>p.min=C,type:"number",placeholder:"最小值",onInput:u},null,40,ys),[[e.vModelText,p.min,void 0,{number:!0}]]),d[16]||(d[16]=e.createElementVNode("span",{class:"range-separator"},"~",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":C=>p.max=C,type:"number",placeholder:"最大值",onInput:u},null,40,Cs),[[e.vModelText,p.max,void 0,{number:!0}]]),d[17]||(d[17]=e.createElementVNode("span",{class:"range-arrow"},"→",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":C=>p.value=C,type:"text",placeholder:"映射值",onInput:u},null,40,Bs),[[e.vModelText,p.value]]),e.createElementVNode("button",{class:"btn-remove-rule",onClick:C=>a(f),title:"删除规则"}," ✕ ",8,ks)]))),128))]),e.createElementVNode("button",{class:"btn-add-rule",onClick:s}," + 添加范围规则 ")])):e.createCommentVNode("",!0),n.value.type==="enum"?(e.openBlock(),e.createElementBlock("div",Ns,[e.createElementVNode("div",Vs,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.value.enumMappings,(p,f,C)=>(e.openBlock(),e.createElementBlock("div",{key:C,class:"enum-mapping"},[e.createElementVNode("input",{value:f,type:"text",placeholder:"原始值",onInput:b=>m(b,f)},null,40,Ds),d[18]||(d[18]=e.createElementVNode("span",{class:"enum-arrow"},"→",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":b=>n.value.enumMappings[f]=b,type:"text",placeholder:"映射值",onInput:u},null,40,As),[[e.vModelText,n.value.enumMappings[f]]]),e.createElementVNode("button",{class:"btn-remove-rule",onClick:b=>i(f),title:"删除映射"}," ✕ ",8,_s)]))),128))]),e.createElementVNode("button",{class:"btn-add-rule",onClick:t}," + 添加枚举映射 ")])):e.createCommentVNode("",!0),n.value.type!=="direct"?(e.openBlock(),e.createElementBlock("div",Fs,[d[25]||(d[25]=e.createElementVNode("label",null,"映射预览",-1)),e.createElementVNode("div",$s,[n.value.type==="boolean"?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createElementVNode("div",ws,[d[19]||(d[19]=e.createElementVNode("span",{class:"preview-input"},"true",-1)),d[20]||(d[20]=e.createElementVNode("span",{class:"preview-arrow"},"→",-1)),e.createElementVNode("span",Ss,e.toDisplayString(n.value.trueValue||"true"),1)]),e.createElementVNode("div",Is,[d[21]||(d[21]=e.createElementVNode("span",{class:"preview-input"},"false",-1)),d[22]||(d[22]=e.createElementVNode("span",{class:"preview-arrow"},"→",-1)),e.createElementVNode("span",zs,e.toDisplayString(n.value.falseValue||"false"),1)])],64)):n.value.type==="range"?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:1},e.renderList(n.value.rangeRules,(p,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"preview-item"},[e.createElementVNode("span",Ts,"["+e.toDisplayString(p.min)+" ~ "+e.toDisplayString(p.max)+"]",1),d[23]||(d[23]=e.createElementVNode("span",{class:"preview-arrow"},"→",-1)),e.createElementVNode("span",Ps,e.toDisplayString(p.value),1)]))),128)):n.value.type==="enum"?(e.openBlock(!0),e.createElementBlock(e.Fragment,{key:2},e.renderList(n.value.enumMappings,(p,f)=>(e.openBlock(),e.createElementBlock("div",{key:f,class:"preview-item"},[e.createElementVNode("span",Rs,e.toDisplayString(f),1),d[24]||(d[24]=e.createElementVNode("span",{class:"preview-arrow"},"→",-1)),e.createElementVNode("span",Ms,e.toDisplayString(p),1)]))),128)):e.createCommentVNode("",!0)])])):e.createCommentVNode("",!0)]),e.createElementVNode("div",{class:"modal-footer"},[e.createElementVNode("button",{class:"btn-cancel",onClick:y},"取消"),e.createElementVNode("button",{class:"btn-confirm",onClick:k},"确定")])])])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-ef9e0ee1"]]),Os={class:"event-card"},Us={class:"header-left"},Ls={class:"collapse-icon"},Ws={class:"event-title"},qs={class:"event-card-body"},Gs={class:"property-item"},js={key:0,class:"selected-point"},Xs={class:"point-main"},Ys={class:"device-name"},Ks={class:"point-name"},Js={class:"point-details"},Zs={class:"point-code"},Qs={key:0,class:"point-unit"},ei={key:1,class:"placeholder"},ti={class:"property-item"},oi=["value"],ni=["value"],ai={class:"property-item"},ri={key:0,class:"mapping-summary"},li={class:"mapping-type-label"},si={class:"mapping-detail"},ii={key:1,class:"placeholder"},Qe=re(e.defineComponent({__name:"BindingCard",props:{binding:{},index:{},isCollapsed:{type:Boolean},nodeProperties:{}},emits:["toggle-collapse","remove","update-field"],setup(g,{emit:h}){const o=g,r=h,n=e.ref(o.binding.devicePointId||""),l=e.ref(!1),E=e.ref(!1),c=e.ref(o.binding.mapping||{type:Ve.DIRECT,valueType:Oe.NUMBER});e.watch(()=>o.binding.devicePointId,m=>{n.value=m||""}),e.watch(()=>o.binding.mapping,m=>{m&&(c.value=m)},{deep:!0});const x=e.computed(()=>{if(!n.value)return null;const[m,u]=n.value.split(":");if(!m||!u)return null;const y=Qt(m),k=y?Vl(m,u):null;return!y||!k?null:{deviceName:y.name,pointName:k.name,pointCode:k.code,pointUnit:k.unit}}),s=(m,u,y,k)=>{const V=new Event("change");Object.defineProperty(V,"target",{value:{value:`${m}:${u}`},writable:!1}),r("update-field","devicePointId",V),console.log("选择了点位:",{device:y.name,point:k.name,dataType:k.dataType,accessMode:k.accessMode})},a=m=>{const u=new Event("change");Object.defineProperty(u,"target",{value:{value:m},writable:!1}),r("update-field","mapping",u)},t=m=>({direct:"直接映射",boolean:"布尔映射",range:"范围映射",enum:"枚举映射"})[m]||m,i=()=>{const m=c.value;return m.type==="boolean"?`True:${m.trueValue||"true"} / False:${m.falseValue||"false"}`:m.type==="range"&&m.rangeRules?`${m.rangeRules.length} 个范围规则`:m.type==="enum"&&m.enumMappings?`${Object.keys(m.enumMappings).length} 个枚举映射`:""};return(m,u)=>(e.openBlock(),e.createElementBlock("div",Os,[e.createElementVNode("div",{class:"event-card-header",onClick:u[1]||(u[1]=y=>m.$emit("toggle-collapse"))},[e.createElementVNode("div",Us,[e.createElementVNode("span",Ls,e.toDisplayString(g.isCollapsed?"▶":"▼"),1),e.createElementVNode("span",Ws,"绑定"+e.toDisplayString(g.index+1),1)]),e.createElementVNode("button",{class:"btn-remove",onClick:u[0]||(u[0]=e.withModifiers(y=>m.$emit("remove"),["stop"])),title:"删除绑定"},"🗑")]),e.withDirectives(e.createElementVNode("div",qs,[e.createElementVNode("div",Gs,[u[10]||(u[10]=e.createElementVNode("label",null,"设备点位",-1)),e.createElementVNode("div",{class:"point-selector-trigger",onClick:u[2]||(u[2]=y=>l.value=!0)},[x.value?(e.openBlock(),e.createElementBlock("div",js,[e.createElementVNode("div",Xs,[e.createElementVNode("span",Ys,e.toDisplayString(x.value.deviceName),1),e.createElementVNode("span",Ks,e.toDisplayString(x.value.pointName),1)]),e.createElementVNode("div",Js,[e.createElementVNode("span",Zs,e.toDisplayString(x.value.pointCode),1),x.value.pointUnit?(e.openBlock(),e.createElementBlock("span",Qs,e.toDisplayString(x.value.pointUnit),1)):e.createCommentVNode("",!0)])])):(e.openBlock(),e.createElementBlock("div",ei," 点击选择设备点位 ")),u[9]||(u[9]=e.createElementVNode("span",{class:"selector-arrow"},"›",-1))])]),e.createVNode(as,{visible:l.value,"onUpdate:visible":u[3]||(u[3]=y=>l.value=y),modelValue:n.value,"onUpdate:modelValue":u[4]||(u[4]=y=>n.value=y),onConfirm:s},null,8,["visible","modelValue"]),e.createElementVNode("div",ti,[u[12]||(u[12]=e.createElementVNode("label",null,"目标属性",-1)),e.createElementVNode("select",{value:g.binding.targetProperty||"",onChange:u[5]||(u[5]=y=>m.$emit("update-field","targetProperty",y))},[u[11]||(u[11]=e.createElementVNode("option",{value:""},"选择属性",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.nodeProperties,y=>(e.openBlock(),e.createElementBlock("option",{key:y.key,value:y.key},e.toDisplayString(y.label),9,ni))),128))],40,oi)]),e.createElementVNode("div",ai,[u[14]||(u[14]=e.createElementVNode("label",null,"值映射配置",-1)),e.createElementVNode("div",{class:"mapping-trigger",onClick:u[6]||(u[6]=y=>E.value=!0)},[c.value.type!=="direct"?(e.openBlock(),e.createElementBlock("div",ri,[e.createElementVNode("span",li,e.toDisplayString(t(c.value.type)),1),e.createElementVNode("span",si,e.toDisplayString(i()),1)])):(e.openBlock(),e.createElementBlock("div",ii," 点击配置值映射 ")),u[13]||(u[13]=e.createElementVNode("span",{class:"selector-arrow"},"›",-1))])]),e.createVNode(Hs,{visible:E.value,"onUpdate:visible":u[7]||(u[7]=y=>E.value=y),modelValue:c.value,"onUpdate:modelValue":u[8]||(u[8]=y=>c.value=y),onConfirm:a},null,8,["visible","modelValue"])],512),[[e.vShow,!g.isCollapsed]])]))}}),[["__scopeId","data-v-3731c19a"]]),ci={class:"dialog-content"},di={class:"dialog-header"},pi={class:"dialog-body"},xi={class:"group-row"},fi={class:"group-field"},mi=["value","onChange"],ui=["value"],gi={class:"group-field group-field-value"},Ei=["value","onInput"],hi=["value","onInput"],vi={key:2,class:"color-input-wrapper"},bi=["value","onInput"],yi={class:"color-value"},Ci=["value","onChange"],Bi=["onClick"],ki={key:0,class:"empty-hint"},Ni={class:"dialog-footer"},et=re(e.defineComponent({__name:"AttributeConfigDialog",props:{attributeGroups:{},nodeProperties:{}},emits:["close","save","add-group","remove-group","update-group"],setup(g,{emit:h}){const o=g,r=h,n=c=>{const x=o.nodeProperties.find(s=>s.key===c);return(x==null?void 0:x.type)||"text"},l=(c,x,s)=>{const a=s.target.value;r("update-group",c,x,a)},E=()=>{for(const c of o.attributeGroups)if(!c.property){alert("请为每组配置选择目标属性");return}r("save")};return(c,x)=>(e.openBlock(),e.createElementBlock("div",{class:"dialog-overlay",onClick:x[3]||(x[3]=e.withModifiers(s=>c.$emit("close"),["self"]))},[e.createElementVNode("div",ci,[e.createElementVNode("div",di,[x[4]||(x[4]=e.createElementVNode("h3",null,"事件属性更改配置",-1)),e.createElementVNode("button",{class:"btn-close",onClick:x[0]||(x[0]=s=>c.$emit("close"))},"×")]),e.createElementVNode("div",pi,[e.createElementVNode("button",{class:"btn-add-group",onClick:x[1]||(x[1]=s=>c.$emit("add-group"))},"新增一组"),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.attributeGroups,(s,a)=>(e.openBlock(),e.createElementBlock("div",{key:a,class:"attribute-group"},[e.createElementVNode("div",xi,[e.createElementVNode("div",fi,[x[6]||(x[6]=e.createElementVNode("label",null,"目标属性",-1)),e.createElementVNode("select",{value:s.property,onChange:t=>l(a,"property",t)},[x[5]||(x[5]=e.createElementVNode("option",{value:""},"选择目标属性",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.nodeProperties,t=>(e.openBlock(),e.createElementBlock("option",{key:t.key,value:t.key},e.toDisplayString(t.label),9,ui))),128))],40,mi)]),e.createElementVNode("div",gi,[x[8]||(x[8]=e.createElementVNode("label",null,"期望值",-1)),!s.property||n(s.property)==="text"?(e.openBlock(),e.createElementBlock("input",{key:0,value:s.value,type:"text",onInput:t=>l(a,"value",t),placeholder:"输入值"},null,40,Ei)):n(s.property)==="number"?(e.openBlock(),e.createElementBlock("input",{key:1,value:s.value,type:"number",onInput:t=>l(a,"value",t),placeholder:"输入数字"},null,40,hi)):n(s.property)==="color"?(e.openBlock(),e.createElementBlock("div",vi,[e.createElementVNode("input",{value:s.value,type:"color",onInput:t=>l(a,"value",t)},null,40,bi),e.createElementVNode("span",yi,e.toDisplayString(s.value||"#000000"),1)])):n(s.property)==="boolean"?(e.openBlock(),e.createElementBlock("select",{key:3,value:s.value,onChange:t=>l(a,"value",t)},[...x[7]||(x[7]=[e.createElementVNode("option",{value:"true"},"是",-1),e.createElementVNode("option",{value:"false"},"否",-1)])],40,Ci)):e.createCommentVNode("",!0)]),e.createElementVNode("button",{class:"btn-delete-group",onClick:t=>c.$emit("remove-group",a),title:"删除"}," 🗑 ",8,Bi)])]))),128)),g.attributeGroups.length===0?(e.openBlock(),e.createElementBlock("div",ki,' 请点击"新增一组"按钮添加属性配置 ')):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ni,[e.createElementVNode("button",{class:"btn-cancel",onClick:x[2]||(x[2]=s=>c.$emit("close"))},"取消"),e.createElementVNode("button",{class:"btn-confirm",onClick:E},"确定")])])]))}}),[["__scopeId","data-v-90af9944"]]),Vi={class:"dialog-content dialog-large"},Di={class:"dialog-header"},Ai={class:"dialog-body dialog-body-split"},_i={class:"code-editor-section"},Fi=["value"],$i={class:"code-preview-section"},wi={class:"section-header"},Si={class:"preview-status"},Ii={key:0,class:"status-success"},zi={key:1,class:"status-error"},Ti={class:"preview-canvas"},Pi={key:0,class:"preview-empty"},Ri={key:1,class:"preview-error-box"},Mi={class:"error-message"},Hi={key:2,class:"preview-node-container"},Oi={key:0,class:"console-output"},Ui={class:"console-logs"},Li={class:"dialog-footer"},Wi=`function execute(node) {
2
7
  // 修改节点填充颜色为红色
3
8
  node.attr('body/fill', '#ff0000');
4
9
 
@@ -50,4 +55,4 @@
50
55
  `;if(N+=f.map(w=>" • "+w).join(`
51
56
  `),N+=`
52
57
 
53
- 是否继续保存?`,!confirm(N))return}const C=prompt("请输入流程名称:","未命名流程");if(!C||!C.trim())return;const b=n.toJSON(),A=n.getNodes().map(N=>({id:N.id,shape:N.shape,position:N.getPosition(),size:N.getSize(),attrs:N.getAttrs(),data:N.getData()})),$=n.getEdges().map(N=>({id:N.id,source:N.getSourceCellId(),target:N.getTargetCellId(),attrs:N.getAttrs(),data:N.getData()})),B={id:"workflow_"+Date.now(),name:C.trim(),data:{...b,nodes:A,edges:$},createdAt:Date.now(),updatedAt:Date.now()};try{const N=localStorage.getItem("saved-workflows"),w=N?JSON.parse(N):[];w.push(B),localStorage.setItem("saved-workflows",JSON.stringify(w)),alert("✓ 流程保存成功!"),console.log("流程已保存:",B)}catch(N){console.error("保存流程失败:",N),alert("保存失败,请重试")}};e.onMounted(()=>{a(),window.addEventListener("resize",d)});const d=()=>{!n||!r.value||n.resize(r.value.clientWidth,r.value.clientHeight)};return e.onBeforeUnmount(()=>{window.removeEventListener("resize",d);const p=f=>{if(f.key==="Delete"||f.key==="Backspace"){if(!n)return;const C=n.getSelectedCells();C.length&&(f.preventDefault(),n.removeCells(C),l.value&&C.includes(l.value.cell)&&(l.value=null))}};document.removeEventListener("keydown",p),n&&n.dispose()}),(p,f)=>(e.openBlock(),e.createElementBlock("div",K1,[e.createVNode(O1,{"show-close":g.showClose,onClear:u,onValidate:k,onSave:V,onClose:f[0]||(f[0]=C=>p.$emit("close"))},null,8,["show-close"]),e.createElementVNode("div",J1,[e.createElementVNode("div",Z1,[e.createElementVNode("div",{id:"workflow-container",ref_key:"containerRef",ref:r},null,512)]),e.createVNode(R1,{"selected-cell":l.value,"onUpdate:label":i},null,8,["selected-cell"])]),e.createVNode(X1,{visible:E.value,position:c.value,"node-types":o.value,onClose:f[1]||(f[1]=C=>E.value=!1),onSelect:m},null,8,["visible","position","node-types"])]))}}),[["__scopeId","data-v-649349a2"]]),ep={key:0,class:"workflow-dialog-overlay"},tp={class:"workflow-dialog"},op=re(e.defineComponent({__name:"WorkflowDialog",props:{visible:{type:Boolean},scadaGraph:{default:null}},emits:["update:visible","close"],setup(g,{emit:h}){const o=g,r=h;e.watch(()=>o.visible,E=>{E?document.body.style.overflow="hidden":document.body.style.overflow=""});const n=()=>{r("update:visible",!1),r("close")},l=E=>{E.key==="Escape"&&o.visible&&n()};return typeof window<"u"&&window.addEventListener("keydown",l),(E,c)=>g.visible?(e.openBlock(),e.createElementBlock("div",ep,[e.createElementVNode("div",tp,[e.createVNode(Q1,{"scada-graph":g.scadaGraph,"show-close":!0,onClose:n},null,8,["scada-graph"])])])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-4e7f6ab7"]]);class np{constructor(){Ue(this,"animations",new Map)}startAnimation(h,o){if(!h||o.type==="none")return;this.stopAnimation(h.id);const r=h.id;let n=null;switch(o.type){case"blink":n=this.createBlinkAnimation(h,o);break;case"scale":n=this.createScaleAnimation(h,o);break;case"rotate":n=this.createRotateAnimation(h,o);break;case"float":n=this.createFloatAnimation(h,o);break;case"pulse":n=this.createPulseAnimation(h,o);break}n&&this.animations.set(r,n)}stopAnimation(h){const o=this.animations.get(h);o&&(o.stop&&o.stop(),o.intervalId&&clearInterval(o.intervalId),this.animations.delete(h))}createBlinkAnimation(h,o){const r=h.getAttrByPath("body/opacity")||1;let n=!0;const l=setInterval(()=>{n=!n,h.setAttrByPath("body/opacity",n?r:.2),o.loop||(clearInterval(l),h.setAttrByPath("body/opacity",r))},o.duration/2);return{intervalId:l,stop:()=>{clearInterval(l),h.setAttrByPath("body/opacity",r)}}}createScaleAnimation(h,o){const r=h.getSize();let n=!0;const l=.05;let E=1;const c=setInterval(()=>{n?(E+=l,E>=1.2&&(n=!1)):(E-=l,E<=.8&&(n=!0)),h.resize(r.width*E,r.height*E),!o.loop&&E>=.99&&E<=1.01&&(clearInterval(c),h.resize(r.width,r.height))},o.duration/20);return{intervalId:c,stop:()=>{clearInterval(c),h.resize(r.width,r.height)}}}createRotateAnimation(h,o){let r=0;const n=360/(o.duration/50),l=setInterval(()=>{r=(r+n)%360,h.rotate(r,{absolute:!0}),!o.loop&&r>=360&&(clearInterval(l),h.rotate(0,{absolute:!0}))},50);return{intervalId:l,stop:()=>{clearInterval(l),h.rotate(0,{absolute:!0})}}}createFloatAnimation(h,o){const r=h.position();let n=!0;const l=2;let E=r.y;const c=setInterval(()=>{n?(E-=l,E<=r.y-10&&(n=!1)):(E+=l,E>=r.y+10&&(n=!0)),h.position(r.x,E),!o.loop&&Math.abs(E-r.y)<1&&(clearInterval(c),h.position(r.x,r.y))},o.duration/40);return{intervalId:c,stop:()=>{clearInterval(c),h.position(r.x,r.y)}}}createPulseAnimation(h,o){const r=h.getAttrByPath("body/fill"),n=h.getAttrByPath("body/stroke");let l=0,E=!0;const c=setInterval(()=>{E?(l+=.1,l>=1&&(E=!1)):(l-=.1,l<=0&&(E=!0)),h.setAttrByPath("body/opacity",.5+l*.5),!o.loop&&l<=.05&&(clearInterval(c),h.setAttrByPath("body/fill",r),h.setAttrByPath("body/stroke",n),h.setAttrByPath("body/opacity",1))},o.duration/20);return{intervalId:c,stop:()=>{clearInterval(c),h.setAttrByPath("body/fill",r),h.setAttrByPath("body/stroke",n),h.setAttrByPath("body/opacity",1)}}}clearAll(){this.animations.forEach((h,o)=>{this.stopAnimation(o)}),this.animations.clear()}}const ke=new np,ap={class:"scada-layout","data-scada-theme":"dark"},rp={class:"scada-canvas-container"},Xo=re(e.defineComponent({name:"ScadaCanvas",inheritAttrs:!0,__name:"ScadaCanvas",props:{authCode:{default:""},customFooter:{default:void 0},previewMode:{type:Boolean,default:!1},onSave:{type:Function,default:void 0}},emits:["preview"],setup(g,{expose:h,emit:o}){const r=g,n=o,l=e.ref(null),E=e.ref(null),c=e.ref(null),x=e.ref(0),s=e.ref(null),a=e.ref(!1);let t=null;e.onMounted(()=>{var G,P;if(!((G=l.value)!=null&&G.containerRef))return;const v=J.getConfig();ge.Graph.registerEdge("animated-edge",{inherit:"edge",markup:[{tagName:"path",selector:"line",attrs:{fill:"none"}},{tagName:"path",selector:"wrap",attrs:{fill:"none",stroke:"transparent",strokeWidth:20}},{tagName:"circle",selector:"circle"}],attrs:{line:{connection:!0,stroke:"#10b981",strokeWidth:2,targetMarker:{name:"block",width:8,height:6}},wrap:{connection:!0,strokeLinecap:"round",strokeLinejoin:"round"}}},!0);const D=l.value.containerRef,_=v.size.width,F=v.size.height;if((q=>{D.style.width=`${_}px`,D.style.height=`${F}px`,D.style.transform=`scale(${q})`,D.style.transformOrigin="center center"})(v.zoom.scale),t=new ge.Graph({container:D,width:_,height:F,background:v.background.image?{color:v.background.color||"#1e293b",image:v.background.image,size:v.background.size||"cover",repeat:v.background.repeat||"no-repeat",position:"center"}:{color:v.background.color||"#1e293b"},grid:v.grid.enabled?{size:v.grid.size,visible:!0,type:v.grid.type||"dot",args:{color:v.grid.color||"#475569",thickness:1}}:!1,interacting:{nodeMovable:!r.previewMode},panning:{enabled:!0,modifiers:"shift"},mousewheel:{enabled:!0,modifiers:["ctrl","meta"]},connecting:{router:{name:"orth",args:{padding:10}},connector:{name:"rounded",args:{radius:8}},snap:v.magnetism.enabled?{radius:v.magnetism.threshold||10}:!1,allowBlank:!1,allowLoop:!1,allowNode:!1,allowEdge:!1,highlight:!0,createEdge(){return t.createEdge({shape:"animated-edge",zIndex:0})},validateConnection({targetMagnet:q}){return!!q}}}),r.previewMode||t.use(new Gt.Selection({enabled:!0,movable:!0,rubberband:!0,showNodeSelectionBox:!1,showEdgeSelectionBox:!1,multiple:!0,pointerEvents:"none"})),v.guides.enabled&&t.use(new nn.Snapline({enabled:!0,sharp:!0,clean:!0})),!r.previewMode){const q=eo(Ie.SCADA_EDITOR_DATA);if(((P=q==null?void 0:q.cells)==null?void 0:P.length)>0)try{const X=q.cells.map(te=>{var se;return te.position&&typeof te.position=="object"&&(typeof te.position.x!="number"||typeof te.position.y!="number")&&(te.position={x:100,y:100}),(te.shape==="edge"||te.shape==="animated-edge")&&(te.router==="manhattan"||((se=te.router)==null?void 0:se.name)==="manhattan")&&(te.router={name:"orth",args:{padding:10}}),te});t.fromJSON({cells:X}),t.getEdges().forEach(te=>{var ne;const se=te.getData();(ne=se==null?void 0:se.animation)!=null&&ne.enabled&&p(te,se.animation)})}catch(X){console.error("恢复画布数据失败,清空缓存:",X),sessionStorage.removeItem(Ie.SCADA_EDITOR_DATA)}}t.on("selection:changed",({selected:q})=>{var te,se;const X=q?q.filter(ne=>ne.isNode()):[];if(x.value=X.length,q&&q.length>0){const ne=q[0];if(ne.isNode())E.value=ne,c.value=null;else if(ne.isEdge()){c.value=ne,E.value=null;const ie=ne.getAttrs();ne.data={...ne.data,originalAttrs:ie},ne.attr("line/stroke","#3b82f6")}}else{if(c.value&&((te=c.value.data)!=null&&te.originalAttrs)){const ne=c.value.data.originalAttrs;c.value.attr("line/stroke",((se=ne.line)==null?void 0:se.stroke)||"#10b981")}E.value=null,c.value=null}}),t.on("edge:click",({edge:q})=>{t.select(q)}),t.on("blank:click",()=>{c.value=null,E.value=null}),t.on("node:change:position",()=>{}),t.on("node:change:size",()=>{}),t.on("node:change:data",({node:q})=>{const X=q.getData();if(X.animation)if(X.animation.enabled===!0){const te={type:X.animation.type||"none",duration:X.animation.duration||1e3,loop:X.animation.loop!==!1};ke.startAnimation(q,te)}else ke.stopAnimation(q.id)}),t.on("edge:change:data",({edge:q})=>{const X=q.getData();X!=null&&X.animation&&p(q,X.animation)});const L=q=>{if(q.key==="Delete"&&t){if(E.value){const X=E.value.id;ke.stopAnimation(X),t.removeNode(X),E.value=null}else if(c.value){const X=c.value.id;t.removeEdge(X),c.value=null}}};document.addEventListener("keydown",L),e.onUnmounted(()=>{document.removeEventListener("keydown",L)})}),e.onUnmounted(()=>{if(t){ke.clearAll();const v={cells:t.toJSON().cells};ot(Ie.SCADA_EDITOR_DATA,v),t.dispose()}}),e.watch(()=>J.getConfig(),v=>{var _;if(!t)return;v.background.image?t.drawBackground({color:v.background.color||"#1e293b",image:v.background.image,size:v.background.size||"cover",repeat:v.background.repeat||"no-repeat",position:"center"}):t.drawBackground({color:v.background.color||"#1e293b"});const D=(_=l.value)==null?void 0:_.containerRef;D&&(D.style.transform=`scale(${v.zoom.scale})`,D.style.transformOrigin="center center",t.resize(v.size.width,v.size.height),D.style.width=`${v.size.width}px`,D.style.height=`${v.size.height}px`),v.grid.enabled?(t.drawGrid({type:v.grid.type||"dot",args:{color:v.grid.color||"#475569",thickness:1}}),t.showGrid()):t.hideGrid(),v.grid.enabled&&v.grid.size&&t.setGridSize(v.grid.size),t.translate(v.offset.x,v.offset.y)},{deep:!0});const i=e.ref({}),m=(v,D)=>(i.value[v]||(i.value[v]=0),i.value[v]++,`${D}_${i.value[v]}`),u=v=>{var P,q,X,te;if(!t)return;const D=Pe.getComponent(v);if(!D){console.error(`未找到组件配置: ${v}`);return}const _=m(v,D.metadata.name),F={enabled:!1,type:"none",duration:1e3,loop:!0},H=ao(50,50,400,300),L={x:H.x,y:H.y,shape:D.shape,width:D.width,height:D.height,label:D.label,attrs:D.attrs,ports:D.ports,data:{...D.data,componentType:v,componentName:_,props:D.props,animation:F,originalStroke:((q=(P=D.attrs)==null?void 0:P.body)==null?void 0:q.stroke)||"#2563eb",originalStrokeWidth:((te=(X=D.attrs)==null?void 0:X.body)==null?void 0:te.strokeWidth)||2}},G=t.addNode(L);t.cleanSelection(),t.select(G)},y=v=>{if(E.value&&(v.attrs&&Object.keys(v.attrs).forEach(D=>{const _=v.attrs[D];typeof _=="object"?Object.keys(_).forEach(F=>{E.value.attr(`${D}/${F}`,_[F])}):E.value.attr(D,_)}),v.position&&(typeof v.position.x=="number"&&typeof v.position.y=="number"?E.value.setPosition(v.position):console.error("position 数据格式错误:",v.position)),v.size&&(typeof v.size.width=="number"&&typeof v.size.height=="number"?E.value.setSize(v.size):console.error("size 数据格式错误:",v.size)),v.data)){const D={...v.data};delete D.position,delete D.size,E.value.store.set("data",D)}},k=()=>{if(!E.value||!t)return;const v=E.value.id;ke.stopAnimation(v),t.removeNode(v),E.value=null},V=v=>{if(c.value){if(v.attrs){Object.keys(v.attrs).forEach(_=>{const F=v.attrs[_];typeof F=="object"?Object.keys(F).forEach(H=>{var L,G;c.value.attr(`${_}/${H}`,F[H]),(G=(L=c.value.data)==null?void 0:L.originalAttrs)!=null&&G[_]&&(c.value.data.originalAttrs[_][H]=F[H])}):c.value.attr(_,F)});const D=c.value.getAttrs();c.value.data={...c.value.data,originalAttrs:D},c.value.attr("line/stroke","#3b82f6")}v.router&&c.value.setRouter(v.router),v.connector&&c.value.setConnector(v.connector),v.animation&&p(c.value,v.animation),v.data&&c.value.setData({...c.value.data,...v.data})}},d=()=>{!c.value||!t||(t.removeEdge(c.value.id),c.value=null)},p=(v,D)=>{if(!v||typeof v.attr!="function"){console.warn("applyEdgeAnimation: edge 对象无效",v);return}if(!D||!D.enabled){v.attr("line/strokeDasharray",void 0),typeof v.removeAttr=="function"&&v.removeAttr("line/class"),v.attr("circle",void 0),typeof v.stopTransition=="function"&&v.stopTransition("attrs/circle/atConnectionRatio");return}const _=D.duration||2e3;v.attr("circle",{r:4,atConnectionRatio:0,fill:{type:"radialGradient",stops:[{offset:"0%",color:"#FFF"},{offset:"100%",color:v.attr("line/stroke")||"#10b981"}]},stroke:v.attr("line/stroke")||"#10b981",strokeWidth:1});const F=()=>{v.attr("circle/atConnectionRatio",0,{silent:!0}),v.transition("attrs/circle/atConnectionRatio",1,{delay:0,duration:_,timing:"linear",complete:()=>{F()}})};F()},f=()=>{t&&confirm("确定要清空画布吗?")&&(ke.clearAll(),t.clearCells(),E.value=null,to(Ie.SCADA_EDITOR_DATA))},C=()=>{if(!t)return;const v=J.getConfig().zoom.scale,D=Math.min(5,v+.1);J.setZoom(D)},b=()=>{if(!t)return;const v=J.getConfig().zoom.scale,D=Math.max(.1,v-.1);J.setZoom(D)},A=()=>{if(!t)return;const v=t.getSelectedCells().filter(_=>_.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=Math.min(...v.map(_=>_.getPosition().x));v.forEach(_=>{_.setPosition({x:D,y:_.getPosition().y})})},$=()=>{if(!t)return;const v=t.getSelectedCells().filter(F=>F.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=v.map(F=>F.getPosition().x+F.getSize().width/2),_=D.reduce((F,H)=>F+H,0)/D.length;v.forEach(F=>{const H=_-F.getSize().width/2;F.setPosition({x:H,y:F.getPosition().y})})},S=()=>{if(!t)return;const v=t.getSelectedCells().filter(_=>_.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=Math.max(...v.map(_=>_.getPosition().x+_.getSize().width));v.forEach(_=>{const F=D-_.getSize().width;_.setPosition({x:F,y:_.getPosition().y})})},B=()=>{if(!t)return;const v=t.getSelectedCells().filter(_=>_.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=Math.min(...v.map(_=>_.getPosition().y));v.forEach(_=>{_.setPosition({x:_.getPosition().x,y:D})})},N=()=>{if(!t)return;const v=t.getSelectedCells().filter(F=>F.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=v.map(F=>F.getPosition().y+F.getSize().height/2),_=D.reduce((F,H)=>F+H,0)/D.length;v.forEach(F=>{const H=_-F.getSize().height/2;F.setPosition({x:F.getPosition().x,y:H})})},w=()=>{if(!t)return;const v=t.getSelectedCells().filter(_=>_.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=Math.max(...v.map(_=>_.getPosition().y+_.getSize().height));v.forEach(_=>{const F=D-_.getSize().height;_.setPosition({x:_.getPosition().x,y:F})})},I=()=>{if(!t)return;const v=t.getSelectedCells().filter(G=>G.isNode());if(v.length<3){le("请选择至少三个节点","warning");return}const D=v.sort((G,P)=>G.getPosition().x-P.getPosition().x),_=D[0],L=(D[D.length-1].getPosition().x-_.getPosition().x)/(D.length-1);D.forEach((G,P)=>{if(P===0||P===D.length-1)return;const q=_.getPosition().x+L*P;G.setPosition({x:q,y:G.getPosition().y})})},R=()=>{if(!t)return;const v=t.getSelectedCells().filter(G=>G.isNode());if(v.length<3){le("请选择至少三个节点","warning");return}const D=v.sort((G,P)=>G.getPosition().y-P.getPosition().y),_=D[0],L=(D[D.length-1].getPosition().y-_.getPosition().y)/(D.length-1);D.forEach((G,P)=>{if(P===0||P===D.length-1)return;const q=_.getPosition().y+L*P;G.setPosition({x:G.getPosition().x,y:q})})},O=async()=>{if(!t){le("画布未初始化","error");return}try{if(console.log("[ScadaCanvas] handleSave 被调用"),console.log("[ScadaCanvas] props.onSave:",r.onSave),r.onSave){console.log("[ScadaCanvas] 调用自定义 onSave 回调"),await r.onSave(),console.log("[ScadaCanvas] 自定义 onSave 回调执行完成");return}console.log("[ScadaCanvas] 没有自定义回调,执行默认下载");const v={version:"1.0.0",timestamp:new Date().toISOString(),config:{size:J.getConfig().size,background:J.getConfig().background,grid:J.getConfig().grid,guides:J.getConfig().guides,magnetism:J.getConfig().magnetism,zoom:J.getConfig().zoom},cells:t.toJSON().cells},D=new Blob([JSON.stringify(v,null,2)],{type:"application/json"}),_=URL.createObjectURL(D),F=document.createElement("a"),H=`scada-canvas-${new Date().getTime()}.json`;F.href=_,F.download=H,F.click(),URL.revokeObjectURL(_),le("保存成功","success")}catch(v){console.error("保存失败",v),le("保存失败,请查看控制台","error")}},j=()=>{s.value&&s.value.click()},Z=v=>{var H;const _=(H=v.target.files)==null?void 0:H[0];if(!_){le("请选择文件","error");return}const F=new FileReader;F.onload=L=>{var G;try{const P=JSON.parse((G=L.target)==null?void 0:G.result);if(!P.cells){le("无效的JSON文件格式","error");return}if(!confirm("导入将清空当前画布,是否继续?"))return;if(t){if(t.clearCells(),t.fromJSON({cells:P.cells}),t.getEdges().forEach(q=>{var te;const X=q.getData();(te=X==null?void 0:X.animation)!=null&&te.enabled&&p(q,X.animation)}),P.config&&J.updateConfig(P.config),P.workflows&&Array.isArray(P.workflows)&&P.workflows.length>0)try{const q=localStorage.getItem("saved-workflows"),X=q?JSON.parse(q):[];let te=0,se=0;P.workflows.forEach(ne=>{const ie=X.findIndex(Ee=>Ee.id===ne.id);ie>=0?(X[ie]={...ne,updatedAt:Date.now()},se++):(X.push(ne),te++)}),localStorage.setItem("saved-workflows",JSON.stringify(X)),le(`导入成功 画布已加载,流程: 新增${te}个,更新${se}个`,"success")}catch(q){console.error("导入流程数据失败:",q),le("画布导入成功, 但流程数据导入失败","warning")}else le("导入成功","success");s.value&&(s.value.value="")}}catch(P){console.error("导入失败",P),le("导入失败,JSON格式错误","error"),s.value&&(s.value.value="")}},F.readAsText(_)},ee=()=>{if(console.log("🎬 [ScadaCanvas] handlePreview 被调用"),!t){console.error("⚠️ [ScadaCanvas] graph 不存在");return}const v={cells:t.toJSON().cells,config:{width:J.getConfig().size.width,height:J.getConfig().size.height,background:J.getConfig().background,grid:J.getConfig().grid}};ot(Ie.SCADA_PREVIEW_DATA,v),console.log("✅ [ScadaCanvas] 数据已保存到 sessionStorage"),console.log("📤 [ScadaCanvas] 即将触发 preview 事件"),n("preview"),console.log("✅ [ScadaCanvas] preview 事件已触发")},ae=()=>{a.value=!0},oe=()=>{if(!t){le("画布未初始化","error");return}try{const v={version:"1.0.0",timestamp:at(rt()),config:{size:J.getConfig().size,background:J.getConfig().background,grid:J.getConfig().grid,guides:J.getConfig().guides,magnetism:J.getConfig().magnetism,zoom:J.getConfig().zoom},cells:t.toJSON().cells,nodes:t.getNodes().map(F=>({id:F.id,type:F.shape,position:F.getPosition(),size:F.getSize(),label:F.attr("label/text"),data:F.getData()})),edges:t.getEdges().map(F=>({id:F.id,source:F.getSourceCellId(),target:F.getTargetCellId()})),workflows:[]},D=new Set;if(t.getNodes().forEach(F=>{const H=F.getData();H!=null&&H.events&&Array.isArray(H.events)&&H.events.forEach(L=>{var G;L.action==="callProcess"&&((G=L.params)!=null&&G.processId)&&D.add(L.params.processId)})}),D.size>0)try{const F=localStorage.getItem("saved-workflows");if(F){const H=JSON.parse(F);v.workflows=H.filter(L=>D.has(L.id))}}catch(F){console.error("加载流程数据失败:",F)}const _=oo(v,"scada-export");le(`已导出为 ${_}`,"success")}catch(v){console.error("导出失败",v),le("导出失败,请查看控制台","error")}};return h({save:O,import:j,export:oe,preview:ee,workflow:ae,zoomIn:C,zoomOut:b,clearAll:f,alignLeft:A,alignCenter:$,alignRight:S,alignTop:B,alignMiddle:N,alignBottom:w,distributeHorizontal:I,distributeVertical:R,addNode:u,updateNode:y,deleteNode:k,getSelectedNode:()=>E.value,selectNode:v=>{if(!t)return!1;const D=t.getCellById(v);return D?(t.select(D),!0):!1},clearSelection:()=>{t&&(t.unselect(t.getSelectedCells()),E.value=null)},getGraph:()=>t,getCanvasData:()=>t?{version:"1.0.0",timestamp:at(rt()),config:J.getConfig(),cells:t.toJSON().cells,nodes:t.getNodes().map(v=>({id:v.id,type:v.shape,position:v.getPosition(),size:v.getSize(),label:v.attr("label/text"),data:v.getData()})),edges:t.getEdges().map(v=>({id:v.id,source:v.getSourceCellId(),target:v.getTargetCellId()}))}:null,loadCanvasData:v=>{if(!t)return!1;try{return t.clearCells(),t.fromJSON({cells:v.cells}),v.config&&J.updateConfig(v.config),t.getEdges().forEach(D=>{var F;const _=D.getData();(F=_==null?void 0:_.animation)!=null&&F.enabled&&p(D,_.animation)}),!0}catch(D){return console.error("加载画布数据失败:",D),!1}},getAllNodes:()=>t?t.getNodes().map(v=>({id:v.id,type:v.shape,position:v.getPosition(),size:v.getSize(),label:v.attr("label/text"),data:v.getData()})):[],getNodeById:v=>{if(!t)return null;const D=t.getCellById(v);if(!D||!D.isNode())return null;const _=D;return{id:_.id,type:_.shape,position:_.getPosition(),size:_.getSize(),label:_.attr("label/text"),data:_.getData()}},getConfigManager:()=>J,updateCanvasConfig:v=>{J.updateConfig(v)},setZoom:v=>{J.setZoom(v)},setCanvasSize:(v,D)=>{J.updateSize({width:v,height:D})},setBackgroundColor:v=>{J.updateBackground({color:v})},getAnimationEngine:()=>ke}),(v,D)=>(e.openBlock(),e.createElementBlock("div",ap,[r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(Ge,{key:0,"selected-nodes-count":x.value,onSave:O,onImport:j,onWorkflow:ae,onPreview:ee,onExport:oe,onZoomIn:C,onZoomOut:b,onClearAll:f,onAlignLeft:A,onAlignCenter:$,onAlignRight:S,onAlignTop:B,onAlignMiddle:N,onAlignBottom:w,onDistributeHorizontal:I,onDistributeVertical:R},null,8,["selected-nodes-count"])),r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("input",{key:1,ref_key:"fileInputRef",ref:s,type:"file",accept:".json",style:{display:"none"},onChange:Z},null,544)),e.createElementVNode("div",rp,[r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(Xe,{key:0,onAddComponent:u})),e.createVNode(Kn,{ref_key:"canvasAreaRef",ref:l},null,512),r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(lt,{key:1,ref:"propertyPanelRef","selected-node":E.value,"selected-edge":c.value,onUpdateNode:y,onDeleteNode:k,onUpdateEdge:V,onDeleteEdge:d},null,8,["selected-node","selected-edge"]))]),e.createVNode(Ed,{"auth-code":g.authCode,"custom-footer":g.customFooter},null,8,["auth-code","custom-footer"]),r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(op,{key:2,visible:a.value,"onUpdate:visible":D[0]||(D[0]=_=>a.value=_),"scada-graph":e.unref(t),onClose:D[1]||(D[1]=_=>a.value=!1)},null,8,["visible","scada-graph"]))]))}}),[["__scopeId","data-v-f7126c68"]]),lp={ScadaCanvas:Xo,PropertyPanel:lt,Header:Ge,ComponentLibrary:Xe,CanvasConfigPanel:Ye,BindingCard:Qe,EventCard:Je,BasicPropertiesTab:Ke,AttributeConfigDialog:et,CustomCodeDialog:tt},Yo=g=>{Object.entries(lp).forEach(([h,o])=>{g.component(h,o)})},sp={install:Yo,version:"1.0.0"};U.AttributeConfigDialog=et,U.BasicComponents=wn,U.BasicPropertiesTab=Ke,U.BindingCard=Qe,U.CanvasConfigPanel=Ye,U.ComponentLibrary=Xe,U.CustomCodeDialog=tt,U.EventCard=Je,U.Header=Ge,U.IoTComponents=Sn,U.PropertyPanel=lt,U.STORAGE_KEYS=Ie,U.ScadaCanvas=Xo,U.animationEngine=ke,U.canvasConfigItems=zn,U.canvasConfigManager=J,U.componentRegistry=Pe,U.default=sp,U.defaultCanvasConfig=je,U.exportToJSON=oo,U.formatTimestamp=at,U.generateEventId=no,U.generateNodeId=dc,U.generateUniqueId=nt,U.getCurrentTimestamp=rt,U.install=Yo,U.loadFromLocal=ic,U.loadFromSession=eo,U.randomPosition=ao,U.removeFromLocal=cc,U.removeFromSession=to,U.saveToLocal=sc,U.saveToSession=ot,U.showMessage=le,U.sizePresetMap=Re,Object.defineProperties(U,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
58
+ 是否继续保存?`,!confirm(N))return}const C=prompt("请输入流程名称:","未命名流程");if(!C||!C.trim())return;const b=n.toJSON(),A=n.getNodes().map(N=>({id:N.id,shape:N.shape,position:N.getPosition(),size:N.getSize(),attrs:N.getAttrs(),data:N.getData()})),$=n.getEdges().map(N=>({id:N.id,source:N.getSourceCellId(),target:N.getTargetCellId(),attrs:N.getAttrs(),data:N.getData()})),B={id:"workflow_"+Date.now(),name:C.trim(),data:{...b,nodes:A,edges:$},createdAt:Date.now(),updatedAt:Date.now()};try{const N=localStorage.getItem("saved-workflows"),w=N?JSON.parse(N):[];w.push(B),localStorage.setItem("saved-workflows",JSON.stringify(w)),alert("✓ 流程保存成功!"),console.log("流程已保存:",B)}catch(N){console.error("保存流程失败:",N),alert("保存失败,请重试")}};e.onMounted(()=>{a(),window.addEventListener("resize",d)});const d=()=>{!n||!r.value||n.resize(r.value.clientWidth,r.value.clientHeight)};return e.onBeforeUnmount(()=>{window.removeEventListener("resize",d);const p=f=>{if(f.key==="Delete"||f.key==="Backspace"){if(!n)return;const C=n.getSelectedCells();C.length&&(f.preventDefault(),n.removeCells(C),l.value&&C.includes(l.value.cell)&&(l.value=null))}};document.removeEventListener("keydown",p),n&&n.dispose()}),(p,f)=>(e.openBlock(),e.createElementBlock("div",K1,[e.createVNode(O1,{"show-close":g.showClose,onClear:u,onValidate:k,onSave:V,onClose:f[0]||(f[0]=C=>p.$emit("close"))},null,8,["show-close"]),e.createElementVNode("div",J1,[e.createElementVNode("div",Z1,[e.createElementVNode("div",{id:"workflow-container",ref_key:"containerRef",ref:r},null,512)]),e.createVNode(R1,{"selected-cell":l.value,"onUpdate:label":i},null,8,["selected-cell"])]),e.createVNode(X1,{visible:E.value,position:c.value,"node-types":o.value,onClose:f[1]||(f[1]=C=>E.value=!1),onSelect:m},null,8,["visible","position","node-types"])]))}}),[["__scopeId","data-v-649349a2"]]),ep={key:0,class:"workflow-dialog-overlay"},tp={class:"workflow-dialog"},op=re(e.defineComponent({__name:"WorkflowDialog",props:{visible:{type:Boolean},scadaGraph:{default:null}},emits:["update:visible","close"],setup(g,{emit:h}){const o=g,r=h;e.watch(()=>o.visible,E=>{E?document.body.style.overflow="hidden":document.body.style.overflow=""});const n=()=>{r("update:visible",!1),r("close")},l=E=>{E.key==="Escape"&&o.visible&&n()};return typeof window<"u"&&window.addEventListener("keydown",l),(E,c)=>g.visible?(e.openBlock(),e.createElementBlock("div",ep,[e.createElementVNode("div",tp,[e.createVNode(Q1,{"scada-graph":g.scadaGraph,"show-close":!0,onClose:n},null,8,["scada-graph"])])])):e.createCommentVNode("",!0)}}),[["__scopeId","data-v-4e7f6ab7"]]);class np{constructor(){Ue(this,"animations",new Map)}startAnimation(h,o){if(!h||o.type==="none")return;this.stopAnimation(h.id);const r=h.id;let n=null;switch(o.type){case"blink":n=this.createBlinkAnimation(h,o);break;case"scale":n=this.createScaleAnimation(h,o);break;case"rotate":n=this.createRotateAnimation(h,o);break;case"float":n=this.createFloatAnimation(h,o);break;case"pulse":n=this.createPulseAnimation(h,o);break}n&&this.animations.set(r,n)}stopAnimation(h){const o=this.animations.get(h);o&&(o.stop&&o.stop(),o.intervalId&&clearInterval(o.intervalId),this.animations.delete(h))}createBlinkAnimation(h,o){const r=h.getAttrByPath("body/opacity")||1;let n=!0;const l=setInterval(()=>{n=!n,h.setAttrByPath("body/opacity",n?r:.2),o.loop||(clearInterval(l),h.setAttrByPath("body/opacity",r))},o.duration/2);return{intervalId:l,stop:()=>{clearInterval(l),h.setAttrByPath("body/opacity",r)}}}createScaleAnimation(h,o){const r=h.getSize();let n=!0;const l=.05;let E=1;const c=setInterval(()=>{n?(E+=l,E>=1.2&&(n=!1)):(E-=l,E<=.8&&(n=!0)),h.resize(r.width*E,r.height*E),!o.loop&&E>=.99&&E<=1.01&&(clearInterval(c),h.resize(r.width,r.height))},o.duration/20);return{intervalId:c,stop:()=>{clearInterval(c),h.resize(r.width,r.height)}}}createRotateAnimation(h,o){let r=0;const n=360/(o.duration/50),l=setInterval(()=>{r=(r+n)%360,h.rotate(r,{absolute:!0}),!o.loop&&r>=360&&(clearInterval(l),h.rotate(0,{absolute:!0}))},50);return{intervalId:l,stop:()=>{clearInterval(l),h.rotate(0,{absolute:!0})}}}createFloatAnimation(h,o){const r=h.position();let n=!0;const l=2;let E=r.y;const c=setInterval(()=>{n?(E-=l,E<=r.y-10&&(n=!1)):(E+=l,E>=r.y+10&&(n=!0)),h.position(r.x,E),!o.loop&&Math.abs(E-r.y)<1&&(clearInterval(c),h.position(r.x,r.y))},o.duration/40);return{intervalId:c,stop:()=>{clearInterval(c),h.position(r.x,r.y)}}}createPulseAnimation(h,o){const r=h.getAttrByPath("body/fill"),n=h.getAttrByPath("body/stroke");let l=0,E=!0;const c=setInterval(()=>{E?(l+=.1,l>=1&&(E=!1)):(l-=.1,l<=0&&(E=!0)),h.setAttrByPath("body/opacity",.5+l*.5),!o.loop&&l<=.05&&(clearInterval(c),h.setAttrByPath("body/fill",r),h.setAttrByPath("body/stroke",n),h.setAttrByPath("body/opacity",1))},o.duration/20);return{intervalId:c,stop:()=>{clearInterval(c),h.setAttrByPath("body/fill",r),h.setAttrByPath("body/stroke",n),h.setAttrByPath("body/opacity",1)}}}clearAll(){this.animations.forEach((h,o)=>{this.stopAnimation(o)}),this.animations.clear()}}const ke=new np,ap={class:"scada-layout","data-scada-theme":"dark"},rp={class:"scada-canvas-container"},Xo=re(e.defineComponent({name:"ScadaCanvas",inheritAttrs:!0,__name:"ScadaCanvas",props:{authCode:{default:""},customFooter:{default:void 0},previewMode:{type:Boolean,default:!1},onSave:{type:Function,default:void 0}},emits:["preview"],setup(g,{expose:h,emit:o}){const r=g,n=o,l=e.ref(null),E=e.ref(null),c=e.ref(null),x=e.ref(0),s=e.ref(null),a=e.ref(!1);let t=null;e.onMounted(()=>{var G,P;if(!((G=l.value)!=null&&G.containerRef))return;const v=J.getConfig();ge.Graph.registerEdge("animated-edge",{inherit:"edge",markup:[{tagName:"path",selector:"line",attrs:{fill:"none"}},{tagName:"path",selector:"wrap",attrs:{fill:"none",stroke:"transparent",strokeWidth:20}},{tagName:"circle",selector:"circle"}],attrs:{line:{connection:!0,stroke:"#10b981",strokeWidth:2,targetMarker:{name:"block",width:8,height:6}},wrap:{connection:!0,strokeLinecap:"round",strokeLinejoin:"round"}}},!0);const D=l.value.containerRef,_=v.size.width,F=v.size.height;if((q=>{D.style.width=`${_}px`,D.style.height=`${F}px`,D.style.transform=`scale(${q})`,D.style.transformOrigin="center center"})(v.zoom.scale),t=new ge.Graph({container:D,width:_,height:F,background:v.background.image?{color:v.background.color||"#1e293b",image:v.background.image,size:v.background.size||"cover",repeat:v.background.repeat||"no-repeat",position:"center"}:{color:v.background.color||"#1e293b"},grid:v.grid.enabled?{size:v.grid.size,visible:!0,type:v.grid.type||"dot",args:{color:v.grid.color||"#475569",thickness:1}}:!1,interacting:{nodeMovable:!r.previewMode},panning:{enabled:!0,modifiers:"shift"},mousewheel:{enabled:!0,modifiers:["ctrl","meta"]},connecting:{router:{name:"orth",args:{padding:10}},connector:{name:"rounded",args:{radius:8}},snap:v.magnetism.enabled?{radius:v.magnetism.threshold||10}:!1,allowBlank:!1,allowLoop:!1,allowNode:!1,allowEdge:!1,highlight:!0,createEdge(){return t.createEdge({shape:"animated-edge",zIndex:0})},validateConnection({targetMagnet:q}){return!!q}}}),r.previewMode||t.use(new Gt.Selection({enabled:!0,movable:!0,rubberband:!0,showNodeSelectionBox:!1,showEdgeSelectionBox:!1,multiple:!0,pointerEvents:"none"})),v.guides.enabled&&t.use(new nn.Snapline({enabled:!0,sharp:!0,clean:!0})),!r.previewMode){const q=eo(Ie.SCADA_EDITOR_DATA);if(((P=q==null?void 0:q.cells)==null?void 0:P.length)>0)try{const X=q.cells.map(te=>{var se;return te.position&&typeof te.position=="object"&&(typeof te.position.x!="number"||typeof te.position.y!="number")&&(te.position={x:100,y:100}),(te.shape==="edge"||te.shape==="animated-edge")&&(te.router==="manhattan"||((se=te.router)==null?void 0:se.name)==="manhattan")&&(te.router={name:"orth",args:{padding:10}}),te});t.fromJSON({cells:X}),t.getEdges().forEach(te=>{var ne;const se=te.getData();(ne=se==null?void 0:se.animation)!=null&&ne.enabled&&p(te,se.animation)})}catch(X){console.error("恢复画布数据失败,清空缓存:",X),sessionStorage.removeItem(Ie.SCADA_EDITOR_DATA)}}t.on("selection:changed",({selected:q})=>{var te,se;const X=q?q.filter(ne=>ne.isNode()):[];if(x.value=X.length,q&&q.length>0){const ne=q[0];if(ne.isNode())E.value=ne,c.value=null;else if(ne.isEdge()){c.value=ne,E.value=null;const ie=ne.getAttrs();ne.data={...ne.data,originalAttrs:ie},ne.attr("line/stroke","#3b82f6")}}else{if(c.value&&((te=c.value.data)!=null&&te.originalAttrs)){const ne=c.value.data.originalAttrs;c.value.attr("line/stroke",((se=ne.line)==null?void 0:se.stroke)||"#10b981")}E.value=null,c.value=null}}),t.on("edge:click",({edge:q})=>{t.select(q)}),t.on("blank:click",()=>{c.value=null,E.value=null}),t.on("node:change:position",()=>{}),t.on("node:change:size",()=>{}),t.on("node:change:data",({node:q})=>{const X=q.getData();if(X.animation)if(X.animation.enabled===!0){const te={type:X.animation.type||"none",duration:X.animation.duration||1e3,loop:X.animation.loop!==!1};ke.startAnimation(q,te)}else ke.stopAnimation(q.id)}),t.on("edge:change:data",({edge:q})=>{const X=q.getData();X!=null&&X.animation&&p(q,X.animation)});const L=q=>{if(q.key==="Delete"&&t){if(E.value){const X=E.value.id;ke.stopAnimation(X),t.removeNode(X),E.value=null}else if(c.value){const X=c.value.id;t.removeEdge(X),c.value=null}}};document.addEventListener("keydown",L),e.onUnmounted(()=>{document.removeEventListener("keydown",L)})}),e.onUnmounted(()=>{if(t){ke.clearAll();const v={cells:t.toJSON().cells};ot(Ie.SCADA_EDITOR_DATA,v),t.dispose()}}),e.watch(()=>J.getConfig(),v=>{var _;if(!t)return;v.background.image?t.drawBackground({color:v.background.color||"#1e293b",image:v.background.image,size:v.background.size||"cover",repeat:v.background.repeat||"no-repeat",position:"center"}):t.drawBackground({color:v.background.color||"#1e293b"});const D=(_=l.value)==null?void 0:_.containerRef;D&&(D.style.transform=`scale(${v.zoom.scale})`,D.style.transformOrigin="center center",t.resize(v.size.width,v.size.height),D.style.width=`${v.size.width}px`,D.style.height=`${v.size.height}px`),v.grid.enabled?(t.drawGrid({type:v.grid.type||"dot",args:{color:v.grid.color||"#475569",thickness:1}}),t.showGrid()):t.hideGrid(),v.grid.enabled&&v.grid.size&&t.setGridSize(v.grid.size),t.translate(v.offset.x,v.offset.y)},{deep:!0});const i=e.ref({}),m=(v,D)=>(i.value[v]||(i.value[v]=0),i.value[v]++,`${D}_${i.value[v]}`),u=v=>{var P,q,X,te;if(!t)return;const D=Pe.getComponent(v);if(!D){console.error(`未找到组件配置: ${v}`);return}const _=m(v,D.metadata.name),F={enabled:!1,type:"none",duration:1e3,loop:!0},H=ao(50,50,400,300),L={x:H.x,y:H.y,shape:D.shape,width:D.width,height:D.height,label:D.label,attrs:D.attrs,ports:D.ports,data:{...D.data,componentType:v,componentName:_,props:D.props,animation:F,originalStroke:((q=(P=D.attrs)==null?void 0:P.body)==null?void 0:q.stroke)||"#2563eb",originalStrokeWidth:((te=(X=D.attrs)==null?void 0:X.body)==null?void 0:te.strokeWidth)||2}},G=t.addNode(L);t.cleanSelection(),t.select(G)},y=v=>{if(E.value&&(v.attrs&&Object.keys(v.attrs).forEach(D=>{const _=v.attrs[D];typeof _=="object"?Object.keys(_).forEach(F=>{E.value.attr(`${D}/${F}`,_[F])}):E.value.attr(D,_)}),v.position&&(typeof v.position.x=="number"&&typeof v.position.y=="number"?E.value.setPosition(v.position):console.error("position 数据格式错误:",v.position)),v.size&&(typeof v.size.width=="number"&&typeof v.size.height=="number"?E.value.setSize(v.size):console.error("size 数据格式错误:",v.size)),v.data)){const D={...v.data};delete D.position,delete D.size,E.value.store.set("data",D)}},k=()=>{if(!E.value||!t)return;const v=E.value.id;ke.stopAnimation(v),t.removeNode(v),E.value=null},V=v=>{if(c.value){if(v.attrs){Object.keys(v.attrs).forEach(_=>{const F=v.attrs[_];typeof F=="object"?Object.keys(F).forEach(H=>{var L,G;c.value.attr(`${_}/${H}`,F[H]),(G=(L=c.value.data)==null?void 0:L.originalAttrs)!=null&&G[_]&&(c.value.data.originalAttrs[_][H]=F[H])}):c.value.attr(_,F)});const D=c.value.getAttrs();c.value.data={...c.value.data,originalAttrs:D},c.value.attr("line/stroke","#3b82f6")}v.router&&c.value.setRouter(v.router),v.connector&&c.value.setConnector(v.connector),v.animation&&p(c.value,v.animation),v.data&&c.value.setData({...c.value.data,...v.data})}},d=()=>{!c.value||!t||(t.removeEdge(c.value.id),c.value=null)},p=(v,D)=>{if(!v||typeof v.attr!="function"){console.warn("applyEdgeAnimation: edge 对象无效",v);return}if(!D||!D.enabled){v.attr("line/strokeDasharray",void 0),typeof v.removeAttr=="function"&&v.removeAttr("line/class"),v.attr("circle",void 0),typeof v.stopTransition=="function"&&v.stopTransition("attrs/circle/atConnectionRatio");return}const _=D.duration||2e3;v.attr("circle",{r:4,atConnectionRatio:0,fill:{type:"radialGradient",stops:[{offset:"0%",color:"#FFF"},{offset:"100%",color:v.attr("line/stroke")||"#10b981"}]},stroke:v.attr("line/stroke")||"#10b981",strokeWidth:1});const F=()=>{v.attr("circle/atConnectionRatio",0,{silent:!0}),v.transition("attrs/circle/atConnectionRatio",1,{delay:0,duration:_,timing:"linear",complete:()=>{F()}})};F()},f=()=>{t&&confirm("确定要清空画布吗?")&&(ke.clearAll(),t.clearCells(),E.value=null,to(Ie.SCADA_EDITOR_DATA))},C=()=>{if(!t)return;const v=J.getConfig().zoom.scale,D=Math.min(5,v+.1);J.setZoom(D)},b=()=>{if(!t)return;const v=J.getConfig().zoom.scale,D=Math.max(.1,v-.1);J.setZoom(D)},A=()=>{if(!t)return;const v=t.getSelectedCells().filter(_=>_.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=Math.min(...v.map(_=>_.getPosition().x));v.forEach(_=>{_.setPosition({x:D,y:_.getPosition().y})})},$=()=>{if(!t)return;const v=t.getSelectedCells().filter(F=>F.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=v.map(F=>F.getPosition().x+F.getSize().width/2),_=D.reduce((F,H)=>F+H,0)/D.length;v.forEach(F=>{const H=_-F.getSize().width/2;F.setPosition({x:H,y:F.getPosition().y})})},S=()=>{if(!t)return;const v=t.getSelectedCells().filter(_=>_.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=Math.max(...v.map(_=>_.getPosition().x+_.getSize().width));v.forEach(_=>{const F=D-_.getSize().width;_.setPosition({x:F,y:_.getPosition().y})})},B=()=>{if(!t)return;const v=t.getSelectedCells().filter(_=>_.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=Math.min(...v.map(_=>_.getPosition().y));v.forEach(_=>{_.setPosition({x:_.getPosition().x,y:D})})},N=()=>{if(!t)return;const v=t.getSelectedCells().filter(F=>F.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=v.map(F=>F.getPosition().y+F.getSize().height/2),_=D.reduce((F,H)=>F+H,0)/D.length;v.forEach(F=>{const H=_-F.getSize().height/2;F.setPosition({x:F.getPosition().x,y:H})})},w=()=>{if(!t)return;const v=t.getSelectedCells().filter(_=>_.isNode());if(v.length<2){le("请选择至少两个节点","warning");return}const D=Math.max(...v.map(_=>_.getPosition().y+_.getSize().height));v.forEach(_=>{const F=D-_.getSize().height;_.setPosition({x:_.getPosition().x,y:F})})},I=()=>{if(!t)return;const v=t.getSelectedCells().filter(G=>G.isNode());if(v.length<3){le("请选择至少三个节点","warning");return}const D=v.sort((G,P)=>G.getPosition().x-P.getPosition().x),_=D[0],L=(D[D.length-1].getPosition().x-_.getPosition().x)/(D.length-1);D.forEach((G,P)=>{if(P===0||P===D.length-1)return;const q=_.getPosition().x+L*P;G.setPosition({x:q,y:G.getPosition().y})})},R=()=>{if(!t)return;const v=t.getSelectedCells().filter(G=>G.isNode());if(v.length<3){le("请选择至少三个节点","warning");return}const D=v.sort((G,P)=>G.getPosition().y-P.getPosition().y),_=D[0],L=(D[D.length-1].getPosition().y-_.getPosition().y)/(D.length-1);D.forEach((G,P)=>{if(P===0||P===D.length-1)return;const q=_.getPosition().y+L*P;G.setPosition({x:G.getPosition().x,y:q})})},O=async()=>{if(!t){le("画布未初始化","error");return}try{if(console.log("[ScadaCanvas] handleSave 被调用"),console.log("[ScadaCanvas] props.onSave:",r.onSave),r.onSave){console.log("[ScadaCanvas] 调用自定义 onSave 回调"),await r.onSave(),console.log("[ScadaCanvas] 自定义 onSave 回调执行完成");return}console.log("[ScadaCanvas] 没有自定义回调,执行默认下载");const v={version:"1.0.0",timestamp:new Date().toISOString(),config:{size:J.getConfig().size,background:J.getConfig().background,grid:J.getConfig().grid,guides:J.getConfig().guides,magnetism:J.getConfig().magnetism,zoom:J.getConfig().zoom},cells:t.toJSON().cells},D=new Blob([JSON.stringify(v,null,2)],{type:"application/json"}),_=URL.createObjectURL(D),F=document.createElement("a"),H=`scada-canvas-${new Date().getTime()}.json`;F.href=_,F.download=H,F.click(),URL.revokeObjectURL(_),le("保存成功","success")}catch(v){console.error("保存失败",v),le("保存失败,请查看控制台","error")}},j=()=>{s.value&&s.value.click()},Z=v=>{var H;const _=(H=v.target.files)==null?void 0:H[0];if(!_){le("请选择文件","error");return}const F=new FileReader;F.onload=L=>{var G;try{const P=JSON.parse((G=L.target)==null?void 0:G.result);if(!P.cells){le("无效的JSON文件格式","error");return}if(!confirm("导入将清空当前画布,是否继续?"))return;if(t){if(t.clearCells(),t.fromJSON({cells:P.cells}),t.getEdges().forEach(q=>{var te;const X=q.getData();(te=X==null?void 0:X.animation)!=null&&te.enabled&&p(q,X.animation)}),P.config&&J.updateConfig(P.config),P.workflows&&Array.isArray(P.workflows)&&P.workflows.length>0)try{const q=localStorage.getItem("saved-workflows"),X=q?JSON.parse(q):[];let te=0,se=0;P.workflows.forEach(ne=>{const ie=X.findIndex(Ee=>Ee.id===ne.id);ie>=0?(X[ie]={...ne,updatedAt:Date.now()},se++):(X.push(ne),te++)}),localStorage.setItem("saved-workflows",JSON.stringify(X)),le(`导入成功 画布已加载,流程: 新增${te}个,更新${se}个`,"success")}catch(q){console.error("导入流程数据失败:",q),le("画布导入成功, 但流程数据导入失败","warning")}else le("导入成功","success");s.value&&(s.value.value="")}}catch(P){console.error("导入失败",P),le("导入失败,JSON格式错误","error"),s.value&&(s.value.value="")}},F.readAsText(_)},ee=()=>{if(console.log("🎬 [ScadaCanvas] handlePreview 被调用"),!t){console.error("⚠️ [ScadaCanvas] graph 不存在");return}const v={cells:t.toJSON().cells,config:{width:J.getConfig().size.width,height:J.getConfig().size.height,background:J.getConfig().background,grid:J.getConfig().grid}};ot(Ie.SCADA_PREVIEW_DATA,v),console.log("✅ [ScadaCanvas] 数据已保存到 sessionStorage"),console.log("📤 [ScadaCanvas] 即将触发 preview 事件"),n("preview"),console.log("✅ [ScadaCanvas] preview 事件已触发")},ae=()=>{a.value=!0},oe=()=>{if(!t){le("画布未初始化","error");return}try{const v={version:"1.0.0",timestamp:at(rt()),config:{size:J.getConfig().size,background:J.getConfig().background,grid:J.getConfig().grid,guides:J.getConfig().guides,magnetism:J.getConfig().magnetism,zoom:J.getConfig().zoom},cells:t.toJSON().cells,nodes:t.getNodes().map(F=>({id:F.id,type:F.shape,position:F.getPosition(),size:F.getSize(),label:F.attr("label/text"),data:F.getData()})),edges:t.getEdges().map(F=>({id:F.id,source:F.getSourceCellId(),target:F.getTargetCellId()})),workflows:[]},D=new Set;if(t.getNodes().forEach(F=>{const H=F.getData();H!=null&&H.events&&Array.isArray(H.events)&&H.events.forEach(L=>{var G;L.action==="callProcess"&&((G=L.params)!=null&&G.processId)&&D.add(L.params.processId)})}),D.size>0)try{const F=localStorage.getItem("saved-workflows");if(F){const H=JSON.parse(F);v.workflows=H.filter(L=>D.has(L.id))}}catch(F){console.error("加载流程数据失败:",F)}const _=oo(v,"scada-export");le(`已导出为 ${_}`,"success")}catch(v){console.error("导出失败",v),le("导出失败,请查看控制台","error")}};return h({save:O,import:j,export:oe,preview:ee,workflow:ae,zoomIn:C,zoomOut:b,clearAll:f,alignLeft:A,alignCenter:$,alignRight:S,alignTop:B,alignMiddle:N,alignBottom:w,distributeHorizontal:I,distributeVertical:R,addNode:u,updateNode:y,deleteNode:k,getSelectedNode:()=>E.value,selectNode:v=>{if(!t)return!1;const D=t.getCellById(v);return D?(t.select(D),!0):!1},clearSelection:()=>{t&&(t.unselect(t.getSelectedCells()),E.value=null)},getGraph:()=>t,getCanvasData:()=>t?{version:"1.0.0",timestamp:at(rt()),config:J.getConfig(),cells:t.toJSON().cells,nodes:t.getNodes().map(v=>({id:v.id,type:v.shape,position:v.getPosition(),size:v.getSize(),label:v.attr("label/text"),data:v.getData()})),edges:t.getEdges().map(v=>({id:v.id,source:v.getSourceCellId(),target:v.getTargetCellId()}))}:null,loadCanvasData:v=>{if(!t)return!1;try{return t.clearCells(),t.fromJSON({cells:v.cells}),v.config&&J.updateConfig(v.config),t.getEdges().forEach(D=>{var F;const _=D.getData();(F=_==null?void 0:_.animation)!=null&&F.enabled&&p(D,_.animation)}),!0}catch(D){return console.error("加载画布数据失败:",D),!1}},getAllNodes:()=>t?t.getNodes().map(v=>({id:v.id,type:v.shape,position:v.getPosition(),size:v.getSize(),label:v.attr("label/text"),data:v.getData()})):[],getNodeById:v=>{if(!t)return null;const D=t.getCellById(v);if(!D||!D.isNode())return null;const _=D;return{id:_.id,type:_.shape,position:_.getPosition(),size:_.getSize(),label:_.attr("label/text"),data:_.getData()}},getConfigManager:()=>J,updateCanvasConfig:v=>{J.updateConfig(v)},setZoom:v=>{J.setZoom(v)},setCanvasSize:(v,D)=>{J.updateSize({width:v,height:D})},setBackgroundColor:v=>{J.updateBackground({color:v})},getAnimationEngine:()=>ke}),(v,D)=>(e.openBlock(),e.createElementBlock("div",ap,[r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(Ge,{key:0,"selected-nodes-count":x.value,onSave:O,onImport:j,onWorkflow:ae,onPreview:ee,onExport:oe,onZoomIn:C,onZoomOut:b,onClearAll:f,onAlignLeft:A,onAlignCenter:$,onAlignRight:S,onAlignTop:B,onAlignMiddle:N,onAlignBottom:w,onDistributeHorizontal:I,onDistributeVertical:R},null,8,["selected-nodes-count"])),r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createElementBlock("input",{key:1,ref_key:"fileInputRef",ref:s,type:"file",accept:".json",style:{display:"none"},onChange:Z},null,544)),e.createElementVNode("div",rp,[r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(Xe,{key:0,onAddComponent:u})),e.createVNode(Kn,{ref_key:"canvasAreaRef",ref:l},null,512),r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(lt,{key:1,ref:"propertyPanelRef","selected-node":E.value,"selected-edge":c.value,onUpdateNode:y,onDeleteNode:k,onUpdateEdge:V,onDeleteEdge:d},null,8,["selected-node","selected-edge"]))]),e.createVNode(Ed,{"auth-code":g.authCode,"custom-footer":g.customFooter},null,8,["auth-code","custom-footer"]),r.previewMode?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(op,{key:2,visible:a.value,"onUpdate:visible":D[0]||(D[0]=_=>a.value=_),"scada-graph":e.unref(t),onClose:D[1]||(D[1]=_=>a.value=!1)},null,8,["visible","scada-graph"]))]))}}),[["__scopeId","data-v-dd826323"]]),lp={ScadaCanvas:Xo,PropertyPanel:lt,Header:Ge,ComponentLibrary:Xe,CanvasConfigPanel:Ye,BindingCard:Qe,EventCard:Je,BasicPropertiesTab:Ke,AttributeConfigDialog:et,CustomCodeDialog:tt},Yo=g=>{Object.entries(lp).forEach(([h,o])=>{g.component(h,o)})},sp={install:Yo,version:"1.0.0"};U.AttributeConfigDialog=et,U.BasicComponents=wn,U.BasicPropertiesTab=Ke,U.BindingCard=Qe,U.CanvasConfigPanel=Ye,U.ComponentLibrary=Xe,U.CustomCodeDialog=tt,U.EventCard=Je,U.Header=Ge,U.IoTComponents=Sn,U.PropertyPanel=lt,U.STORAGE_KEYS=Ie,U.ScadaCanvas=Xo,U.animationEngine=ke,U.canvasConfigItems=zn,U.canvasConfigManager=J,U.componentRegistry=Pe,U.default=sp,U.defaultCanvasConfig=je,U.exportToJSON=oo,U.formatTimestamp=at,U.generateEventId=no,U.generateNodeId=dc,U.generateUniqueId=nt,U.getCurrentTimestamp=rt,U.install=Yo,U.loadFromLocal=ic,U.loadFromSession=eo,U.randomPosition=ao,U.removeFromLocal=cc,U.removeFromSession=to,U.saveToLocal=sc,U.saveToSession=ot,U.showMessage=le,U.sizePresetMap=Re,Object.defineProperties(U,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});