|
@@ -1,7 +1,57 @@
|
|
|
<template>
|
|
|
<div id="sand-edit-container" class="sand-edit-container">
|
|
|
<div class="sand-toolbar">
|
|
|
+ <el-tabs v-model="activeToolTabName" stretch class="sand-toolbar-tabs">
|
|
|
+ <el-tab-pane label="元素库" name="元素库">
|
|
|
+ <div class="sand-elements-tab">
|
|
|
+ <div class="sand-elements sand-elements-line">
|
|
|
+ <span>线条</span>
|
|
|
+ <div class="elements-row" >
|
|
|
+ <!-- <img :src="edge.ImgUrl" v-for="edge in myEdges" :key="edge.key"
|
|
|
+ @mousedown="edgeDragStart(edge,$event)" /> -->
|
|
|
+ <img src="~@/assets/icons/arrow.svg" :draggable="true" @dragstart="edgeDragStart('noArrowStraight',$event)" />
|
|
|
+ <img src="~@/assets/img/chart_m/change.png" />
|
|
|
+ <img src="~@/assets/img/chart_m/Group.png" />
|
|
|
+ <img src="~@/assets/img/chart_m/Group_act.png" />
|
|
|
+ <img src="~@/assets/img/chart_m/User.png" />
|
|
|
+ <img src="~@/assets/img/chart_m/User_act.png" />
|
|
|
+ <img src="~@/assets/img/chart_m/View.png" />
|
|
|
+ <img src="~@/assets/img/chart_m/View_act.png" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="sand-elements sand-elements-shape">
|
|
|
+ <span>基本形状</span>
|
|
|
+ <div class="elements-row">
|
|
|
+ <div
|
|
|
+ class="elements-shape-item"
|
|
|
+ v-for="shape in myNodes"
|
|
|
+ :key="shape.key"
|
|
|
+ :style="shape.styles"
|
|
|
+ @mousedown="dragStart(shape,$event)"
|
|
|
+ >
|
|
|
+ {{shape.label}}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="sand-elements sand-elements-mind">
|
|
|
+ <span>思维导图</span>
|
|
|
+ <div class="elements-row-mind">
|
|
|
+ <img src="~@/assets/icons/arrow.svg" />
|
|
|
+ <img src="~@/assets/icons/arrow.svg" />
|
|
|
+ <img src="~@/assets/icons/arrow.svg" />
|
|
|
+ <img src="~@/assets/icons/arrow.svg" />
|
|
|
+ <img src="~@/assets/icons/arrow.svg" />
|
|
|
+ <img src="~@/assets/icons/arrow.svg" />
|
|
|
+ <img src="~@/assets/icons/arrow.svg" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
|
|
|
+ </el-tab-pane>
|
|
|
+ <el-tab-pane label="风格" name="风格">
|
|
|
+ 风格
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
</div>
|
|
|
<div class="sand-main">
|
|
|
<div class="sand-main-top">
|
|
@@ -29,24 +79,166 @@
|
|
|
<el-button type="primary" size="large" @click="saveChart(null)" style="min-width: 120px;">保存</el-button>
|
|
|
</div>
|
|
|
</div>
|
|
|
+ <div class="sand-main-body">
|
|
|
+ <div class="sand-mainBody-tool">
|
|
|
+ 撤销
|
|
|
+ </div>
|
|
|
+ <div class="sand-mainBody-chart" id="sand-mainBody-chart">
|
|
|
+ <div id="sand-chart-container" ></div>
|
|
|
+
|
|
|
+ <!-- 缩略图 -->
|
|
|
+ <div id="minimap" class="minimap"></div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script>
|
|
|
+import { myGraph } from '../common/gragh';
|
|
|
+import { myNodes,myNodeOption } from '../common/node';
|
|
|
+import { myEdges } from '../common/edge';
|
|
|
+import { Addon } from '@antv/x6'
|
|
|
+import { configOpt } from '../common/toolConfig';
|
|
|
+
|
|
|
+const { line} = configOpt;
|
|
|
export default {
|
|
|
name:"sandFlowIndex",
|
|
|
data() {
|
|
|
return {
|
|
|
-
|
|
|
+ graph: null,
|
|
|
+ dnd:null,
|
|
|
+ initData: {},
|
|
|
+ activeToolTabName:"元素库",
|
|
|
+ addEdgeType:"",
|
|
|
+ tx:0,
|
|
|
+ ty:0
|
|
|
+ }
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ initData(newval) {
|
|
|
+ console.log(newval)
|
|
|
+ this.graph.fromJSON(newval);
|
|
|
+ },
|
|
|
+ },
|
|
|
+ computed:{
|
|
|
+ myNodes(){
|
|
|
+ return myNodes
|
|
|
+ },
|
|
|
+ myEdges(){
|
|
|
+ return myEdges
|
|
|
}
|
|
|
},
|
|
|
+ mounted(){
|
|
|
+ this.init()
|
|
|
+ console.log(document.getElementsByClassName('x6-graph-scroller-content')[0].clientWidth);
|
|
|
+ document.getElementsByClassName('x6-graph-scroller-content')[0].addEventListener("dragover",this.edgeDragover)
|
|
|
+ document.getElementsByClassName('x6-graph-scroller-content')[0].addEventListener("drop",this.edgeDrop)
|
|
|
+ },
|
|
|
+ beforeDestroy(){
|
|
|
+ document.getElementById('sand-mainBody-chart').removeEventListener("dragover",this.edgeDragover)
|
|
|
+ document.getElementById('sand-mainBody-chart').removeEventListener("drop",this.edgeDrop)
|
|
|
+ },
|
|
|
methods: {
|
|
|
+ // 初始化画布
|
|
|
+ init() {
|
|
|
+ const graph = new myGraph('sand-chart-container');
|
|
|
+ this.graph = graph;
|
|
|
+ this.dnd = new Addon.Dnd({
|
|
|
+ target: this.graph,
|
|
|
+ animation: true,
|
|
|
+ validateNode() {
|
|
|
+ return true;
|
|
|
+ },
|
|
|
+ });
|
|
|
+ // graph.on('translate', ({ tx, ty }) => {
|
|
|
+ // this.tx = tx
|
|
|
+ // this.ty = ty
|
|
|
+ // console.log(tx, ty);
|
|
|
+ // })
|
|
|
+ },
|
|
|
+ dragStart(data,e) {
|
|
|
+ // console.log(data,e,"触发了")
|
|
|
+ const { key,shape } = data;
|
|
|
+
|
|
|
+ const node = this.graph.createNode({
|
|
|
+ shape,
|
|
|
+ ...myNodeOption(key),
|
|
|
+ });
|
|
|
+ this.dnd.start(node,e);
|
|
|
+ },
|
|
|
+ edgeDragStart(type){
|
|
|
+ this.addEdgeType = type
|
|
|
+ console.log(type,"触发了边")
|
|
|
+ },
|
|
|
+ edgeDragover(e){
|
|
|
+ e.preventDefault()
|
|
|
+ },
|
|
|
+ edgeDrop(e){
|
|
|
+ if(!this.addEdgeType){
|
|
|
+ return
|
|
|
+ }
|
|
|
+ console.log(this.addEdgeType,e);
|
|
|
+ console.log(this.graph);
|
|
|
+ // console.log(e.offsetX-this.tx,e.offsetY-this.ty);
|
|
|
+ // return
|
|
|
+ this.graph.addEdge({
|
|
|
+ shape:'edge',
|
|
|
+ // shape,
|
|
|
+ // ...myNodeOption(key),
|
|
|
+ // source: { x: 240, y: 40 },
|
|
|
+ // source: { x: e.screenX-40, y: e.screenX-40 },
|
|
|
+ // target: { x: e.screenY+40, y: e.screenY+40 },
|
|
|
+ // source: { x: 0, y: 0 },
|
|
|
+ // target: { x: 0 ,y: 80 },
|
|
|
+ source: { x: e.offsetX, y: e.offsetY },
|
|
|
+ target: { x: e.offsetX ,y: e.offsetY+80 },
|
|
|
+ router: {
|
|
|
+ name: 'normal',
|
|
|
+ args: {
|
|
|
+ padding: {
|
|
|
+ left: 10,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ attrs:{
|
|
|
+ line:{
|
|
|
+ stroke: line.color,
|
|
|
+ strokeWidth: line.width,
|
|
|
+ sourceMarker: false,//起始箭头
|
|
|
+ targetMarker: false,//终止箭头
|
|
|
+ }
|
|
|
+ },
|
|
|
+ connector: {
|
|
|
+ name: 'normal',
|
|
|
+ },
|
|
|
+ // tools: {
|
|
|
+ // items: [
|
|
|
+ // {
|
|
|
+ // name: 'vertices',
|
|
|
+ // args: {
|
|
|
+ // attrs: { fill: '#666' },
|
|
|
+ // },
|
|
|
+ // },
|
|
|
+ // // {
|
|
|
+ // // name: 'segments',
|
|
|
+ // // args: {
|
|
|
+ // // snapRadius: 20,
|
|
|
+ // // attrs: {
|
|
|
+ // // fill: '#444',
|
|
|
+ // // },
|
|
|
+ // // },
|
|
|
+ // // },
|
|
|
+ // ],
|
|
|
+ // },
|
|
|
+ // vertices: [{ x: 240, y: 140 }]
|
|
|
+ });
|
|
|
+ },
|
|
|
copySandHandle(){
|
|
|
|
|
|
},
|
|
|
saveChart(){
|
|
|
-
|
|
|
+ console.log(this.myEdges);
|
|
|
}
|
|
|
},
|
|
|
}
|
|
@@ -60,15 +252,63 @@
|
|
|
flex-wrap: nowrap;
|
|
|
.sand-toolbar{
|
|
|
min-width: 400px;
|
|
|
+ width: 400px;
|
|
|
background-color: white;
|
|
|
border-radius: 4px;
|
|
|
border: 1px solid #DCDFE6;
|
|
|
height: 100%;
|
|
|
box-sizing: border-box;
|
|
|
margin-right: 20px;
|
|
|
+ padding-bottom: 20px;
|
|
|
+ .sand-elements-tab{
|
|
|
+ padding: 0 30px;
|
|
|
+ overflow: auto;
|
|
|
+ height: calc(100vh - 220px);
|
|
|
+ .sand-elements{
|
|
|
+ padding: 30px 0 20px;
|
|
|
+ border-bottom: 1px solid #C8CDD9 ;
|
|
|
+ span{
|
|
|
+ display: inline-block;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ font-size: 16px;
|
|
|
+ color: #999999;
|
|
|
+ }
|
|
|
+ .elements-row{
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ align-items: center;
|
|
|
+ margin-right: -10px;
|
|
|
+ .elements-shape-item,img{
|
|
|
+ margin-right: 10px;
|
|
|
+ margin-bottom: 10px;
|
|
|
+ cursor: pointer;
|
|
|
+ }
|
|
|
+ img{
|
|
|
+ height: 26px;
|
|
|
+ width: 26px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .sand-elements-mind{
|
|
|
+ border-bottom: none;
|
|
|
+ padding-bottom: 0;
|
|
|
+ .elements-row-mind{
|
|
|
+ display: flex;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ img{
|
|
|
+ width: calc(50% - 10px);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
.sand-main{
|
|
|
- flex-grow: 1;
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
.sand-main-top{
|
|
|
padding: 20px 20px 10px;
|
|
|
display: flex;
|
|
@@ -79,6 +319,7 @@
|
|
|
box-shadow: 0px 2px 12px 0px rgba($color: #000000, $alpha: 0.08);
|
|
|
border: 1px solid #DCDFE6;
|
|
|
border-radius: 4px;
|
|
|
+ margin-bottom: 20px;
|
|
|
.sand-mainTop-form{
|
|
|
margin-bottom: 10px;
|
|
|
margin-right: 20px;
|
|
@@ -100,21 +341,84 @@
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ .sand-main-body{
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ flex: 1;
|
|
|
+ background-color: white;
|
|
|
+ border: 1px solid #DCDFE6;
|
|
|
+ border-radius: 4px;
|
|
|
+ .sand-mainBody-tool{
|
|
|
+ height: 50px;
|
|
|
+ width: 100%;
|
|
|
+ background-color: #F5F6F7;
|
|
|
+ box-sizing: border-box;
|
|
|
+ border-radius: 4px;
|
|
|
+ }
|
|
|
+ .sand-mainBody-chart{
|
|
|
+ height: calc(100% - 50px);
|
|
|
+ // flex: 1;
|
|
|
+ position: relative;
|
|
|
+ display: flex;
|
|
|
+ .minimap{
|
|
|
+ position:absolute;
|
|
|
+ right:6px;
|
|
|
+ bottom:6px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
@media screen and (max-width:1680px) {
|
|
|
#sand-edit-container{
|
|
|
.sand-toolbar{
|
|
|
min-width: 330px;
|
|
|
+ width: 330px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
</style>
|
|
|
<style lang="scss">
|
|
|
+ .sand-toolbar-tabs{
|
|
|
+ .el-tabs__header{
|
|
|
+ padding-top: 16px;
|
|
|
+ box-shadow: 0px 2px 12px 0px rgba($color: #000000, $alpha: 0.08);
|
|
|
+ }
|
|
|
+ }
|
|
|
.el-cascader{
|
|
|
.el-input{
|
|
|
width: 240px;
|
|
|
}
|
|
|
}
|
|
|
+ .sand-mainBody-chart{
|
|
|
+ #sand-chart-container{
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+ .x6-graph-scroller {
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ .x6-port-body {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* reseize 框样式 */
|
|
|
+ .x6-widget-transform {
|
|
|
+ .x6-widget-transform-resize {
|
|
|
+ border-radius: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .x6-widget-minimap-viewport{
|
|
|
+ border-color: red;
|
|
|
+ .x6-widget-minimap-viewport-zoom{
|
|
|
+ border-color: red;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .x6-widget-minimap{
|
|
|
+ width: auto !important;
|
|
|
+ height: auto !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
</style>
|