Parcourir la source

自定义布局

rsbi il y a 4 ans
Parent
commit
cc46f74d75

+ 1 - 1
src/view/portal/LayoutOptarea.vue

@@ -386,6 +386,7 @@ export default {
               }
             }, 200);
              */
+            console.log("moving...");
           }else{
             //获取TREE
 				    var ref = $("#comptree").jstree(true);
@@ -407,7 +408,6 @@ export default {
               var comp = {"id":newGuid(), "name":"数据块", "type":"box"};
                execf(layoutId, comp);
             }
-            
           }
           ts.setUpdate();
           ts.$forceUpdate();

+ 3 - 1
src/view/portal/PortalCustomiz.vue

@@ -24,6 +24,7 @@
       <selectCube ref="selectCubeForm" :callback="selectCubeCallback"></selectCube>
       <select-dset ref="selectDsetForm"></select-dset>
        <layout-param-add ref="prarmAddForm" :pageInfo="pageInfo"></layout-param-add>
+       <auto-layout ref="autoLayoutForm" :pageInfo="pageInfo"></auto-layout>
 
       <!-- 保存框 -->
        <el-dialog title="报表保存" :visible.sync="saveShow" :close-on-click-modal="false" custom-class="nopadding">
@@ -43,6 +44,7 @@
 import {baseUrl, ajax} from '@/common/biConfig'
 import layoutLeft from "./LayoutLeft.vue"
 import PortalLayout from "./PortalLayoutDailog.vue"
+import AutoLayout from "./PortalLayoutAuto.vue"
 import selectCube from "@/view/bireport/SelectCube"
 import SelectDset from "./SelectDset"
 import layoutParam from "./LayoutParam.vue"
@@ -60,7 +62,7 @@ import LayoutRight from './LayoutRight.vue'
 
 export default {
   name: "customizer",
-  components: {layoutLeft, PortalLayout, selectCube, SelectDset, layoutParam, LayoutOptarea, LayoutParamAdd, LayoutBottom, LayoutRight},
+  components: {layoutLeft, PortalLayout, selectCube, SelectDset, layoutParam, LayoutOptarea, LayoutParamAdd, LayoutBottom, LayoutRight,AutoLayout},
   props: {
 
   },

+ 619 - 0
src/view/portal/PortalLayoutAuto.vue

@@ -0,0 +1,619 @@
+<template>
+    <el-dialog title="自定义布局" :visible.sync="show" :close-on-click-modal="false" custom-class="nopadding">
+      <div class="el-dialog-div">
+        <div class="table-toolbar">
+          <button class="btn btn-default btn-rounded btn-outline btn-xs" type="button" @click="lyt_insertRow()">插入行</button>
+          <button class="btn btn-default btn-rounded btn-outline btn-xs" type="button" @click="lyt_insertCol()">插入列</button>
+          <button class="btn btn-default btn-rounded btn-outline btn-xs" type="button" @click="lyt_deleteRow()">删除行</button>
+          <button class="btn btn-default btn-rounded btn-outline btn-xs" type="button" @click="lyt_deleteCol()">删除列</button>
+          <button class="btn btn-default btn-rounded btn-outline btn-xs" type="button" @click="lyt_mergeCell()">合并</button>
+          <button class="btn btn-default btn-rounded btn-outline btn-xs" type="button" @click="lyt_unmergeCell()">取消合并</button>
+        </div>
+        <div style="height:calc(100% - 30px)">
+          <table id="autoLayoutTable" border="0" cellspacing="0" cellpadding="0" class="r_layout">
+            <template v-for="(trs, index) in layoutJson" >
+              <tr :key="index" >
+                <template v-for="td in trs">
+                 <td class="laytd" :node="td.id" :key="td.id" :height="td.height+'%'" :width="td.width+'%'" :colspan="td.colspan" :rowspan="td.rowspan"></td>
+                </template>
+              </tr>
+            </template>
+          </table>
+        </div>
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="save()">确 定</el-button>
+        <el-button @click="show = false">取 消</el-button>
+      </div>
+    </el-dialog>
+</template>
+
+<script>
+import {baseUrl} from '@/common/biConfig'
+import * as layout from './Utils'
+import $ from 'jquery'
+
+export default {
+  components:{
+  },
+  props:{
+      pageInfo:{
+        type:Object,
+        required:true
+     }
+  },
+  data(){
+    return {
+        show:false,
+        layoutJson: null,
+        curtabtd:null
+    }
+  },
+  mounted(){
+
+  },
+  computed: {
+     
+  },
+  methods: {
+     showDailog(){
+        this.show = true;
+        let json = this.pageInfo.body;
+        let lay = [];
+        for(let i=1; true; i++){
+          var tr = json["tr"+i];
+          if(!tr || tr == null){
+            break;
+          }
+          let tds = [];
+          for(var j=0; j<tr.length; j++){
+            var td = tr[j];
+            tds.push({colspan:td.colspan, rowspan:td.rowspan, width:td.width, height:td.height, id:td.id});
+          }
+          lay.push(tds);
+        }
+        this.layoutJson = lay;
+        this.$nextTick(()=>this.bindSelectEvent());
+     },
+     bindSelectEvent(){
+       let thiz = this;
+        const selFunc = function(ts){
+          $("#autoLayoutTable td").removeClass("tdselect");
+          $(ts).addClass("tdselect");
+        }
+        const areaSelFunc = function(start, end){
+          $("#autoLayoutTable td").removeClass("tdselect");
+          var p1 = $(start).attr("pos").split(",");
+          var p2 = $(end).attr("pos").split(",");
+          //反向选择的时候,交换位置
+          if(p1[0] > p2[0] || p1[1] > p2[1]){
+            let tmp = p1;
+            p1 = p2;
+            p2 = tmp;
+          }
+          
+          for(let i=p1[0]; i<=p2[0]; i++){
+            for(let j = p1[1]; j<=p2[1]; j++){
+              $("#autoLayoutTable td[pos='"+(i+","+j)+"']").addClass("tdselect");
+            }
+          }
+        }
+        var issel = false;
+        var start = null;
+        $("#autoLayoutTable").on("click", 'td.laytd', function(){
+          if(!issel){
+            selFunc(this);
+          }
+        }).on("mousedown", "td.laytd", function(e){
+          issel = true;
+          start = this;
+        }).on("mouseup","td.laytd", function(e){
+          issel = false;
+        }).on("mousemove","td.laytd", function(e){
+          //console.log("issel = " + issel);
+          if(issel){
+            areaSelFunc(start, this);
+          }
+        }).on("contextmenu","td.laytd", function(e){
+          issel = false;
+          thiz.curtabtd = this;
+          //选中单元格
+          if($("#autoLayoutTable td.tdselect").length <= 1){
+            selFunc(this);
+          }
+        });
+        this.updateHeightWidth();
+        selFunc($("#autoLayoutTable td.laytd:first"));
+     },
+     save(){
+        let comps = layout.findAllComps(this.pageInfo);
+        var ljson = {};
+        var rows = document.getElementById("autoLayoutTable").rows;
+        var pidx = 0;
+        for(var i=0;i<rows.length;i++){
+          var cells = rows[i].cells;
+          var tds = [];
+          ljson["tr"+(i+1)] = tds;
+          for(var j=0;j<cells.length;j++){
+            var cell = $(cells[j]);
+            var obj = {};
+            obj.colspan = cell.attr("colspan")?cell.attr("colspan"):"1";
+            obj.rowspan = (cell.attr("rowspan")?cell.attr("rowspan"):"1");
+            obj.height = Number(cell.attr("height").replace("%", ''));
+            obj.width = Number(cell.attr("width").replace("%", ''));
+            obj.id = pidx;
+            pidx=pidx+1;
+            tds.push(obj);
+          }
+        }
+        this.pageInfo.body = ljson;
+        this.pageInfo.layout = 6;
+        ljson.tr1[0].children = comps;
+        this.show = false;
+        this.$parent.isbindTdEvent = true;
+        this.$parent.isupdate = true;
+        this.$parent.$forceUpdate();
+     },
+     updateHeightWidth(noSetPos){
+        //获取第一行
+        var cells = document.getElementById("autoLayoutTable").rows[0].cells;
+        var cols = 0;  //获取宽度
+        for(let i=0; i<cells.length; i++){
+          cols = cols + Number(($(cells[i]).attr("colspan")?$(cells[i]).attr("colspan"):1));
+        }
+        var effectRow = {}; // 在rowspan 的单元格中需要影响后面行的宽度,定义 行数+逗号+列+after/before后的影响行数MAP对象. 比如 {"1,1after":2}, after/befroe表示插入的前还是后
+        var rows = document.getElementById("autoLayoutTable").rows;
+        var rowLength = rows.length; //行数
+        for(let j=0; j<rowLength; j++){
+          cells = rows[j].cells;
+          var wposIndex = 0; // 行pos位置
+          for(let i=0; i<cells.length; i++){
+            var colspan = $(cells[i]).attr("colspan")?Number($(cells[i]).attr("colspan")):1;
+            var rowspan = $(cells[i]).attr("rowspan")?Number($(cells[i]).attr("rowspan")):1;
+            var wd = ((100/cols) * colspan);
+            var hd = ((100/rowLength) * rowspan);
+            $(cells[i]).attr({"width" : Math.round(wd) + "%", "height":Math.round(hd)+"%"});  //定义单元格宽度,高度
+            
+            if(noSetPos && noSetPos==true){
+              continue;
+            }
+            if(rowspan > 1){  //会影响后面行的pos
+              for(let k=1; k<rowspan; k++){
+                //判断启用before 还是 after, before 表示影响的行前面没有单元格(td)
+                var st = "before";
+                //i == 0)  //第0列肯定是before
+                for(let m=0;m<i;m++){
+                  var rs = ($(cells[m]).attr("rowspan")?Number($(cells[m]).attr("rowspan")):1) - 1;
+                  if(rs < k){   //如果当前单元格的跨度  <  影响的行, 说明影响的行的单元格前面存在单元格,
+                    st = "after";   
+                    break;
+                  }
+                }
+                
+                effectRow[(j+k)+","+(st=="before"?wposIndex:wposIndex-1)+st] = colspan;  //占位影响的行, 需要考虑before/after
+              }
+            }
+            //如果是第一行,先判断是否需要追加 占位位置,  需考虑连续追加
+            for(let l=wposIndex-1; i==0&&l<cols; l++){
+              if(effectRow[j+","+(wposIndex)+"before"]){
+                wposIndex = wposIndex + effectRow[j+","+(wposIndex)+"before"];
+              }else{
+                break;
+              }
+            }
+            $(cells[i]).attr({"pos":j+","+wposIndex});
+            wposIndex = wposIndex + 1;
+            if(colspan > 1){  //会影响本行后面的pos
+              wposIndex = wposIndex + (colspan - 1);
+            }
+            //wposIndex追加 占位 位置, 需考虑连续追加
+            for(let l=wposIndex-1; l<cols; l++){  //考虑连续追加,两个竖向合并单元格
+              if(effectRow[j+","+(l) + "after"]){
+                wposIndex = wposIndex + effectRow[j+","+(l) + "after"];
+              }else{
+                break;
+              }
+            }
+          }
+        }
+      },
+      lyt_mergeCell(){
+        var p1 = null;
+        var p2 = null;
+        var size = $("#autoLayoutTable td.tdselect").length;
+        if(size <= 1){
+          return;
+        }
+        var endTd = null;
+        $("#autoLayoutTable td.tdselect").each(function(index, element) {
+          if(index == 0){
+            p1 = $(this).attr("pos").split(",");
+          }
+          if(index == size - 1){
+            p2 = $(this).attr("pos").split(",");
+            endTd = $(this);
+          }
+              if(index > 0){
+            $(this).remove();
+          }
+          });
+        //结束单元格的colspan,  rowspan 影响宽度,高度
+        var colspan = endTd.attr("colspan")?Number(endTd.attr("colspan")):1;
+        var rowspan = endTd.attr("rowspan")?Number(endTd.attr("rowspan")):1;
+        $("#autoLayoutTable td.tdselect").attr("rowspan", Math.abs(p1[0] - p2[0] + (rowspan - 1)) + 1).attr("colspan", Math.abs(p1[1] - p2[1] +(colspan - 1) ) + 1);
+        this.updateHeightWidth(true);
+      },
+      lyt_unmergeCell(){
+        var o = $("#autoLayoutTable td.tdselect");
+        if(o.length == 0){
+          this.$notify.error({
+            title: '请先选择单元格。',
+            offset: 50
+          });
+          return;
+        }
+        this.curtabtd = o[0];
+        var td = $(this.curtabtd);
+        var colspan = td.attr("colspan") ? Number(td.attr("colspan")) : 1;
+        var rowspan = td.attr("rowspan") ? Number(td.attr("rowspan")) : 1;
+        td.attr("colspan", 1);
+        td.attr("rowspan", 1);
+        for(let i=1; i<=rowspan; i++){
+          var str = "";
+          for(let j=1; j<(i == 1 ? colspan : colspan + 1); j++){
+            str = str + "<td class=\"laytd\"></td>";
+          }
+          if(i == 1){
+            td.after(str);  //第一行,直接追加
+          }else{
+            var zuobiao = td.attr("pos").split(",");
+            var node = $("#autoLayoutTable td[pos='"+((Number(zuobiao[0])+i-1) +","+ (Number(zuobiao[1]) - 1))+"']") //求当前td的下一个的前一个
+            if(node.length == 0){  //如果查找的TD不存在
+              //开始查询后一个
+              node = $("#autoLayoutTable td[pos='"+((Number(zuobiao[0])+i-1) +","+ (Number(zuobiao[1]) + colspan))+"']") //求当前td的下一个的后一个
+              if(node.length > 0){
+                node.before(str);
+              }else{
+                //还是未找到,直接追加
+                var tr = td.parent();  //查找当前TR
+                for(let k=1; k<=i-1; k++){
+                  tr = tr.next();
+                }
+                tr.append(str);
+              }
+            }else{
+              node.after(str);  
+            }
+            
+          }
+        }
+        this.updateHeightWidth();
+        this.curtabtd = null;
+      },
+      lyt_insertRow(){
+        var o = $("#autoLayoutTable td.tdselect");
+        if(o.length == 0){
+          this.$notify.error({ title: '请先选择单元格。',offset: 50 });
+          return;
+        }
+        this.curtabtd = o[0];
+        var td = this.curtabtd;
+        //定义判断新增加的单元格是否属于一个合并单元格的内容。
+        var tdInCells = function(rowIndex, colIndex){
+          var returnTd = null;
+          $("#autoLayoutTable td").each(function(index, element) {
+                  var pos = $(element).attr("pos").split(",");
+            var rowspan = $(element).attr("rowspan") ? Number($(element).attr("rowspan")) : 1;
+            var colspan = $(element).attr("colspan") ? Number($(element).attr("colspan")) : 1;
+            if(rowspan > 1){
+              if(rowIndex > Number(pos[0]) && rowIndex <= Number(pos[0])+ rowspan && 
+                colIndex >= Number(pos[1]) && colIndex < Number(pos[1]) + colspan ){  //当前需要新添加的td 属于表格的一个单元格
+                returnTd = $(element);
+              }
+            }
+              });
+          return returnTd;
+        };
+        
+        var colCount = 0;
+        var cells = document.getElementById("autoLayoutTable").rows[0].cells;
+        for(let i=0; i<cells.length; i++){
+          var colspan = $(cells[i]).attr("colspan") ? Number($(cells[i]).attr("colspan")) : 1;
+          colCount = colCount + colspan;
+        }
+        var pos = $(td).attr("pos").split(",");
+        var row = Number(pos[0]) + 1;
+        var rowspan = $(td).attr("rowspan")?Number($(td).attr("rowspan")):1;
+        row = row + rowspan - 1; //如果rowspan>1 计算新的行(row)
+        var str = "<tr>";
+        for(let i=0; i<colCount; i++){
+          var curTd = $("#autoLayoutTable td[pos='"+row+","+i+"']");
+          if(curTd.length == 0){   //如果需要添加的td不存在,并且属于一个合并单元格的内容,为当前合并单元格增加1个rowspan
+            var retTd = tdInCells(row, i);
+            if(retTd != null){
+              var r = Number(retTd.attr("rowspan")) + 1;
+              retTd.attr("rowspan", r);
+              //如果retTd的colspan > 1, 为i 追加 rowspan - 1, 不然rowspan 会被加多次
+              var c = Number(retTd.attr("colspan"));
+              if(c > 1){
+                i = i + c - 1;
+              }
+              continue;
+            }
+          }
+          str = str + "<td class=\"laytd\">";
+          str = str + "</td>";
+        }
+        str = str + "</tr>";
+        var obj = $(td).parent();   //rowspan 影响插入的位置
+        for(let i=1; i<rowspan; i++){
+          obj = obj.next();
+        }
+        obj.after(str);
+        this.updateHeightWidth();
+        this.curtabtd = null;
+      },
+      lyt_insertCol(){
+         var o = $("#autoLayoutTable td.tdselect");
+        if(o.length == 0){
+          this.$notify.error({ title: '请先选择单元格。',offset: 50 });
+          return;
+        }
+          var td = o[0];
+          //定义判断新增加的单元格是否属于一个合并单元格的内容。
+          var tdInCells = function(rowIndex, colIndex){
+            var returnTd = null;
+            $("#autoLayoutTable td").each(function(index, element) {
+                    var pos = $(element).attr("pos").split(",");
+              var colspan = $(element).attr("colspan") ? Number($(element).attr("colspan")) : 1;
+              var rowspan = $(element).attr("rowspan") ? Number($(element).attr("rowspan")) : 1;
+              if(colspan > 1){
+                if(rowIndex >= Number(pos[0]) && rowIndex < Number(pos[0])+ rowspan && 
+                  colIndex > Number(pos[1]) && colIndex <= Number(pos[1]) + colspan ){  //当前需要新添加的td 属于表格的一个单元格
+                  returnTd = $(element);
+                }
+              }
+                });
+            return returnTd;
+          };
+          
+          var rows = document.getElementById("autoLayoutTable").rows;
+          //获取当前TD的index
+          var pos = $(td).attr("pos").split(",");
+          var idx = Number(pos[1]);
+          var colspan = $(td).attr("colspan") ? Number($(td).attr("colspan")) : 1;
+          if(colspan > 1){
+            idx = idx + colspan - 1; //当前td的colspan影响插入列的位置
+          }
+          var insertArray = [];
+          for(let i=0; i<rows.length; i++){
+            var ctd = null;
+            var curTd = $("#autoLayoutTable td[pos='"+i+","+(idx)+"']");
+            if(curTd.length == 0){   //如果当前td不存在,并且属于一个合并单元格的内容,为当前合并单元格增加1个colspan
+              var retTd = tdInCells(i, idx);
+              if(retTd != null){
+                var r = Number(retTd.attr("colspan")) + 1;
+                retTd.attr("colspan", r);
+                var c = Number(retTd.attr("rowspan"));
+                if(c > 1){
+                  i = i + c - 1;
+                }
+                continue;
+              }
+            }else{
+              //如果当前td存在,并且colspan > 1, 为当前td 添加一个colspan
+              var r = curTd.attr("colspan") ? Number(curTd.attr("colspan")) : 1;
+              var c = Number(curTd.attr("rowspan"));   //rowspan 影响数据行
+              if(c > 1){
+                i = i + c - 1;
+              }
+              if(r > 1){
+                curTd.attr("colspan", r + 1);
+                continue;
+              }
+              ctd = curTd;
+            }
+            var rspan = ctd.attr("rowspan") ? Number(ctd.attr("rowspan")) : 1;
+            var cspan = ctd.attr("colspan") ? Number(ctd.attr("colspan")) : 1; 
+            //当前插入的TD跨行和列,需要设置新的 colspan, rowspan
+            var str = "<td class=\"laytd\" rowspan=\""+rspan+"\" colspan=\""+cspan+"\"></td>";
+            //ctd.after(str);
+            insertArray.push({"obj":ctd, "str" : str});
+          }
+          for(let i=0; i<insertArray.length; i++){
+            insertArray[i].obj.after(insertArray[i].str);
+          }
+          this.updateHeightWidth();
+        },
+        lyt_deleteCol(){
+         var o = $("#autoLayoutTable td.tdselect");
+          if(o.length == 0){
+            this.$notify.error({ title: '请先选择单元格。',offset: 50 });
+            return;
+          }
+          var td = $(o[0]);
+          var rows = document.getElementById("autoLayoutTable").rows;
+          //定义判断需要删除的单元格是否属于一个合并单元格的内容。
+          var tdInCells = function(rowIndex, colIndex){
+            var returnTd = null;
+            $("#autoLayoutTable td").each(function(index, element) {
+                    var pos = $(element).attr("pos").split(",");
+              var colspan = $(element).attr("colspan") ? Number($(element).attr("colspan")) : 1;
+              var rowspan = $(element).attr("rowspan") ? Number($(element).attr("rowspan")) : 1;
+              if(colspan > 1){
+                if(rowIndex >= Number(pos[0]) && rowIndex < Number(pos[0])+ rowspan && 
+                  colIndex > Number(pos[1]) && colIndex <= Number(pos[1]) + colspan ){  //当前需要新添加的td 属于表格的一个单元格
+                  returnTd = $(element);
+                }
+              }
+                });
+            return returnTd;
+          };
+          //获取当前TD的index
+          var pidx = Number(td.attr("pos").split(",")[1]);
+          var removes = [];
+          //对于colspan > 1 的单元格删除,需要删除多列
+          var tdcspan = td.attr("colspan") ? Number(td.attr("colspan")) : 1;
+          for(let k=0; k<tdcspan; k++){
+            var idx = pidx + k;
+            for(let i=0; i<rows.length; i++){
+              var curTd = $("#autoLayoutTable td[pos='"+i+","+(idx)+"']");
+              if(curTd.attr("pos") == td.attr("pos")){  //需要移除的td刚好是当前选择的TD,不用判断直接移除
+                removes.push(curTd);
+                var c = Number(curTd.attr("rowspan"));  //rowspan影响列
+                if(c > 1){
+                  i = i + c - 1;
+                }
+                continue;
+              }
+              if(curTd.length == 0){   //如果当前td不存在,并且属于一个合并单元格的内容,为当前合并单元格减少1个colspan
+                var retTd = tdInCells(i, idx);
+                if(retTd != null){
+                  var r = Number(retTd.attr("colspan")) - 1;
+                  retTd.attr("colspan", r);
+                  var c = Number(retTd.attr("rowspan"));
+                  if(c > 1){
+                    i = i + c - 1;
+                  }
+                  continue;
+                }
+              }else{
+                //如果当前td存在,并且colspan > 1, 为当前td 减少一个colspan
+                var r = curTd.attr("colspan") ? Number(curTd.attr("colspan")) : 1;
+
+                //有rowspan > 1, 影响多行
+                var c = curTd.attr("rowspan") ? Number(curTd.attr("rowspan")) : 1;
+                if(c > 1){
+                  i = i + c - 1;
+                }
+                if(r > 1){
+                  curTd.attr("colspan", r - 1);
+                  continue;
+                }
+              }
+              
+              removes.push(curTd);;
+            }
+          }
+          for(let i=0; i<removes.length; i++){
+            $(removes[i]).remove();
+          }
+          this.updateHeightWidth();
+        },
+        lyt_deleteRow(){
+          var o = $("#autoLayoutTable td.tdselect");
+          if(o.length == 0){
+            this.$notify.error({ title: '请先选择单元格。',offset: 50 });
+            return;
+          }
+          var td = $(o[0]);
+          var colCount = 0;
+          var cells = document.getElementById("autoLayoutTable").rows[0].cells;
+          for(let i=0; i<cells.length; i++){
+            var colspan = $(cells[i]).attr("colspan") ? Number($(cells[i]).attr("colspan")) : 1;
+            colCount = colCount + colspan;
+          }
+          //定义判断需要删除的单元格是否属于一个合并单元格的内容。
+          var tdInCells = function(rowIndex, colIndex){
+            var returnTd = null;
+            $("#autoLayoutTable td").each(function(index, element) {
+                    var pos = $(element).attr("pos").split(",");
+              var rowspan = $(element).attr("rowspan") ? Number($(element).attr("rowspan")) : 1;
+              var colspan = $(element).attr("colspan") ? Number($(element).attr("colspan")) : 1;
+              if(rowspan > 1){
+                if(rowIndex > Number(pos[0]) && rowIndex <= Number(pos[0] + rowspan) && 
+                  colIndex >= Number(pos[1]) && colIndex < Number(pos[1]) + colspan ){  //当前需要新添加的td 属于表格的一个单元格
+                  returnTd = $(element);
+                }
+              }
+                });
+            return returnTd;
+          };
+          var deltrs = [];
+          var pos = $(td).attr("pos").split(",");
+          var nrow = Number(pos[0]);
+          var delrowspan = td.attr("rowspan") ? Number(td.attr("rowspan")) : 1;  //rowspan 影响删除的行数
+          for(let n=0; n<delrowspan; n++){
+            for(let i=0; i<colCount; i++){
+              var row = nrow + n;
+              var curTd = $("#autoLayoutTable td[pos='"+row+","+i+"']");
+              if(curTd.length == 0){
+                //需要删除的单元格不存在,并且属于一个合并单元格中,需要把合并单元格的rowspan - 1
+                var retTd = tdInCells(row, i);
+                if(retTd != null){
+                  var r = Number(retTd.attr("rowspan")) - 1;
+                  retTd.attr("rowspan", r);
+                  //如果retTd的colspan > 1, 为i 追加 rowspan - 1, 不然rowspan 会被加多次
+                  var c = Number(retTd.attr("colspan"));
+                  if(c > 1){
+                    i = i + c - 1;
+                  }
+                }
+              }else{
+                //需要删除的单元格存在,并且占用多行(row), 减少rowspan,  并且把td放入下一行
+                if(Number(curTd.attr("rowspan")) > 1){
+                  curTd.attr("rowspan", Number(curTd.attr("rowspan")) - 1);
+                  var isdeal = false;
+                  var l = i -1;
+                  while(l>=0){   //向前查找是否有对象
+                    var target = $("#T"+compId+" td[pos='"+(row+1)+","+(l)+"']");
+                    if(target.length > 0){
+                      target.after(curTd);
+                      isdeal = true;
+                      break;
+                    }
+                    l = l - 1;
+                  }
+                  if(isdeal == false){
+                    l = i + 1;
+                    while(l < colCount){ //向后查找是否有对象
+                      var target = $("autoLayoutTable td[pos='"+(row+1)+","+(l)+"']");
+                      if(target.length > 0){
+                        target.before(curTd);
+                        isdeal = true;
+                        break;
+                      }
+                      l = l + 1;
+                    }
+                  }
+                }
+                var c = Number(curTd.attr("colspan"));  //如果colspan > 1, 夸多列处理
+                if(c > 1){
+                  i = i + c - 1;
+                }
+                
+              }
+            }
+            deltrs.push($("#autoLayoutTable tr").get(row));
+          }
+          for(let i=0; i<deltrs.length; i++){
+            $(deltrs[i]).remove();
+          }	
+          this.updateHeightWidth();
+        }
+  }
+}
+</script>
+
+<style lang="less">
+.table-toolbar {
+	padding-bottom: 3px;
+}
+table.r_layout {
+	border-collapse:collapse;
+	table-layout:fixed;
+	width:100%;
+  height:100%;
+  td.laytd {
+    border: 1px solid #D3D3D3;
+    text-align: left;
+    vertical-align: top;
+    background-color:#f0f3f4;
+    min-height:100px;
+    padding:5px;
+  }
+}
+#autoLayoutTable td.tdselect{
+	background-color:#FFFF99;
+}
+</style>

+ 5 - 1
src/view/portal/PortalLayoutDailog.vue

@@ -58,7 +58,11 @@ export default {
      save(){
        let l = this.layoutId;
        if(l === 6){  //自定义
-
+            this.show = false;
+            var o = this.$parent;
+            this.$nextTick(()=>{
+              o.$refs['autoLayoutForm'].showDailog();
+            });
        }else{
          let comps = layout.findAllComps(this.pageInfo);
          let json = layout.layout["l"+l];