taskreport
Version:
A Report Render for TaskBuilder
203 lines (190 loc) • 5.86 kB
JavaScript
import Spreadsheet from "../x-data-spreadsheet/src/index.js";
import zhCN from "../x-data-spreadsheet/src/locale/zh-cn.js";
class TaskReportRender {
constructor() {
this.xss = null;
this.trpData = null;
this.trpFilePath = null;
}
init(_trpData) {
x_spreadsheet.locale('zh-cn', zhCN);
this.trpData = _trpData;
this.xss = x_spreadsheet('body', {
mode: 'read', //read
showToolbar: false,
showGrid: true,
showContextmenu: false,
showBottomBar: false,
view: {
height: () => document.documentElement.clientHeight,
width: () => document.documentElement.clientWidth,
},
row: this.trpData.pageSetting.row,
col: this.trpData.pageSetting.col
});
}
getDataSource(dsId) {
if(!this.trpData.dataSources) return null;
for(var i=0;i<this.trpData.dataSources.length;i++) {
let ds = this.trpData.dataSources[i];
if(ds.id==dsId) {
return ds;
}
}
return null;
}
formatCellData(ri, ci, cdb, format) {
let ds = this.getDataSource(cdb.dataSource);
if(ds && ds.data) {
let data = ds.data;
if(cdb.dataBindMember) data = ds.data[cdb.dataBindMember];
if(!data) {
this.trpData.data[0].rows[ri+""].cells[ci+""].text = "";
return;
}
//如果是数组,则表示需要轮询创建区域内容,不单个设置单元格
if(Array.isArray(data)) return;
let cellText = format;
if(cellText) {
try {
cellText = replaceDataField(data, cellText);
if(cellText) cellText = exeExpress(cellText);
this.trpData.data[0].rows[ri+""].cells[ci+""].text = cellText;
} catch(err) {
console.log(err);
}
}
}
}
bindCellData(ri, ci, format) {
//先找该单元格有没有设置数据绑定
for(let cellId in this.trpData.dataBindCells) {
let cdb = this.trpData.dataBindCells[cellId];
if(cdb.type=="cell" && cdb.ri==ri && cdb.ci==ci) {
this.formatCellData(ri, ci, cdb, format);
return;
}
}
//如果单元格没有设置数据绑定,则判断该单元格所在区域是否设置了数据绑定
for(let cellId in this.trpData.dataBindCells) {
let cdb = this.trpData.dataBindCells[cellId];
if(cdb.type=="range" && ri>=cdb.sri && ci>=cdb.sci && ri<=cdb.eri && ci<=cdb.eci) {
this.formatCellData(ri, ci, cdb, format);
return;
}
}
//如果上面两项都没有,则判断页面是否有设置了数据绑定
if(this.trpData.pageSetting.dataSource) {
this.formatCellData(ri, ci, this.trpData.pageSetting, format);
}
}
formatCellData(data, format) {
let cellText = format;
if(!cellText) return "";
try {
cellText = replaceDataField(data, cellText);
if(cellText) cellText = exeExpress(cellText);
} catch(err) {
console.log(err);
cellText = "";
}
return cellText;
}
bindRangeData(cdb, data, rowsTmp) {
//先删除模板行
for(let ri=cdb.sri;ri<=cdb.eri;ri++) {
delete this.trpData.data[0].rows[ri];
}
//然后把超过当前区域的行暂存到一个临时对象里
let rowsDown = {};
for(let ri in this.trpData.data[0].rows) {
if(ri=="len" || parseInt(ri)<=cdb.sri) continue;
let row = this.trpData.data[0].rows[ri];
rowsDown[ri] = cloneObj(row);
}
//删除模板行下面的行
for(let ri in rowsDown) {
delete this.trpData.data[0].rows[ri];
}
let rowIndex = cdb.sri;
//轮询插入绑定了数据的行
for(var i=0;i<data.length;i++) {
let obj = data[i];
for(var j=0;j<rowsTmp.length;j++) {
let rowTmp = cloneObj(rowsTmp[j]);
if(rowTmp.cells) {
for(let ci in rowTmp.cells) {
let cell = rowTmp.cells[ci];
if(cell.text) {
cell.text = this.formatCellData(obj, cell.text);
}
}
this.trpData.data[0].rows[rowIndex] = rowTmp;
}
rowIndex++;
}
}
//然后行索引加上数据集数量后重新放到data里
for(let ri in rowsDown) {
this.trpData.data[0].rows[parseInt(ri)+rowIndex] = rowsDown[ri];
}
}
/**
* 获得动态绑定区域模板
* @return {[type]} [description]
*/
getRangeTemplate() {
for(let cellId in this.trpData.dataBindCells) {
let cdb = this.trpData.dataBindCells[cellId];
if(cdb.type=="range" && cdb.dataBindMember) {
let ds = this.getDataSource(cdb.dataSource);
if(!ds || !ds.data) continue;
let data = ds.data[cdb.dataBindMember];
if(!Array.isArray(data)) continue;
//先取出动态绑定区域的模板
let rowsTmp = [];
for(let ri=cdb.sri;ri<=cdb.eri;ri++) {
let rowTmp = {
cells: {}
};
let row = this.trpData.data[0].rows[ri+""];
if(!row) {
rowsTmp.push({});
continue;
}
for(let ci=cdb.sci;ci<=cdb.eci;ci++) {
let cell = row.cells[ci];
if(cell) {
if(cell.text && (cell.text+"").indexOf("{")>=0 && (cell.text+"").indexOf("}")>0) {
//如果没有数据可以绑定,则需要清空绑定表达式
if(data.length==0) cell.text = "";
}
rowTmp.cells[ci] = cloneObj(cell);
}
}
rowsTmp.push(rowTmp);
}
if(data.length==0) continue;
//console.log(rowsTmp);
//再绑定数据
this.bindRangeData(cdb, data, rowsTmp);
}
}
}
bindData() {
for(let ri in this.trpData.data[0].rows) {
let row = this.trpData.data[0].rows[ri];
if(ri=="len") continue;
for(let ci in row.cells) {
let cell = row.cells[ci];
if(cell.text && (cell.text+"").indexOf("{")>=0 && (cell.text+"").indexOf("}")>0) {
this.bindCellData(parseInt(ri), parseInt(ci), cell.text);
}
}
}
this.getRangeTemplate();
this.xss.loadData(this.trpData.data);
this.xss.reRender();
}
}
window.trpRender = new TaskReportRender();