Browse Source

归档树按钮布局

duy 2 years ago
parent
commit
49be766952
2 changed files with 312 additions and 133 deletions
  1. 150 60
      src/views/manager/archivetree.vue
  2. 162 73
      src/views/manager/projectinfo/archivetreeRule.vue

+ 150 - 60
src/views/manager/archivetree.vue

@@ -55,30 +55,33 @@
                             class="marleft10"
                             v-show="data.moreShow"
                           >
-                            <i
-                              @click.stop='addtree(data,node)'
-                              class="el-icon-circle-plus-outline"
-                              style="fontSize:18px;"
-                              v-if="data.isStorageNode!=1"
-                            ></i>
-                            <i
-                              @click.stop='edittree(data,node)'
-                              class="el-icon-edit-outline marleft5"
-                              style="fontSize:18px;"
-                              v-if="node.level!=1"
-                            ></i>
-                            <i
-                              @click.stop='deletetree(node)'
-                              class="el-icon-delete marleft5"
-                              style="fontSize:18px;"
-                              v-if="node.level!=1"
-                            ></i>
-                            <i
-                              @click.stop='paixuMD(data)'
-                              class="el-icon-sort marleft5"
-                              style="fontSize:18px;"
-                              v-if="node.level!=1"
-                            ></i>
+                          <div class="normal-black ">
+                                <div >
+                                    <el-link :underline="false">
+                                      <i
+                                        class="el-icon-menu "
+                                        @click="showMenu($event,data, node)"
+                                        v-if="node.level != 1"
+                                      
+                                      ></i>
+                                    </el-link>
+                            
+                                
+                              <!-- 因右键自定义菜单事件需要获取当前点击的位置,所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置 -->
+                                    <ul
+                                      v-show="menuvisible"
+                                      :style="{ left: menuleft + 'px', top: menutop + 'px' }"
+                                      class="contextmenu"
+                                    >
+                                      <li v-for="item in menusData" :key="item"  @click="menuClick($event,item,data,node)"> 
+                                            <i :class="item.icon"></i>
+                                            <span>{{item.label}}</span>
+                                      </li>
+                            
+                                    </ul>
+                                </div>
+
+                              </div>
                           </span>
                         </span>
                       </el-tree>
@@ -94,43 +97,53 @@
                       :filter-node-method="filterNode"
                     >
                       <span
-                        class=" flexStar"
-                        slot-scope="{ node, data }"
-                        @mouseover="mouseOver(data)"
-                        @mouseleave="mouseLeave(data)"
-                        style="box-sizing: border-box;width:120%;"
-                      >
-                        <span  style="text-overflow: ellipsis;">{{ data.title }}</span>
-                        <span
-                          class="marleft10"
-                          v-show="data.moreShow"
+                          class=" flexStar"
+                          slot-scope="{ node, data }"
+                          @mouseover="mouseOver(data)"
+                          @mouseleave="mouseLeave(data)"
+                            
                         >
-                          <i
-                            @click.stop='addtree(data,node)'
-                            class="el-icon-circle-plus-outline"
-                            style="fontSize:18px;"
-                            v-if="data.isStorageNode!=1"
-                          ></i>
-                          <i
-                            @click.stop='edittree(data,node)'
-                            class="el-icon-edit-outline marleft5"
-                            style="fontSize:18px;"
-                            v-if="node.level!=1"
-                          ></i>
-                          <i
-                            @click.stop='deletetree(node)'
-                            class="el-icon-delete marleft5"
-                            style="fontSize:18px;"
-                            v-if="node.level!=1"
-                          ></i>
-                          <i
-                            @click.stop='paixuMD(data)'
-                            class="el-icon-sort marleft5"
-                            style="fontSize:18px;"
-                            v-if="node.level!=1"
-                          ></i>
+                          <!-- <span style="text-overflow: ellipsis;width:101%;">{{ data.title }}</span> -->
+                          <span v-if="data.title&&data.title.length<=30">{{data.title | ellipsis}}</span>
+                  
+                            <el-tooltip v-if="data.title&&data.title.length>30" :content="data.title" raw-content placement="top-start"  effect="light">
+                              <span v-if="data.title &&data.title.length <=30">{{ data.title }}</span>
+                              <span v-if="data.title && data.title.length > 30"> {{data.title | ellipsis}}</span>
+                            </el-tooltip>
+                    
+                          <span
+                            class="marleft10"
+                            v-show="data.moreShow"
+                          >
+                          <div class="normal-black ">
+                                <div >
+                                    <el-link :underline="false">
+                                      <i
+                                        class="el-icon-menu "
+                                        @click="showMenu($event,data, node)"
+                                        v-if="node.level != 1"
+                                      
+                                      ></i>
+                                    </el-link>
+                            
+                                
+                              <!-- 因右键自定义菜单事件需要获取当前点击的位置,所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置 -->
+                                    <ul
+                                      v-show="menuvisible"
+                                      :style="{ left: menuleft + 'px', top: menutop + 'px' }"
+                                      class="contextmenu"
+                                    >
+                                      <li v-for="item in menusData" :key="item"  @click="menuClick($event,item,data,node)"> 
+                                            <i :class="item.icon"></i>
+                                            <span>{{item.label}}</span>
+                                      </li>
+                            
+                                    </ul>
+                                </div>
+
+                              </div>
+                          </span>
                         </span>
-                      </span>
                       </el-tree>
                     </el-scrollbar>
                   </div>
@@ -1006,6 +1019,18 @@ export default {
         checkedKeys:[],//分类并卷 回显 勾选数组
 
         treeSelectId:'',//选中的划分树
+        menusData:[
+          {icon: 'el-icon-s-promotion', label: '新增', key: "add"},
+          {icon: 'el-icon-s-promotion', label: '编辑', key: "edit"},
+          {icon: 'el-icon-sort', label: '排序', key: "sort"},
+       
+          {icon: 'el-icon-s-promotion', label: '删除', key: "del"},
+      
+      ],//树组件操作菜单
+      menuvisible:false,
+      menuleft:20,
+      menutop:0,
+     
     }
   },
 
@@ -1227,6 +1252,7 @@ export default {
     mouseLeave (data) {
       if (data.moreShow) {
         this.$set(data, 'moreShow', false)
+        this.menuvisible=false
       }
     },
     mouseOver (data) {
@@ -1750,7 +1776,49 @@ export default {
             }
           })
         });
-    }
+    },
+        //树形控件菜单相关方法
+  mouseout(){
+      this.menuvisible=false
+  },
+    //展示菜单
+  showMenu(e,data,node){
+    e.preventDefault();
+    console.log(e,'e');
+    var x = e.pageX; //这个应该是相对于整个浏览器页面的x坐标,左上角为坐标原点(0,0)
+    var y = e.pageY; //这个应该是相对于整个浏览器页面的y坐标,左上角为坐标原点(0,0)
+    this.menutop = y;
+    this.menuleft = x;
+    this.menuvisible=true
+
+    },
+    menuClick(e,item,data,node){
+       this.menuKey=''
+        e.preventDefault();
+        if(item.key==='add'){
+          if(data.isStorageNode!=1){
+            this.addtree(data,node)
+            this.menuKey='add'
+          }else{
+            this.$message.warning('该节点下不允许新增节点')
+          }
+        }
+        else if(item.key==='edit'){
+          this.edittree(data,node)
+          this.menuKey='edit'
+        }
+         else if(item.key==='del'){
+            this.menuKey='del'
+          this.deletetree(data,node)
+        }else if(item.key==='copy'){
+          this.$message.info('暂无相关接口')
+        }
+        else if(item.key==='sort'){
+            this.menuKey='sort'
+         this.paixuMD(data,node)
+        }
+    },
+
 
   },
   watch: {
@@ -1828,4 +1896,26 @@ export default {
   overflow: hidden;
   line-height: 20px;
 }
+
+.contextmenu {
+margin: 0;
+background: #fff;
+z-index: 1000;
+position: fixed; //关键样式设置固定定位
+list-style-type: none;
+padding: 5px 0;
+border-radius: 4px;
+font-size: 12px;
+font-weight: 400;
+color: #333;
+box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
+}
+.contextmenu li {
+margin: 0;
+padding: 7px 16px;
+cursor: pointer;
+}
+.contextmenu li:hover {
+background: #eee;
+}
 </style>

+ 162 - 73
src/views/manager/projectinfo/archivetreeRule.vue

@@ -52,37 +52,38 @@
                           <span
                             class="marleft10"
                             v-show="data.moreShow"
-                            style="z-index:1000;positon:absolute"
+                           
                           >
-                            <i
-                              @click.stop='addtree(data,node)'
-                              class="el-icon-circle-plus-outline"
-                              style="fontSize:18px;"
-                              v-if="data.isStorageNode!=1"
-                            ></i>
-                            <i
-                              @click.stop='edittree(data,node)'
-                              class="el-icon-edit-outline marleft5"
-                              style="fontSize:18px;"
-                              v-if="node.level!=1"
-                            ></i>
-                            <i
-                              @click.stop='deletetree(node)'
-                              class="el-icon-delete marleft5"
-                              style="fontSize:18px;"
-                              v-if="node.level!=1"
-                            ></i>
-                            <i
-                              @click.stop='paixuMD(data)'
-                              class="el-icon-sort marleft5"
-                              style="fontSize:18px;"
-                              v-if="node.level!=1"
-                            ></i>
-                            <i
-                              @click.stop='synctree(data,node)'
-                              class="el-icon-refresh marleft5"
-                              style="fontSize:18px;"
-                            ></i>
+                          <div class="normal-black ">
+                                <div >
+                                    <el-link :underline="false">
+                                      <i
+                                        class="el-icon-menu "
+                                        @click="showMenu($event,data, node)"
+                                        v-if="node.level != 1"
+                                      
+                                      ></i>
+                                    </el-link>
+                            
+                                
+                              <!-- 因右键自定义菜单事件需要获取当前点击的位置,所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置 -->
+                                    <ul
+                                      v-show="menuvisible"
+                                      :style="{ left: menuleft + 'px', top: menutop + 'px' }"
+                                      class="contextmenu"
+                                    >
+                                 
+                                        <li v-for="item in menusData" :key="item"  @click="menuClick($event,item,data,node)"> 
+                                            <i :class="item.icon"></i>
+                                            <span>{{item.label}}</span>
+                                        </li>
+                                  
+                                    
+                            
+                                    </ul>
+                                </div>
+
+                              </div>
                           </span>
                         </span>
                       </el-tree>
@@ -97,49 +98,53 @@
                       :default-expand-all="true"
                       :filter-node-method="filterNode"
                     >
-                      <span
-                        class=" flexStar"
-                        slot-scope="{ node, data }"
-                        @mouseover="mouseOver(data)"
-                        @mouseleave="mouseLeave(data)"
-                        style="box-sizing: border-box;width:120%;"
-                      >
-                        <span  style="text-overflow: ellipsis;">{{ data.title }}</span>
-                        <span
-                          class="marleft10"
-                          v-show="data.moreShow"
+                    
+                         <span
+                          class=" flexStar"
+                          slot-scope="{ node, data }"
+                          @mouseover="mouseOver(data)"
+                          @mouseleave="mouseLeave(data)"
+
                         >
-                          <i
-                            @click.stop='addtree(data,node)'
-                            class="el-icon-circle-plus-outline"
-                            style="fontSize:18px;"
-                            v-if="data.isStorageNode!=1"
-                          ></i>
-                          <i
-                            @click.stop='edittree(data,node)'
-                            class="el-icon-edit-outline marleft5"
-                            style="fontSize:18px;"
-                            v-if="node.level!=1"
-                          ></i>
-                          <i
-                            @click.stop='deletetree(node)'
-                            class="el-icon-delete marleft5"
-                            style="fontSize:18px;"
-                            v-if="node.level!=1"
-                          ></i>
-                          <i
-                            @click.stop='paixuMD(data)'
-                            class="el-icon-sort marleft5"
-                            style="fontSize:18px;"
-                            v-if="node.level!=1"
-                          ></i>
-                          <i
-                            @click.stop='synctree(data,node)'
-                            class="el-icon-refresh marleft5"
-                            style="fontSize:18px;"
-                          ></i>
+                           <div v-if="data.title&&data.title.length<=30">{{data.title | ellipsis}}</div>
+                  
+                            <el-tooltip v-if="data.title&&data.title.length>30" :content="data.title" raw-content placement="top-start"  effect="light">
+                              <span v-if="data.title &&data.title.length <=30">{{ data.title }}</span>
+                              <span v-if="data.title && data.title.length > 30"> {{data.title | ellipsis}}</span>
+                            </el-tooltip>
+                    
+
+                          <span
+                            class="marleft10"
+                            v-show="data.moreShow"
+                           
+                          >
+                          <div class="normal-black ">
+                                <div >
+                                    <el-link :underline="false">
+                                      <i
+                                        class="el-icon-menu "
+                                        @click="showMenu($event,data, node)"
+                                        v-if="node.level != 1"
+                                      
+                                      ></i>
+                                    </el-link>
+                              <!-- 因右键自定义菜单事件需要获取当前点击的位置,所以此处绑定动态样式来控制菜单实时跟踪鼠标右键点击位置 -->
+                                    <ul
+                                      v-show="menuvisible"
+                                      :style="{ left: menuleft + 'px', top: menutop + 'px' }"
+                                      class="contextmenu"
+                                    >
+                                      <li v-for="item in menusData" :key="item"  @click="menuClick($event,item,data,node)"> 
+                                            <i :class="item.icon"></i>
+                                            <span>{{item.label}}</span>
+                                      </li>
+                            
+                                    </ul>
+                                </div>
+                              </div>
+                          </span>
                         </span>
-                      </span>
                       </el-tree>
                   
                   </div>
@@ -992,13 +997,25 @@ export default {
         configVisible:false,
 
         projectId:'',
-	archiveAutoType:'',//最高1  分类2  独立3
+	      archiveAutoType:'',//最高1  分类2  独立3
         nodesList:[],
 
         configInfo:null,
         checkedKeys:[],//分类并卷 回显 勾选数组
 
         treeSelectId:'',//选中的划分树
+        menusData:[
+          {icon: 'el-icon-s-promotion', label: '新增', key: "add"},
+          {icon: 'el-icon-s-promotion', label: '编辑', key: "edit"},
+          {icon: 'el-icon-sort', label: '排序', key: "sort"},
+       
+          {icon: 'el-icon-s-promotion', label: '删除', key: "del"},
+          {icon: 'el-icon-refresh', label: '同步', key: "sync"},
+      
+      ],//树组件操作菜单
+      menuvisible:false,
+      menuleft:20,
+      menutop:0,
     }
   },
   computed:{
@@ -1212,6 +1229,7 @@ export default {
     mouseLeave (data) {
       if (data.moreShow) {
         this.$set(data, 'moreShow', false)
+        this.menuvisible=false
       }
     },
     mouseOver (data) {
@@ -1746,6 +1764,55 @@ export default {
           })
         });
     },
+         //树形控件菜单相关方法
+  mouseout(){
+      this.menuvisible=false
+  },
+    //展示菜单
+  showMenu(e,data,node){
+    e.preventDefault();
+    console.log(e,'e');
+    var x = e.pageX; //这个应该是相对于整个浏览器页面的x坐标,左上角为坐标原点(0,0)
+    var y = e.pageY; //这个应该是相对于整个浏览器页面的y坐标,左上角为坐标原点(0,0)
+    this.menutop = y;
+    this.menuleft = x;
+    this.menuvisible=true
+
+    },
+    menuClick(e,item,data,node){
+       this.menuKey=''
+        e.preventDefault();
+        if(item.key==='add'){
+          if(data.isStorageNode!=1){
+            this.addtree(data,node)
+            this.menuKey='add'
+          }else{
+            this.$message.warning('该节点下不允许新增节点')
+          }
+          
+        }
+        
+        else if(item.key==='edit'){
+          this.edittree(data,node)
+          this.menuKey='edit'
+        }
+         else if(item.key==='del'){
+            this.menuKey='del'
+          this.deletetree(data,node)
+        }else if(item.key==='copy'){
+          this.$message.info('暂无相关接口')
+        }
+        else if(item.key==='sort'){
+            this.menuKey='sort'
+         this.paixuMD(data,node)
+        }
+        else if(item.key==='sync'){
+            this.menuKey='sync'
+         this.synctree(data,node)
+        }
+    },
+
+
 
   },
   watch: {
@@ -1839,5 +1906,27 @@ export default {
         min-width: 100%;
         font-size: s;
         
-  }
+}
+
+.contextmenu {
+margin: 0;
+background: #fff;
+z-index: 1000;
+position: fixed; //关键样式设置固定定位
+list-style-type: none;
+padding: 5px 0;
+border-radius: 4px;
+font-size: 12px;
+font-weight: 400;
+color: #333;
+box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);
+}
+.contextmenu li {
+margin: 0;
+padding: 7px 16px;
+cursor: pointer;
+}
+.contextmenu li:hover {
+background: #eee;
+}
 </style>