/** * 数据表格数据结构. * @typedef {Array} DatatableData * @example { //数据表格数据条目 "data": [ { "org": [{ "distinguishedName": "张三@bf007525-99a3-4178-a474-32865bdddec8@I", "id": "bf007525-99a3-4178-a474-32865bdddec8", "name": "张三", "person": "0c828550-d8ab-479e-9880-09a59332f1ed", "unit": "9e6ce205-86f6-4d84-96e1-83147567aa8d", "unitLevelName": "兰德纵横/市场营销部", "unitName": "市场营销部" }], "org_1": [{ "distinguishedName": "张三@bf007525-99a3-4178-a474-32865bdddec8@I", "id": "bf007525-99a3-4178-a474-32865bdddec8", "name": "张三", "person": "0c828550-d8ab-479e-9880-09a59332f1ed", "unit": "9e6ce205-86f6-4d84-96e1-83147567aa8d", "unitLevelName": "兰德纵横/市场营销部", "unitName": "市场营销部" }, { "distinguishedName": "李四@bf007525-99a3-4178-a474-32865bdddec8@I", "id": "bf007525-99a3-4178-a474-32865bdddec8", "name": "李四", "person": "0c828550-d8ab-479e-9880-09a59332f1ed", "unit": "9e6ce205-86f6-4d84-96e1-83147567aa8d", "unitLevelName": "兰德纵横/市场营销部", "unitName": "市场营销部" }], "number": "111", "textfield": "杭州", "attachment": [ { "activityName": "拟稿", "extension": "jpg", "id": "9514758e-9e28-4bfe-87d7-824f2811f173", "businessId": "1234758e-9e28-4bfe-87d7-824f2811f173", "lastUpdateTime": "2020-12-09 21:48:03", "length": 452863.0, "name": "111.jpg", "person": "李四@lisi@P" } ] } ... ], "total": { "number": 222, //总计采用字段id "textfield": 2 } } */ MWF.xDesktop.requireApp("process.Xform", "$Module", null, false); /** @class DatatablePC 数据表格组件。表格形式的多行数据编辑组件。 * @o2cn 数据表格PC端 * @example * //可以在脚本中获取该组件 * //方法1: * var datatable = this.form.get("name"); //获取组件 * //方法2 * var datatable = this.target; //在组件事件脚本中获取 * @extends MWF.xApplication.process.Xform.$Module * @o2category FormComponents * @since v6.2 * @o2range {Process|CMS|Portal} * @hideconstructor */ MWF.xApplication.process.Xform.DatatablePC = new Class( /** @lends MWF.xApplication.process.Xform.DatatablePC# */ { Implements: [Events], Extends: MWF.APP$Module, isEdit: false, options: { /** * 所有内容加载后执行(包括异步加载)。 * @event MWF.xApplication.process.Xform.DatatablePC#afterLoad * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 每初始化一个条目,但未加载的时候触发,通过this.event可以获取条目对象。 * @event MWF.xApplication.process.Xform.DatatablePC#beforeLoadLine * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 每一个条目加载后时候触发,通过this.event可以获取条目对象。 * @event MWF.xApplication.process.Xform.DatatablePC#afterLoadLine * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 数据表格改变时触发。通过this.event.lines可以获取修改的条目数组,this.event.type可以获得修改的类型。
* * * * * * * * *
this.event.type触发类型this.event.lines
addline添加一行添加的行数组
deleteline删除一行删除的行数组
editcomplete某行完成编辑(点击当前编辑行前面的√执行。同时编辑多行忽略)编辑的行数组
editmodule字段值改变时(同时编辑多行触发此事件,每次编辑单行忽略)this.event.lines为编辑的行数组
this.event.module为修改的字段
move通过向上箭头调整行顺序数据表格所有行
import导入数据后数据表格所有行
* @event MWF.xApplication.process.Xform.DatatablePC#change * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 添加条目时触发。通过this.event.line可以获取对应的条目对象,this.event.ev可以获得事件触发的Event。 * @event MWF.xApplication.process.Xform.DatatablePC#addLine * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 编辑条目时触发(同时编辑多行不触发此事件)。通过this.event可以获取对应的条目对象。 * @event MWF.xApplication.process.Xform.DatatablePC#editLine * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 完成编辑条目时触发(点击当前编辑行前面的√执行。同时编辑多行不触发此事件)。通过this.event可以获取对应的条目对象。 * @event MWF.xApplication.process.Xform.DatatablePC#completeLineEdit * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 取消编辑条目时触发(点击当前编辑行前面的 — 执行。同时编辑多行不触发此事件)。通过this.event可以获取对应的条目对象。 * @event MWF.xApplication.process.Xform.DatatablePC#cancelLineEdit * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 删除条目前触发。通过this.event可以获取对应的条目对象。 * @event MWF.xApplication.process.Xform.DatatablePC#deleteLine * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 删除条目后触发。 * @event MWF.xApplication.process.Xform.DatatablePC#afterDeleteLine * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 导出前触发。 * @event MWF.xApplication.process.Xform.DatatablePC#beforeExport * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 导出excel的时候触发,this.event指向导出的数据,您可以通过修改this.event来修改数据。 * @event MWF.xApplication.process.Xform.DatatablePC#export * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} * @example * this.event数据格式如下: * { * data : [ * ["姓名","性别","学历","专业","出生日期","毕业日期"], //标题 * [ "张三","男","大学本科","计算机","2001-1-2","2019-9-2" ], //第一行数据 * [ "李四","男","大学专科","数学","1998-1-2","2018-9-2" ] //第二行数据 * ], //导出的数据 * colWidthArray : [100, 50, 100, 200, 150, 150], //每列宽度 * title : "xxxx" //导出的excel文件标题 * } */ /** * 在导入excel,进行数据校验后触发,this.event指向导入的数据。 * @event MWF.xApplication.process.Xform.DatatablePC#validImport * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} * @example * this.event数据格式如下: * { * data : [ * { * "姓名" : "张三", * "性别" : "男", * "学历" : "大学本科", * "专业" : "计算机", * "出生日期" : "aa01-1-2", * "毕业日期" : "2019-9-2", * "errorTextList" : [ * "第5列:aa01-1-2不是正确的日期格式。" * ] //校验出的错误信息,如果该行数据正确,则无该字段 * } * ... * ], //导入的数据 * "validted" : true //是否校验通过,可以在本事件中修改该参数,确定是否强制导入 * } */ /** * 导入前触发。 * @event MWF.xApplication.process.Xform.DatatablePC#beforeImport * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 在导入excel,数据校验成功将要设置回数据表格的时候触发,this.event指向整理过的导入数据,格式见{@link DatatableData}。 * @event MWF.xApplication.process.Xform.DatatablePC#import * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ /** * 在导入excel,数据设置回数据表格以后触发,this.event指向整理过的导入数据,格式见{@link DatatableData}。 * @event MWF.xApplication.process.Xform.DatatablePC#afterImport * @see {@link https://www.yuque.com/o2oa/ixsnyt/hm5uft#i0zTS|组件事件说明} */ "moduleEvents": ["queryLoad","postLoad","load", "afterLoad", "beforeLoadLine", "afterLoadLine", "change", "addLine", "deleteLine", "afterDeleteLine", "editLine", "completeLineEdit", "cancelLineEdit", "beforeExport", "export", "beforeImport", "import", "validImport", "afterImport"] }, initialize: function(node, json, form, options){ this.node = $(node); this.node.store("module", this); this.json = json; this.form = form; this.field = true; this.fieldModuleLoaded = false; }, load: function(){ this._loadModuleEvents(); if (this.fireEvent("queryLoad")){ this._queryLoaded(); // if( this.isSectionMergeEdit() ){ //区段合并,删除区段值合并数据后编辑 // if( this.json.mergeTypeEdit === "script" ){ // this._loadMergeEditNodeByScript(); // }else{ // this._loadMergeEditNodeByDefault(); // } // }else{ // this._loadUserInterface(); // } this._loadUserInterface(); this._loadStyles(); this._loadDomEvents(); //this._loadEvents(); this._afterLoaded(); this.fireEvent("afterLoad"); // this.fireEvent("load"); } }, _loadMergeEditNodeByScript: function(){ if (this.json.sectionMergeEditScript && this.json.sectionMergeEditScript.code) { var data = this.form.Macro.exec(this.json.sectionMergeEditScript.code, this); this._setBusinessData( data ); //this._loadUserInterface(); } }, _loadMergeEditNodeByDefault: function(){ var data = this.getSortedSectionData(); var businessData = []; data.each(function(d){ d.data = d.data || {}; businessData = businessData.concat( d.data.data || [] ); }); this._setBusinessData({ data: businessData }); //this._loadUserInterface(); }, _loadUserInterface: function(){ //区段合并后编辑 if( this.isSectionMergeEdit() ){ //区段合并,删除区段值合并数据后编辑 if( this.json.mergeTypeEdit === "script" ){ this._loadMergeEditNodeByScript(); }else{ this._loadMergeEditNodeByDefault(); } } //区段合并展现 this.isMergeRead = this.isSectionMergeRead(); //启用区段且显示所有区段 this.sectionBy = this._getSectionBy(); this.isShowAllSection = this.isAllSectionShow(); // this.editModules = []; // if( !layout.mobile ){ // this.node.setStyle("overflow-x", "auto"); // this.node.setStyle("overflow-y", "hidden"); // } this.table = this.node.getElement("table"); this.tBody = this.table.getElement("tbody"); this.editable = !(this.readonly || (this.json.isReadonly === true) || (this.form.json.isReadonly === true)); if( this.isMergeRead )this.editable = false; if (this.editable && this.json.editableScript && this.json.editableScript.code){ this.editable = this.form.Macro.exec(((this.json.editableScript) ? this.json.editableScript.code : ""), this); } this.deleteable = this.json.deleteable !== "no"; this.addable = this.json.addable !== "no"; this.sortable = this.json.sortable !== "no"; //允许导入 this.importenable = this.editable && (this.json.impexpType === "impexp" || this.json.impexpType === "imp"); //允许导出 this.exportenable = this.json.impexpType === "impexp" || this.json.impexpType === "exp"; //是否多行同时编辑 this.multiEditMode = this.json.editMode === "multi"; //是否有总计列 this.totalFlag = false; this.totalColumns = []; this.totalNumberModuleIds = []; // this.hiddenColIndexList = []; if( this.isShowAllSection ){ this.data = this._getAllSectionData() }else if( this.isMergeRead ){ this.data = this.getSectionMergeReadData() }else{ this.data = this.getValue(); if( !this._getBusinessData() ){ this.isNew = true; this._setValue(this.data); } } this.lineList = []; this.sectionlineList = []; this.loadDatatable(); }, /* * @summary 重新加载数据表格。 * @example * this.form.get("fieldId").reload(); //重新加载 */ reload: function(){ this.reloading = true; this._removeEl(); // this.editModules = []; //是否有总计列 this.totalFlag = false; this.totalColumns = []; this.totalNumberModuleIds = []; this.checkMerge( this.getValue() ); this.clearSubModules(); this.lineList = []; this.sectionlineList = []; this.loadDatatable(); this.reloading = false; }, loadDatatable: function(){ this.loading = true; this._loadStyles(); this._loadTitleTr(); this._loadTemplate(); this._loadTotalTr(); this.fireEvent("load"); this._loadDatatable(function(){ this._loadImportExportAction(); this.fieldModuleLoaded = true; this.loading = false; this.fireEvent("postLoad"); }.bind(this)); }, _removeEl: function(){ var node; if( this.titleTr ){ node = this.titleTr.getElement("th.mwf_addlineaction"); if( node )node.destroy(); node = this.titleTr.getElement("th.mwf_moveaction"); if( node )node.destroy(); } if( this.templateTr ){ node = this.templateTr.getElement("td.mwf_editaction"); if( node )node.destroy(); node = this.templateTr.getElement("td.mwf_moveaction"); if( node )node.destroy(); } if( this.totalTr ){ this.totalTr.destroy(); this.totalTr = null; } if( this.exportActionNode ){ this.exportActionNode.destroy(); this.totalTr = null; } if( this.importActionNode ){ this.importActionNode.destroy(); this.totalTr = null; } }, _loadTitleTr: function(){ this.titleTr = this.table.getElement("tr"); var ths = this.titleTr.getElements("th"); if (this.json.border){ ths.setStyles({ "border-bottom": this.json.border, "border-right": this.json.border }); } if (this.json.titleStyles)ths.setStyles(this.json.titleStyles); //datatable$Title Module ths.each(function(th, index){ var json = this.form._getDomjson(th); th.store("dataTable", this); th.addClass("mwf_origional"); if (json){ var module = this.form._loadModule(json, th); this.form.modules.push(module); if( json.isShow === false ){ th.hide(); //隐藏列 }else if( this.reloading && json.isShow === true){ th.setStyle("display", ""); } if((json.total === "number") || (json.total === "count"))this.totalFlag = true; } }.bind(this)); if(this.editable){ var actionTh = new Element("th.mwf_addlineaction", {"styles": {"width": "46px"}}).inject(this.titleTr, "top"); //操作列 if(this.addable){ var addLineAction = new Element("div.addLineAction.ooicon-create", { "styles": this.form.css.addLineAction, "events": { "click": function(e){ if( this.json.addTo === "first" ){ this._insertLineByIndex(e.target, 0); }else{ this._addLine(e.target, true); } }.bind(this) } }).inject(actionTh); } var moveTh; if( this.sortable ){ moveTh = new Element("th.mwf_moveaction", {"styles": this.form.css.gridMoveActionCell || {}}).inject(this.titleTr, "bottom"); //总计列 } if (this.json.border){ Array.each([actionTh,moveTh], function(th){ if(th)th.setStyles({ "border-bottom": this.json.border, "border-right": this.json.border }) }.bind(this)); } if (this.json.titleStyles){ Object.each(this.json.titleStyles, function( value, key ){ if( key && key.toLowerCase() !== "width" ){ actionTh.setStyle(key, value); if(moveTh)moveTh.setStyle(key, value); } }); } } }, _loadTemplate: function(){ // this.templateJson = {}; var trs = this.table.getElements("tr"); this.templateTr = trs[trs.length-1]; this.templateNode = this.templateTr; var tds = this.templateNode.getElements("td"); this.columnCount = tds.length; if (this.json.border) { tds.setStyles({ "border-bottom": this.json.border, "border-right": this.json.border, "background": "transparent" }); } if (this.json.contentStyles)tds.setStyles(this.json.contentStyles); //datatable$Data Module tds.each(function(td, index){ var json = this.form._getDomjson(td); td.store("dataTable", this); td.addClass("mwf_origional"); if (json){ // var module = this.form._loadModule(json, td); // this.form.modules.push(module); if( json.cellType === "sequence" )td.addClass("mwf_sequence"); //序号列 if( json.isShow === false ){ td.hide(); //隐藏列 }else if( this.reloading && json.isShow === true){ td.setStyle("display", ""); } } }.bind(this)); if(this.editable){ var eTd = new Element("td.mwf_editaction",{"styles": this.json.actionStyles || {}}).inject(this.templateNode, "top"); //操作列 this.columnCount = this.columnCount+1; var mTd; if( this.sortable ){ mTd= new Element("td.mwf_moveaction", {"styles": this.form.css.gridMoveActionCell || {}}).inject(this.templateNode, "bottom"); this.columnCount = this.columnCount+1; } //排序列 if (this.json.border){ Array.each([eTd,mTd], function(td){ if(td)td.setStyles({ "border-bottom": this.json.border, "border-right": this.json.border, "background": "transparent" }) }.bind(this)); } if (this.json.contentStyles){ Object.each(this.json.contentStyles, function( value, key ){ if( key && key.toLowerCase() !== "width" ){ eTd.setStyle(key, value); if(mTd)mTd.setStyle(key, value); } }); // eTd.setStyles(this.json.contentStyles); // if(mTd)mTd.setStyles(this.json.contentStyles); } } this.templateHtml = this.templateNode.get("html"); // var moduleNodes = this.form._getModuleNodes(this.templateNode); // moduleNodes.each(function (node) { // if (node.get("MWFtype") !== "form") { // var json = this.form._getDomjson(node); // this.templateJson[json.id] = json ; // } // }.bind(this)); this.templateNode.hide(); }, _loadTotalTr: function(){ if( !this.totalFlag )return; this.totalTr = new Element("tr.mwf_totaltr", {"styles": this.form.css.datagridTotalTr}).inject(this.tBody||this.table); if( this.isShowSectionKey() && !(this.json.totalRowBySection || [] ).contains("module")){ this.totalTr.hide() } if( this.isShowSectionBy() && !(this.json.totalRowBy || [] ).contains("module") ){ this.totalTr.hide() } var ths = this.titleTr.getElements("th"); //datatable$Title Module ths.each(function(th, index){ var td = new Element("td", {"text": "", "styles": this.form.css.datagridTotalTd}).inject(this.totalTr); if (this.json.amountStyles) td.setStyles(this.json.amountStyles); var json = this.form._getDomjson(th); if (json){ if( json.isShow === false ){ td.hide(); //隐藏列 }else if( this.reloading && json.isShow === true){ td.setStyle("display", ""); } if ((json.total === "number") || (json.total === "count")){ this.totalColumns.push({ "th" : th, "td" : td, "index": index, "type": json.total }) } } }.bind(this)); var tds = this.templateTr.getElements("td"); //datatable$Data Module tds.each(function(td, index){ var json = this.form._getDomjson(td); if (json){ //总计列 var tColumn = this.totalColumns.find(function(a){ return a.index === index }); if(tColumn){ var moduleNodes = this.form._getModuleNodes(td); //获取总计列内的填写组件 if( moduleNodes.length > 0 ){ tColumn.moduleJson = this.form._getDomjson(moduleNodes[0]); if(tColumn.type === "number")this.totalNumberModuleIds.push( tColumn.moduleJson.id ); } } } }.bind(this)); }, _getTotalTr: function(){ return this.totalTr; }, _loadTotal: function(){ var totalData = {}; if (!this.totalFlag)return totalData; if (!this._getTotalTr())this._loadTotalTr(); var data; if( this.isShowAllSection ){ data = { data : [] }; Object.each( this.getBusinessDataById(), function (d, key) { if( !["data","total"].contains(key) ){ data.data = data.data.concat( d.data ) } }) }else if( this.isMergeRead ){ data = this.data; }else{ data = this.getValue(); } this.totalColumns.each(function(column, index){ var json = column.moduleJson; if(!json)return; var total = this._loadColumnTotal( column, data ); if( typeOf(total) !== "null" )totalData[json.id] = total; }.bind(this)); data.total = totalData; return totalData; }, _loadColumnTotal: function(column, data){ var json = column.moduleJson; if(!json)return; var pointLength = 0; //小数点后的最大数位 var tmpV; if (column.type === "count"){ tmpV = data.data.length; }else if(column.type === "number"){ tmpV = new Decimal(0); for (var i=0; i -1 ){ pointLength = Math.max(pointLength, v.split(".")[1].length); } } } } if( isNaN( tmpV ) ) { column.td.set("text", ""); return; } var s = tmpV.toString(), total; if( json.decimals && (json.decimals!=="*")){ total = this.formatDecimals( json, s.toFloat()); }else if( pointLength <= 0 || s === "0" ){ total = s; }else if( s.indexOf(".") > -1 ){ var length = s.split(".")[1].length; total = length < pointLength ? (s + "0".repeat(pointLength-length)) : s }else{ total = s +"."+ "0".repeat(pointLength); } column.td.set("text", this.formatSeparate( json, total ) ); if( json.currencySymbol ){ new Element("span", {"text": json.currencySymbol, "style":"padding-right:5px"}).inject( column.td, "top" ); } return total; }, formatDecimals: function( json, v ){ var str; if (json.decimals && (json.decimals!=="*")) { //小数点数位 var decimals = json.decimals.toInt(); var p = Math.pow(10, decimals); var f_x = Math.round(v * p) / p; str = f_x.toString(); if (decimals > 0) { var pos_decimal = str.indexOf('.'); if (pos_decimal < 0) { pos_decimal = str.length; str += '.'; } var decimalStr = (str).substr(pos_decimal + 1, (str).length); while (decimalStr.length < decimals) { str += '0'; decimalStr += 0; } } } return str || v.toString(); }, formatSeparate: function(json, str){ if( typeOf( str ) === "number" )str = str.toString(); if( json.digitsToSeparate && parseInt(json.digitsToSeparate) > 1 ){ var digits = parseInt(json.digitsToSeparate); var reg = new RegExp( "(\\d{"+digits+"}\\B)" ,"g"); var arr = str.split("."); var i = arr[0].split("").reverse().join("") .replace(reg, "$1,") .split("").reverse().join(""); str = arr.length > 1 ? ( i + "." + arr[1] ) : i ; } return str; }, isTotalNumberModule: function( id ){ return this.totalNumberModuleIds.contains(id) }, isShowSectionKey: function(){ return this.json.showSectionKey && this.isMergeRead ; }, isShowSectionBy: function(){ return this.json.showSectionBy && this.isShowAllSection ; }, isSectionData: function(){ //数据是否经过区段处理 var data = this.getBusinessDataById(); if( o2.typeOf( data ) === "object" ){ var keys = Object.keys(data); for( var i=0; i 0 ? this.sectionlineList[idx-1].getLastTr() : this.templateNode; if( map[data.sectionKey] ) { sectionLine = map[data.sectionKey]; sectionLine.setIndex( beforeNode, data, idx, isEdited, isNew, operation ); }else{ var node = this._createLineNode( beforeNode ); sectionLine = this._loadSectionLine_EditSection(node, data, idx, isEdited, isNew); } if( this.sectionBy && this.sectionBy === data.sectionKey ){ this.sectionLineEdited = sectionLine; } this.sectionlineList.push(sectionLine); }.bind(this)) if (callback) callback(); }, _loadSectionLine_EditSection: function(container, data, index, isEdited, isNew){ var sectionLine = new MWF.xApplication.process.Xform.DatatablePC.SectionLine(container, this, data, { index : index, indexText : (index+1).toString(), isNew: isNew, isEdited: typeOf(isEdited) === "boolean" ? isEdited : this.editable, isEditable: this.editable && this.isSectionLineEditable(data), isDeleteable: this.deleteable && this.isSectionLineEditable(data), isAddable: this.addable && this.isSectionLineEditable(data) }); // this.fireEvent("beforeLoadLine", [line]); sectionLine.load(); // this.fireEvent("afterLoadLine", [line]); return sectionLine; }, isSectionLineEditable: function(data){ return this.isShowAllSection && this.sectionBy && this.sectionBy === data.sectionKey; }, _loadSectionLineList: function(callback, operation){ var map = this.unchangedSectionLineMap || {}; this.dataWithSectionKey.each(function(data, idx){ var sectionLine; var isEdited = false; var isNew = false; var beforeNode = idx > 0 ? this.sectionlineList[idx-1].getLastTr() : this.templateNode; if( map[data.sectionKey] ) { sectionLine = map[data.sectionKey]; sectionLine.setIndex( beforeNode, data, idx, isEdited, isNew, operation ); }else { var node = this._createLineNode( beforeNode ); sectionLine = this._loadSectionLine(node, data, idx, isEdited, isNew); } this.sectionlineList.push(sectionLine); }.bind(this)) if (callback) callback(); }, _loadSectionLine: function(container, data, index, isEdited, isNew){ var sectionLine = new MWF.xApplication.process.Xform.DatatablePC.SectionLine(container, this, data, { index : index, indexText : (index+1).toString(), isNew: isNew, isEdited: typeOf(isEdited) === "boolean" ? isEdited : this.editable, isEditable: this.editable, isDeleteable: this.deleteable, isAddable: this.addable, isMergeRead: this.isMergeRead }); // this.fireEvent("beforeLoadLine", [line]); sectionLine.load(); // this.fireEvent("afterLoadLine", [line]); return sectionLine; }, _loadLineList: function(callback, operation){ var map = this.unchangedLineMap || {}; Object.each(map, function (line, idx) { line.setIndex( idx.toInt() ); }); this.data.data.each(function(data, idx){ if( !data )return; var idxStr = idx.toString(); var beforeNode = idx > 0 ? this.lineList[idx - 1].node : this.templateNode; if( map[idxStr] ){ if( !operation || operation === "moveUpList" ){ map[idxStr].node.inject( beforeNode, "after" ); } this.lineList.push( map[idxStr] ); }else{ var isNew = this.isNew || (o2.typeOf(this.newLineIndex) === "number" ? idx === this.newLineIndex : false); var isEdited = (!this.multiEditMode && o2.typeOf(this.newLineIndex) === "number") ? idx === this.newLineIndex : this.multiEditMode; var node = this._createLineNode( beforeNode ); var line = this._loadLine(node, data, idx, isEdited, isNew ); this.lineList.push(line); } }.bind(this)); this.isNew = false; this.newLineIndex = null; if (callback) callback(); }, _loadLine: function(container, data, index, isEdited, isNew){ var line = new MWF.xApplication.process.Xform.DatatablePC.Line(container, this, data, { index : index, indexText : (index+1).toString(), isNew: isNew, isEdited: typeOf(isEdited) === "boolean" ? isEdited : this.editable, isEditable: this.editable, isDeleteable: this.deleteable, isAddable: this.addable, isMergeRead: this.isMergeRead }); this.fireEvent("beforeLoadLine", [line]); line.load(); this.fireEvent("afterLoadLine", [line]); return line; }, isMax : function(){ var maxCount = this.json.maxCount ? this.json.maxCount.toInt() : 0; if( this.editable && maxCount > 0 ) { if( this.isShowAllSection ){ if( this.sectionLineEdited && this.sectionLineEdited.lineList.length >= maxCount )return true; }else{ if( this.lineList.length >= maxCount )return true; } } return false; }, isMin : function(){ var minCount = this.json.minCount ? this.json.minCount.toInt() : 0; if( this.editable && minCount > 0 ) { if( this.isShowAllSection ){ if( this.sectionLineEdited && this.sectionLineEdited.lineList.length <= minCount )return true; }else { if (this.lineList.length <= minCount) return true; } } return false; }, _setLineData: function(line, d){ if( line.sectionLine ){ var data = this.getBusinessDataById(); var sdata = data[ line.sectionLine.sectionKey ]; if( sdata && sdata.data ){ sdata.data[line.options.indexInSectionLine] = d; this.setAllSectionData( data, false, "setLineData" ); } }else{ var index = line.options.index; var data = this.getInputData(); data.data[index] = d; this.setData( data, false, "setLineData" ); } }, _addLine: function(ev, edited, d){ if( !this._completeLineEdit(ev, true) )return; if( this.isMax() ){ var text = MWF.xApplication.process.Xform.LP.maxItemCountNotice.replace("{n}",this.json.maxCount); this.form.notice(text,"info"); return false; } var data, index, line; if( this.isShowAllSection ){ data = this.getBusinessDataById(); var sdata = data[ this.sectionBy ]; if( !sdata ){ sdata = data[ this.sectionBy ] = { data: [] }; } index = sdata.data.length; // if( d && !d.sectionKey )d.sectionKey = this.sectionBy; // sectionKey: this.sectionBy sdata.data.push(d||{}); this.newLineIndex = index; this.setAllSectionData( data, false, "addLine"); line = this.sectionLineEdited.lineList[index]; line.isNewAdd = true; }else{ index = this.lineList.length; data = this.getInputData(); data.data.push(d||{}); this.newLineIndex = index; this.setData( data , false, "addLine"); line = this.getLine(index); line.isNewAdd = true; } this.validationMode(); this.fireEvent("addLine", [{"line":line, "ev":ev}]); this.fireEvent("change", [{"lines":[line], "type":"addline"}]); return line; }, _insertLine: function(ev, beforeLine){ if( !this._completeLineEdit(ev, true) )return; if( this.isMax() ){ var text = MWF.xApplication.process.Xform.LP.maxItemCountNotice.replace("{n}",this.json.maxCount); this.form.notice(text,"info"); return false; } //使用数据驱动 var data, index, line; if( this.isShowAllSection ){ index = beforeLine.options.indexInSectionLine + 1; data = this.getBusinessDataById(); var sdata = data[ this.sectionBy ]; if( !sdata ){ sdata = data[ this.sectionBy ] = { data: [] }; } sdata.data.splice(index, 0, {}); this.newLineIndex = index; this.setAllSectionData( data, false, "insertLine"); line = this.sectionLineEdited.lineList[index]; line.isNewAdd = true; }else { index = beforeLine.options.index + 1; data = this.getInputData(); data.data.splice(index, 0, {}); this.newLineIndex = index; this.setData(data, false, "insertLine"); line = this.getLine(index); line.isNewAdd = true; } this.validationMode(); this.fireEvent("addLine",[{"line":line, "ev":ev}]); this.fireEvent("change", [{"lines":[line], "type":"addline"}]); return line; }, _insertLineByIndex: function(ev, index, d){ if( !this._completeLineEdit(ev, true) )return; if( this.isMax() ){ var text = MWF.xApplication.process.Xform.LP.maxItemCountNotice.replace("{n}",this.json.maxCount); this.form.notice(text,"info"); return false; } var data, line; if( this.isShowAllSection ){ data = this.getBusinessDataById(); var sdata = data[ this.sectionBy ]; if( !sdata ){ sdata = data[ this.sectionBy ] = { data: [] }; } if (sdata.data.length < index) return null; sdata.data.splice(index, 0, d || {}); this.newLineIndex = index; this.setAllSectionData( data , false, "insertLine" ); line = this.sectionLineEdited.lineList[index]; line.isNewAdd = true; }else { //使用数据驱动 data = this.getInputData(); if (data.data.length < index) return null; data.data.splice(index, 0, d || {}); this.newLineIndex = index; this.setData(data, false, "insertLine"); line = this.getLine(index); line.isNewAdd = true; } this.validationMode(); this.fireEvent("addLine",[{"line":line, "ev":ev}]); this.fireEvent("change", [{"lines":[line], "type":"addline"}]); return line; }, _deleteSelectedLine: function(ev){ var selectedLine = this.lineList.filter(function (line) { return line.selected; }); if( selectedLine.length === 0 ){ this.form.notice( MWF.xApplication.process.Xform.LP.selectItemNotice,"info"); return false; } var minCount = this.json.minCount ? this.json.minCount.toInt() : 0; if( minCount > 0 ){ if( this.lineList.length - selectedLine.length < minCount ){ var text = MWF.xApplication.process.Xform.LP.minItemNotice.replace("{n}", minCount ); this.form.notice(text,"info"); return false; } } var _self = this; this.form.confirm("warn", ev, MWF.xApplication.process.Xform.LP.deleteDatagridLineTitle, MWF.xApplication.process.Xform.LP.deleteSelectedItemNotice, 300, 120, function(){ _self._delLines( selectedLine ); this.close(); }, function(){ this.close(); }, null, null, this.form.json.confirmStyle); }, _delLines: function(lines){ var _self = this; var saveFlag = false; var data; if( this.isShowAllSection ){ data = this.getBusinessDataById(); }else{ data = _self.getInputData(); } lines.reverse().each(function(line){ _self.fireEvent("deleteLine", [line]); if(line.deleteAttachment())saveFlag = true; if( line.sectionLine ){ var d = data[ line.sectionLine.sectionKey ]; if( d && d.data ){ d.data.splice(line.options.indexInSectionLine, 1); if(this.currentEditedLine === line)this.currentEditedLine = null; } }else { data.data.splice(line.options.index, 1); if (this.currentEditedLine === line) this.currentEditedLine = null; } _self.fireEvent("afterDeleteLine"); }); if( this.isShowAllSection ){ _self.setAllSectionData(data, false, "deleteLines"); }else{ _self.setData( data , false, "deleteLines"); } this.validationMode(); _self.fireEvent("change", [{"lines":lines, "type":"deletelines"}]); if(saveFlag)this.saveFormData(); }, _deleteLine: function(ev, line){ if( !this._completeLineEdit(ev, true) )return; if( this.isMin() ){ var text = MWF.xApplication.process.Xform.LP.minItemCountNotice.replace("{n}", this.json.minCount ); this.form.notice(text,"info"); return false; } var _self = this; this.form.confirm("warn", ev, MWF.xApplication.process.Xform.LP.deleteDatagridLineTitle, MWF.xApplication.process.Xform.LP.deleteDatagridLine, 300, 120, function(){ _self._delLine(line); this.close(); }, function(){ this.close(); }, null, null, this.form.json.confirmStyle); }, _delLine: function(line){ this.fireEvent("deleteLine", [line]); var saveFlag = line.deleteAttachment(); //使用数据驱动 var data; if( line.sectionLine ){ var data = this.getBusinessDataById(); var d = data[ line.sectionLine.sectionKey ]; if( d && d.data ){ d.data.splice(line.options.indexInSectionLine, 1); } if(this.currentEditedLine === line)this.currentEditedLine = null; this.setAllSectionData( data, false, "deleteLine" ); }else{ data = this.getInputData(); data.data.splice(line.options.index, 1); if(this.currentEditedLine === line)this.currentEditedLine = null; this.setData( data , false, "deleteLine"); } this.validationMode(); this.fireEvent("afterDeleteLine"); this.fireEvent("change", [{"lines":[line], "type":"deleteline"}]); if(saveFlag)this.saveFormData(); }, _cancelLineEdit: function(){ var line = this.currentEditedLine; if( !line )return true; line.validationMode(); if( line.isNewAdd ){ // var saveFlag = line.deleteAttachment(); this._delLine( line ); this.currentEditedLine = null; // if(saveFlag)this.form.saveFormData(); }else{ // line.data = Object.clone(line.getOriginalDataWithCheckAttachment()); line.resetDataWithOriginalData(); line.changeEditMode(false); this._loadTotal(); if( line.sectionLine )line.sectionLine._loadTotal(); if(line.attachmentChangeFlag){ this.saveFormData(); line.attachmentChangeFlag = false; } this.currentEditedLine = null; this.fireEvent("cancelLineEdit", [line]); } return true; }, _completeLineEdit: function( ev, fireChange, ignoerSave ){ var line = this.currentEditedLine; if( !line )return true; if( !line.validation() )return false; var originalDataStr, dataStr; if( fireChange ){ if( line.originalData && o2.typeOf(line.originalData) === "object"){ originalDataStr = JSON.stringify(line.originalData) } dataStr = JSON.stringify(line.data); } line.isNewAdd = false; // line.data = line.getData(); line.computeModuleData("save"); line.originalData = Object.clone(line.data); line.changeEditMode(false); this._loadTotal(); if( line.sectionLine )line.sectionLine._loadTotal(); if(line.attachmentChangeFlag && !ignoerSave){ this.saveFormData(); line.attachmentChangeFlag = false; } this.currentEditedLine = null; this.validationMode(); this.fireEvent("completeLineEdit", [line]); if( fireChange && originalDataStr !== dataStr ){ this.fireEvent("change", [{"lines":[line], "type":"editcomplete"}]); } return true; }, _moveUpLine: function(ev, line){ if( this.currentEditedLine && !this._completeLineEdit(null, true) )return false; var data, upData, curData; if( this.isShowAllSection ){ if (line.options.indexInSectionLine === 0) return; data = this.getBusinessDataById(); var sdata = data[ this.sectionBy ]; if( !sdata )return; upData = sdata.data[line.options.indexInSectionLine - 1]; curData = sdata.data[line.options.indexInSectionLine]; sdata.data[line.options.indexInSectionLine] = upData; sdata.data[line.options.indexInSectionLine - 1] = curData; this.setAllSectionData( data, false, "moveUpList" ); }else { if (line.options.index === 0) return; data = this.getInputData(); upData = data.data[line.options.index - 1]; curData = data.data[line.options.index]; data.data[line.options.index] = upData; data.data[line.options.index - 1] = curData; this.setData(data, false, "moveUpList"); } this.fireEvent("change", [{lines: this.lineList, "type":"move"}]); }, _changeEditedLine: function(line){ if( this.currentEditedLine ){ if( line === this.currentEditedLine )return; if( !this._completeLineEdit( null,true ) )return; } line.changeEditMode(true); /** * 数据表格当前正在编辑的条目,当数据表格为“同时编辑多行”时无此属性。 * @member {MWF.xApplication.process.Xform.DatatablePC.Line | MWF.xApplication.process.Xform.DatatableMobile.Line | Null} * @example * //获取数据表格“dt1”的正在编辑的条目。 * var line = this.form.get("dt1").currentEditedLine; * //获取数据 * var data = line.getData(); * //设置数据 * line.setData({"subject":"111"}); * //获取subject字段的值 * var data = line.get("subject").getData(); * //设置subject字段的值 * line.get("subject").setData("test1"); */ this.currentEditedLine = line; }, // editValidation: function(){ // var flag = true; // this.editModules.each(function(field, key){ // if (field.json.type!=="sequence" && field.validationMode ){ // field.validationMode(); // if (!field.validation()) flag = false; // } // }.bind(this)); // return flag; // }, _afterLoaded: function(){ }, // /** // * @summary 重置数据表格的值为默认值或置空。 // * @example // * this.form.get('fieldId').resetData(); // */ resetData: function(){ //var value = this.getDefaultValue() || {"data": [], "total":{}}; var value = this.getValue(); this.setData( value , false ); }, /**当参数为Promise的时候,请查看文档: {@link https://www.yuque.com/o2oa/ixsnyt/ws07m0|使用Promise处理表单异步}
* 当表单上没有对应组件的时候,可以使用this.data[fieldId] = data赋值。 * @summary 为数据表格赋值,如果需要设置所有区段数据请使用setAllSectionData方法。 * @param data{DatatableData|Promise} 必选,数组或Promise. * @param fireChange{boolean} 可选,是否触发change事件,默认false. * @example * this.form.get("fieldId").setData({data:[]}); //赋空值 * @example * //如果无法确定表单上是否有组件,需要判断 * if( this.form.get('fieldId') ){ //判断表单是否有无对应组件 * this.form.get('fieldId').setData( data ); * }else{ * this.data['fieldId'] = data; * } *@example * //使用Promise * var field = this.form.get("fieldId"); * var promise = new Promise(function(resolve, reject){ //发起异步请求 * var oReq = new XMLHttpRequest(); * oReq.addEventListener("load", function(){ //绑定load事件 * resolve(oReq.responseText); * }); * oReq.open("GET", "/data.json"); //假设数据存放在data.json * oReq.send(); * }); * promise.then( function(){ * var data = field.getData(); //此时由于异步请求已经执行完毕,getData方法获得data.json的值 * }) * field.setData( promise ); */ setData: function(data, fireChange, operation){ if (!data){ data = this._getValue(); }else{ //todo 计算total } this._setData(data, fireChange, operation); }, _setData: function(data, fireChange, operation){ var p = o2.promiseAll(this.data).then(function(v){ this.data = v; // if (o2.typeOf(data)==="object") data = [data]; this.__setData(data, fireChange, operation); this.moduleValueAG = null; return v; }.bind(this), function(){ this.moduleValueAG = null; }.bind(this)); this.moduleValueAG = p; if (this.moduleValueAG) this.moduleValueAG.then(function(){ this.moduleValueAG = null; }.bind(this), function(){ this.moduleValueAG = null; }.bind(this)); }, __setData: function(data, fireChange, operation){ // if( typeOf( data ) === "object" && typeOf(data.data) === "array" ){ if( this.isShowAllSection ){ //兼容外部对编辑当前区段的setData,内部的setData不走这里,直接走setAllSectionData this._setEditedSectionData(data, fireChange, operation); return; }else if( this.isMergeRead ){ //合并且只读,不允许setData throw new Error("The data table is merged and read-only, you can use the 'setAllSectionData' method to set all section data"); } var old; if(fireChange)old = Object.clone(this._getBusinessData() || {}); this._setUnchangedLineMap(data, operation); this._setBusinessData(data); this.data = data; if (this.data){ this.clearSubModules(); } this.lineList = []; this.sectionlineList = []; if( this.currentEditedLine )this.currentEditedLine = null; this._loadDatatable( function () { if (fireChange && JSON.stringify(old) !== JSON.stringify(data)) this.fireEvent("change"); this.unchangedLineMap = null; }.bind(this), operation); }, _setEditedSectionData: function(data, fireChange, operation){ if( this.isShowAllSection ){ var d = this.getBusinessDataById(); d[ this.sectionBy ] = data || { data: [] }; this.setAllSectionData( d, fireChange , operation); } }, deleteAttachment: function( attId ){ this.form.workAction.deleteAttachment(attId, this.form.businessData.work.id); }, saveFormData: function(){ this.form.saveFormData(); }, /** * @summary 当数据表格设置为区段合并展现、区段合并编辑时,可以使用本方法设置所有区段数据。 * @param data{Object} 必选,对象. * @param fireChange{boolean} 可选,是否触发change事件,默认false. * @example * this.form.get("fieldId").setAllSectionData({}); //赋空值 * @example * this.data['fieldId'].setAllSectionData({ * "3455b82a-399c-4ee4-b9b9-e70ae40fbaf1": { //区段1的key和data * "data": [ * { * "good": "yf", * "number_2": 11, * "prize": 1 * } * ] * }, * "83de86fc-60bc-4b4c-955c-1085915865a4": { //区段2的key和data * "data": [ * { * "good": "yf", * "number_2": 11, * "prize": 10 * } * ] * } * }); */ setAllSectionData: function(data, fireChange, operation){ // if( this.isSectionMergeEdit() ){ // //合并且编辑,不允许setAllSectionData // throw new Error("The data table is in merge editing state, you can use the 'setData' method to set the data"); // } var old; if(fireChange)old = Object.clone(this.getBusinessDataById() || {}); //删除并没有用,因为会对比数据提交,如果要清空可以给data.data = []; data.total = {} // if( data && data.data )delete data.data; // if( data && data.total )delete data.total; this._setUnchangedSectionLineMap(data); this.setBusinessDataById(data); if( operation ){ this.data = this.isShowAllSection ? this._getAllSectionData() : data; }else{ this.checkMerge(data); } if (this.data){ this.clearSubModules(); } if (fireChange && JSON.stringify(old) !== JSON.stringify(data)) this.fireEvent("change"); this.lineList = []; this.sectionlineList = []; if( this.currentEditedLine )this.currentEditedLine = null; this._loadDatatable(function () { Object.each(this.unchangedSectionLineMap, function(sline, key){ sline.isUnchangedAll = null; sline.unchangedLineMap = null; }); this.unchangedSectionLineMap = null; }.bind(this), operation); }, checkMerge: function(data){ //区段合并后编辑 var isMergeEidt = this.isSectionMergeEdit(); if( isMergeEidt ){ //区段合并,删除区段值合并数据后编辑 if( this.json.mergeTypeEdit === "script" ){ this._loadMergeEditNodeByScript(); }else{ this._loadMergeEditNodeByDefault(); } } //区段合并展现 this.isMergeRead = this.isSectionMergeRead(); //启用区段且显示所有区段 this.sectionBy = this._getSectionBy(); this.isShowAllSection = this.isAllSectionShow(); if( this.isShowAllSection ){ this.data = this._getAllSectionData(); }else if( this.isMergeRead ) { this.data = this.getSectionMergeReadData(); }else if( isMergeEidt ){ this.data = this._getBusinessData() }else{ this.data = data; } }, _setUnchangedSectionLineMap: function( data, operation ){ if( !data ){ return; } var map = {}; if( this.sectionlineList && this.sectionlineList.length ){ this.sectionlineList.each(function (sline, i) { for( var key in data ){ if( key === sline.sectionKey ){ var m = sline._setUnchangedLineMap(data[key], operation); if( m )map[key] = m; break; } } }.bind(this)); } this.unchangedSectionLineMap = map; }, _setUnchangedLineMap: function(data, operation){ if( !data ){ this.unchangedLineMap = {}; return; } var fromOutside = !operation; var lineDataList = this.lineList.map(function (line) { if( line.options.isEditable !== this.editable )return ""; if( line.options.isDeleteable !== this.deleteable )return ""; if( line.options.isAddable !== this.addable )return ""; return fromOutside ? JSON.stringify(line.data) : line.data; }.bind(this)); var dStr, map = {}; data.data.each(function (d, idx) { if(fromOutside)dStr = JSON.stringify(d); for (var i = 0; i < this.lineList.length; i++) { var isEqual= fromOutside ? (dStr === lineDataList[i]) : (d === lineDataList[i] ); if ( isEqual ) { map[idx] = this.lineList[i]; lineDataList[i] = ""; break; } } }.bind(this)); this.unchangedLineMap = map; }, clearSubModules: function(){ if( this.sectionlineList && this.sectionlineList.length ){ this.sectionlineList.each(function (sline, i) { sline.clearSubModules(); }.bind(this)); }else{ var map = this.unchangedLineMap || {}; var lines = []; Object.values(map).each(function (d) { lines = lines.concat(d); }); for (var i=0; i * 1、当使用Promise的时候
* 使用异步函数生成器(Promise)为组件赋值的时候,用getData方法立即获取数据,可能返回修改前的值,当Promise执行完成以后,会返回修改后的值。
* this.data[fieldId] 立即获取数据,可能获取到异步函数生成器,当Promise执行完成以后,会返回修改后的值。
* {@link https://www.yuque.com/o2oa/ixsnyt/ws07m0#EggIl|具体差异请查看链接}
* 2、当表单上没有对应组件的时候,可以使用this.data[fieldId]获取值,但是this.form.get('fieldId')无法获取到组件。 * @summary 获取数据表格数据. * @example * var data = this.form.get('fieldId').getData(); *@example * //如果无法确定表单上是否有组件,需要判断 * var data; * if( this.form.get('fieldId') ){ //判断表单是否有无对应组件 * data = this.form.get('fieldId').getData(); * }else{ * data = this.data['fieldId']; //直接从数据中获取字段值 * } * @example * //使用Promise * var field = this.form.get("fieldId"); * var promise = new Promise(function(resolve, reject){ //发起异步请求 * var oReq = new XMLHttpRequest(); * oReq.addEventListener("load", function(){ //绑定load事件 * resolve(oReq.responseText); * }); * oReq.open("GET", "/data.json"); //假设数据存放在data.json * oReq.send(); * }); * promise.then( function(){ * var data = field.getData(); //此时由于异步请求已经执行完毕,getData方法获得data.json的值 * }) * field.setData( promise ); * @return {DatatableData} */ getData: function(){ if( this.importer ){ this.importer.destroySimulateModule(); } if (this.editable!==false){ // this.lineList.each(function(line, index){ // if( !this.multiEditMode && line.options.isEdited ){ // line.data = line.getData(); // }else{ // line.data = line.getData(); // } // }); if( this.multiEditMode){ this.lineList.each(function (line) { line.computeModuleData("save"); }) } return this._getBusinessData(); }else{ return this._getBusinessData(); } }, getInputData: function(){ if( this.importer ){ this.importer.destroySimulateModule(); } if (this.editable!==false){ return this._getBusinessData(); }else{ return this._getBusinessData(); } }, //区段依据 _getSectionBy: function(){ if (this.json.section!=="yes"){ return ""; }else { switch (this.json.sectionBy){ case "person": return layout.desktop.session.user.id; case "unit": return (this.form.businessData.task) ? this.form.businessData.task.unit : ""; case "activity": return (this.form.businessData.work) ? this.form.businessData.work.activity : ""; case "splitValue": return (this.form.businessData.work) ? this.form.businessData.work.splitValue : ""; case "script": if( this.json.sectionByScript && this.json.sectionByScript.code){ return this.form.Macro.exec(this.json.sectionByScript.code, this) || ""; }else{ return ""; } default: return ""; } } }, createErrorNode: function(text){ var node = new Element("div"); var iconNode = new Element("div", { "styles": { "width": "20px", "height": "20px", "float": "left", "background": "url("+"../x_component_process_Xform/$Form/default/icon/error.png) center center no-repeat" } }).inject(node); var textNode = new Element("div", { "styles": { "line-height": "20px", "margin-left": "20px", "color": "red", "word-break": "keep-all" }, "text": text }).inject(node); return node; }, notValidationMode: function(text){ if (!this.isNotValidationMode){ this.isNotValidationMode = true; this.node.store("borderStyle", this.node.getStyles("border-left", "border-right", "border-top", "border-bottom")); this.node.setStyle("border", "1px solid red"); this.errNode = this.createErrorNode(text).inject(this.node, "after"); this.showNotValidationMode(this.node); var parentNode = this.errNode; while( parentNode && parentNode.offsetParent === null ){ parentNode = parentNode.getParent(); } if (parentNode && !parentNode.isIntoView()) parentNode.scrollIntoView(false); } }, showNotValidationMode: function(node){ var p = node.getParent("div"); if (p){ if (p.get("MWFtype") == "tab$Content"){ if (p.getParent("div").getStyle("display")=="none"){ var contentAreaNode = p.getParent("div").getParent("div"); var tabAreaNode = contentAreaNode.getPrevious("div"); var idx = contentAreaNode.getChildren().indexOf(p.getParent("div")); var tabNode = tabAreaNode.getLast().getFirst().getChildren()[idx]; tabNode.click(); p = tabAreaNode.getParent("div"); } } this.showNotValidationMode(p); } }, validationMode: function(){ if (this.isNotValidationMode){ this.isNotValidationMode = false; this.node.setStyles(this.node.retrieve("borderStyle")); if (this.errNode){ this.errNode.destroy(); this.errNode = null; } } this.lineList.each(function(line){ line.validationMode(); }) }, validationConfigItem: function(routeName, data){ var flag = (data.status=="all") ? true: (routeName == data.decision); if (flag){ //??? var n = this.getInputData(); if( o2.typeOf(n)==="object"){ var arr = []; Object.each( n, function (d, key) { if(o2.typeOf(d) === "array")arr = arr.concat(d); }); n = arr; } var v = (data.valueType=="value") ? n : n.length; switch (data.operateor){ case "isnull": if (!v){ this.notValidationMode(data.prompt); return false; } break; case "notnull": if (v){ this.notValidationMode(data.prompt); return false; } break; case "gt": if (v>data.value){ this.notValidationMode(data.prompt); return false; } break; case "lt": if (v 0 ? this.lineList[idx - 1].node : this.sectionKeyNode; if( map[idxStr] ){ if( !operation || operation === "moveUpList" ){ map[idxStr].node.inject( beforeNode, "after" ); } this.lineList.push( map[idxStr] ); this.datatable.lineList.push(map[idxStr]); }else{ var node = this._createLineNode( beforeNode ); var isEdited = false, isNew = false; if( this.options.isEdited ){ var dt = this.datatable; isNew = dt.isNew || (o2.typeOf(dt.newLineIndex) === "number" ? idx === dt.newLineIndex : false); isEdited = (!dt.multiEditMode && o2.typeOf(dt.newLineIndex) === "number") ? idx === dt.newLineIndex : dt.multiEditMode; dt.isNew = false; dt.newLineIndex = null; } var line = this._loadLine( node, d, idx, isEdited, isNew ); this.lineList.push(line); this.datatable.lineList.push(line); } }.bind(this)) } if( this.totalTr )this.totalTr.inject( this.lineList.getLast().node, "after" ); this._loadTotal(); }, _loadLine: function(container, data, index, isEdited, isNew){ var line = new MWF.xApplication.process.Xform.DatatablePC.Line(container, this.datatable, data, { indexInSectionLine : index, indexInSectionLineText : (index+1).toString(), index: this.datatable.lineList.length, indexText : (this.datatable.lineList.length + 1).toString(), isNew: isNew, isEdited: typeOf(isEdited) === "boolean" ? isEdited : this.options.isEdited, isEditable: this.options.isEditable, isDeleteable: this.options.isDeleteable, isAddable: this.options.isAddable, isMergeRead: this.options.isMergeRead, sectionKey: this.sectionKey }, this); this.datatable.fireEvent("beforeLoadLine", [line]); line.load(); this.datatable.fireEvent("afterLoadLine", [line]); return line; }, _createLineNode: function( beforeNode ){ var tr; if( beforeNode ){ tr = new Element("tr").inject(beforeNode, "after"); }else if( this.totalTr ){ tr = new Element("tr").inject(this.totalTr, "before"); }else{ tr = this.datatable._createLineNode(); // tr = new Element("tr").inject(this.tBody || this.table); } return tr; }, loadSectionKeyNode: function () { var styleName = this.datatable.isShowSectionKey() ? "sectionKeyStyles" : "sectionByStyles"; var sectionKeyStyles = this.datatable._parseStyles( this.datatable.json[styleName] || {} ); var keyNode = new Element("td.mwf_sectionkey", { colspan: this.datatable.columnCount, styles : sectionKeyStyles }).inject( this.sectionKeyNode ); this.keyNode = keyNode; var separator; if( this.datatable.isShowSectionKey() ){ separator = this.datatable.json.keyContentSeparator; }else{ separator = this.datatable.json.keyContentSeparatorSectionBy; } this.datatable.getSectionKeyWithMerge( this.data, function (key) { if( o2.typeOf(key) === "string" ){ keyNode.set("text", key + (separator || "")); }else{ Promise.resolve(key).then(function (k) { keyNode.set("text", k + (separator || "")); }.bind(this)) } }.bind(this)); }, _setUnchangedLineMap: function(data, operation){ var fromOutside = !operation; var dt = this.datatable; var editalbe; if( dt.isShowAllSection ){ editalbe = dt.isShowAllSection && dt.sectionBy && dt.sectionBy === this.sectionKey; } var lineDataList = this.lineList.map(function (line) { if( dt.isShowAllSection ){ if( line.options.isEditable !== (dt.editable && editalbe) )return ""; if( line.options.isDeleteable !== (dt.deleteable && editalbe) )return ""; if( line.options.isAddable !== (dt.addable && editalbe) )return ""; }else{ if( line.options.isEditable !== dt.editable )return ""; if( line.options.isDeleteable !== dt.deleteable )return ""; if( line.options.isAddable !== dt.addable )return ""; } return fromOutside ? JSON.stringify(line.data) : line.data; }.bind(this)); var dStr, map = {}; data.data.each(function (d, idx) { if(fromOutside)dStr = JSON.stringify(d); for (var i = 0; i < this.lineList.length; i++) { var isEqual = fromOutside ? (dStr === lineDataList[i]) : (d === lineDataList[i] ); if ( isEqual ) { map[idx] = this.lineList[i]; lineDataList[i] = ""; break; } } }.bind(this)); this.isUnchangedAll = data.data.length === this.lineList.length; if( this.isUnchangedAll ){ for( var i=0; i 0; if( !hasUnchangedLine ){ if( this.sectionKeyNode ){ this.sectionKeyNode.destroy(); this.sectionKeyNode = null; } } var lines = []; Object.values(map).each(function (d) { lines = lines.concat(d); }); for (var i=0; i 0 ){ tColumn.moduleJson = this.form._getDomjson(moduleNodes[0]); if(tColumn.type === "number")this.totalNumberModuleIds.push( tColumn.moduleJson.id ); } } } }.bind(this)); }, _getTotalTr: function(){ return this.totalTr; }, _loadTotal: function(){ var totalData = {}; if( !this.datatable.totalFlag )return totalData; if (!this._getTotalTr())this._loadTotalTr(); var data; if( this.datatable.isShowAllSection ){ Object.each( this.datatable.getBusinessDataById(), function (d, k) { if( this.sectionKey === k )data = d }.bind(this)) }else{ data = this.data.data; } this.totalColumns.each(function(column, index){ var json = column.moduleJson; if(!json)return; var total = this.datatable._loadColumnTotal( column, data ); if( typeOf(total) !== "null" )totalData[json.id] = total; }.bind(this)); data.total = totalData; return totalData; }, isTotalNumberModule: function( id ){ return this.totalNumberModuleIds.contains(id) }, getLastTr: function () { if( this.totalTr )return this.totalTr; if( this.lineList.length )return this.lineList.getLast().node; return this.sectionKeyNode; } }); MWF.xApplication.process.Xform.DatatablePC.Line = new Class({ Implements: [Options, Events], options: { isNew: false, isEdited : true, //是否正在编辑 isEditable : true, //能否被编辑 isDeleteable: true, //能否被删除 isAddable: true, //能否添加 isMergeRead: false, //合并阅读 index : 0, indexText : "0", indexInSectionLine: 0, indexInSectionLineText : "0", sectionKey: "" }, initialize: function (node, datatable, data, options, sectionLine) { this.setOptions(options); this.node = node; this.datatable = datatable; this.data = data; this.form = this.datatable.form; this.sectionLine = sectionLine; // if( !this.datatable.multiEditMode && !this.options.isNew){ // this.originalData = Object.clone(data); // } this.init() }, init: function(){ this.modules = []; this.all = {}; this.all_templateId = {}; this.fields = []; this.allField = {}; this.allField_templateId = {}; this.changedAttachmentMap = {}; }, load: function(){ if( !this.datatable.multiEditMode && this.options.isEdited )this.datatable.currentEditedLine = this; this.loadModules(); this.loadSequence(); this.createActions(); this.loadZebraStyle(); this.loadEditedStyle(); this.addNodeEvent(); if( !this.datatable.multiEditMode )this.originalData = Object.clone(this.data); // if(this.options.isNew && this.options.isEdited){ // this.data = this.getData(); // if( !this.datatable.multiEditMode )this.originalData = Object.clone(this.data); // this.options.isNew = false; // } }, resetId: function(){ this.setIndex(); }, setIndex: function(index, indexInSectionLine){ var hasIndexArg = typeOf(index) !== "null"; var hasIndexInSectionLineArg = typeOf(indexInSectionLine) !== "null"; if( hasIndexArg && hasIndexInSectionLineArg){ if( this.options.index === index && this.options.indexInSectionLine === indexInSectionLine )return; }else if( hasIndexArg && !hasIndexInSectionLineArg){ if( this.options.index === index )return; }else if(!hasIndexArg && hasIndexInSectionLineArg){ if( this.options.indexInSectionLine === indexInSectionLine )return; } if( hasIndexArg ){ this.options.index = index; this.options.indexText = (index.toInt()+1).toString(); } if( hasIndexInSectionLineArg ){ this.options.indexInSectionLine = indexInSectionLine; this.options.indexInSectionLineText = (indexInSectionLine.toInt()+1).toString(); } //合并状态或拆分状态 var sectionKey = this.options.sectionKey || this.datatable.sectionBy; this.modules.each(function (module) { var json = module.json; var id, oldId = json.id, templateJsonId = json.originialId; if( this.datatable.isShowAllSection ){ id = this.datatable.json.id + ".." + sectionKey + "..data.." + this.options.indexInSectionLine + ".." + json.originialId; }else if( sectionKey ){ id = this.datatable.json.id + ".." + sectionKey + "..data.." + this.options.index + ".." + json.originialId; }else{ id = this.datatable.json.id + "..data.." + this.options.index + ".." + json.originialId; } json.id = id; switch (module.json.type) { case "Select": (module.areaNode || module.node).set("id", id); break; default: module.node.set("id", id); break; } if( json.type==="Attachment" || json.type==="AttachmentDg" ){ json.site = this.getAttachmentSite(json, templateJsonId, sectionKey); } delete this.all[oldId]; this.all[id] = module; delete this.allField[oldId]; this.allField[id] = module; if(this.form.all[oldId] && this.form.all[oldId] === module){ delete this.form.all[oldId]; } this.form.all[id] = module; if(this.form.forms[oldId] && this.form.forms[oldId] === module){ delete this.form.forms[oldId]; } if( module.field )this.form.forms[id] = module; if( hasIndexArg || hasIndexInSectionLineArg ){ this.loadSequence(); this.loadZebraStyle(); } }.bind(this)); }, loadModules: function(){ this.node.set("html", this.datatable.templateHtml); var moduleNodes = this.form._getModuleNodes(this.node, true); //合并状态或拆分状态 var sectionKey = this.options.sectionKey || this.datatable.sectionBy; moduleNodes.each(function (node) { var mwfType = node.get("MWFtype"); if (mwfType === "form")return; var _self = this; var tJson = this.form._getDomjson(node); if( tJson ){ var json = Object.clone(tJson); if( !this.options.isEdited || !this.options.isEditable ){ if( json.hasOwnProperty('showMode') ){ json.showMode = 'read'; }else{ json.isReadonly = true; } } var templateJsonId = json.id; var index = this.options.index; var id; if( this.datatable.isShowAllSection ){ id = this.datatable.json.id + ".." + sectionKey + "..data.." + this.options.indexInSectionLine + ".." + json.id; }else if( sectionKey ){ id = this.datatable.json.id + ".." + sectionKey + "..data.." + index + ".." + json.id; }else{ id = this.datatable.json.id + "..data.." + index + ".." + json.id; } json.originialId = templateJsonId; json.id = id; node.set("id", id); if( json.type==="Attachment" || json.type==="AttachmentDg" ){ json.type = "AttachmentDg"; json.ignoreSite = true; json.site = this.getAttachmentSite(json, templateJsonId, sectionKey); } if (this.form.all[id]) this.form.all[id] = null; if (this.form.forms[id])this.form.forms[id] = null; var hasData = this.data.hasOwnProperty(templateJsonId); var module = this.form._loadModule(json, node, function () { if( _self.options.isMergeRead ){ this.field = false; //不希望保存数据 this._getBusinessData = function(){ return _self.data[templateJsonId]; }; this._setBusinessData = function () {}; } if( _self.widget )this.widget = _self.widget; this.parentLine = _self; this.parentDatatable = _self.datatable; //只读方法值在页面加载的时候或者new的时候计算一下 if( this.json.compute === "show" ){ var needComputeShow = false; if( _self.datatable.loading ) { needComputeShow = true; }else if( _self.options.isNew && !_self.reloading ){ needComputeShow = true; } if( !needComputeShow ){ this.json.compute = "create"; // if( this.options.moduleEvents && this.options.moduleEvents.length ){ //恢复compute var eventName = ( this.options.moduleEvents || [] ).contains("afterLoad") ? "afterLoad" : "load"; var resetCompute = function () { this.json.compute = "show"; this.removeEvent( eventName, resetCompute ); }.bind(this) this.addEvent(eventName, resetCompute); } } } }); if(!module.parentLine)module.parentLine = this; if(!module.parentDatatable)module.parentDatatable = this.datatable; if((json.type==="Attachment" || json.type==="AttachmentDg")){ module.addEvent("change", function(){ if( this.datatable.multiEditMode ){ _self.datatable.saveFormData(); }else{ _self.attachmentChangeFlag = true; } }.bind(this)) } this.form.modules.push(module); this.modules.push(module); this.all[id] = module; this.all_templateId[templateJsonId] = module; if (module.field) { // if(hasData){ // module.setData(this.data[templateJsonId]); // }else if(this.options.isEdited){ // this.data[templateJsonId] = module.getData(); // } if(this.options.isEdited ) { if (json.type !== "Attachment" && json.type !== "AttachmentDg"){ if( module.json.compute === "save" && module.getInputData ){ this.data[templateJsonId] = module.getInputData(); }else{ this.data[templateJsonId] = module.getData(); } } }else if(!hasData && module.getValue ){ this.data[templateJsonId] = module.getValue(); } this.allField[id] = module; this.allField_templateId[templateJsonId] = module; this.fields.push( module ); if( this.options.isEdited && this.datatable.multiEditMode ){ module.addEvent("change", function(){ this.datatable.fireEvent("change", [{lines: [this], type: "editmodule", module: module}]); }.bind(this)) } //该字段是合集数值字段 if(this.datatable.multiEditMode && this.isTotalNumberModule(templateJsonId)){ //module module.addEvent("change", function(){ this.datatable._loadTotal(); if( this.sectionLine )this.sectionLine._loadTotal(); }.bind(this)) } } } }.bind(this)); }, isTotalNumberModule: function(id){ if( this.sectionLine ){ return this.sectionLine.isTotalNumberModule(id) }else{ return this.datatable.isTotalNumberModule(id) } }, getIndex: function(){ return this.options.index; }, getModule: function(templateJsonId){ var _subform = this.datatable.json._subform; if( _subform ){ var module = this.all_templateId[_subform+"_"+templateJsonId]; if( module )return module; } return this.all_templateId[templateJsonId]; }, get: function(templateJsonId){ return this.getModule( templateJsonId ); }, getAttachmentSite: function(json, templateJsonId, sectionKey){ //确保site最长为64,否则后台会报错 var index = this.options.index; var baseSite; baseSite = "." + index + "." + (json.site || templateJsonId); var maxLength; var sectionId = ""; if( sectionKey ){ maxLength = Math.floor((63 - baseSite.length)/2 ); sectionId = (sectionKey.length > maxLength) ? sectionKey.substr(sectionKey.length-maxLength, maxLength) : sectionKey; sectionId = "." + sectionId; }else{ maxLength = 64 - baseSite.length; } var templateId = this.datatable.json.id; templateId = (templateId.length > maxLength) ? templateId.substr(templateId.length-maxLength, maxLength) : templateId; return templateId + sectionId + baseSite; }, deleteAttachment: function(){ var saveFlag = false; for( var key in this.allField){ var module = this.allField[key]; if( module.json.type==="Attachment" || module.json.type==="AttachmentDg" ){ var array = module._getBusinessData(); (array || []).each(function(d){ saveFlag = true; this.datatable.deleteAttachment(d.id); for( var i=0; i 0 )mJson = this.form._getDomjson(mNodes[0]); } if(thJson && mJson && this.isAvaliableColumn(thJson, mJson)){ this.columnJsonList.push({ "thJson": thJson, "title": th.get("text"), "mJson" : mJson, "available": true }) } }.bind(this)); }, getLineExportData: function(line, index ){ var exportData = []; this.columnJsonList.each(function (column) { var module; if( column.mJson && column.available ){ module = line.all_templateId[column.mJson.id]; } if ( !module ) { exportData.push(""); }else{ var text; if ( column.mJson.type === "Label" && module.node) { text = module.node.get("text"); }else{ text = module.getExcelData(); } if( !text && o2.typeOf(text) !== "number" ){ text = ""; } exportData.push( text ); } }.bind(this)); return exportData; }, // getLineExportData: function(line, index ){ // var exportData = []; // this.columnJsonList.each(function (column) { // // var module; // if( column.mJson && column.available ){ // module = line.all_templateId[column.mJson.id]; // } // if ( !module ) { // exportData.push(""); // }else{ // var value = module.getData(); // var text = ""; // // if( value ){ // switch (column.mJson.type) { // case "Org": // case "Reader": // case "Author": // case "Personfield": // case "Orgfield": // if (o2.typeOf(value) === "array") { // var textArray = []; // value.each(function (item) { // if (o2.typeOf(item) === "object") { // textArray.push(item.distinguishedName); // } else { // textArray.push(item); // } // }.bind(this)); // text = textArray.join(", \n"); // } else if (o2.typeOf(value) === "object") { // text = value.distinguishedName; // } else { // text = value; // } // break; // case "Combox": // case "Address": // text = o2.typeOf(value) === "array" ? value.join(", ") : value; // break; // case "Checkbox": // var options = module.getOptionsObj(); // var value = o2.typeOf(value) === "array" ? value : [value]; // var arr = []; // value.each( function( a, i ){ // var idx = options.valueList.indexOf( a ); // arr.push( idx > -1 ? options.textList[ idx ] : "") ; // }); // text = arr.join(", "); // break; // case "Radio": // case "Select": // var options = module.getOptionsObj(); // var idx = options.textList.indexOf( value ); // text = idx > -1 ? options.valueList[ idx ] : ""; // break; // case "Textarea": // text = value; // break; // case "Calendar": // text = value; // break; // case "Elautocomplete": // text = value; // break; // case "Elcascader": // if( typeOf(value) === "text" ) // break; // default: // text = value; // break; // } // } else if ( column.mJson.type === "Label" && module.node) { // text = module.node.get("text"); // } // // if( !text && o2.typeOf(text) !== "number" ){ // text = ""; // } // // exportData.push( text ); // } // }.bind(this)); // return exportData; // }, isAvaliableColumn : function(thJson, mJson){ if (thJson && ( thJson.isShow === false || thJson.isImpExp === false ))return false; //隐藏列,不允许导入导出 if (mJson && (mJson.type == "sequence" || mJson.cellType == "sequence") )return false; //序号列 if (mJson && ["Image","Button","ImageClipper","WritingBoard","Attachment","AttachmentDg","Label", "Elbutton","Elcarousel","Eldropdown","Elicon","Eltree"].contains(mJson.type) )return false; //图片,附件,Label列不导入导出 // if (type==="import" && module && ["Label"].contains(module.json.type))return false; //Label 不导入 return true; }, getColWidthArray : function(){ var colWidthArr = []; this.columnJsonList.each(function(c, index){ if ( c.available ) { if (c.mJson && ["Org","Reader","Author","Personfield","Orgfield"].contains(c.mJson.type)) { colWidthArr.push(340); } else if (c.mJson && c.mJson.type === "Address") { colWidthArr.push(170); } else if (c.mJson && c.mJson.type === "Textarea") { colWidthArr.push(260); } else if (c.mJson && c.mJson.type === "Htmleditor") { colWidthArr.push(500); } else if (c.mJson && c.mJson.type === "TinyMCEEditor") { colWidthArr.push(500); } else if (c.mJson && c.mJson.type === "Calendar") { colWidthArr.push(150); } else { colWidthArr.push(150); } } }.bind(this)); return colWidthArr; }, getDateIndexArray : function(){ var dateIndexArr = []; //日期格式列下标 var idx=0; this.columnJsonList.each(function(c){ if ( c.available && c.mJson ) { if(c.mJson.type === "Calendar")dateIndexArr.push(idx); idx++; } }.bind(this)); return dateIndexArr; }, getTitleArray : function(){ var arr = []; this.columnJsonList.each(function(c, index){ if ( c.available && c.mJson )arr.push(c.title); }.bind(this)); return arr; }, getExcelName: function(){ var title; if( this.datatable.json.excelName && this.datatable.json.excelName.code ){ title = this.form.Macro.exec(this.datatable.json.excelName.code, this); }else{ title = MWF.xApplication.process.Xform.LP.datatableExportDefaultName; } var titleA = title.split("."); if( ["xls","xlst"].contains( titleA[titleA.length-1].toLowerCase() ) ){ titleA.splice( titleA.length-1 ); } title = titleA.join("."); return title; }, exportWithImportDataToExcel : function ( importedData ) { MWF.require("MWF.widget.Mask", null, false); this.mask = new MWF.widget.Mask({ "style": "desktop", "zIndex": 50000 }); // 适配移动端 if (layout.mobile) { this.mask.load(); } else { this.mask.loadNode(this.form.app.content); } this.datatable.fireEvent("beforeExport"); this.getColumnList(); var resultArr = []; var titleArr = this.getTitleArray("import"); titleArr.push( MWF.xApplication.process.Xform.LP.validationInfor ); resultArr.push( titleArr ); importedData.each( function( lineData, lineIndex ){ var array = []; this.columnJsonList.each( function (obj, i) { array.push( ( lineData[ obj.title ] || '' ).replace(/ /g, "\n") ); }); array.push( lineData.errorTextListExcel ? lineData.errorTextListExcel.join("\n") : "" ); resultArr.push( array ); }.bind(this)); var colWidthArr = this.getColWidthArray(); colWidthArr.push( 300 ); //提示信息 var excelName = this.getExcelName(); var arg = { data : resultArr, colWidthArray : colWidthArr, title : excelName, withError : true }; this.datatable.fireEvent("export", [arg]); new MWF.xApplication.process.Xform.DatatablePC.ExcelUtils( this.datatable ).exportToExcel( arg.data || resultArr, arg.title || excelName, arg.colWidthArray || colWidthArr, this.getDateIndexArray(), //日期格式列下标 null, function () { if (this.mask) { this.mask.hide(); this.mask = null; } }.bind(this) ); } }); MWF.xApplication.process.Xform.DatatablePC.Importer = new Class({ Implements: [Options, Events], options: { }, initialize: function (datatable, options) { this.setOptions(options); this.datatable = datatable; this.form = this.datatable.form; this.lp = MWF.xApplication.process.Xform.LP; this.columnText = this.lp.importValidationColumnText; this.columnTextExcel = this.lp.importValidationColumnTextExcel; this.excelUtil = new MWF.xApplication.process.Xform.DatatablePC.ExcelUtils( this.datatable ); this.columnJsonList = []; }, isAvaliableColumn : function(thJson, mJson){ if (thJson && ( thJson.isShow === false || thJson.isImpExp === false ))return false; //隐藏列,不允许导入导出 if (mJson && (mJson.type == "sequence" || mJson.cellType == "sequence") )return false; //序号列 if (mJson && ["Image","Button","ImageClipper","WritingBoard","Attachment","AttachmentDg","Label", "Elbutton","Elbutton","Elcarousel","Eldropdown","Elicon","Eltree"].contains(mJson.type) )return false; //图片,附件,Label列不导入导出 // if (type==="import" && module && ["Label"].contains(module.json.type))return false; //Label 不导入 return true; }, importFromExcel : function () { this.datatable.fireEvent("beforeImport"); this.getColumnList(); var dateColArray = this.getDateIndexArray(); //日期列 var orgTitleArray = this.getOrgTitleArray(); this.excelUtil.upload( dateColArray, function (data) { MWF.require("MWF.widget.Mask", null, false); this.mask = new MWF.widget.Mask({ "style": "desktop", "zIndex": 50000 }); // 适配移动端 if (layout.mobile) { this.mask.load(); } else { this.mask.loadNode(this.form.app.content); } this.importedData = data; if( !this.checkCount() )return; this.loadSimulateModule(); this.columnJsonList.each(function (c) { c.module = this.importerLine.getModule(c.mJson.id) }.bind(this)); if( orgTitleArray.length > 0 ){ this.listAllOrgData( orgTitleArray, function () { this.checkAndImport(); }.bind(this)); }else{ this.checkAndImport(); } }.bind(this)); }, checkAndImport: function () { this.checkData( function (flag) { if( !flag ){ this.openErrorDlg(); }else{ this.importData() } this.destroySimulateModule(); }.bind(this)); }, destroySimulateModule: function(){ if( !this.importerDatatable ){ this.form.disallowSaving = false; return; } this.importerDatatable.destroy(); this.importerDatatable = null; this.form.disallowSaving = false; }, loadSimulateModule: function(){ this.form.disallowSaving = true; this.importerDatatable = new MWF.xApplication.process.Xform.DatatablePC.ImporterDatabale( this.datatable ); this.importerDatatable.load(); this.importerLine = this.importerDatatable.addLine({}); }, getColumnList: function(){ this.columnJsonList = []; var ths = this.datatable.titleTr.getElements("th.mwf_origional"); var tds = this.datatable.templateTr.getElements("td.mwf_origional"); var idx = 0; ths.each(function(th, index){ var thJson = this.form._getDomjson( th ); var mJson; if(tds[index]){ var mNodes = this.form._getModuleNodes(tds[index]); //获取总计列内的填写组件 if( mNodes.length > 0 )mJson = this.form._getDomjson(mNodes[0]); } if(thJson && mJson && this.isAvaliableColumn(thJson, mJson)){ this.columnJsonList.push({ "thJson": thJson, "title": th.get("text"), "mJson" : mJson, "field": mJson.id, "index": idx, // "module": this.importerLine.getModule(mJson.id) // "module": this.simelateModuleMap[mJson.id] }); idx++; } }.bind(this)); return this.columnJsonList; }, getDateIndexArray : function(){ var dateIndexArr = []; //日期格式列下标 var idx=0; this.columnJsonList.each(function(c){ if ( c.mJson && c.mJson.type === "Calendar" && (c.mJson.format === "%Y-%m-%d" || c.mJson.format === "%Y-%m-%d %H:%M:%S")) { dateIndexArr.push(idx); } idx++; }.bind(this)); return dateIndexArr; }, getOrgTitleArray : function(){ var orgTitleArr = []; this.columnJsonList.each(function(c){ if ( c.mJson && ["Org","Reader","Author","Personfield","Orgfield"].contains(c.mJson.type) ) { orgTitleArr.push(c.title); } }.bind(this)); return orgTitleArr; }, parseImportedData: function(){ var data = []; this.importedData.each( function( ilineData ){ var lineData = {}; this.columnJsonList.each( function (obj, i) { var index = obj.index; var module = obj.module; var json = obj.mJson; var text = obj.title; var d = ilineData[text] || ""; var value; if( d === "" || d === undefined || d === null ){ value = ""; }else{ switch (json.type) { case "Org": case "Reader": case "Author": case "Personfield": case "Orgfield": var arr = this.stringToArray(d); if( arr.length === 0 ){ value = this.getOrgData( d ); }else{ value = []; arr.each( function(d, idx){ var obj = this.getOrgData( d ); value.push( obj ); }.bind(this)); } break; default: value = d; //换行符 break; } } lineData[ json.id ] = value; }.bind(this)); data.push( lineData ); }.bind(this)); return data; }, stringToArray: function(string){ return string.replace(/ /g,",").split(/\s*,\s*/g ).filter(function(s){ return !!s; }); }, importData: function(){ var data = this.parsedData; //this.parseImportedData(idata); this.datatable.fireEvent("import", [data] ); this.datatable.setData( { "data" : data } ); this.datatable.fireEvent("afterImport", [data] ); this.datatable.fireEvent("change", [{lines: this.datatable.lineList, type : "import"}]); if (this.mask) { this.mask.hide(); this.mask = null; } this.form.notice( MWF.xApplication.process.Xform.LP.importSuccess ); }, openErrorDlg : function(){ var eData = this.importedData; var _self = this; var objectToString = function (obj, type) { if(!obj)return ""; var arr = []; Object.each(obj, function (value, key) { if( type === "style" ){ arr.push( key + ":"+ value +";" ) }else{ arr.push( key + "='"+ value +"'" ) } }) return arr.join(" ") } var htmlArray = [""]; var titleStyle = objectToString(this.datatable.json.impExpTableTitleStyles, "style"); htmlArray.push(""); this.columnJsonList.each(function (obj, i) { htmlArray.push( "" ); }); htmlArray.push(""); htmlArray.push("" ); var contentStyles = Object.clone( this.datatable.json.impExpTableContentStyles ); if( !contentStyles[ "border-bottom" ] && !contentStyles[ "border" ] )contentStyles[ "border-bottom" ] = "1px solid #eee"; var contentStyle = objectToString( Object.merge( contentStyles, {"text-align":"left"}) , "style" ); eData.each( function( lineData, lineIndex ){ htmlArray.push( "" ); this.columnJsonList.each( function (obj, i) { htmlArray.push( "" ); //换行符 }); htmlArray.push( "" ); htmlArray.push( "" ); }.bind(this)); htmlArray.push( "
"+obj.title+" "+MWF.xApplication.process.Xform.LP.validationInfor +"
"+ ( lineData[ obj.title ] || '' ).replace(/ /g,"
") +"
"+( lineData.errorTextList ? lineData.errorTextList.join("
") : "" )+"
" ); var width = this.datatable.json.impExpDlgWidth || 1000; var height = this.datatable.json.impExpDlgHeight || 700; width = width.toInt(); height = height.toInt(); var div = new Element("div", { style : "padding:10px;", html : htmlArray.join("") }); var dlg = o2.DL.open({ "style" : this.form.json.dialogStyle || "user", "title": MWF.xApplication.process.Xform.LP.importFail, "content": div, "offset": {"y": 0}, "isMax": true, "width": width, "height": height, "buttonList": [ { "type": "exportWithError", "text": MWF.xApplication.process.Xform.LP.datagridExport, "action": function () { _self.exportWithImportDataToExcel(eData); } }, { "type": "cancel", "text": MWF.LP.process.button.cancel, "action": function () { dlg.close(); } } ], "onPostClose": function(){ dlg = null; }.bind(this) }); if (this.mask) { this.mask.hide(); this.mask = null; } }, checkCount: function(){ var idata = this.importedData; var lp = MWF.xApplication.process.Xform.LP; var exceeded = false; var maxCount = this.datatable.json.maxCount ? this.datatable.json.maxCount.toInt() : 0; if( maxCount > 0 && idata.length > maxCount )exceeded = true; var less = false; var minCount = this.datatable.json.minCount ? this.datatable.json.minCount.toInt() : 0; if( minCount > 0 && idata.length < minCount) less = true; if( exceeded ) { var text = lp.importTooManyNotice.replace("{n1}", idata.length).replace("{n2}", this.datatable.json.maxCount); this.form.notice(text, "error"); return false; } if( less ){ var text = lp.importTooFewNotice.replace("{n1}", idata.length).replace("{n2}", this.datatable.json.minCount ); this.form.notice(text,"error"); return false; } return true; }, checkData : function( callback){ this.parsedData = this.parseImportedData(); this.isImportSuccess = true; this.checkLineData(0, function () { var arg = { validted : this.isImportSuccess, data : this.importedData }; this.datatable.fireEvent( "validImport", [arg] ); callback( arg.validted ) }.bind(this)); }, checkLineData: function(lineIndex, callback){ if( lineIndex < this.importedData.length ){ this._checkLineData(this.importedData[lineIndex], lineIndex, function (flag) { lineIndex++; if( !flag )this.isImportSuccess = false; this.checkLineData(lineIndex, callback); }.bind(this)); }else{ if(callback)callback(); } }, _checkLineData: function(lineData, lineIndex, callback){ lineData.errorTextList = lineData.errorTextList || []; lineData.errorTextListExcel = lineData.errorTextListExcel || []; var parsedLineData = (this.parsedData && this.parsedData[lineIndex]) ? this.parsedData[lineIndex] : []; this.checkModuleData(0, lineData, parsedLineData, function () { var flag = !lineData.errorTextList.length; callback(flag); }); }, checkModuleData: function(index, lineData, parsedLineData, callback){ if( index < this.columnJsonList.length ){ var result = this._checkModuleData(this.columnJsonList[index], lineData, parsedLineData); Promise.resolve(result).then(function (flag) { index++; this.checkModuleData(index, lineData, parsedLineData, callback); }.bind(this)) }else{ if(callback)callback(); } }, _checkModuleData: function (columnJson, lineData, parsedLineData) { var index = columnJson.index; var json = columnJson.mJson; var module = columnJson.module; var text = columnJson.title; var colInfor = this.columnText.replace( "{n}", index+1 ); var colInforExcel = this.columnTextExcel.replace( "{n}", this.excelUtil.index2ColName( index ) ); var d = lineData[text] || ""; var parsedD = parsedLineData[json.id] || ""; var lp = this.lp; var flag = true; if(d){ switch (json && json.type) { case "Org": case "Reader": case "Author": case "Personfield": case "Orgfield": var arr = this.stringToArray(d); arr.each( function(d, idx){ var obj = this.getOrgData( d ); if( obj.errorText ){ lineData.errorTextList.push( colInfor + obj.errorText + lp.fullstop ); lineData.errorTextListExcel.push( colInforExcel + obj.errorText + lp.fullstop ); flag = false; } }.bind(this)); break; case "Number": case "Currency": case "Elnumber": if (isNaN(d)){ lineData.errorTextList.push( colInfor + d + lp.notValidNumber + lp.fullstop ); lineData.errorTextListExcel.push( colInforExcel + d + lp.notValidNumber + lp.fullstop ); flag = false; } break; case "Calendar": case "Eldate": case "Eldatetime": if( json.format === "%Y-%m-%d" || json.format === "%Y-%m-%d %H:%M:%S" ){ if( !( isNaN(d) && !isNaN(Date.parse(d) ))){ lineData.errorTextList.push(colInfor + d + lp.notValidDate + lp.fullstop ); lineData.errorTextListExcel.push( colInforExcel + d + lp.notValidDate + lp.fullstop ); flag = false; } } break; default: break; } } if (module && module.setData && json.type !== "Address"){ var hasError = false; if(["Org","Reader","Author","Personfield","Orgfield"].contains(json.type)){ if(o2.typeOf(parsedD)==="array" && parsedD.length){ hasError = parsedD.some(function (item) { return item.errorText; }); flag = false; } } if(!hasError){ module.setExcelData(parsedD); var ps = []; if( module.moduleExcelAG )ps.push( module.moduleExcelAG ); if( module.moduleValueAG && !ps.contains(module.moduleValueAG) )ps.push( module.moduleValueAG ); if( module.moduleSelectAG && !ps.contains(module.moduleSelectAG) )ps.push( module.moduleSelectAG ); return Promise.all( ps ).then(function () { var result = module.validationExcel(); if ( result && result.length ){ lineData.errorTextList.push(colInfor + result.join("\n") ); lineData.errorTextListExcel.push( colInforExcel + result.join("\n")); flag = false; } parsedLineData[json.id] = module.getData(); return flag; }) } } return flag }, exportWithImportDataToExcel: function(eData){ var exporter = new MWF.xApplication.process.Xform.DatatablePC.Exporter(this.datatable); exporter.exportWithImportDataToExcel(eData) }, getOrgData : function( str ){ str = str.trim(); var flag = str.substr(str.length-2, 2); switch (flag.toLowerCase()){ case "@i": return this.identityMap[str] || {"errorText": str + MWF.xApplication.process.Xform.LP.notExistInSystem }; case "@p": return this.personMap[str] || {"errorText": str + MWF.xApplication.process.Xform.LP.notExistInSystem }; case "@u": return this.unitMap[str] || {"errorText": str + MWF.xApplication.process.Xform.LP.notExistInSystem }; case "@g": return this.groupMap[str] || {"errorText": str + MWF.xApplication.process.Xform.LP.notExistInSystem }; default: return this.identityMap[str] || this.personMap[str] || this.unitMap[str] || this.groupMap[str] || {"errorText": str + MWF.xApplication.process.Xform.LP.notExistInSystem }; } }, listAllOrgData : function (orgTitleList, callback) { var identityList = [], personList = [], unitList = [], groupList = []; if( orgTitleList.length > 0 ){ this.importedData.each( function( lineData, lineIndex ){ // if( lineIndex === 0 )return; orgTitleList.each( function (title, index) { if( !lineData[title] )return; var arr = this.stringToArray(lineData[title]); arr.each( function( a ){ a = a.trim(); var flag = a.substr(a.length-2, 2); switch (flag.toLowerCase()){ case "@i": identityList.push( a ); break; case "@p": personList.push( a ); break; case "@u": unitList.push( a ); break; case "@g": groupList.push( a ); break; default: identityList.push( a ); personList.push( a ); unitList.push( a ); groupList.push( a ); break; } }) }.bind(this)) }.bind(this)); var identityLoaded, personLoaded, unitLoaded, groupLoaded; var check = function () { if( identityLoaded && personLoaded && unitLoaded && groupLoaded ){ if(callback)callback(); } }; this.identityMap = {}; if( identityList.length ){ identityList = identityList.unique(); o2.Actions.load("x_organization_assemble_express").IdentityAction.listObject({ identityList : identityList }, function (json) { json.data.each( function (d) { this.identityMap[ d.matchKey ] = d; }.bind(this)); identityLoaded = true; check(); }.bind(this)) }else{ identityLoaded = true; check(); } this.personMap = {}; if( personList.length ){ personList = personList.unique(); o2.Actions.load("x_organization_assemble_express").PersonAction.listObject({ personList : personList }, function (json) { json.data.each( function (d) { this.personMap[ d.matchKey ] = d; }.bind(this)); personLoaded = true; check(); }.bind(this)) }else{ personLoaded = true; check(); } this.unitMap = {}; if( unitList.length ){ unitList = unitList.unique(); o2.Actions.load("x_organization_assemble_express").UnitAction.listObject({ unitList : unitList }, function (json) { json.data.each( function (d) { this.unitMap[ d.matchKey ] = d; }.bind(this)); unitLoaded = true; check(); }.bind(this)) }else{ unitLoaded = true; check(); } this.groupMap = {}; if( groupList.length ){ groupList = groupList.unique(); o2.Actions.load("x_organization_assemble_express").GroupAction.listObject({ groupList : groupList }, function (json) { json.data.each( function (d) { this.groupMap[ d.matchKey ] = d; }.bind(this)); groupLoaded = true; check(); }.bind(this)) }else{ groupLoaded = true; check(); } } } }); MWF.xDesktop.requireApp("Template", "utils.ExcelUtils", null, false); MWF.xApplication.process.Xform.DatatablePC.ExcelUtils = new Class({ Extends: MWF.xApplication.Template.utils.ExcelUtils, initialize: function(){ this.sheet2JsonOptions = {}; this.pollyfill(); } });