You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

200 lines
7.0 KiB

/**
* Created by Jacky.Gao on 2017-01-26.
*/
import * as utils from '../Utils.js';
import {afterRenderer} from './CellRenderer.js';
import buildMenuConfigure from './ContextMenu.js';
import Handsontable from 'handsontable';
export default class ReportTable{
constructor(container,callback){
this.container=container;
this.hot=new Handsontable(container,{
startCols:1,
startRows:1,
fillHandle:{
autoInsertRow:false
},
colHeaders:true,
rowHeaders:true,
autoColumnSize:false,
autoRowSize:false,
manualColumnResize:true,
manualRowResize:true,
maxColsNumber:700,
outsideClickDeselects:false
});
this.buildMenu();
this.hot.addHook("afterRenderer",afterRenderer);
let file=utils.getParameter("_u");
if(!file || file===null || file===''){
file='classpath:template/template.ureport.xml';
}else{
window._reportFile=file;
}
this.cellsMap=new Map();
this.loadFile(file,callback);
this.hot.addHook('afterRowResize', function(currentRow,newSize) {
let rowHeights=this.getSettings().rowHeights;
let oldRowHeights=rowHeights.concat([]);
let newRowHeights=rowHeights.concat([]);
newRowHeights.splice(currentRow,1,newSize);
this.updateSettings({
rowHeights:newRowHeights,
manualRowResize:newRowHeights
});
const _this=this;
utils.undoManager.add({
redo:function(){
rowHeights=_this.getSettings().rowHeights;
oldRowHeights=rowHeights.concat([]);
newRowHeights.splice(currentRow,1,newSize);
_this.updateSettings({
rowHeights:newRowHeights,
manualRowResize:newRowHeights
});
utils.setDirty();
},
undo:function(){
_this.updateSettings({
rowHeights:oldRowHeights,
manualRowResize:oldRowHeights
});
utils.setDirty();
}
});
utils.setDirty();
});
this.hot.addHook('afterColumnResize',function(currentColumn,newSize){
let colWidths=this.getSettings().colWidths;
let newColWidths=colWidths.concat([]);
let oldColWidths=colWidths.concat([]);
newColWidths.splice(currentColumn,1,newSize);
this.updateSettings({
colWidths:newColWidths,
manualColumnResize:newColWidths
});
const _this=this;
utils.undoManager.add({
redo:function(){
colWidths=_this.getSettings().colWidths;
newColWidths=colWidths.concat([]);
oldColWidths=colWidths.concat([]);
newColWidths.splice(currentColumn,1,newSize);
_this.updateSettings({
colWidths:newColWidths,
manualColumnResize:newColWidths
});
utils.setDirty();
},
undo:function(){
_this.updateSettings({
colWidths:oldColWidths,
manualColumnResize:oldColWidths
});
utils.setDirty();
}
});
utils.setDirty();
});
}
loadFile(file,callback){
const _this=this;
const url=window._server+"/designer/loadReport";
$.ajax({
url,
type:'POST',
data:{file},
success:function(reportDef){
_this.reportDef=reportDef;
_this._buildReportData(reportDef);
if(callback){
callback.call(_this,reportDef);
}
_this.hot.render();
if(file!=='classpath:template/template.ureport.xml'){
_this.hot.context.fileInfo.setFile(file);
}else{
_this.hot.context.fileInfo.setFile(`${window.i18n.table.report.tip}`);
}
if(reportDef.paper.bgImage){
$('.ht_master').css('background',`url(${reportDef.paper.bgImage}) 50px 26px no-repeat`);
}else{
$('.ht_master').css('background','transparent');
}
},
error:function(response){
if(response && response.responseText){
alert("服务端错误:"+response.responseText+"");
}else{
alert(`${window.i18n.table.report.load}${file}${window.i18n.table.report.fail}`);
}
window.location.href = '/ureport/designer'
}
});
}
_buildReportData(data){
this.cellsMap.clear();
const rows=data.rows;
const rowHeights=[];
for(let row of rows){
const height=row.height;
rowHeights.push(utils.pointToPixel(height));
}
const columns =data.columns;
const colWidths=[];
for(let col of columns){
const width=col.width;
colWidths.push(utils.pointToPixel(width));
}
const cellsMap=data.cellsMap;
const dataArray=[],mergeCells=[];
for(let row of rows){
const rowData=[];
for(let col of columns){
let key=row.rowNumber+","+col.columnNumber;
let cell=cellsMap[key];
if(cell){
this.cellsMap.set(key,cell);
rowData.push(cell.value.value || "");
let rowspan=cell.rowSpan,colspan=cell.colSpan;
if(rowspan>0 || colspan>0){
if(rowspan===0)rowspan=1;
if(colspan===0)colspan=1;
mergeCells.push({
rowspan,
colspan,
row:row.rowNumber-1,
col:col.columnNumber-1
});
}
}else{
rowData.push("");
}
}
dataArray.push(rowData);
}
this.hot.loadData(dataArray);
this.hot.updateSettings({
colWidths,
rowHeights,
mergeCells,
readOnly:true
});
}
buildMenu(){
this.hot.updateSettings({
contextMenu: buildMenuConfigure()
});
}
bindSelectionEvent(callback){
const _this=this;
Handsontable.hooks.add("afterSelectionEnd",function(rowIndex,colIndex,row2Index,col2Index){
callback.call(_this,rowIndex,colIndex,row2Index,col2Index);
},this.hot);
}
};