goldpankit
Version:
GoldPanKit是一款极速研发套件,可在套件中快速构建各类技术框架和项目。开源作者可发布自己的项目,并为其设定金额,实现开源项目的盈利。
2 lines • 60.6 kB
JavaScript
var fe=Object.defineProperty;var be=(e,t,i)=>t in e?fe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i;var b=(e,t,i)=>(be(e,typeof t!="symbol"?t+"":t,i),i),q=(e,t,i)=>{if(!t.has(e))throw TypeError("Cannot "+i)};var ee=(e,t,i)=>(q(e,t,"read from private field"),i?i.call(e):t.get(e)),j=(e,t,i)=>{if(t.has(e))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(e):t.set(e,i)},te=(e,t,i,a)=>(q(e,t,"write to private field"),a?a.call(e,i):t.set(e,i),i);var ie=(e,t,i)=>(q(e,t,"access private method"),i);import{_ as S,r as f,o as g,h as A,w as y,b as u,c as p,g as x,F as O,a7 as F,k as M,a as d,t as C,j as V,y as pe,P as Te,B,K as le,J as G,X as z,m as $,aa as ne,ab as ae,A as Q,e as N,ac as ye,p as H,l as W,z as K,E as Le,i as se,ad as ve,ae as Ce,af as we,D as Ie,a9 as Ee,s as De,U as Oe}from"./index-18d82337.js";import{a as Ae,I as Re}from"./InnerRouterViewWindow-c6700a41.js";const P={join:{color:"#eee",hoverColor:"#faa5aa",selectedColor:"#FC777D"},aggregate:{color:"#FFE957",hoverColor:"#faa5aa",selectedColor:"#FC777D"}},Se={name:"RelationLine",props:{start:{required:!0},end:{required:!0},selected:{default:!1},lineType:{required:!0}},data(){return{lineConfig:{x:0,y:0,stroke:"#ccc",strokeWidth:4,lineJoin:"round",lineCap:"round"}}},computed:{position(){return[this.start,this.end]}},watch:{position(){this.init()},selected(){this.selected?this.highlight(!0,this.selected):this.highlight(!1,this.selected)}},methods:{handleSelect(){this.selected?this.$emit("unselect"):this.$emit("select")},highlight(e=!0,t=!1){const i=this.$refs.line.getNode();if(e)t?(i.setAttr("stroke",P[this.lineType].selectedColor),i.zIndex(101)):(i.setAttr("stroke",P[this.lineType].hoverColor),i.zIndex(100)),i.setAttr("strokeWidth",5);else{if(i.zIndex(1),t)return;i.setAttr("stroke",P[this.lineType].color),i.setAttr("strokeWidth",4)}},init(){this.lineConfig.stroke=P[this.lineType].color;const e=[];this.start.y!==this.end.y&&(this.end.x-this.start.x>0?this.end.x-this.start.x<50?(this.start.x-=200,e.push(this.start.x-50),e.push(this.start.y),e.push(this.start.x-50),e.push(this.end.y)):(e.push(this.start.x+(this.end.x-this.start.x)/2),e.push(this.start.y),e.push(this.start.x+(this.end.x-this.start.x)/2),e.push(this.end.y)):Math.abs(this.end.x-this.start.x)<200?(this.start.x-=200,e.push(this.start.x-50),e.push(this.start.y),e.push(this.start.x-50),e.push(this.end.y)):Math.abs(this.end.x-this.start.x)<450?(this.end.x+=200,e.push(this.start.x+50),e.push(this.start.y),e.push(this.start.x+50),e.push(this.end.y)):(this.start.x-=200,this.end.x+=200,e.push(this.start.x-Math.abs(this.end.x-this.start.x)/2),e.push(this.start.y),e.push(this.start.x-Math.abs(this.end.x-this.start.x)/2),e.push(this.end.y))),this.lineConfig.points=[this.start.x,this.start.y,...e,this.end.x,this.end.y]}},created(){this.init()}};function xe(e,t,i,a,n,l){const o=f("v-line");return g(),A(o,{ref:"line",config:n.lineConfig,onMouseenter:t[0]||(t[0]=c=>l.highlight(!0,i.selected)),onMouseleave:t[1]||(t[1]=c=>l.highlight(!1,i.selected)),onClick:l.handleSelect},null,8,["config","onClick"])}const oe=S(Se,[["render",xe],["__scopeId","data-v-6a26c54d"]]),Ve={name:"Table",props:{x:{default:0},y:{default:0},fieldHeight:{default:30},table:{required:!0},relations:{required:!0},selected:{default:!1}},data(){const e=this;return{layerConfig:{x:e.x,y:e.y,draggable:!1}}},computed:{backgroundConfig(){return{width:200,height:(this.visibleFields.length+1)*this.fieldHeight,fill:"#fafafa"}},tableNameConfig(){return{text:this.table.alias,x:10,y:8,fontSize:15,fill:"#fff"}},tableHeaderConfig(){return{width:200,height:this.fieldHeight,fill:this.table.type==="MAIN"?"#FC777D":"#666"}},relation(){return this.relations.find(e=>e.targetTable===this.table.name)},visibleFields(){return this.table.fields.filter(e=>e.visible===!0)}},watch:{selected(e){if(e){this.select();return}this.select(!1)}},methods:{selectTable(e){this.$emit("table:select",this.table.id)},previewTable(e){this.$emit("table:preview",this.table.id)},select(e=!0){const t=this.$refs.background.getNode();e?(t.setAttr("stroke",(this.table.type==="MAIN","#FC777D")),t.setAttr("strokeWidth",5)):t.setAttr("strokeWidth",0)},handleHeaderMouseover(e){this.getNode().draggable(!0),window.document.body.style.cursor="move"},handleHeaderMouseleave(e){this.getNode().draggable(!1),window.document.body.style.cursor="default"},getNode(){return this.$refs.table.getNode()},handleFieldMouseDown(e){this.getNode().draggable(!1),this.$emit("field:mousedown",{table:this.table,field:e})},handleFieldMouseUp(e){this.getNode().draggable(!0),this.$emit("field:mouseup",{table:this.table,field:e})}}};function Ne(e,t,i,a,n,l){const o=f("v-rect"),c=f("v-text"),_=f("v-layer");return g(),A(_,{ref:"table",config:n.layerConfig},{default:y(()=>[u(o,{ref:"background",config:l.backgroundConfig},null,8,["config"]),u(o,{config:l.tableHeaderConfig,onMouseover:l.handleHeaderMouseover,onMouseleave:l.handleHeaderMouseleave,onClick:l.selectTable,onDblclick:l.previewTable},null,8,["config","onMouseover","onMouseleave","onClick","onDblclick"]),u(c,{config:l.tableNameConfig,onMouseover:l.handleHeaderMouseover,onMouseleave:l.handleHeaderMouseleave,onClick:l.selectTable,onDblclick:l.previewTable},null,8,["config","onMouseover","onMouseleave","onClick","onDblclick"]),(g(!0),p(O,null,x(l.visibleFields,(m,s)=>(g(),A(o,{key:m.name,config:{y:s*i.fieldHeight+l.tableHeaderConfig.height,width:200,height:i.fieldHeight,fill:"#fff"},onMousedown:h=>l.handleFieldMouseDown(m),onMouseup:h=>l.handleFieldMouseUp(m)},null,8,["config","onMousedown","onMouseup"]))),128)),(g(!0),p(O,null,x(l.visibleFields,(m,s)=>(g(),A(c,{key:m,config:{text:m.name,x:10,y:s*i.fieldHeight+l.tableHeaderConfig.height+10,fontSize:13,fill:"#333"},onMousedown:h=>l.handleFieldMouseDown(m),onMouseup:h=>l.handleFieldMouseUp(m)},null,8,["config","onMousedown","onMouseup"]))),128))]),_:1},8,["config"])}const re=S(Ve,[["render",Ne]]);const Me={name:"QueryModelDesigner",components:{Table:re,RelationLine:oe},props:{model:{},fieldHeight:{default:30}},data(){return{rendered:!0,configKonva:{width:1260,height:1e3,draggable:!0},relationLines:[],relationRuntime:{table:null,field:null,targetTable:null,targetField:null}}},computed:{tableLength(){return this.model.tables.length},reRenderFactors(){return[this.tableLength,this.model]}},watch:{reRenderFactors(){this.render()}},methods:{handleDelete(){if(this.model.selectedLineId!=null){this.__deleteLine();return}this.model.selectedTableId!=null&&this.__deleteTable()},globalClick(e){e.target.nodeType==="Stage"&&(this.model.selectedTableId=null,this.model.previewTableId=null,this.model.selectedLineId=null)},moveTable(){for(const e of this.model.tables){const t=this.$refs[e.id][0].getNode().getAbsolutePosition();e.x=t.x,e.y=t.y}this.computeRelations()},computeRelations(){this.relationLines=[];for(const e of this.model.joins){const t=this.model.tables.find(a=>a.id===e.table.id),i=this.model.tables.find(a=>a.id===e.targetTable.id);for(const a of e.ons){const n=this.__getFieldPosition(t,a.field),l=this.__getFieldPosition(i,a.targetField,!1);n==null||l==null||this.relationLines.push({id:F(),start:n,end:l,type:"join",table:e.table,field:a.field,targetTable:e.targetTable,targetField:a.targetField})}}for(const e of this.model.aggregates){const t=this.__getFieldPosition(e.table,e.field),i=this.__getFieldPosition(e.targetTable,e.targetField,!1);t==null||i==null||this.relationLines.push({id:F(),start:t,end:i,type:"aggregate",table:e.table,field:e.field,targetTable:e.targetTable,targetField:e.targetField})}},handleFieldMouseDown({table:e,field:t}){this.$refs.stage.getNode().draggable(!1),this.relationRuntime.table=e,this.relationRuntime.field=t},handleFieldMouseUp({table:e,field:t}){if(!(this.relationRuntime.table==null||(this.$refs.stage.getNode().draggable(!0),this.relationRuntime.targetTable=e,this.relationRuntime.targetField=t,this.relationRuntime.table.id===this.relationRuntime.targetTable.id))){if(this.model.lineType==="join"){this.__addJoinRelation(),this.$emit("change");return}this.model.lineType==="aggregate"&&(this.__addAggregate(),this.$emit("change"))}},handleTableSelect(e){this.model.selectedTableId=e,this.model.selectedLineId=null,this.model.previewTableId=null},handleLineSelect(e){this.model.selectedLineId=e.id,this.model.selectedTableId=null,this.model.previewTableId=null},handleTablePreview(e){this.model.previewTableId=e},handleDrop(e,t){const i=this.$refs.stage.getNode();i.setPointersPositions(e);const a=i.getPointerPosition(),n={width:200,height:(this.model.dragData.fields.length+1)*this.fieldHeight},l={...this.model.dragData,fields:this.model.dragData.fields.map(o=>({...o,alias:o.name,visible:!0,isVirtual:!1})),isVirtual:!1,type:this.model.tables.length===0?"MAIN":"SUB",x:a.x-n.width/2,y:a.y-n.height/2,id:F(),joins:[]};this.model.tables.push(l),this.$emit("change")},confirmCreateVirtualTable(){const e={width:200,height:this.fieldHeight},t={id:F(),name:this.model.name,alias:this.model.name,comment:this.model.comment,...e,type:"MAIN",isVirtual:!0,x:100,y:100,joins:[],aggregates:[]};t.fields=this.__getVirtualTableDefaultFields(t),this.model.tables.push(t),this.$emit("change")},render(){this.rendered=!1,this.$nextTick(()=>{this.rendered=!0,this.$nextTick(()=>{const t=this.$refs.stage.getNode().container();t.addEventListener("dragover",function(i){i.preventDefault()}),t.addEventListener("drop",i=>{i.preventDefault(),this.handleDrop(i,2)}),this.computeRelations()})})},__getVirtualTableDefaultFields(e){return JSON.parse(JSON.stringify([{name:"field1",alias:"field1",type:"int",length:0,decimal:0,required:!1,isPrimaryKey:!1,isAutoIncrement:!1,comment:"Virtual field 1",isVirtual:!0,visible:!0,table:e},{name:"field2",alias:"field2",type:"int",length:0,decimal:0,required:!1,isPrimaryKey:!1,isAutoIncrement:!1,comment:"Virtual field 2",isVirtual:!0,visible:!0,table:e},{name:"field3",alias:"field3",type:"int",length:0,decimal:0,required:!1,isPrimaryKey:!1,isAutoIncrement:!1,comment:"Virtual field 3",isVirtual:!0,visible:!0,table:e}]))},__deleteLine(){const e=this.relationLines.find(t=>t.id===this.model.selectedLineId);if(e.type==="join"){const t=this.model.joins.findIndex(n=>n.table.id===e.table.id&&n.targetTable.id===e.targetTable.id),i=this.model.joins[t],a=i.ons.findIndex(n=>n.field.name===e.field.name&&n.targetField.name===e.targetField.name);a!==-1&&i.ons.splice(a,1),i.ons.length===0&&this.model.joins.splice(t,1)}else{const t=this.model.aggregates.findIndex(i=>i.table.id===e.table.id&&i.targetTable.id===e.targetTable.id&&i.field.name===e.field.name&&i.targetField.name===e.targetField.name);this.model.aggregates.splice(t,1)}this.model.selectedLineId=null,this.$emit("change"),this.render()},__deleteTable(){const e=this.model.tables.findIndex(a=>a.id===this.model.selectedTableId),t=this.model.tables[e];let i=Promise.resolve();t.type==="MAIN"&&this.model.tables.length>1&&(i=this.deleteConfirm("Deleting the main table will delete all the schedules and associations. Are you sure to delete it?")),i.then(()=>{if(t.type==="MAIN"){this.model.tables=[],this.model.joins=[],this.model.aggregates=[],this.$emit("change");return}this.model.joins=this.model.joins.filter(a=>!(a.table.id===this.model.selectedTableId||a.targetTable.id===this.model.selectedTableId)),this.model.aggregates=this.model.aggregates.filter(a=>!(a.table.id===this.model.selectedTableId||a.targetTable.id===this.model.selectedTableId)),this.model.tables.splice(e,1),this.$emit("change")}).catch(()=>{})},__addJoinRelation(){if(this.relationRuntime.table.id===this.relationRuntime.targetTable.id){this.$tip.warning("The join relationship cannot be created.");return}let e=this.model.joins.find(t=>t.table.id===this.relationRuntime.table.id&&t.targetTable.id===this.relationRuntime.targetTable.id);e==null&&(e={table:this.relationRuntime.table,targetTable:this.relationRuntime.targetTable,joinType:"INNER JOIN",relation:"ONE-TO-ONE",ons:[]},this.model.joins.push(e)),e.ons.push({field:this.relationRuntime.field,targetField:this.relationRuntime.targetField,relation:"AND"}),this.computeRelations()},__addAggregate(){if(this.relationRuntime.table.id===this.relationRuntime.targetTable.id){this.$tip.warning("The aggregate relationship cannot be created.");return}let e=this.model.aggregates.find(t=>t.table.id===this.relationRuntime.table.id&&t.targetTable.id===this.relationRuntime.targetTable.id&&(t.field.name===this.relationRuntime.field.name||t.targetField.name===this.relationRuntime.targetField.name));e==null&&(e={table:this.relationRuntime.table,targetTable:this.relationRuntime.targetTable,field:this.relationRuntime.field,targetField:this.relationRuntime.targetField,function:"COUNT"},this.model.aggregates.push(e)),this.computeRelations()},__getFieldPosition(e,t,i=!0){const n=this.$refs.stage.getNode().getAbsolutePosition();let l=e.fields.findIndex(m=>m.visible&&m.name===t.name);if(l===-1)return null;let o=l;for(let m=0;m<o;m++)e.fields[m].visible||l--;if(l===-1)return null;const c=e.x+(i?200:0)-n.x,_=e.y+this.fieldHeight+(l+1)*this.fieldHeight-15-n.y;return{x:c,y:_}},__computeSize(){const e=document.querySelector(".designer-wrap").getBoundingClientRect();this.configKonva.width=e.width,this.configKonva.height=e.height}},mounted(){this.render(),this.__computeSize(),window.addEventListener("resize",()=>{this.__computeSize()})}},Fe={class:"wrap"};function Be(e,t,i,a,n,l){const o=f("Table"),c=f("RelationLine"),_=f("v-layer"),m=f("v-stage");return g(),p(O,null,[i.model.tables.length===0?(g(),p("div",{key:0,class:"empty-tip",onDragover:t[1]||(t[1]=M(()=>{},["prevent"])),onDrop:t[2]||(t[2]=s=>l.handleDrop(s,1))},[d("div",Fe,[d("p",null,C(e.$t("database.dragTip")),1),d("p",null,C(e.$t("common.or")),1),d("p",null,[d("em",{onClick:t[0]||(t[0]=(...s)=>l.confirmCreateVirtualTable&&l.confirmCreateVirtualTable(...s))},C(e.$t("database.createVirtualTableTip")),1)])])],32)):V("",!0),d("div",{class:"stage-wrap",tabindex:"-1",onKeyup:t[5]||(t[5]=pe((...s)=>l.handleDelete&&l.handleDelete(...s),["delete"]))},[n.rendered?(g(),A(m,{key:0,ref:"stage",config:n.configKonva,onMouseup:t[4]||(t[4]=s=>e.$refs.stage.getNode().draggable(!0)),onClick:l.globalClick},{default:y(()=>[(g(!0),p(O,null,x(i.model.tables,s=>(g(),A(o,{ref_for:!0,ref:s.id,key:s.name,"field-height":i.fieldHeight,x:s.x,y:s.y,table:s,relations:i.model.joins,selected:i.model.selectedTableId===s.id,onDragmove:l.moveTable,"onField:mousedown":l.handleFieldMouseDown,"onField:mouseup":l.handleFieldMouseUp,"onTable:select":l.handleTableSelect,"onTable:preview":l.handleTablePreview},null,8,["field-height","x","y","table","relations","selected","onDragmove","onField:mousedown","onField:mouseup","onTable:select","onTable:preview"]))),128)),u(_,null,{default:y(()=>[(g(!0),p(O,null,x(n.relationLines,s=>(g(),A(c,{key:s.id,"line-type":s.type,start:s.start,end:s.end,selected:i.model.selectedLineId===s.id,onSelect:h=>l.handleLineSelect(s),onUnselect:t[3]||(t[3]=h=>i.model.selectedLineId=null)},null,8,["line-type","start","end","selected","onSelect"]))),128))]),_:1})]),_:1},8,["config","onClick"])):V("",!0)],32)],64)}const ke=S(Me,[["render",Be],["__scopeId","data-v-dd89d219"]]);const $e={name:"SQLLine",props:{type:{},indent:{default:0},visible:{default:!0}}},Pe={class:"code"},Ue={class:"opera"},He={key:0};function We(e,t,i,a,n,l){const o=f("el-button");return g(),p("div",{class:G(["sql-line",{"sql-line__hide":!i.visible}]),style:z({"padding-left":i.indent+"px"})},[d("p",Pe,[Te(e.$slots,"default",{},void 0,!0)]),d("ul",Ue,[i.type==="field"?(g(),p("li",He,[B(u(o,{icon:"View",onClick:t[0]||(t[0]=c=>e.$emit("update:visible",!1))},null,512),[[le,i.visible]]),B(u(o,{icon:"Hide",onClick:t[1]||(t[1]=c=>e.$emit("update:visible",!0))},null,512),[[le,!i.visible]])])):V("",!0)])],6)}const J=S($e,[["render",We],["__scopeId","data-v-6cb65a6a"]]);const qe={name:"DynamicWidthInput",props:{modelValue:{}},data(){return{value:this.modelValue,oldValue:this.modelValue,changeTimeout:null}},watch:{modelValue:{immediate:!0,handler(){this.value=this.modelValue}}},methods:{handleInput(e){this.value=e.target.innerText,this.$emit("update:modelValue",e.target.innerText),this.changeTimeout!=null&&clearTimeout(this.changeTimeout),this.changeTimeout=setTimeout(()=>{this.$emit("change",{oldValue:this.oldValue,newValue:e.target.innerText}),this.oldValue=e.target.innerText},300)},handleBlur(){this.$emit("update:blur-model-value",this.value),this.$emit("blur")}}};function je(e,t,i,a,n,l){return g(),p("div",{class:"dynamic-width-input",contenteditable:!0,onInput:t[0]||(t[0]=(...o)=>l.handleInput&&l.handleInput(...o)),onBlur:t[1]||(t[1]=(...o)=>l.handleBlur&&l.handleBlur(...o))},C(i.modelValue),33)}const X=S(qe,[["render",je],["__scopeId","data-v-04b6211d"]]);const Ge={name:"SQLLineKeywordSelect",props:{width:{default:"120px"},data:{type:Array,required:!0}}};function ze(e,t,i,a,n,l){const o=f("el-option"),c=f("el-select");return g(),A(c,{class:"sql-line-keyword-select",size:"default",style:z({width:i.width})},{default:y(()=>[(g(!0),p(O,null,x(i.data,_=>(g(),A(o,{key:_,value:_,label:_},null,8,["value","label"]))),128))]),_:1},8,["style"])}const Z=S(Ge,[["render",ze],["__scopeId","data-v-b739087d"]]);const Qe={name:"ErrorWindow",data(){return{visible:!1,title:"错误",message:""}},methods:{open({title:e,message:t}){this.title=e,this.message=t,this.visible=!0}}},Ke={class:"error-message"};function Je(e,t,i,a,n,l){const o=f("el-dialog");return g(),A(o,{title:n.title,modelValue:n.visible,"onUpdate:modelValue":t[0]||(t[0]=c=>n.visible=c),class:"error-window",width:"550px","append-to-body":""},{default:y(()=>[d("pre",Ke,C(n.message),1)]),_:1},8,["title","modelValue"])}const Xe=S(Qe,[["render",Je]]);const Ze={name:"QueryResultPreview",components:{ErrorWindow:Xe},data(){return{loading:!1,visible:!1,pagination:{page:1,capacity:100,total:0},sql:"",columns:[],result:[]}},computed:{...$(["currentProject","currentDatabase"])},methods:{open(e,t){this.sql=t,this.fetchList().then(()=>{this.visible=!0,this.loading=!0,this.columns=e.map(i=>i.substring(1,i.length-1)),this.result=[]}).catch(i=>{this.$refs.errorWindow.open({title:"SQL错误",message:i.message})})},fetchList(){return new Promise((e,t)=>{ne({projectId:this.currentProject,databaseId:this.currentDatabase,sql:this.__getCountSql()}).then(i=>(e(),this.pagination.total=i[0].total,this.pagination.total>0?ne({projectId:this.currentProject,databaseId:this.currentDatabase,sql:this.__getPaginationSql()}):[])).then(i=>{this.result=i}).catch(i=>{t(i)}).finally(()=>{this.loading=!1})})},getColumnWidth(e){let t=ae(e)+24,i=t;const a=this.result[0];if(a!=null){const n=a[e];n!=null&&(i=ae(n)+24)}return Math.max(t,i)},handleCurrentChange(e){this.pagination.page=e,this.fetchList()},handleSizeChange(e){this.pagination.capacity=e,this.fetchList()},__getPaginationSql(){let e=(this.pagination.page-1)*this.pagination.capacity;return`${this.sql} LIMIT ${e}, ${this.pagination.capacity}`},__getCountSql(){return`SELECT COUNT(*) AS total FROM (${this.sql}) _count`}}},Ye={class:"toolbar"};function et(e,t,i,a,n,l){const o=f("el-pagination"),c=f("el-table-column"),_=f("el-table"),m=f("el-dialog"),s=f("ErrorWindow"),h=Q("loading");return g(),p(O,null,[u(m,{class:"sql-preview",title:e.$t("database.queryResult"),width:"1000px",modelValue:n.visible,"onUpdate:modelValue":t[0]||(t[0]=r=>n.visible=r),"append-to-body":""},{default:y(()=>[d("div",Ye,[u(o,{background:"","page-sizes":[10,20,50,100,200,500],"default-page-size":100,layout:"total, prev, pager, next, sizes",total:n.pagination.total,onCurrentChange:l.handleCurrentChange,onSizeChange:l.handleSizeChange},null,8,["total","onCurrentChange","onSizeChange"])]),B((g(),A(_,{data:n.result,border:""},{default:y(()=>[(g(!0),p(O,null,x(n.columns,r=>(g(),A(c,{key:r,prop:r,label:r,"min-width":l.getColumnWidth(r)},null,8,["prop","label","min-width"]))),128))]),_:1},8,["data"])),[[h,n.loading]])]),_:1},8,["title","modelValue"]),u(s,{ref:"errorWindow"},null,512)],64)}const tt=S(Ze,[["render",et]]),it={name:"SQLJoin",components:{DynamicWidthInput:X,SQLLine:J,SQLLineKeywordSelect:Z},props:{table:{required:!0},joins:{required:!0},indentLevel:{default:1}},computed:{indent(){return`${(this.indentLevel-1)*20}px`}},methods:{handleChange(){this.$emit("change")}}},lt=d("em",null,"ON",-1),nt={class:"join-ons"},at=d("span",null,".",-1),st=d("span",null,"=",-1),ot=d("span",null,".",-1);function rt(e,t,i,a,n,l){const o=f("SQLLineKeywordSelect"),c=f("DynamicWidthInput"),_=f("SQLLine");return g(),p("ul",{class:"joins",style:z({"padding-left":l.indent})},[(g(!0),p(O,null,x(i.joins,m=>(g(),p("li",null,[u(_,null,{default:y(()=>[u(o,{modelValue:m.joinType,"onUpdate:modelValue":s=>m.joinType=s,width:"105px",data:["INNER JOIN","LEFT JOIN","RIGHT JOIN","OUTER JOIN"],class:"keyword",onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"]),d("span",null,C(m.targetTable.name),1),u(c,{modelValue:m.targetTable.alias,"onUpdate:modelValue":s=>m.targetTable.alias=s,onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"]),lt,u(o,{modelValue:m.relation,"onUpdate:modelValue":s=>m.relation=s,width:"130px",data:["ONE-TO-ONE","ONE-TO-MANY","MANY-TO-ONE"],class:"relation",onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1024),d("ul",nt,[(g(!0),p(O,null,x(m.ons,(s,h)=>(g(),A(_,{indent:"20"},{default:y(()=>[h!==0?(g(),A(o,{key:0,modelValue:s.relation,"onUpdate:modelValue":r=>s.relation=r,data:["AND","OR"],width:"45px",onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"])):V("",!0),u(c,{modelValue:s.table.alias,"onUpdate:modelValue":r=>s.table.alias=r,onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"]),at,d("span",null,C(s.field.name),1),st,u(c,{modelValue:s.targetTable.alias,"onUpdate:modelValue":r=>s.targetTable.alias=r,onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"]),ot,d("span",null,C(s.targetField.name),1)]),_:2},1024))),256))])]))),256))],4)}const dt=S(it,[["render",rt]]),ut={name:"SQL",components:{SQLJoin:dt,DynamicWidthInput:X,SQLLine:J,SQLLineKeywordSelect:Z},props:{model:{required:!0},table:{required:!0},repairedJoins:{type:Array,required:!0},visibleFields:{type:Array},aggregates:{required:!0}},methods:{handleChange(){this.$emit("field:change")},handleTableAliasChange(e,{oldValue:t,newValue:i}){const a=this.model.tables.find(n=>n.id===e.id);if(a.type==="MAIN"){this.$emit("field:change");return}for(const n of a.fields)n.alias===`${t}_${n.name}`&&(n.alias=`${i}_${n.name}`);this.$emit("field:change")},createVirtualField(){const e={name:"virtual1",alias:"virtual1",type:"int",comment:"虚拟字段",isVirtual:!0,visible:!0};this.table.fields.push(e),this.$emit("field:created",{field:e}),this.$emit("field:change")},getAggregate(e){const t=this.aggregates.find(i=>i.field.name===e.name);return t??null},fieldVisibleChange(){this.$emit("field:change")},deleteVirtualField(e){const t=this.table.fields[e];this.table.fields.splice(e,1),this.$emit("field:deleted",{index:e,field:t}),this.$emit("field:change")},__getAggregateFunctionWidth(e){return{COUNT:65,SUM:44,AVG:42,MAX:44,MIN:40}[e]}}},ht={class:"sql"},ct=d("em",null,"SELECT",-1),gt=d("em",null,"SELECT",-1),mt=d("span",null,"(",-1),_t=d("span",null,".",-1),ft=d("span",null,")",-1),bt=d("em",null,"FROM",-1),pt=d("span",null,")",-1),Tt=d("span",null,"AS",-1),yt=d("span",{class:"comment"},"#",-1),Lt=d("span",null,".",-1),vt=d("span",null,"AS",-1),Ct=d("span",null,"AS",-1),wt=d("span",{class:"comment"},"#",-1),It=d("em",null,"FROM",-1),Et=d("span",null,"AS",-1);function Dt(e,t,i,a,n,l){const o=f("SQLLine"),c=f("SQLLineKeywordSelect"),_=f("DynamicWidthInput"),m=f("SQLJoin");return g(),p("div",ht,[u(o,{type:"select","onField:create":l.createVirtualField},{default:y(()=>[ct]),_:1},8,["onField:create"]),(g(!0),p(O,null,x(i.visibleFields,(s,h)=>(g(),p(O,null,[l.getAggregate(s)?(g(),p(O,{key:0},[u(o,{indent:"20",visible:s.visible},{default:y(()=>[N("(")]),_:2},1032,["visible"]),u(o,{indent:"40",visible:s.visible},{default:y(()=>[gt]),_:2},1032,["visible"]),u(o,{indent:"60",visible:s.visible},{default:y(()=>[u(c,{modelValue:l.getAggregate(s).function,"onUpdate:modelValue":r=>l.getAggregate(s).function=r,data:["COUNT","SUM","AVG","MAX","MIN"],width:`${l.__getAggregateFunctionWidth(l.getAggregate(s).function)}px`,onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","width","onChange"]),mt,u(_,{modelValue:l.getAggregate(s).targetTable.alias,"onUpdate:modelValue":r=>l.getAggregate(s).targetTable.alias=r,onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"]),_t,d("span",null,C(l.getAggregate(s).targetField.name),1),ft]),_:2},1032,["visible"]),u(o,{indent:"40",visible:s.visible},{default:y(()=>[bt,d("span",null,C(l.getAggregate(s).targetTable.name),1),u(_,{modelValue:l.getAggregate(s).targetTable.alias,"onUpdate:modelValue":r=>l.getAggregate(s).targetTable.alias=r,onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"])]),_:2},1032,["visible"]),u(m,{"indent-level":3,joins:i.repairedJoins,table:l.getAggregate(s).targetTable},null,8,["joins","table"]),u(o,{indent:"20",type:s.isVirtual?"virtual-field":"field",visible:s.visible,"onUpdate:visible":[r=>s.visible=r,l.fieldVisibleChange],"onField:delete":r=>l.deleteVirtualField(h)},{default:y(()=>[pt,Tt,u(_,{modelValue:s.alias,"onUpdate:modelValue":r=>s.alias=r},null,8,["modelValue","onUpdate:modelValue"]),d("span",null,C(i.visibleFields.length===h+1?"":","),1),s.isVirtual?(g(),p(O,{key:0},[yt,u(_,{modelValue:s.type,"onUpdate:modelValue":r=>s.type=r,class:"comment",onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"]),u(_,{modelValue:s.comment,"onUpdate:modelValue":r=>s.comment=r,class:"comment",onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"])],64)):V("",!0)]),_:2},1032,["type","visible","onUpdate:visible","onField:delete"])],64)):(g(),A(o,{key:s.name,type:s.isVirtual?"virtual-field":"field",visible:s.visible,"onUpdate:visible":[r=>s.visible=r,l.fieldVisibleChange],indent:"20","onField:delete":r=>l.deleteVirtualField(h)},{default:y(()=>[u(_,{modelValue:s.table.alias,"onUpdate:modelValue":r=>s.table.alias=r,onChange:r=>l.handleTableAliasChange(s.table,r)},null,8,["modelValue","onUpdate:modelValue","onChange"]),Lt,s.isVirtual?(g(),p(O,{key:1},[u(_,{"model-value":s.name,"blur-model-value":s.name,"onUpdate:blurModelValue":r=>s.name=r,onBlur:l.handleChange},null,8,["model-value","blur-model-value","onUpdate:blurModelValue","onBlur"]),Ct,u(_,{"model-value":s.alias,"blur-model-value":s.alias,"onUpdate:blurModelValue":r=>s.alias=r,onBlur:l.handleChange},null,8,["model-value","blur-model-value","onUpdate:blurModelValue","onBlur"]),d("span",null,C(i.visibleFields.length===h+1?"":","),1),wt,u(_,{modelValue:s.type,"onUpdate:modelValue":r=>s.type=r,class:"comment",onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"]),u(_,{modelValue:s.comment,"onUpdate:modelValue":r=>s.comment=r,class:"comment",onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"])],64)):(g(),p(O,{key:0},[d("span",null,C(s.name),1),vt,u(_,{modelValue:s.alias,"onUpdate:modelValue":r=>s.alias=r,onChange:l.handleChange},null,8,["modelValue","onUpdate:modelValue","onChange"]),d("span",null,C(i.visibleFields.length===h+1?"":","),1)],64))]),_:2},1032,["type","visible","onUpdate:visible","onField:delete"]))],64))),256)),i.table.isVirtual?V("",!0):(g(),A(o,{key:0},{default:y(()=>[It,d("span",null,C(i.table.name),1),Et,u(_,{modelValue:i.table.alias,"onUpdate:modelValue":t[0]||(t[0]=s=>i.table.alias=s),onChange:l.handleChange},null,8,["modelValue","onChange"])]),_:1})),u(m,{joins:i.repairedJoins,table:i.table,onChange:l.handleChange},null,8,["joins","table","onChange"])])}const de=S(ut,[["render",Dt]]);const Ot={name:"TableSetting",components:{SQL:de,QueryResultPreview:tt,SQLLineKeywordSelect:Z,DynamicWidthInput:X,SQLLine:J},props:{visible:{default:!0},model:{required:!0},table:{},joins:{type:Array},aggregates:{type:Array}},computed:{...$(["currentDatabase"]),visibleFields(){let e=new Set;for(const t of this.table.fields)t.table=this.table,e.add(t);for(const t of this.repairedJoins){for(const i of t.table.fields)i.table=t.table,e.add(i);for(const i of t.targetTable.fields)i.table=t.targetTable,e.add(i)}return[...e]},repairedJoins(){const e=[];if(!this.joins.find(t=>t.table.id===this.table.id||t.targetTable.id===this.table.id))return[];for(const t of this.joins){const i={...t};if(t.table.id===this.table.id){e.push(i);continue}if(t.targetTable.id===this.table.id){const n=i.table;i.targetTable=i.table,i.table=n,e.push(i);continue}if(e.find(n=>n.targetTable.id===i.targetTable.id)){const n=i.table;i.targetTable=i.table,i.table=n}e.push(i)}return e}},methods:{copy(){ye({sql:this.__getSql().sql}).then(e=>navigator.clipboard.writeText(e)).then(()=>{this.$tip.success(this.$t("common.copySuccessfully"))}).catch(e=>{this.$tip.apiFailed(e)})},execute(){const e=this.__getSql();this.$refs.queryResultPreview.open(e.fields,e.sql,[])},__getSql(){if(this.table==null)return{fields:[],sql:""};let e=[];const t=[];e.push("SELECT");for(const i of this.visibleFields){if(!i.visible)continue;const a=this.getAggregate(i);a!=null?(e.push("(SELECT"),e.push(`${a.function}(${a.targetTable.alias}.${a.targetField.name})`),e.push(`FROM \`${a.targetTable.name}\` AS \`${a.targetTable.alias}\``),e=e.concat(this.__getJoinSql(a.targetTable,this.repairedJoins)),e.push(`) AS \`${a.field.alias}\`,`),t.push(`\`${a.field.alias}\``)):(e.push(`\`${i.table.alias}\`.\`${i.name}\` AS \`${i.alias}\`,`),t.push(`\`${i.alias}\``))}if(e[e.length-1]=e[e.length-1].substring(0,e[e.length-1].length-1),!this.table.isVirtual){let i=` AS \`${this.table.alias}\``;this.table.name===this.table.alias&&(i=""),e.push(`FROM \`${this.table.name}\`${i}`)}return e=e.concat(this.__getJoinSql(this.table,this.repairedJoins)),{fields:t,sql:e.join(`
`)}},__getJoinSql(e,t){const i=[];for(const a of t){let n=` \`${a.targetTable.alias}\``;a.targetTable.name===a.targetTable.alias&&(n=""),i.push(`${a.joinType} \`${a.targetTable.name}\`${n}`);for(let l=0;l<a.ons.length;l++){const o=a.ons[l];let c=l===0?"ON ":`${o.relation} `;i.push(`${c}\`${o.table.alias}\`.\`${o.field.name}\` = \`${o.targetTable.alias}\`.\`${o.targetField.name}\``)}}return i},getAggregate(e){const t=this.aggregates.find(i=>i.field.name===e.name);return t??null}}},At=e=>(H("data-v-1dd38098"),e=e(),W(),e),Rt={class:"toolbar"},St=At(()=>d("h2",null,"SQL预览",-1)),xt={class:"opera"},Vt={key:0,class:"wrap"};function Nt(e,t,i,a,n,l){const o=f("el-button"),c=f("SQL"),_=f("QueryResultPreview");return g(),p("div",{class:G(["table-setting",{visible:i.visible}])},[d("div",Rt,[St,d("div",xt,[u(o,{type:"primary",size:"default",class:"button-copy",onClick:l.copy},{default:y(()=>[N("复制")]),_:1},8,["onClick"]),u(o,{type:"primary",size:"default",onClick:l.execute},{default:y(()=>[N("执行语句")]),_:1},8,["onClick"])])]),i.table!=null?(g(),p("div",Vt,[u(c,{model:i.model,table:i.table,"repaired-joins":l.repairedJoins,aggregates:i.aggregates,"visible-fields":l.visibleFields,"onField:change":t[0]||(t[0]=m=>e.$emit("field:change",m)),"onField:created":t[1]||(t[1]=m=>e.$emit("field:created",m)),"onField:deleted":t[2]||(t[2]=m=>e.$emit("field:deleted",m))},null,8,["model","table","repaired-joins","aggregates","visible-fields"])])):V("",!0),u(_,{ref:"queryResultPreview"},null,512)],2)}const ue=S(Ot,[["render",Nt],["__scopeId","data-v-1dd38098"]]);function he(e){return K.post("/project/database/model/create",e)}function ce(e){return K.post("/project/database/model/update",e)}function Mt(e){return K.post("/project/database/model/delete",e)}function Ft(e,t,i,a){if(!/^[a-zA-Z][a-zA-Z0-9_]+$/.test(t)){i(new Error(a));return}i()}function Oi(e,t,i,a){if(!/^(?!0)(\d+)\.(\d+)\.(\d+)/.test(t)){i(new Error(a));return}i()}const Bt={name:"TableLibrary",components:{Empty:Le,InnerRouterView:Ae,InnerRouterViewWindow:Re},props:{currentModel:{}},data(){return{newModel:{name:"",comment:"",tables:[],joins:[],aggregates:[],__lineType:"join",__visibleSQLPreviewWindow:!1},editModel:{id:null,name:"",comment:""},modelTemplate:null}},computed:{...$(["tables","models","currentProject","currentDatabase","globalLoading"])},methods:{...se(["fetchTables"]),getRules(){return{name:[{required:!0,message:this.$t("form.isRequired",{value:this.$t("database.modelName")})},{validator:(e,t,i)=>Ft(e,t,i,"模型名称必须以字母开头,长度必须大于1,且只能包含字母、数字和下划线!")}]}},handleDragStart(e){this.$emit("table:drag",e)},createQueryModel(){this.$refs.routerViewWindow.push("create-model");for(const e in this.newModel)this.newModel[e]=this.modelTemplate[e];this.$nextTick(()=>{this.$refs.createForm.clearValidate()})},updateModel(e){for(const t in this.editModel)this.editModel[t]=e[t];this.$refs.routerViewWindow.push("update-model"),this.$nextTick(()=>{this.$refs.editForm.clearValidate()})},confirmUpdate(){this.$refs.editForm.validate(e=>{e&&ce({projectId:this.currentProject,databaseId:this.currentDatabase,model:this.editModel}).then(()=>{Object.assign(this.currentModel,this.editModel),this.$refs.routerViewWindow.back()}).catch(t=>{this.$tip.apiFailed(t)})})},confirmCreate(){this.$refs.createForm.validate(e=>{if(!e)return;const t=JSON.parse(JSON.stringify(this.newModel));for(const i in this.newModel)i.startsWith("__")&&delete t[i];he({projectId:this.currentProject,databaseId:this.currentDatabase,model:t}).then(i=>{const a=JSON.parse(JSON.stringify(this.newModel));a.id=i,this.models.unshift(a),this.selectModel(a),this.$refs.routerViewWindow.back()}).catch(i=>{this.$tip.apiFailed(i)})})},deleteModel(e){this.deleteConfirm(this.$t("database.deleteModelTip",{modelName:e.name})).then(()=>{Mt({projectId:this.currentProject,databaseId:this.currentDatabase,modelId:e.id}).then(()=>{const t=this.models.findIndex(i=>i.id===e.id);if(t!==-1){const i=this.models[t];this.models.splice(t,1),this.$emit("deleted",i)}this.$tip.success(this.$t("common.deleteSuccessfully"))}).catch(t=>{this.$tip.apiFailed(t)})}).catch(()=>{})},selectModel(e){this.$emit("update:currentModel",e)}},created(){this.modelTemplate={...this.newModel}}},ge=e=>(H("data-v-418130c4"),e=e(),W(),e),kt={class:"table-library"},$t={class:"block"},Pt={class:"header",slot:"title"},Ut=ge(()=>d("h4",null,"查询模型",-1)),Ht={key:0,class:"model-list"},Wt=["onClick"],qt=["onClick"],jt=["onClick"],Gt={class:"create-model-form"},zt={class:"opera"},Qt={class:"create-model-form"},Kt={class:"opera"},Jt={class:"block table-list-wrap"},Xt={class:"header"},Zt=ge(()=>d("h4",null,"数据库表",-1)),Yt={class:"table-list"},ei=["onDragstart"];function ti(e,t,i,a,n,l){const o=f("el-button"),c=f("Edit"),_=f("el-icon"),m=f("Delete"),s=f("Empty"),h=f("InnerRouterView"),r=f("el-input"),w=f("el-form-item"),E=f("el-form"),T=f("InnerRouterViewWindow"),v=Q("loading");return g(),p("div",kt,[d("div",$t,[u(T,{ref:"routerViewWindow",default:"query-models"},{default:y(()=>[u(h,{name:"query-models"},{default:y(()=>[d("div",Pt,[Ut,u(o,{type:"primary",size:"default",icon:"Plus",class:"button-icon",onClick:l.createQueryModel},null,8,["onClick"])]),e.models.length>0?(g(),p("ul",Ht,[(g(!0),p(O,null,x(e.models,L=>(g(),p("li",{key:L.id,class:G({selected:i.currentModel!=null&&i.currentModel.id===L.id}),onClick:R=>l.selectModel(L)},[d("label",null,C(L.name),1),d("p",null,C(L.comment),1),d("div",null,[d("span",{onClick:M(R=>l.updateModel(L),["stop"])},[u(_,null,{default:y(()=>[u(c)]),_:1})],8,qt),d("span",{onClick:M(R=>l.deleteModel(L),["stop"])},[u(_,null,{default:y(()=>[u(m)]),_:1})],8,jt)])],10,Wt))),128))])):(g(),A(s,{key:1}))]),_:1}),u(h,{name:"create-model",title:e.$t("database.createNewModel")},{default:y(()=>[d("div",Gt,[u(E,{ref:"createForm",model:n.newModel,rules:l.getRules(),onSubmit:t[2]||(t[2]=M(()=>{},["prevent"]))},{default:y(()=>[u(w,{label:e.$t("common.name"),prop:"name",required:""},{default:y(()=>[u(r,{modelValue:n.newModel.name,"onUpdate:modelValue":t[0]||(t[0]=L=>n.newModel.name=L)},null,8,["modelValue"])]),_:1},8,["label"]),u(w,{label:e.$t("common.remark"),prop:"comment"},{default:y(()=>[u(r,{modelValue:n.newModel.comment,"onUpdate:modelValue":t[1]||(t[1]=L=>n.newModel.comment=L),type:"textarea",rows:2},null,8,["modelValue"])]),_:1},8,["label"])]),_:1},8,["model","rules"]),d("div",zt,[u(o,{size:"default",onClick:t[3]||(t[3]=L=>e.$refs.routerViewWindow.back())},{default:y(()=>[N(C(e.$t("common.cancel")),1)]),_:1}),u(o,{type:"primary",size:"default",onClick:l.confirmCreate},{default:y(()=>[N(C(e.$t("common.confirmAdd")),1)]),_:1},8,["onClick"])])])]),_:1},8,["title"]),u(h,{name:"update-model",title:e.$t("database.updateModelTitle")},{default:y(()=>[d("div",Qt,[u(E,{ref:"editForm",model:n.editModel,rules:l.getRules(),onSubmit:t[6]||(t[6]=M(()=>{},["prevent"]))},{default:y(()=>[u(w,{label:e.$t("common.name"),prop:"name",required:""},{default:y(()=>[u(r,{modelValue:n.editModel.name,"onUpdate:modelValue":t[4]||(t[4]=L=>n.editModel.name=L)},null,8,["modelValue"])]),_:1},8,["label"]),u(w,{label:e.$t("common.remark"),prop:"comment"},{default:y(()=>[u(r,{modelValue:n.editModel.comment,"onUpdate:modelValue":t[5]||(t[5]=L=>n.editModel.comment=L),type:"textarea",rows:2},null,8,["modelValue"])]),_:1},8,["label"])]),_:1},8,["model","rules"]),d("div",Kt,[u(o,{size:"default",onClick:t[7]||(t[7]=L=>e.$refs.routerViewWindow.back())},{default:y(()=>[N(C(e.$t("common.cancel")),1)]),_:1}),u(o,{type:"primary",size:"default",onClick:l.confirmUpdate},{default:y(()=>[N(C(e.$t("common.confirmUpdate")),1)]),_:1},8,["onClick"])])])]),_:1},8,["title"])]),_:1},512)]),d("div",Jt,[d("div",Xt,[Zt,u(o,{class:"button-icon",size:"default",type:"primary",icon:"Refresh",onClick:e.fetchTables},null,8,["onClick"])]),B((g(),p("ul",Yt,[(g(!0),p(O,null,x(e.tables,L=>(g(),p("li",{key:L.name,draggable:"true",onDragstart:R=>l.handleDragStart(L.name)},[d("label",null,C(L.name),1),d("p",null,C(L.comment),1)],40,ei))),128))])),[[v,e.globalLoading.tables]])])])}const ii=S(Bt,[["render",ti],["__scopeId","data-v-418130c4"]]);var li=ve();const D=Ce(li);var k,U,me;class ni{constructor(t,i=3500,a=2e3){j(this,U);j(this,k,"join");b(this,"BACKGROUND_ITEM_COLOR","#555");b(this,"TABLE_MIN_DISTANCE",50);b(this,"TABLE_WIDTH",200);b(this,"TABLE_TITLE_HEIGHT",40);b(this,"TABLE_FIELD_HEIGHT",30);b(this,"TABLE_TITLE_BACKGROUND_COLOR","#fc6a70");b(this,"SUB_TABLE_TITLE_BACKGROUND_COLOR","#2e3444");b(this,"TABLE_FIELD_BACKGROUND_COLOR","#fff");b(this,"TABLE_FIELD_BORDER_COLOR","#ccc");b(this,"TABLE_FIELD_HOVER_BACKGROUND_COLOR","#f0f0f0");b(this,"TABLE_FIELD_DRAG_BALL_BACKGROUND_COLOR","#4a536e");b(this,"TABLE_FIELD_DRAG_BALL_HOVER_BACKGROUND_COLOR","#90a1d7");b(this,"TABLE_OPERA_BACKGROUND_COLOR","#f7f7f7");b(this,"TABLE_BUTTON_BACKGROUND_COLOR","#cb5053");b(this,"TABLE_BUTTON_HOVER_BACKGROUND_COLOR","#fc6a70");b(this,"TABLE_Z_INDEX",100);b(this,"LINE_COLOR","#394054");b(this,"LINE_HOVER_COLOR","#fc6a70");b(this,"LINE_CONTROL_COLOR","#999");b(this,"LINE_CONTROL_HOVER_COLOR","#fc6a70");b(this,"LINE_AGG_CONTROL_COLOR","#3e74ea");b(this,"DEFAULT_FONT_COLOR","#333");b(this,"MAX_Z_INDEX",1e4);b(this,"REVERSE_FONT_COLOR","#fff");b(this,"FONT_SIZE_TITLE",16);b(this,"stageWidth",null);b(this,"stageHeight",null);b(this,"stageContainer",null);b(this,"stage",null);b(this,"dashLine",null);b(this,"tables",[]);b(this,"elementLayer",null);b(this,"previewStage",null);b(this,"cloneElementLayer",null);b(this,"currentDragField",null);b(this,"currentDragTable",null);b(this,"isDragEnd",!1);b(this,"events",{});b(this,"createLine",({lineType:t,field:i,targetField:a,table:n,targetTable:l,targetFieldBackgroundRect:o})=>new Promise((c,_)=>{try{t=t||ee(this,k);const m=this.elementLayer.findOne(`#${n.id}`),s=this.elementLayer.findOne(`#${l.id}`),h=m.findOne(`#${i.name}`),r=s.findOne(`#${a.name}`);if(h.__lines&&h.__lines.length>0)for(const v of h.__lines){if(v.table===m&&v.targetTable===s&&v.field1===h&&v.field2===r)return _(new Error("请勿重复关联!"));if(v.table===s&&v.targetTable===m&&v.field1===r&&v.field2===h)return _(new Error("请勿重复关联!"))}const w=this.computeLinePoints({table:m,field1:h,targetTable:s,field2:r}),E=this.computeLineControlPoints({linePoints:w,table:m,targetTable:s});h.__lines=h.__lines||[],r.__lines=r.__lines||[];const T={lineType:t,table:m,field1:h,targetTable:s,field2:r,line:new D.Line({name:`field_line_${Math.round(Math.random()*1e4)}`,points:w,stroke:this.LINE_COLOR,strokeWidth:2,lineCap:"round",lineJoin:"round",zIndex:1}),control:new D.Circle({name:`field_line_control_${Math.round(Math.random()*1e4)}`,x:E.x,y:E.y,radius:10,fill:t==="join"?this.LINE_CONTROL_COLOR:this.LINE_AGG_CONTROL_COLOR,draggable:!1,zIndex:2})};h.__lines.push(T),r.__lines.push(T),this.elementLayer.add(T.line),this.elementLayer.add(T.control),T.control.on("click",()=>{T.line.destroy(),T.control.destroy();const v=h.__lines.indexOf(T);v!==-1&&h.__lines.splice(v,1);const L=r.__lines.indexOf(T);L!==-1&&r.__lines.splice(L,1),this.redrawPreview(),this.events["line:deleted"]&&this.events["line:deleted"]({field:i,targetField:a,table:n,targetTable:l})}),T.control.on("mouseover",()=>{T.line.stroke(this.LINE_HOVER_COLOR),T.line.zIndex(this.MAX_Z_INDEX),T.control.zIndex(this.MAX_Z_INDEX),T.control.fill(this.LINE_CONTROL_HOVER_COLOR),T.table.zIndex(this.MAX_Z_INDEX),T.targetTable.zIndex(this.MAX_Z_INDEX),this.stage.container().style.cursor="pointer"}),T.control.on("mouseout",()=>{T.line.stroke(this.LINE_COLOR),T.line.zIndex(1),T.line.dash([]),T.control.zIndex(2),T.control.fill(T.lineType==="join"?this.LINE_CONTROL_COLOR:this.LINE_AGG_CONTROL_COLOR),T.table.zIndex(this.TABLE_Z_INDEX),T.targetTable.zIndex(this.TABLE_Z_INDEX),this.stage.container().style.cursor="default"}),o&&o.fill(this.TABLE_FIELD_BACKGROUND_COLOR),this.tables.forEach(v=>v.zIndex(this.TABLE_Z_INDEX)),this.redrawPreview(),c()}catch(m){o&&o.fill(this.TABLE_FIELD_BACKGROUND_COLOR),_(m)}}));b(this,"redrawPreview",()=>{this.cloneElementLayer&&this.cloneElementLayer.destroy(),this.cloneElementLayer=this.elementLayer.clone(),this.previewStage.add(this.cloneElementLayer)});this.stageContainer=t,this.stageWidth=i,this.stageHeight=a,ie(this,U,me).call(this)}createBackground(){const t=new D.Layer;this.stage.add(t);const i=80,a=1;let n=(this.stage.width()-i*a*2)/(i+1);for(let l=0;l<i;l++)for(let o=0;o<i;o++){const c=new D.Circle({x:(n+a*2)*o+n,y:(n+a*2)*l+n,radius:a,fill:this.BACKGROUND_ITEM_COLOR,draggable:!0,zIndex:1});t.add(c)}}createTable(t,i,a,n=!1){const l=new D.Group({id:t.id,name:`table_${t.name}_${Math.round(Math.random()*1e4)}`,width:this.TABLE_WIDTH,height:this.TABLE_TITLE_HEIGHT+20,x:i,y:a,draggable:!0,zIndex:this.TABLE_Z_INDEX}),o=new D.Rect({width:this.TABLE_WIDTH,height:this.TABLE_TITLE_HEIGHT+20,x:0,y:-20,fill:this.TABLE_OPERA_BACKGROUND_COLOR,stroke:this.TABLE_FIELD_BORDER_COLOR,strokeWidth:1,cornerRadius:[10,10,10,10],cornerStrokeWidth:1,cornerStroke:this.TABLE_FIELD_BORDER_COLOR});l.add(o);const c=new D.Circle({x:l.width()-15,y:-10,radius:5,fill:this.TABLE_BUTTON_BACKGROUND_COLOR,draggable:!1});c.on("click",()=>{this.events["table:delete"]&&this.events["table:delete"]({table:t,tableGroup:l})}),c.on("mouseover",()=>{c.fill(this.TABLE_BUTTON_HOVER_BACKGROUND_COLOR)}),c.on("mouseout",()=>{c.fill(this.TABLE_BUTTON_BACKGROUND_COLOR)}),l.add(c);const _=new D.Rect({x:-2,y:0,width:this.TABLE_WIDTH+4,height:this.TABLE_TITLE_HEIGHT,fill:t.type==="MAIN"?this.TABLE_TITLE_BACKGROUND_COLOR:this.SUB_TABLE_TITLE_BACKGROUND_COLOR,stroke:t.type==="MAIN"?this.TABLE_TITLE_BACKGROUND_COLOR:this.SUB_TABLE_TITLE_BACKGROUND_COLOR,strokeWidth:1}),m=new D.Text({x:10,y:5,text:t.name,fontSize:this.FONT_SIZE_TITLE,fontStyle:"bold",fill:this.REVERSE_FONT_COLOR,width:this.TABLE_WIDTH,height:this.TABLE_TITLE_HEIGHT,lineHeight:2});for(let s=0;s<t.fields.length;s++){const h=t.fields[s],r=new D.Group({id:h.name,name:"field",x:0,y:_.height()+this.TABLE_FIELD_HEIGHT*s});let w=[0,0,0,0];s===t.fields.length-1&&(w=[0,0,10,10]);const E=new D.Rect({name:"background",x:0,y:0,width:this.TABLE_WIDTH,height:this.TABLE_FIELD_HEIGHT,fill:this.TABLE_FIELD_BACKGROUND_COLOR,stroke:this.TABLE_FIELD_BORDER_COLOR,strokeWidth:.5,cornerRadius:w,cornerStrokeWidth:.5,cornerStroke:"#ccc"}),T=new D.Text({x:25,y:0,text:h.name,fontSize:14,fontFamily:"Calibri",fill:this.DEFAULT_FONT_COLOR,height:this.TABLE_FIELD_HEIGHT,lineHeight:2}),v=new D.Circle({name:"a"+Math.round(Math.random()*1e4),x:15,y:15,radius:4,fill:this.TABLE_FIELD_DRAG_BALL_BACKGROUND_COLOR});v.on("mousedown",()=>{l.draggable(!1),this.stage.draggable(!1),this.isDragEnd=!1,this.currentDragField=h,this.currentDragTable=t}),v.on("mouseover",()=>{v.fill(this.TABLE_FIELD_DRAG_BALL_HOVER_BACKGROUND_COLOR)}),v.on("mouseout",()=>{v.fill(this.TABLE_FIELD_DRAG_BALL_BACKGROUND_COLOR)}),r.on("mouseover",()=>{this.currentDragField&&this.currentDragTable!==t&&E.fill(this.TABLE_FIELD_HOVER_BACKGROUND_COLOR)}),r.on("mouseout",()=>{this.currentDragField&&E.fill(this.TABLE_FIELD_BACKGROUND_COLOR)}),r.on("mouseup",()=>{!this.currentDragField||this.currentDragTable===t||this.createLine({table:this.currentDragTable,field:this.currentDragField,targetTable:t,targetField:h,targetFieldBackgroundRect:E}).then(()=>{try{this.events["line:created"]&&this.events["line:created"]({table:this.currentDragTable,field:this.currentDragField,targetTable:t,targetField:h})}catch(R){throw R}}).catch(R=>{console.error("创建关联线出现错误",R),this.events["line:create:error"]&&this.events["line:create:error"](R)})}),r.add(E),r.add(T),r.add(v),l.add(r);const L=l.height()+this.TABLE_FIELD_HEIGHT;l.height(L),o.height(L)}return l.add(_),l.add(m),l.on("mouseleave",()=>{this.stage.container().style.cursor="default"}),l.on("mouseover",s=>{s.target instanceof D.Circle?this.stage.container().style.cursor="pointer":this.stage.container().style.cursor="move"}),l.on("dragmove",()=>{l.find(".field").forEach(h=>{if(h.__lines&&h.__lines.length>0)for(const r of h.__lines){const w=this.computeLinePoints(r);r.line.points(w);const E=this.computeLineControlPoints({linePoints:w,...r});r.control.position(E)}}),t.x=l.absolutePosition().x,t.y=l.absolutePosition().y}),l.on("dragend",()=>{this.events.change&&this.events.change(t)}),l.on("dblclick",s=>{this.events["table:dblclick"]&&this.events["table:dblclick"]({event:s,table:t,tableGroup:l})}),this.tables.push(l),this.elementLayer.add(l),this.redrawPreview(),n&&this.events.change&&this.events.change(),l}deleteTable(t){try{const i=this.elementLayer.findOne(`#${t.id}`);if(i==null){console.warn("删除表,但在设计器中找到表元素!",t);return}const a=i.find(".field");for(const n of a)if(!(!n.__lines||n.__lines.length===0)){for(const l of n.__lines)l.line.destroy(),l.control.destroy();n.__lines=[]}this.tables=this.tables.filter(n=>n!==i),i.destroy(),this.redrawPreview()}catch(i){console.error(i)}}lineType(t){if(t==null)return this.lineType;te(this,k,t)}createPreview(t,i=200,a=150){this.previewStage=new D.Stage({container:t,width:i,height:a,scaleX:i/this.stageWidth,scaleY:a/this.stageHeight}),this.redrawPreview(),this.stage.on("dragmove",()=>{this.elementLayer.children.forEach(n=>{const l=this.cloneElementLayer.findOne("."+n.name());l instanceof D.Line?(l.points(n.points()),l.strokeWidth(2)):l.position(n.position())})})}initAutoSize(){this.stage.on("wheel",i=>{if(!i.evt.ctrlKey)return;i.evt.preventDefault();const a=this.elementLayer.scaleX(),n=this.stage.getPointerPosition(),l={x:(n.x-this.elementLayer.x())/a,y:(n.y-this.elementLayer.y())/a},o=i.evt.deltaY>0?a*1.05:a/1.05;if(o>3||o<.2)return;this.elementLayer.scale({x:o,y:o}),this.cloneElementLayer.scale({x:o,y:o});const c={x:n.x-l.x*o,y:n.y-l.y*o};this.elementLayer.position(c),this.cloneElementLayer.position(c)})}redraw(){this.tables=[],this.elementLayer&&this.elementLayer.destroy(),this.elementLayer=new D.Layer,this.stage.add(this.elementLayer),this.dashLine=new D.Line({name:"dash_line",points:[0,0,0,0],stroke:"#fc6a70",strokeWidth:1,opacity:0,lineCap:"round",lineJoin:"round",dash:[10,10]}),this.elementLayer.add(this.dashLine)}computeLinePoints({field1:t,field2:i,table:a,targetTable:n}){let l=a,o=a;a.absolutePosition().x>n.absolutePosition().x&&(l=n),a.absolutePosition().y>n.absolutePosition().y&&(o=n);let c=o.absolutePosition(),_=t,m=i;t.absolutePosition().x>i.absolutePosition().x&&(_=i,m=t);const s=_.absolutePosition(),h=m.absolutePosition(),r=h.x-s.x-this.TABLE_WIDTH,w=[0,s.y+15];r>=this.TABLE_MIN_DISTANCE?w[0]=s.x+this.TABLE_WIDTH:w[0]=s.x;let E=[...w],T=[...w],v=[...w],L=[...w];E=[s.x+this.TABLE_WIDTH+r/2,s.y+15],T=[...E],v=[...E],s.x+this.TABLE_WIDTH+this.TABLE_MIN_DISTANCE>h.x&&(E[0]=s.x-30,T[0]=E[0],T[1]=c.y-50),s.x+this.TABLE_WIDTH+this.TABLE_MIN_DISTANCE>h.x&&(v[0]=h.x+this.TABLE_WIDTH+30,v[1]=T[1]),L=[s.x+this.TABLE_WIDTH+r/2,h.y+15],s.x+this.TABLE_WIDTH+this.TABLE_MIN_DISTANCE>h.x&&(L[0]=h.x+this.TABLE_WIDTH+30);const R=[0,h.y+15];return s.x+this.TABLE_WIDTH+this.TABLE_MIN_DISTANCE>h.x?R[0]=h.x+this.TABLE_WIDTH:R[0]=h.x,R[0]>l.absolutePosition().x&&R[0]<l.absolutePosition().x+l.width()&&R[1]>l.absolutePosition().y&&R[1]<l.absolutePosition().y+l.height()&&(w[0]=s.x+this.TABLE_WIDTH,R[0]=h.x+this.TABLE_WIDTH,E[0]=h.x+this.TABLE_WIDTH+30,T[0]=h.x+this.TABLE_WIDTH+30),[...w,...E,...T,...v,...L,...R]}computeLineControlPoints({linePoints:t,table:i,targetTable:a}){const n=t[0];let l=i;i.absolutePosition().x>a.absolutePosition().x&&(l=a);let o=n>=l.absolutePosition().x+this.TABLE_WIDTH?20:-20;return{x:t[0]+o,y:t[1]}}on(t,i){this.events[t]=i}}k=new WeakMap,U=new WeakSet,me=function(){this.stage=new D.Stage({container:this.stageContainer,width:this.stageWidth,height:this.stageHeight,draggable:!1}),this.redraw(),this.stage.on("click",t=>{this.events["stage:click"]&&this.events["stage:click"](t)}),this.stage.on("mousemove",()=>{if(this.isDragEnd||!this.currentDragTable||!this.currentDragField)return;const t=this.elementLayer.findOne(`#${this.currentDragTable.id}`);if(t==null)return;const i=t.findOne(`#${this.currentDragField.name}`);if(i==null)return;const a=this.stage.getPointerPosition();this.dashLine.zIndex(this.MAX_Z_INDEX),this.dashLine.opacity(1),this.dashL