jingrow/jingrow/public/frontend/assets/MindMapEditor-DZRhWd7t.js

2 lines
17 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import{d as rt,u as ct,r as u,o as vt,a3 as le,z as mt,af as Ne,A as o,c as f,b as l,e as s,w as d,g as t,B as g,t as i,I as Ee,s as b,T as S,V as ae,L as U,q as Fe,f as ft,l as oe,ap as De,aq as pt,M as Se,F as Y,C as ne,ar as gt,O as ht,i as I,j as v,U as N,W as yt,m as K,h as bt}from"./index-DAsPldBw.js";import{I as E}from"./iconify-frnT9hzL.js";import{u as kt,l as se,a as Ct,S as _t,g as wt,s as ze,c as Me,b as xt,r as Tt,d as It,e as Nt}from"./useMindMap-CHuHVVe9.js";import{getRecord as Et,updateRecord as Ft}from"./common-iDI_BY8C.js";import{_ as Dt}from"./_plugin-vue_export-helper-DlAUqK2U.js";const St={class:"mindmap-toolbar"},zt={class:"mindmap-toolbar__left"},Mt={class:"btn-text"},Lt={class:"mindmap-title"},Rt={class:"mindmap-toolbar__right"},qt={class:"btn-text"},At={class:"btn-text"},Bt={class:"btn-text"},Pt={class:"btn-text"},Ut={class:"btn-text"},Kt={class:"theme-menu"},Vt={class:"theme-menu-group"},Ot=["onClick"],$t={class:"theme-menu-group"},Ht=["onClick"],Wt={class:"theme-item-actions"},Yt={class:"btn-text"},Xt={key:0,class:"mindmap-loading"},Zt={class:"mindmap-canvas"},jt={class:"zoom-controls"},Gt={key:2,class:"context-menu__divider"},Jt={class:"custom-modal-content"},Qt={class:"custom-modal-header"},el={class:"custom-modal-body"},tl={class:"form-item"},ll={class:"form-item"},al={class:"custom-modal-footer"},ol={class:"custom-modal-content custom-modal-card"},nl={class:"custom-modal-header"},sl={class:"custom-modal-body"},il={class:"theme-row"},dl={class:"theme-label"},ul={class:"theme-row"},rl={class:"theme-label"},cl={class:"theme-row"},vl={class:"theme-label"},ml={class:"theme-preview"},fl={class:"theme-label"},pl={class:"color-preview"},gl=rt({__name:"MindMapEditor",setup(hl){const X=ht(),Le=bt(),k=ct(),V=u(X.query.id||""),z=u(),{graph:y,initCanvas:ie,applyLayout:de,addNode:M,addParent:ue,removeNode:re,removeNodes:Re,updateNodeData:qe,toggleCollapse:ce,setThemeConfig:Z,exportData:Ae,fitView:j,zoomIn:ve,zoomOut:me,resetZoom:fe,interaction:h,setSelectedNodeId:pe,setSelectedNodeIds:ge,resize:Be,canUndo:Pe,canRedo:Ue,undo:he,redo:ye,saveHistory:m}=kt(),p=u(null),C=u([]),r=u({show:!1,x:0,y:0,nodeId:""}),be=I(()=>r.value.nodeId?y.value.getChildren(r.value.nodeId).length>0:!1),ke=I(()=>r.value.nodeId&&y.value.getNode(r.value.nodeId)?.collapsed||!1),Ke=I(()=>{if(!r.value.nodeId)return!1;const a=y.value.getNode(r.value.nodeId);return a&&!a.isRoot});function Ve(a,e,n){r.value={show:!0,x:a,y:e,nodeId:n}}function _(){r.value.show=!1}function Oe(){r.value.nodeId&&(M(r.value.nodeId,"新节点"),m("add-child")),_()}function $e(){const a=y.value.getParent(r.value.nodeId)?.id;a&&(M(a,"新节点"),m("add-sibling")),_()}function He(){r.value.nodeId&&(ue(r.value.nodeId,"新节点"),m("add-parent")),_()}function We(){r.value.nodeId&&J(r.value.nodeId),_()}function Ye(){r.value.nodeId&&(re(r.value.nodeId),m("delete-node"),p.value=null),_()}function Xe(){r.value.nodeId&&(ce(r.value.nodeId),m("toggle-collapse")),_()}const O=u(null),L=u(""),R=u(""),G=u(!1);function J(a){const e=y.value.getNode(a);e&&(O.value=a,L.value=e.label,R.value=e.description||"",G.value=!0)}function Ze(){if(O.value){const a=L.value.trim()||"Node",e=R.value.trim();qe(O.value,{label:a,description:e||void 0}),m("edit-node")}Q()}function Q(){G.value=!1,O.value=null,L.value="",R.value=""}const ee=u(!1),q=u(!1),Ce=u("Mind Map"),A=u("forest-green"),F=u(!1),w=u("#2a6a4a"),B=u(""),x=u("monochromatic"),P=u([]),je=u(null);function Ge(a){w.value=a.baseColor||"#2a6a4a",B.value=a.name||"",x.value=a.schemeType||"monochromatic",je.value=a.id||null,F.value=!0}function Je(a){Tt(a),k.success(o("Theme removed from favorites")),P.value=se()}function _e(a){const e=wt(a);if(e){A.value=a,Z(e),ze(e);const n=e.isDark??a.startsWith("dark-");W.value=n?"dark":"light"}}const we=I(()=>[{label:o("Monochromatic"),key:"monochromatic"},{label:o("Analogous"),key:"analogous"},{label:o("Complementary"),key:"complementary"},{label:o("Triadic"),key:"triadic"},{label:o("Split-Complementary"),key:"split-complementary"},{label:o("Tetradic"),key:"tetradic"}]);function Qe(){const a=Me(w.value,x.value);A.value=a.id,Z(a),ze(a),W.value=a.isDark?"dark":"light",F.value=!1}function et(){const a=Me(w.value,x.value),e=B.value.trim()||`Custom (${a.baseColor})`,n={...a,name:e,favorite:!0};xt(n),k.success(o("Theme saved to favorites")),B.value="",P.value=se(),F.value=!1}const tt=I(()=>It(w.value,x.value)),D=u({show:!1,x:0,y:0,content:""}),T=u(!1),$=u(null),xe=I(()=>T.value&&$.value?$.value:"body");function lt(){const a=$.value;a&&(T.value?document.exitFullscreen?.()||document.webkitExitFullscreen?.():a.requestFullscreen?.()||a.webkitRequestFullscreen?.())}function H(){T.value=!!(document.fullscreenElement||document.webkitFullscreenElement),le(()=>{Be()})}const W=u(localStorage.getItem("mindmap-theme")||"light"),at=I(()=>{const a=Nt.getTypes(),e={"radial-mindmap":o("Radial Mindmap"),"logic-tree":o("Logic Tree"),fishbone:o("Fishbone Diagram"),tree:o("Tree Diagram"),"org-chart":o("Organization Chart"),"timeline-horizontal":o("Horizontal Timeline"),"timeline-vertical":o("Vertical Timeline"),"force-directed":o("Force-Directed Graph")};return a.map(n=>({label:e[n]||n,key:n}))});function ot(a){de(a)}function Te(a){const e=a.target;if(!(e.tagName==="INPUT"||e.tagName==="TEXTAREA")){if(p.value)switch(a.key){case"Tab":a.preventDefault(),M(p.value,"新节点"),m("add-child");break;case"Enter":if(a.shiftKey){a.preventDefault();const n=y.value.getNode(p.value);n&&!n.isRoot&&(ue(p.value,"新节点"),m("add-parent"))}else{a.preventDefault();const n=y.value.getParent(p.value)?.id;n&&(M(n,"新节点"),m("add-sibling"))}break;case"Delete":case"Backspace":if(a.preventDefault(),C.value.length>1){const n=C.value.filter(c=>!y.value.getNode(c)?.isRoot);n.length>0&&(Re(n),m("delete-nodes"),p.value=null,C.value=[])}else p.value&&(y.value.getNode(p.value)?.isRoot||(re(p.value),m("delete-node"),p.value=null,C.value=[]));break;case"F2":a.preventDefault(),J(p.value);break}(a.ctrlKey||a.metaKey)&&a.key==="z"&&!a.shiftKey&&(a.preventDefault(),he()),(a.ctrlKey||a.metaKey)&&(a.key==="y"||a.key==="z"&&a.shiftKey)&&(a.preventDefault(),ye())}}vt(async()=>{P.value=se();const a=Ct();if(a){A.value=a.id,Z(a);const e=a.isDark??a.id.startsWith("dark-");W.value=e?"dark":"light",a.baseColor&&(w.value=a.baseColor),a.schemeType&&(x.value=a.schemeType)}await nt(),document.addEventListener("keydown",Te),document.addEventListener("fullscreenchange",H),document.addEventListener("webkitfullscreenchange",H),le(()=>{h.value&&(h.value.on("node:click",e=>{p.value=e.nodeId||null,e.selectedIds?(C.value=e.selectedIds,ge(e.selectedIds)):(C.value=e.nodeId?[e.nodeId]:[],pe(e.nodeId||null)),_()}),h.value.on("canvas:click",()=>{p.value=null,C.value=[],pe(null),_()}),h.value.on("selection:end",e=>{e.selectedIds&&(C.value=e.selectedIds,ge(e.selectedIds),e.selectedIds.length>0&&(p.value=e.selectedIds[0]))}),h.value.on("node:contextmenu",e=>{e.nodeId&&e.originalEvent&&Ve(e.originalEvent.clientX,e.originalEvent.clientY,e.nodeId)}),h.value.on("node:toggle-collapse",e=>{e.nodeId&&ce(e.nodeId)}),h.value.on("node:add-child",e=>{e.nodeId&&(M(e.nodeId,"新节点"),m("add-child"))}),h.value.on("node:dblclick",e=>{e.nodeId&&J(e.nodeId)}),h.value.on("node:drag:end",e=>{m("drag-node")}),h.value.on("description:hover",e=>{e.description&&e.originalEvent?D.value={show:!0,x:e.originalEvent.clientX,y:e.originalEvent.clientY,content:e.description}:D.value.show=!1}))})}),mt(()=>{document.removeEventListener("keydown",Te),document.removeEventListener("fullscreenchange",H),document.removeEventListener("webkitfullscreenchange",H)});async function nt(){if(await le(),!V.value){z.value&&(ie(z.value,null),m("initial-load"),setTimeout(()=>j(),150));return}ee.value=!0;try{const a=X.query.pagetype,e=a?Ne(a):"Mind Map",n=await Et(e,V.value);if(n.success&&n.data){const c=n.data;Ce.value=c.name||c.title||"Mind Map";let Ie=null;if(c.mindmap_data)try{Ie=typeof c.mindmap_data=="string"?JSON.parse(c.mindmap_data):c.mindmap_data}catch(te){console.error("Failed to parse mindmap data:",te)}if(z.value){const te=ie(z.value,Ie);m("initial-load"),te&&requestAnimationFrame(()=>{requestAnimationFrame(()=>{j()})})}}else k.error(n.message||o("Failed to load mind map"))}catch(a){k.error(o("Failed to load")+": "+(a.message||o("Unknown error")))}finally{ee.value=!1}}async function st(){if(!V.value){k.warning(o("Cannot save: record name not specified"));return}q.value=!0;try{const a=Ae(),e=X.query.pagetype,n=e?Ne(e):"Mind Map",c=await Ft(n,V.value,{mindmap_data:a});c.success?k.success(o("Saved successfully")):k.error(c.message||o("Failed to save"))}catch(a){k.error(o("Failed to save")+": "+(a.message||o("Unknown error")))}finally{q.value=!1}}function it(){Le.back()}function dt(){j()}function ut(){de(),m("auto-layout")}return(a,e)=>(v(),f("div",{class:U(["mindmap-editor",{fullscreen:T.value,"dark-theme":W.value==="dark"}]),ref_key:"editorRoot",ref:$},[l("div",St,[l("div",zt,[s(t(g),{quaternary:"",size:"small",onClick:it,class:"toolbar-btn",title:t(o)("Back")},{default:d(()=>[e[12]||(e[12]=l("i",{class:"fa fa-arrow-left"},null,-1)),l("span",Mt,i(t(o)("Back")),1)]),_:1},8,["title"]),l("div",Lt,[e[13]||(e[13]=l("i",{class:"fa fa-sitemap",style:{color:"#6366f1","margin-right":"8px"}},null,-1)),l("span",null,i(Ce.value),1)])]),l("div",Rt,[s(t(Ee),{size:6,align:"center"},{default:d(()=>[s(t(g),{quaternary:"",size:"small",type:"default",class:"toolbar-btn",disabled:!t(Pe),title:t(o)("Undo")+" (Ctrl+Z)",onClick:t(he)},{icon:d(()=>[s(t(N),null,{default:d(()=>[s(t(E),{icon:"tabler:arrow-back-up"})]),_:1})]),_:1},8,["disabled","title","onClick"]),s(t(g),{quaternary:"",size:"small",type:"default",class:"toolbar-btn",disabled:!t(Ue),title:t(o)("Redo")+" (Ctrl+Y)",onClick:t(ye)},{icon:d(()=>[s(t(N),null,{default:d(()=>[s(t(E),{icon:"tabler:arrow-forward-up"})]),_:1})]),_:1},8,["disabled","title","onClick"]),e[20]||(e[20]=l("div",{class:"toolbar-divider"},null,-1)),s(t(g),{quaternary:"",size:"small",type:"info",class:"toolbar-btn",title:t(o)("Organize Layout"),onClick:ut},{default:d(()=>[e[14]||(e[14]=l("i",{class:"fa fa-magic"},null,-1)),l("span",qt,i(t(o)("Organize Layout")),1)]),_:1},8,["title"]),s(t(g),{quaternary:"",size:"small",type:"default",class:"toolbar-btn",title:t(o)("Fit Canvas"),onClick:dt},{default:d(()=>[e[15]||(e[15]=l("i",{class:"fa fa-expand"},null,-1)),l("span",At,i(t(o)("Fit Canvas")),1)]),_:1},8,["title"]),s(t(g),{quaternary:"",size:"small",type:"default",class:"toolbar-btn",title:T.value?t(o)("Exit Fullscreen"):t(o)("Fullscreen"),onClick:lt},{default:d(()=>[l("i",{class:U(T.value?"fa fa-compress":"fa fa-arrows-alt")},null,2),l("span",Bt,i(T.value?t(o)("Exit Fullscreen"):t(o)("Fullscreen")),1)]),_:1},8,["title"]),e[21]||(e[21]=l("div",{class:"toolbar-divider"},null,-1)),s(t(Se),{trigger:"click",options:at.value,onSelect:ot},{default:d(()=>[s(t(g),{quaternary:"",size:"small",class:"toolbar-btn",title:t(o)("Switch Layout")},{default:d(()=>[e[16]||(e[16]=l("i",{class:"fa fa-sitemap"},null,-1)),l("span",Pt,i(t(o)("Layout")),1)]),_:1},8,["title"])]),_:1},8,["options"]),s(t(yt),{trigger:"click",placement:"bottom-start","show-arrow":!1,"content-style":"padding: 4px 0; min-width: 240px;"},{trigger:d(()=>[s(t(g),{quaternary:"",size:"small",class:"toolbar-btn",title:t(o)("Switch Theme")},{default:d(()=>[e[17]||(e[17]=l("i",{class:"fa fa-palette"},null,-1)),l("span",Ut,i(t(o)("Theme")),1)]),_:1},8,["title"])]),default:d(()=>[l("div",Kt,[l("div",Vt,i(t(o)("System")),1),(v(!0),f(Y,null,ne(t(_t),n=>(v(),f("div",{key:n.id,class:U(["theme-menu-item",{active:A.value===n.id}]),onClick:c=>_e(n.id)},i(n.name),11,Ot))),128)),P.value.length>0?(v(),f(Y,{key:0},[e[18]||(e[18]=l("div",{class:"theme-menu-divider"},null,-1)),l("div",$t,i(t(o)("Favorites")),1),(v(!0),f(Y,null,ne(P.value,n=>(v(),f("div",{key:n.id,class:U(["theme-menu-item theme-item-with-actions",{active:A.value===n.id}])},[l("span",{class:"theme-item-label",onClick:c=>_e(n.id)},i(n.name||"Custom"),9,Ht),l("span",Wt,[s(t(N),{class:"theme-item-action",size:"14",title:t(o)("Edit"),onClick:S(c=>Ge(n),["stop"])},{default:d(()=>[s(t(E),{icon:"tabler:edit"})]),_:1},8,["title","onClick"]),s(t(N),{class:"theme-item-action theme-item-delete",size:"14",title:t(o)("Delete"),onClick:S(c=>Je(n.id),["stop"])},{default:d(()=>[s(t(E),{icon:"tabler:trash"})]),_:1},8,["title","onClick"])])],2))),128))],64)):b("",!0),e[19]||(e[19]=l("div",{class:"theme-menu-divider"},null,-1)),l("div",{class:"theme-menu-item",onClick:e[0]||(e[0]=n=>F.value=!0)},i(t(o)("Custom Theme")),1)])]),_:1}),e[22]||(e[22]=l("div",{class:"toolbar-divider"},null,-1)),s(t(g),{size:"small",class:"save-btn-brand",loading:q.value,disabled:q.value,title:t(o)("Save"),onClick:st},{icon:d(()=>[s(t(N),null,{default:d(()=>[s(t(E),{icon:"tabler:check"})]),_:1})]),default:d(()=>[l("span",Yt,i(q.value?t(o)("Saving..."):t(o)("Save")),1)]),_:1},8,["loading","disabled","title"])]),_:1})])]),ee.value?(v(),f("div",Xt,[e[23]||(e[23]=l("i",{class:"fa fa-spinner fa-spin"},null,-1)),l("p",null,i(t(o)("Loading mind map...")),1)])):b("",!0),l("div",Zt,[l("canvas",{ref_key:"canvasRef",ref:z,class:"mind-map-canvas"},null,512)]),l("div",jt,[l("button",{class:"zoom-btn",onClick:e[1]||(e[1]=(...n)=>t(ve)&&t(ve)(...n)),title:"放大"},"+"),l("button",{class:"zoom-btn",onClick:e[2]||(e[2]=(...n)=>t(fe)&&t(fe)(...n)),title:"重置"},"⟲"),l("button",{class:"zoom-btn",onClick:e[3]||(e[3]=(...n)=>t(me)&&t(me)(...n)),title:"缩小"},"")]),r.value.show?(v(),f("div",{key:1,class:"context-menu",style:ae({left:r.value.x+"px",top:r.value.y+"px"}),onClick:e[4]||(e[4]=S(()=>{},["stop"]))},[l("div",{class:"context-menu__item",onClick:We},[e[24]||(e[24]=l("i",{class:"fa fa-edit"},null,-1)),l("span",null,i(t(o)("Edit Node")),1),e[25]||(e[25]=l("span",{class:"shortcut"},"F2",-1))]),e[34]||(e[34]=l("div",{class:"context-menu__divider"},null,-1)),l("div",{class:"context-menu__item",onClick:Oe},[e[26]||(e[26]=l("i",{class:"fa fa-plus"},null,-1)),l("span",null,i(t(o)("Add Child Node")),1),e[27]||(e[27]=l("span",{class:"shortcut"},"Tab",-1))]),l("div",{class:"context-menu__item",onClick:$e},[e[28]||(e[28]=l("i",{class:"fa fa-share"},null,-1)),l("span",null,i(t(o)("Add Sibling Node")),1),e[29]||(e[29]=l("span",{class:"shortcut"},"Enter",-1))]),Ke.value?(v(),f("div",{key:0,class:"context-menu__item",onClick:He},[e[30]||(e[30]=l("i",{class:"fa fa-level-up"},null,-1)),l("span",null,i(t(o)("Add Parent Node")),1),e[31]||(e[31]=l("span",{class:"shortcut"},"Shift+Enter",-1))])):b("",!0),e[35]||(e[35]=l("div",{class:"context-menu__divider"},null,-1)),be.value?(v(),f("div",{key:1,class:"context-menu__item",onClick:Xe},[l("i",{class:U(ke.value?"fa fa-expand":"fa fa-compress")},null,2),l("span",null,i(ke.value?t(o)("Expand"):t(o)("Collapse")),1)])):b("",!0),be.value?(v(),f("div",Gt)):b("",!0),l("div",{class:"context-menu__item context-menu__item--danger",onClick:Ye},[e[32]||(e[32]=l("i",{class:"fa fa-trash"},null,-1)),l("span",null,i(t(o)("Delete Node")),1),e[33]||(e[33]=l("span",{class:"shortcut"},"Del",-1))])],4)):b("",!0),(v(),Fe(De,{to:xe.value},[G.value?(v(),f("div",{key:0,class:"custom-modal-overlay",onClick:S(Q,["self"])},[l("div",Jt,[l("div",Qt,[l("h3",null,i(t(o)("Edit Node")),1)]),l("div",el,[l("div",tl,[l("label",null,i(t(o)("Title")),1),s(t(oe),{value:L.value,"onUpdate:value":e[5]||(e[5]=n=>L.value=n),placeholder:t(o)("Enter title"),onKeydown:e[6]||(e[6]=ft(S(()=>{},["prevent"]),["enter"]))},null,8,["value","placeholder"])]),l("div",ll,[l("label",null,i(t(o)("Description")),1),s(t(oe),{value:R.value,"onUpdate:value":e[7]||(e[7]=n=>R.value=n),type:"textarea",placeholder:t(o)("Enter description (optional)"),rows:3,autosize:{minRows:2,maxRows:6}},null,8,["value","placeholder"])])]),l("div",al,[s(t(g),{onClick:Q},{default:d(()=>[K(i(t(o)("Cancel")),1)]),_:1}),s(t(g),{type:"primary",onClick:Ze},{default:d(()=>[K(i(t(o)("Save")),1)]),_:1})])])])):b("",!0)],8,["to"])),(v(),Fe(De,{to:xe.value},[F.value?(v(),f("div",{key:0,class:"custom-modal-overlay",onClick:e[11]||(e[11]=S(n=>F.value=!1,["self"]))},[l("div",ol,[l("div",nl,[l("h3",null,i(t(o)("Custom Theme")),1)]),l("div",sl,[l("div",il,[l("label",dl,i(t(o)("Theme Name")),1),s(t(oe),{value:B.value,"onUpdate:value":e[8]||(e[8]=n=>B.value=n),placeholder:"",clearable:"",style:{width:"200px"}},null,8,["value"])]),l("div",ul,[l("label",rl,i(t(o)("Base Color")),1),s(t(pt),{value:w.value,"onUpdate:value":e[9]||(e[9]=n=>w.value=n),"show-alpha":!1,modes:["hex"],to:!1},null,8,["value"])]),l("div",cl,[l("label",vl,i(t(o)("Color Scheme")),1),s(t(Se),{trigger:"click",options:we.value,onSelect:e[10]||(e[10]=n=>x.value=n),to:!1},{default:d(()=>[s(t(g),null,{default:d(()=>[K(i(we.value.find(n=>n.key===x.value)?.label)+" ",1),e[36]||(e[36]=l("i",{class:"fa fa-chevron-down",style:{"margin-left":"8px"}},null,-1))]),_:1})]),_:1},8,["options"])]),l("div",ml,[l("label",fl,i(t(o)("Preview")),1),l("div",pl,[(v(!0),f(Y,null,ne(tt.value,(n,c)=>(v(),f("div",{key:c,class:"color-swatch",style:ae({backgroundColor:n.fill,borderColor:n.stroke,color:n.color})},i(t(o)("Level"))+" "+i(c),5))),128))])]),s(t(gt)),s(t(Ee),{vertical:""},{default:d(()=>[s(t(g),{class:"save-btn-brand",block:"",onClick:Qe},{icon:d(()=>[s(t(N),null,{default:d(()=>[s(t(E),{icon:"tabler:check"})]),_:1})]),default:d(()=>[K(" "+i(t(o)("Apply Theme")),1)]),_:1}),s(t(g),{quaternary:"",block:"",onClick:et},{icon:d(()=>[s(t(N),null,{default:d(()=>[s(t(E),{icon:"tabler:star"})]),_:1})]),default:d(()=>[K(" "+i(t(o)("Save to Favorites")),1)]),_:1})]),_:1})])])])):b("",!0)],8,["to"])),D.value.show?(v(),f("div",{key:2,class:"description-tooltip",style:ae({left:D.value.x+"px",top:D.value.y+"px"})},i(D.value.content),5)):b("",!0)],2))}}),wl=Dt(gl,[["__scopeId","data-v-add68777"]]);export{wl as default};