UNPKG

taskreport

Version:

A Report Render for TaskBuilder

203 lines (190 loc) 5.86 kB
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();