選択できるのは25トピックまでです。
トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
121 行
3.8 KiB
121 行
3.8 KiB
import {undoManager,setDirty,buildNewCellDef} from '../Utils.js';
|
|
import {alert} from '../MsgBox.js';
|
|
|
|
/**
|
|
* Created by Jacky.Gao on 2017-01-25.
|
|
*/
|
|
import Tool from './Tool.js';
|
|
export default class MergeTool extends Tool{
|
|
execute(){
|
|
const table=this.context.hot;
|
|
const selected=table.getSelected();
|
|
if(!selected){
|
|
alert("请选择目标单元格.");
|
|
return;
|
|
}
|
|
let mergeCells=table.getSettings().mergeCells || [];
|
|
let oldMergeCells=mergeCells.concat([]);
|
|
let startRow=selected[0],startCol=selected[1],endRow=selected[2],endCol=selected[3];
|
|
let tmp=endRow;
|
|
if(startRow>endRow){
|
|
endRow=startRow;
|
|
startRow=tmp;
|
|
}
|
|
tmp=endCol;
|
|
if(startCol>endCol){
|
|
endCol=startCol;
|
|
startCol=tmp;
|
|
}
|
|
const _this=this;
|
|
doMergeCells(startRow,startCol,endRow,endCol,table,this.context);
|
|
undoManager.add({
|
|
redo:function(){
|
|
mergeCells=table.getSettings().mergeCells || [];
|
|
oldMergeCells=mergeCells.concat([]);
|
|
doMergeCells(startRow,startCol,endRow,endCol,table,_this.context);
|
|
setDirty();
|
|
},
|
|
undo:function(){
|
|
table.updateSettings({mergeCells:oldMergeCells});
|
|
setDirty();
|
|
}
|
|
});
|
|
setDirty();
|
|
}
|
|
getTitle(){
|
|
return '合并/拆分单元格';
|
|
}
|
|
getIcon(){
|
|
return `<i class="ureport ureport-merge" style="color: #0e90d2;"></i>`;
|
|
}
|
|
}
|
|
function doMergeCells(startRow,startCol,endRow,endCol,table,context){
|
|
let doMerge=true,doSplit=false;
|
|
const selectCell=context.getCell(startRow,startCol);
|
|
const mergeCells=table.getSettings().mergeCells || [];
|
|
for(let i=startRow;i<=endRow;i++){
|
|
for(let j=startCol;j<=endCol;j++){
|
|
let td=table.getCell(i,j);
|
|
if(!td){
|
|
continue;
|
|
}
|
|
let $td=$(td);
|
|
let colSpan=$td.prop("colspan") || "1",rowSpan=$td.prop("rowspan") || "1";
|
|
colSpan=parseInt(colSpan),rowSpan=parseInt(rowSpan);
|
|
if(colSpan>1 || rowSpan>1){
|
|
let index=0;
|
|
doSplit=true;
|
|
doMerge=false;
|
|
while(index<mergeCells.length){
|
|
let mergeItem=mergeCells[index];
|
|
let row=mergeItem.row,col=mergeItem.col;
|
|
if(row===i && col===j){
|
|
mergeCells.splice(index,1);
|
|
break;
|
|
}
|
|
index++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(doMerge){
|
|
if(endRow<startRow){
|
|
let tmp=startRow;
|
|
startRow=endRow;
|
|
endRow=tmp;
|
|
}
|
|
if(endCol<startCol){
|
|
let tmp=startCol;
|
|
startCol=endCol;
|
|
endCol=tmp;
|
|
}
|
|
let rowSpan=endRow-startRow,colSpan=endCol-startCol;
|
|
if(rowSpan===0){
|
|
rowSpan=1;
|
|
}else{
|
|
rowSpan++;
|
|
}
|
|
if(colSpan===0){
|
|
colSpan=1;
|
|
}else{
|
|
colSpan++;
|
|
}
|
|
const newMergeItem={row:startRow,col:startCol,rowspan:rowSpan,colspan:colSpan};
|
|
mergeCells.push(newMergeItem);
|
|
}else{
|
|
if(doSplit){
|
|
for(let i=startRow;i<=endRow;i++) {
|
|
for (let j = startCol; j <= endCol; j++) {
|
|
let cellDef=context.getCell(i,j);
|
|
if(!cellDef){
|
|
cellDef=buildNewCellDef(i+1,j+1);
|
|
context.addCell(cellDef);
|
|
}
|
|
}
|
|
}
|
|
}else{
|
|
alert("请选择多个单元格后再进行此操作!");
|
|
}
|
|
}
|
|
table.updateSettings({mergeCells});
|
|
};
|