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
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);
|
|
}
|
|
};
|
|
|