MForm.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /*
  2. 外部方法
  3. getResult(verify, separator, isAlert, onlyModified, keepAllData )
  4. 返回:如果不校验或者通过了校验返回表单上的数据,如果不能通过校验返回null
  5. 参数:
  6. verify 是否校验,
  7. separator 多值域的分割符,
  8. isAlert 如果verify为true则是否提醒用户校验未通过,
  9. onlyModified只获取修改过的结果,
  10. keepAllData获取所有MDOMItem对象的值并保留未生成对象的data
  11. getItem( name )
  12. 根据name返回MDOMItem对象
  13. verify(isAlert)
  14. 校验用户是否已经填写了必填对象
  15. */
  16. MWF.xDesktop.requireApp("Template", "MDomItem", null, false);
  17. var MForm = new Class({
  18. Extends: MWF.widget.Common,
  19. Implements: [Options, Events],
  20. options : {
  21. style : "default",
  22. isNew : false,
  23. isEdited : false,
  24. emptyItemContainer : true,
  25. showNotEmptyFlag : false,
  26. //batch,所有item的错误都校验,每个item所有错误一起校验,错误显示在Item的字段后或指定区域;
  27. //batchSingle, 所有item的错误都校验,每个item只校验一个错误,错误显示在Item的字段后或指定区域;
  28. //alert,验证时遇到一个不成功的Item用app.notice()弹出消息后中断,
  29. //single,验证时遇到一个不成功的Item在字段后面或指定区域显示错误信息后中断
  30. verifyType : "alert",
  31. itemTemplateUrl : "",
  32. containerHtml : null,
  33. itemTemplate : null
  34. },
  35. initialize: function (container, data, options , app, css ) {
  36. this.setOptions(options);
  37. this.path = "/x_component_Template/$MForm/";
  38. this.cssPath = "/x_component_Template/$MForm/"+this.options.style+"/css.wcss";
  39. this._loadCss();
  40. if( css ){
  41. this.css = Object.merge( this.css, css )
  42. }
  43. this.app = app;
  44. this.container = $(container);
  45. this.data = data;
  46. this.isSourceDataEmpty = false;
  47. if( !this.data || this.data == "" ){
  48. this.isSourceDataEmpty = true;
  49. this.data = [{}];
  50. }
  51. this.itemTemplateUrl = this.options.itemTemplateUrl;
  52. this.itemTemplate = this.options.itemTemplate;
  53. this.items = null;
  54. this.labelContainers = null;
  55. this.itemContainers = null;
  56. this.valSeparator = /,|;|\^\^|\|/g; //如果是多值对象,作为用户选择的多个值的分隔符
  57. },
  58. load: function () {
  59. this.fireEvent("queryLoad");
  60. this.loadTemplate( function(){
  61. //如果itemTemplate没有name赋值Key
  62. for( var it in this.itemTemplate ){
  63. if( !this.itemTemplate[it]["name"] ){
  64. this.itemTemplate[it]["name"] = it;
  65. }
  66. this.itemTemplate[it]["key"] = it;
  67. }
  68. //如果itemTemplate没有name和Key不一致,那么根据name赋值itemTemplate
  69. var json = {}
  70. for( var it in this.itemTemplate ){
  71. if( it != this.itemTemplate[it]["name"] ){
  72. json[ this.itemTemplate[it]["name"] ] = this.itemTemplate[it]
  73. }
  74. }
  75. for( var it in json ){
  76. this.itemTemplate[it] = json[it];
  77. }
  78. this.items = {};
  79. this.itemsByKey = {};
  80. if( this.options.containerHtml ){
  81. this.container.set("html",this.options.containerHtml);
  82. }
  83. this.labelContainers = this.container.getElements("[lable]");
  84. this.itemContainers = this.container.getElements("[item]");
  85. this.formatStyles();
  86. (this.options.isEdited || this.options.isNew) ? this.loadEdit() : this.loadRead();
  87. this.fireEvent("postLoad");
  88. }.bind(this) )
  89. },
  90. formatStyles: function(){
  91. this.container.getElements("[styles]").each(function(el){
  92. var styles = el.get("styles");
  93. if( styles && this.css[styles] ){
  94. el.setStyles( this.css[styles] )
  95. }
  96. }.bind(this));
  97. this.container.getElements("[class]").each(function(el){
  98. var className = el.get("class");
  99. if( className && this.css[className] ){
  100. el.setStyles( this.css[className] )
  101. }
  102. }.bind(this))
  103. },
  104. loadTemplate : function( callback ){
  105. if ( !this.itemTemplate && this.itemTemplateUrl) {
  106. MWF.getJSON(this.itemTemplateUrl, function(json){
  107. this.itemTemplate = json;
  108. if( callback )callback();
  109. }.bind(this));
  110. }else{
  111. if( callback )callback();
  112. }
  113. },
  114. loadEdit : function() {
  115. if (this.options.isNew) {
  116. this.formatEdit(this.itemTemplate, true);
  117. } else if (!this.isSourceDataEmpty) {
  118. if (typeOf(this.data) != "array") {
  119. this.data = [this.data]
  120. }
  121. for (var i = 0; i < this.data.length; i++) {
  122. var d = this.data[i];
  123. var items = this.itemTemplate;
  124. for (var it in d ) {
  125. if (items[it]) {
  126. items[it].value = d[it];
  127. }
  128. }
  129. this.formatEdit(items, false);
  130. }
  131. for (var it in this.itemTemplate ) {
  132. this.itemTemplate[it].value = "";
  133. }
  134. } else {
  135. this.formatEdit(this.itemTemplate, true);
  136. }
  137. },
  138. loadRead : function() {
  139. if (this.options.isNew) {
  140. this.formatRead(this.itemTemplate);
  141. } else if (!this.isSourceDataEmpty) {
  142. if ( typeOf(this.data) != "array") {
  143. this.data = [this.data]
  144. }
  145. for (var i = 0; i < this.data.length; i++) {
  146. var d = this.data[i];
  147. var items = this.itemTemplate;
  148. for (var it in d ) {
  149. if (items[it]) {
  150. items[it].value = d[it];
  151. }
  152. }
  153. this.formatRead(items);
  154. }
  155. for (var it in this.itemTemplate ) {
  156. this.itemTemplate[it].value = "";
  157. }
  158. }
  159. },
  160. formatRead : function(itemData) {
  161. var self = this;
  162. this.labelContainers.each(function( el ) {
  163. var obj = itemData[el.get("lable")];
  164. if (!obj)
  165. return;
  166. el.set("text",obj.text);
  167. });
  168. this.itemContainers.each(function( el ) {
  169. var obj = itemData[el.get("item")];
  170. if (!obj)
  171. return;
  172. if( obj.style ){
  173. el.setStyles( obj.style )
  174. }
  175. if( typeOf( obj.value ) == "function" ) {
  176. var value = obj.value();
  177. }else if( typeOf( obj.value ) == "boolean" ){
  178. var value = obj.value.toString();
  179. }else{
  180. var value = (obj.value ? obj.value : "").toString();
  181. }
  182. //if (obj.type == "file" || obj.type == "attachment") {
  183. // if ( obj.value && obj.value != "") {
  184. // if( jQuery.type( obj.value ) == "string" ){
  185. // jQuery.each(obj.value.split("^^"), function(i, n) {
  186. // str = "<div><a target='_blank' href='" + self.filePreLink + encodeURIComponent(n) + "' class='inputlink'>" + n + "</a></div>";
  187. // el.html(str);
  188. // })
  189. // }
  190. // }
  191. //} else
  192. if( obj.type == "hidden" ) {
  193. el.hide();
  194. el.set("html",value.replace( this.valSeparator, ",").replace(/\n/g,"<br/>") )
  195. }else if( obj.type == "radio" || obj.type == "select" || obj.type == "checkbox" || obj.type == "multiselect" ) {
  196. var values = value.split( this.valSeparator );
  197. if( obj.selectText && obj.selectValue ){
  198. var selectValues = this._getSelectOpt( obj.selectValue );
  199. var selectTexts = this._getSelectOpt( obj.selectText );
  200. var result = [];
  201. for( i=0;i<selectValues.length;i++){
  202. if( values.contains( selectValues[i] ) ){
  203. result.push( selectTexts[i] )
  204. }
  205. }
  206. el.set("html",result.join(","));
  207. }else{
  208. el.set("html",value.replace( this.valSeparator, ",").replace(/\n/g,"<br/>") )
  209. }
  210. }else if( obj.type == "rtf"){
  211. el.set("html",value )
  212. } else {
  213. el.set("html",value.replace( this.valSeparator, ",").replace(/\n/g,"<br/>") )
  214. }
  215. }.bind(this))
  216. },
  217. _getSelectOpt: function( option ){
  218. var opt = option;
  219. if( typeOf( opt ) == "function" ){
  220. opt = opt.call();
  221. };
  222. return typeOf( opt ) == "array" ? opt : opt.split( this.valSeparator );
  223. },
  224. formatEdit : function(itemData, isNew, unid) {
  225. var self = this;
  226. this.labelContainers.each(function( el ) {
  227. var obj = itemData[el.get("lable")];
  228. if (!obj)
  229. return;
  230. if (self.options.showNotEmptyFlag && obj.notEmpty) {
  231. el.set("html","<span style='color:red;'>*</span>" + obj.text)
  232. } else {
  233. el.set("text",obj.text);
  234. }
  235. });
  236. this.itemContainers.each(function( el ) {
  237. var obj = itemData[el.get("item")];
  238. if (!obj)
  239. return;
  240. if (self.options.emptyItemContainer) {
  241. el.set("html","");
  242. }
  243. self.loadItem(obj, el);
  244. })
  245. },
  246. loadItem : function(template, container) {
  247. template.objectId = template.name;
  248. var item = new MDomItem(container, template, this, this.app, this.css );
  249. if( this.options.verifyType == "batchSingle" ){
  250. item.options.warningType = "single";
  251. }else{
  252. item.options.warningType = this.options.verifyType;
  253. }
  254. //item.parent = this;
  255. item.load();
  256. this.items[template.objectId] = item;
  257. this.itemsByKey[template.key] = item;
  258. },
  259. verify : function(isShowWarming) {
  260. var flag = true;
  261. for (var it in this.items ) {
  262. if (!this.items[it].verify(isShowWarming)) {
  263. if (this.options.verifyType == "batch" || this.options.verifyType == "batchSingle") {
  264. flag = false;
  265. } else {
  266. return false;
  267. }
  268. }
  269. }
  270. return flag;
  271. },
  272. getItemsKeyValue : function(separator , onlyModified ) {
  273. //separator 多值合并分隔符
  274. var key_value = {};
  275. for (var it in this.items ) {
  276. var item = this.items[it];
  277. var value = onlyModified ? item.getModifiedValue() : item.getValue();
  278. if( value != null ){
  279. if (typeOf(value) === "array") {
  280. key_value[item.options.objectId] = ( typeOf(separator) == "string" ? value.join(separator) : value );
  281. } else {
  282. key_value[item.options.objectId] = value;
  283. }
  284. }
  285. }
  286. return key_value;
  287. },
  288. getResult : function(verify, separator, isShowWarming, onlyModified, keepAllData ) {
  289. if ( !verify || this.verify(isShowWarming)) {
  290. if( keepAllData ){
  291. var result = this.data[0];
  292. var keyValue = this.getItemsKeyValue(separator, onlyModified);
  293. for( var key in keyValue ){
  294. result[ key ] = keyValue[ key ];
  295. }
  296. return result;
  297. }else{
  298. return this.getItemsKeyValue(separator, onlyModified);
  299. }
  300. } else {
  301. return false;
  302. }
  303. },
  304. getItem : function( name ){
  305. return this.items[name] || this.itemsByKey[name];
  306. },
  307. clearWarning: function( type ){
  308. for (var it in this.items ) {
  309. var item = this.items[it];
  310. if( !type ){
  311. item.clearWarning( "empty" );
  312. item.clearWarning( "invalid" );
  313. }else{
  314. item.clearWarning( type )
  315. }
  316. }
  317. }
  318. });