UNPKG

tfp

Version:

A Web UI framework for TaskBuilder

323 lines (264 loc) 12.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var TFPComponentRender = /*#__PURE__*/function () { function TFPComponentRender(__tfp, _dataModel, _level) { (0, _classCallCheck2["default"])(this, TFPComponentRender); if (!__tfp) { throw new Error("请提供tfp对象!"); return; } if (!_dataModel) { throw new Error("请提供组件数据模型!"); return; } this._tfp = __tfp; this.dataModel = _dataModel; this.metadata = this._tfp.type(this.dataModel.type); this.level = 0; //组件相对页面组件的层次 if (_level) this.level = _level; } (0, _createClass2["default"])(TFPComponentRender, [{ key: "cpt", get: function get() { return this._tfp.components[this.dataModel.id]; } }, { key: "isContainer", get: function get() { return this._tfp.components[this.dataModel.id].isContainer; } }, { key: "getHtmlIndent", value: function getHtmlIndent() { return this.cpt.getHtmlIndent(); } }, { key: "getAttrHtml", value: function getAttrHtml(retainStyleAttr) { var attrHtml = ""; var attrs = this.metadata.attrs; var arrAttr = []; for (var _i = 0; _i < attrs.length; _i++) { var attrInfo = attrs[_i]; if (attrInfo.type == "group") { for (var j = 0; j < attrInfo.items.length; j++) { arrAttr.push(attrInfo.items[j]); } } else { arrAttr.push(attrInfo); } } for (var _i2 = 0; _i2 < arrAttr.length; _i2++) { var _attrInfo = arrAttr[_i2]; if ((_attrInfo.isHtmlAttr || _attrInfo.attrName) && _attrInfo.name in this.dataModel) { var attrVal = this.dataModel[_attrInfo.name]; if (!attrVal || attrVal == 0 || attrVal == false || attrVal == "false") continue; //如果是特殊属性,则调用自定义方法获得属性html if (_attrInfo.special && this.getCustomAttrHtml) { attrHtml += this.getCustomAttrHtml(_attrInfo.name); continue; } if (typeof attrVal == "string" && (attrVal.indexOf("{") >= 0 && attrVal.indexOf("}") > 0 || attrVal.indexOf("#[") >= 0 && attrVal.indexOf("]") > 0)) { //如果不是设计时,并且不是组件值属性,则不渲染,但不包括在数据表格行里动态生成的组件 if (!(this._tfp.isDesigning && _attrInfo.name == "value") && !retainStyleAttr) continue; } //设计时组件不能禁用,否则无法点击获得焦点 if (this._tfp.isDesigning && _attrInfo.name == "disabled") continue; if (_attrInfo.name == "disabled" || _attrInfo.name == "readonly") { attrHtml += " " + _attrInfo.name; if (attrVal == false || attrVal == "false") attrHtml += "=\"false\""; } else { var vvv = this.dataModel[_attrInfo.name]; //HTML标签的属性名必须小写 if (_attrInfo.attrName) attrHtml += " " + _attrInfo.attrName.toLowerCase() + "=\"" + vvv + "\"";else attrHtml += " " + _attrInfo.name.toLowerCase() + "=\"" + vvv + "\""; } } } //事件 if (!this._tfp.isDesigning && this.metadata.events) { for (var i = 0; i < this.metadata.events.length; i++) { var eventInfo = this.metadata.events[i]; //如果不是HTML事件,则忽略 if (eventInfo.isNotHtmlEvent) continue; //input type=text 的onchange事件在代码里修改值不会触发,需要在各个组件里处理 //页面加载事件不能直接写在body标签的属性里,因为需要等tfp组件解析完毕 if (eventInfo.name.toLowerCase() == "onchange" || this.cpt.type == "Page" && eventInfo.name.toLowerCase() == "onload") continue; for (var propName in this.dataModel) { //事件名称忽略大小写 if (eventInfo.name.toLowerCase() == propName.toLowerCase()) { var eventFunc = this.dataModel[propName]; //如果事件处理函数内有数据绑定表达式,则不渲染,但不包括在数据表格行里动态生成的组件 if (!retainStyleAttr && (eventFunc.indexOf("{") >= 0 && eventFunc.indexOf("}") > 0 || eventFunc.indexOf("#[") >= 0 && eventFunc.indexOf("]") > 0)) continue; if (eventInfo.eventArgs != "") if (eventFunc.indexOf("(") < 0 || eventFunc.indexOf(")") < 0) eventFunc += "()"; attrHtml += " " + eventInfo.name.toLowerCase() + "=\"" + eventFunc + "\""; break; } } } } return attrHtml; } /** * 获得组件的样式HTML * @param {Boolean} isGetHead [description] * @param {[type]} retainStyleAttr 是否在组件的HTML标签的属性中保留CSS样式代码, * 例如移动端数据表格组件的数据行里的子组件,因为是动态生成的,没有唯一的id * @return {[type]} [description] */ }, { key: "getStyleHtml", value: function getStyleHtml(isGetHead, retainStyleAttr) { var styleHtml = ""; if (this.dataModel.styles) { for (var styleName in this.dataModel.styles) { styleHtml += " " + styleName + ":" + this.dataModel.styles[styleName] + ";"; } } if (this.dataModel.style && !(this.dataModel.style.indexOf("{") >= 0 && this.dataModel.style.indexOf("}") > 0 || this.dataModel.style.indexOf("#[") >= 0 && this.dataModel.style.indexOf("]") > 0)) { styleHtml += this.dataModel.style; } if (this.getCustomStyleHtml) styleHtml += this.getCustomStyleHtml(); if (this._tfp.isDesigning) { styleHtml += "user-select:none;"; //设计时,如果容器组件没有设置边框,则为其添加一个轮廓线,以便查看 //不能直接设置border样式,因为会造成面板组件的内容宽度和高度与实际不一致 //导致设计时可能会出现滚动条,而实际运行时没有 if ((this.isContainer || this.dataModel.components) && styleHtml.indexOf("border:") < 0 && styleHtml.indexOf("border-width:") < 0) styleHtml += "outline:#cccccc dashed 1px;"; } //如果是在后台编译时获得样式信息,则将组件样式抽取到页面头部style标签中,以便统一查看 if (isGetHead) {// } else if (this._tfp.isDesigning || retainStyleAttr) { styleHtml = " style=\"" + styleHtml + " \""; } else { styleHtml = ""; } return styleHtml; } }, { key: "getComponentsHtml", value: function getComponentsHtml(_getComponentsHtml, indent, retainStyleAttr) { var html = ""; if (!indent) indent = ""; for (var i = 0; i < this.dataModel.components.length; i++) { var cdm = this.dataModel.components[i]; var Render = this._tfp.renders[cdm.type]; if (!Render) continue; var render = new Render(this._tfp, cdm, this.level + 1); html += render.getHtml(_getComponentsHtml, indent, retainStyleAttr); } return html; } }, { key: "getHtml", value: function getHtml(tagName, getComponentsHtml, parentIndent, retainStyleAttr) { if (!tagName) return ""; var indent = this.getHtmlIndent(); //有些容器组件由多级html元素构成,他们子组件的代码缩进 //需要根据父组件的容器元素的代码缩进进行相应的增加 if (parentIndent) { indent = parentIndent + "\t"; this.indent = indent; } var cptHtml = indent + "<" + tagName + " id=\"" + this.dataModel.id + "\" class=\""; if (this._tfp.curPage.dataModel.client != "mini") { cptHtml += "tfp-" + this.dataModel.type.toLowerCase().replace("_", "-"); if (this.getSpecialClass) cptHtml += this.getSpecialClass(); } else { cptHtml += "w-" + this.dataModel.id + " wx-" + this.dataModel.type.toLowerCase().replace("_", "-"); } if (this.dataModel["class"] && !(this.dataModel["class"].indexOf("{") >= 0 && this.dataModel["class"].indexOf("}") > 0 || this.dataModel["class"].indexOf("#[") >= 0 && this.dataModel["class"].indexOf("]") > 0)) { cptHtml += " " + this.dataModel["class"]; } cptHtml += "\""; cptHtml += this.getAttrHtml(retainStyleAttr) + this.getStyleHtml(false, retainStyleAttr); if (this.getBodyHtml) { cptHtml += ">"; cptHtml += this.getBodyHtml(getComponentsHtml, retainStyleAttr); cptHtml += "</" + tagName + ">\r\n"; } else if (this.isContainer || this.dataModel.components) { cptHtml += ">\r\n"; if (getComponentsHtml && this.dataModel.components) { cptHtml += this.getComponentsHtml(getComponentsHtml, indent, retainStyleAttr); } cptHtml += indent + "</" + tagName + ">\r\n"; } else { cptHtml += "/>\r\n"; } return cptHtml; } }, { key: "getComponentsWX", value: function getComponentsWX(getComponentsHtml, indent, retainStyleAttr, otherOptions) { var wx = { "wxjson": "", "wxjs": "", "wxml": "", "wxss": "" }; if (!indent) indent = ""; if (this.dataModel.components) { for (var i = 0; i < this.dataModel.components.length; i++) { var cdm = this.dataModel.components[i]; var Render = this._tfp.renders[cdm.type]; if (!Render) continue; var render = new Render(this._tfp, cdm, this.level + 1); var wx0 = render.getWX(getComponentsHtml, indent, retainStyleAttr, otherOptions); wx.wxjson += wx0.wxjson; wx.wxjs += wx0.wxjs; wx.wxml += wx0.wxml; wx.wxss += wx0.wxss; } } return wx; } }, { key: "getWX", value: function getWX(tagName, getComponentsHtml, parentIndent, retainStyleAttr, otherOptions) { if (!tagName) return ""; var indent = this.getHtmlIndent(); //有些容器组件由多级html元素构成,他们子组件的代码缩进 //需要根据父组件的容器元素的代码缩进进行相应的增加 if (parentIndent) { indent = parentIndent + "\t"; this.indent = indent; } var cpt_wx = { "wxjson": "", "wxjs": "", "wxml": "", "wxss": "" }; cpt_wx.wxml += indent + "<" + tagName + ""; if (otherOptions && otherOptions.gridContainer) cpt_wx.wxml += " id=\"" + this.dataModel.id + "_{{index}}\"";else cpt_wx.wxml += " id=\"" + this.dataModel.id + "\""; cpt_wx.wxml += " class=\""; cpt_wx.wxml += "w-" + this.dataModel.id + " "; if (this._tfp.curPage.dataModel.client != "mini") { cpt_wx.wxml += "tfp-" + this.dataModel.type.toLowerCase().replace("_", "-"); if (this.getSpecialClass) cpt_wx.wxml += this.getSpecialClass(); } else { cpt_wx.wxml += "wx-" + this.dataModel.type.toLowerCase().replace("_", "-"); } if (this.dataModel["class"] && !(this.dataModel["class"].indexOf("{") >= 0 && this.dataModel["class"].indexOf("}") > 0 || this.dataModel["class"].indexOf("#[") >= 0 && this.dataModel["class"].indexOf("]") > 0)) { cpt_wx.wxml += " " + this.dataModel["class"]; } cpt_wx.wxml += "\""; cpt_wx.wxml += this.getAttrHtml(retainStyleAttr, otherOptions) + this.getStyleHtml(false, retainStyleAttr, otherOptions); if (this.getBodyWX) { cpt_wx.wxml += ">"; var body_wx = this.getBodyWX(getComponentsHtml, retainStyleAttr, otherOptions); cpt_wx.wxml += body_wx.wxml; cpt_wx.wxml += "</" + tagName + ">\r\n"; cpt_wx.wxjs += body_wx.wxjs; } else if (this.isContainer || this.dataModel.components) { cpt_wx.wxml += ">\r\n"; if (getComponentsHtml && this.dataModel.components) { var coms_wx = this.getComponentsWX(getComponentsHtml, indent, retainStyleAttr, otherOptions); cpt_wx.wxml += coms_wx.wxml; cpt_wx.wxjs += coms_wx.wxjs; } cpt_wx.wxml += indent; cpt_wx.wxml += "</" + tagName + ">\r\n"; } else { cpt_wx.wxml += "/>\r\n"; } return cpt_wx; } }]); return TFPComponentRender; }(); exports["default"] = TFPComponentRender;