tfp
Version:
A Web UI framework for TaskBuilder
304 lines (267 loc) • 9.56 kB
JavaScript
import {VisibleComponent} from "../controller.js";
/**
* 数据表格组件
* @param {[type]} dataModel [description]
*/
export default class Grid extends VisibleComponent {
constructor(__tfp, dataModel, parent) {
super(__tfp, "Grid", dataModel, parent);
this.pageSize = 20;
this.curPage = 0;
this.pageCount = 0;
this.rowsCount = 0;
this.dataList = [];
if(__tfp.isDesigning) {
if(!this.dataModel.components || this.dataModel.components.length==0) {
this.dataModel.components = [{
id: this.id+"_DataRow",
type: "GridDataRow",
styles: {
"position": "absolute",
"top": "0",
"left": "10px",
"right": "10px",
"height": "60px",
"border": "1px solid #cccccc",
"border-radius": "10px"
}
}];
}
}
}
//属性
get loadDataService() { return this.dataModel.loadDataService }
set loadDataService(value) {this.dataModel.loadDataService = value}
get dataBindingMember() { return this.dataModel.dataBindingMember }
set dataBindingMember(value) {this.dataModel.dataBindingMember = value}
get dataBindingKey() { return this.dataModel.dataBindingKey }
set dataBindingKey(value) {this.dataModel.dataBindingKey = value}
get showSearchBox() { return this.dataModel.showSearchBox }
set showSearchBox(value) {
this.dataModel.showSearchBox = value ? true : false;
if(this._jqObj) {
if(this.dataModel.showSearchBox) {
if(this._jqObj.find(".tfp-grid-searchbox").length>0) {
this._jqObj.find(".tfp-grid-searchbox").show();
} else {
$(this.getSearchBoxHtml()).insertBefore(this._jqObj.find(".tfp-grid-datalist"));
}
this._jqObj.find(".tfp-grid-datalist").css("top", "50px");
} else {
this._jqObj.find(".tfp-grid-searchbox").hide();
this._jqObj.find(".tfp-grid-datalist").css("top", "0");
}
}
}
get allowPaging() { return this.dataModel.allowPaging }
set allowPaging(value) {
this.dataModel.allowPaging = value ? true : false;
if(this._jqObj) {
if(this.dataModel.allowPaging) {
if(this._jqObj.find(".tfp-grid-footer").length>0) {
this._jqObj.find(".tfp-grid-footer").show();
} else {
$(this.getFooterHtml()).insertAfter(this._jqObj.find(".tfp-grid-datalist"));
}
this._jqObj.find(".tfp-grid-datalist").css("bottom", "50px");
} else {
this._jqObj.find(".tfp-grid-footer").hide();
this._jqObj.find(".tfp-grid-footer").css("bottom", "0");
}
}
}
get containerEl() {
return this._jqObj.find(".tfp-grid-datalist").get(0);
}
deleteCptId(cptHtml) {
let start = cptHtml.indexOf("id=\"");
if(start<0) return cptHtml;
let end = cptHtml.indexOf("\"", start+4);
if(end<0) return cptHtml;
cptHtml = cptHtml.substr(0, start)+cptHtml.substr(end+2);
return this.deleteCptId(cptHtml);
}
setCptDataFormat(cdm) {
//let cpt = this._tfp.get(cdm.id);
if(cdm.dataBindingFormat) {
cdm.value = cdm.dataBindingFormat;
}
if(cdm.components && cdm.components.length>0) {
for(var i=0;i<cdm.components.length;i++) {
this.setCptDataFormat(cdm.components[i]);
}
}
}
getSearchBoxHtml() {
var html = "";
if(this.showSearchBox) {
var indent = this.getHtmlIndent();
let imgUrl = this._tfp.rootPath+"/src/components/grid/images/search.png";
let readonly = "";
if(this._tfp.isDesigning) readonly = " readonly";
html += indent+"\t<div class=\"tfp-grid-searchbox\">"
+"<img src=\""+imgUrl+"\" /><input type=\"text\""+readonly+">"
+"<label>搜索</label></div>\r\n";
}
return html;
}
getFooterHtml() {
var html = "";
if(this.allowPaging) {
var indent = this.getHtmlIndent();
html += indent+"\t<div class=\"tfp-grid-footer\">\r\n";
html += indent+"\t\t<div style=\"border:0;\"></div>\r\n";
html += indent+"\t\t<div>首页</div>\r\n";
html += indent+"\t\t<div>上一页</div>\r\n";
html += indent+"\t\t<div>下一页</div>\r\n";
html += indent+"\t\t<div>尾页</div>\r\n";
html += indent+"\t</div>\r\n";
}
return html;
}
/**
* 动态创建行模板内的组件
* @param {[type]} cdm [description]
* @return {[type]} [description]
*/
createRowCpt(parent, cdm, rowIndex) {
$("#"+cdm.id).attr("id", cdm.id+"_"+rowIndex);
cdm.id = cdm.id+"_"+rowIndex;
var cptClass = this._tfp.controllers[cdm.type];
if (!cptClass) {
console.log("未找到名为[" + cdm.type + "]的组件控制器!");
return;
}
var cpt = new cptClass(this._tfp, cdm, parent);
window[cpt.id] = cpt;
cpt._jqObj = $("#"+cpt.id);
if(cpt._jqObj.length>0) cpt.el = cpt._jqObj[0];
if(!cdm.components || cdm.components.length==0) return;
for(var i=0;i<cdm.components.length;i++) {
this.createRowCpt(cpt, cdm.components[i], rowIndex);
}
}
bindData(data) {
if(!data || !Array.isArray(data)) return;
this.dataList = data;
let top = 0;
for(var i=0;i<this.dataModel.components.length;i++) {
this._tfp.remove(this.dataModel.components[i]);
}
this.dataModel.components = [];
let dataListDiv = this._jqObj.find(".tfp-grid-datalist");
dataListDiv.empty();
for(var i=0;i<data.length;i++) {
let rowData = data[i];
let rowIndex = i;
if(this.templateRowCdm.beforeBindingData) {
try {
rowData = eval(this.templateRowCdm.beforeBindingData);
} catch(err) {
console.log(err);
}
}
let dataRowHtml = this.dataRowHtmlTemplate;
top = i*(this.rowHeight+10);
try {
dataRowHtml = this._tfp.replaceDataField(rowData, dataRowHtml);
dataRowHtml = this._tfp.exeExpress(dataRowHtml);
} catch(e) {
console.log(e);
return;
}
dataListDiv.append(dataRowHtml);
let cdmRow = JSON.parse(JSON.stringify(this.templateRowCdm));
this.createRowCpt(this, cdmRow, i);
this._tfp.initCptRuntime(this._tfp.components[cdmRow.id]);
let newRow = dataListDiv.find(".tfp-griddatarow").last();
newRow.css("top", top+"px");
if(this.templateRowCdm.afterBindingData) {
try {
eval(this.templateRowCdm.afterBindingData);
} catch(err) {
console.log(err);
}
}
}
dataListDiv.get(0).scrollTop = 0;
if(this.allowPaging) this._jqObj.find(".tfp-grid-footer").find("div").eq(0).html(this.curPage+"/"+this.pageCount);
}
loadData(toPage) {
if(!this.dataModel.loadDataService) {
alert("请为["+this.id+"]设置加载数据服务!");
return;
}
let serviceCpt = this._tfp.get(this.dataModel.loadDataService);
if(!serviceCpt) {
alert("ID为["+this.dataModel.loadDataService+"]的组件不存在!");
return;
}
if(!this.dataModel.dataBindingMember) {
alert("请为["+this.id+"]设置数据绑定成员!");
return;
}
var args = {};
if(this.allowPaging) {
args = {
pageSize: this.pageSize,
toPage: toPage
};
}
if(this.showSearchBox) {
let keyword = this._jqObj.find(".tfp-grid-searchbox").find("input").val();
if(keyword.trim()!="") args.keyword = keyword;
}
let that = this;
serviceCpt.status = 0;
serviceCpt.request(args, function(req, res) {
var data = res[that.dataModel.dataBindingMember];
if(!data) return;
if(that.allowPaging) {
that.curPage = data.toPage;
that.rowsCount = data.rowsCount;
that.pageCount = data.pageCount;
that.pageSize = data.pageSize;
that.bindData(data.rows);
} else {
that.bindData(data);
}
});
}
initRuntime() {
let that = this;
let templateRow = this._jqObj.find(".tfp-griddatarow-template");
this.dataRowHtmlTemplate = templateRow.get(0).outerHTML;
this.dataRowHtmlTemplate = this.dataRowHtmlTemplate.replace("tfp-griddatarow-template", "tfp-griddatarow");
this.rowHeight = templateRow.height();
let tmpCdm = this.dataModel.components[0];
this.templateRowCdm = JSON.parse(JSON.stringify(tmpCdm));
this.dataModel.components = [];
this._tfp.remove(tmpCdm.id);
this._jqObj.find(".tfp-griddatarow-template").remove();
this._jqObj.find(".tfp-grid-searchbox").find("label").click(function() {
that.loadData(1);
});
if(this.allowPaging) {
let footerDivs = this._jqObj.find(".tfp-grid-footer").find("div");
let that = this;
footerDivs.eq(1).click(function() {
that.loadData(1);
});
footerDivs.eq(2).click(function() {
let prevPage = that.curPage - 1;
if(prevPage<1) prevPage = 1;
that.loadData(prevPage);
});
footerDivs.eq(3).click(function() {
let nextPage = that.curPage + 1;
if(nextPage>that.pageCount) nextPage = that.pageCount;
that.loadData(nextPage);
});
footerDivs.eq(4).click(function() {
that.loadData(that.pageCount);
});
}
this.loadData(1);
}
}