fw.eglt.js 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149
  1. /**
  2. * @author herong 可编辑多记录组件
  3. */
  4. var CFWEGlt = _FW.fCreateClass();
  5. /**
  6. * 可编辑多记录组件API
  7. */
  8. CFWEGlt.prototype = {
  9. fInitialize : function(options) {
  10. },
  11. /**
  12. * 多记录列表数据显示完毕后调用自定义函数
  13. * @param String sListID(必需) 多记录表的配置ID名称
  14. * @param String sFunName(必需) 自定义的函数名
  15. * @return true、false
  16. * <pre>
  17. * 使用举例:
  18. * CFW.oEGlt.doLoad(ListID,'myfun') ;
  19. * function myfun(){}
  20. * 或
  21. * CFW.oEGlt.doLoad(ListID,CBxgx.oComm.myfun) ;
  22. * </pre>
  23. */
  24. doLoad : function (sListID, sFunName) {
  25. if(CFW.oValid.fnIsNull(sListID,"CFW.oEGlt.doLoad 多记录表的配置ID名称")){
  26. return false;
  27. }
  28. if(CFW.oValid.fnIsNull(sFunName,"CFW.oEGlt.doLoad 自定义的函数名")){
  29. return false;
  30. }
  31. var target = eval('document.all.' + sListID);
  32. var opts = null;
  33. if (jQuery.data(target, 'fwdatagrid') != null) {
  34. opts = jQuery.data(target, 'fwdatagrid').options;
  35. } else {
  36. opts = jQuery.data(target, 'fweditgrid').options;
  37. }
  38. var fun = window[sFunName];
  39. if (typeof sFunName == 'function') {
  40. fun = sFunName;
  41. }
  42. opts.onLoadSuccess = fun;
  43. return true;
  44. },
  45. /**
  46. * 行选择函数
  47. * 改变选中行的颜色或是单击某行记录的任何地方进行勾选
  48. * 主要是配合 doClick、doDblClick使用
  49. * @param String sListID(必需) 只读多记录表单的配置ID
  50. * @param int rowindex(必需) 行序号(从0开始)
  51. * @param String type(必需) 应用的类型字符串例如:row=s|input=checkbox
  52. * 其中 row 属性表示行的颜色需要改变
  53. * 若 row=n 表示不需要改变行颜色
  54. * 若 row=s 表示单选行只改变选中行的颜色
  55. * 若 row=m 表示只要选中都改变颜色
  56. * input 属性表示选择行后勾选框的勾选上
  57. * 若 input=checkbox 表示多选框
  58. * 若 input=radio 表示单选框
  59. * <pre>
  60. * 使用举例:
  61. * 1.改变行颜色而且是单选行,若列表有勾选框不自动勾选
  62. * var sMark='row=s'
  63. * CFW.oEGlt.fnSelectedRows('zhcx_grjbzltest3',0,sMark);
  64. * 2.改变行颜色,若列表有勾选框自动勾选
  65. * var sMark='row=s|input=checkbox'
  66. * CFW.oEGlt.fnSelectedRows('zhcx_grjbzltest3',0,sMark);
  67. * </pre>
  68. */
  69. fnSelectedRows : function(sListID,rowindex,type){
  70. if(CFW.oValid.fnIsNull(sListID,"CFW.oEGlt.fnSelectedRows 多记录表单的配置ID")){
  71. return ;
  72. }
  73. if(CFW.oValid.fnIsNull(rowindex,"CFW.oEGlt.fnSelectedRows 行序号")){
  74. return ;
  75. }
  76. if(CFW.oValid.fnIsNull(type,"CFW.oEGlt.fnSelectedRows 应用的类型字符串")){
  77. return ;
  78. }
  79. var grid =$('#'+sListID);
  80. var tmp,chk,arry1,arry2,sRow='',sInput='';
  81. var str = type.toLowerCase();
  82. if(str==''||str==null){
  83. str='row=s|input=checkbox';
  84. }
  85. arry1 = str.split('|');
  86. for(var i=0;i<arry1.length;i++){
  87. tmp = arry1[i];
  88. arry2 = tmp.split('=');
  89. if(arry2[0]=='row'){sRow=arry2[1];}
  90. if(arry2[0]=='input'){sInput=arry2[1];}
  91. }
  92. //执行单行选择并改变颜色时,需要去掉已选的颜色
  93. if(sRow=='s'){
  94. $('.fweditgrid-view tbody tr[class*=fweditgrid-row-selected]', grid).each(function(){
  95. $(this).removeClass('fweditgrid-row-selected');
  96. });
  97. }
  98. $('.fweditgrid-view tbody tr[fweditgrid-row-index='+rowindex+']', grid).each(function(){
  99. //单行或是多行选择
  100. if(sRow=='s'||sRow=='m'){
  101. $(this).addClass('fweditgrid-row-selected');
  102. }
  103. //需要对选择框做处理
  104. if(sInput!=''){
  105. chk = $('[type="'+sInput+'"]',$(this)).attr("checked");
  106. if(!chk){
  107. $('[type="'+sInput+'"]',$(this)).attr("checked",true);
  108. }//else{
  109. // $('[type="'+sInput+'"]',$(this)).attr("checked",false);
  110. //}
  111. }
  112. });
  113. },
  114. /**
  115. * where条件修改后,重新刷新多记录表的数据
  116. * @param String sListID(必需) 多记录表的配置ID名称
  117. * @param String sWhere(必需) 新的查询条件
  118. * @param int pageNum 为刷新列表后显示第几页的数据,-1表示当前页,默认为1,不能输入0或负数
  119. * @return true、false
  120. * <pre>
  121. * 使用举例:
  122. * 第一种应用的方式:
  123. * 刷新后显示第一页,第三个入参可以不用写
  124. * CFW.oEGlt.fnGetData('fw_blank_todolist'," OPERID='23' ") ;
  125. * 第二种应用的方式:
  126. * 刷新后显示第6页的内容
  127. * CFW.oEGlt.fnGetData('fw_blank_todolist'," OPERID='23' ",6) ;
  128. * </pre>
  129. */
  130. fnGetData : function(sListID, sWhere, iPageNum,successFunName,erroFunName){
  131. iPageNum = iPageNum || 1;
  132. if(CFW.oValid.fnIsNull(sListID,"CFW.oEGlt.fnGetData 多记录表的配置ID名称")){
  133. return false;
  134. }
  135. if(CFW.oValid.fnIsNull(sWhere,"CFW.oEGlt.fnGetData 新的查询条件")){
  136. return false;
  137. }
  138. if(!CFW.oValid.fnIsInteger(iPageNum)){
  139. CFW.oWin.fnAlert('页号必须为整数');
  140. return false;
  141. }
  142. if(iPageNum <= 0 && iPageNum!=-1){
  143. CFW.oWin.fnAlert('页号不能为0或负数');
  144. return false;
  145. }
  146. var target = eval('document.all.'+sListID);
  147. var opts ;
  148. if (jQuery.data(target, 'fwdatagrid') != null) {
  149. opts = jQuery.data(target, 'fwdatagrid').options;
  150. var successfun = window[successFunName];
  151. if (typeof successFunName == 'function') {
  152. successfun = successFunName;
  153. opts.onLoadSuccess = successfun;
  154. }
  155. var errorfun = window[erroFunName];
  156. if (typeof erroFunName == 'function') {
  157. errorfun = erroFunName;
  158. opts.onLoadError = errorfun;
  159. }
  160. opts.ReGetListData(target, sWhere, iPageNum);
  161. return true;
  162. }
  163. if (jQuery.data(target, 'fweditgrid') != null) {
  164. opts = jQuery.data(target, 'fweditgrid').options;
  165. var successfun = window[successFunName];
  166. if (typeof successFunName == 'function') {
  167. successfun = successFunName;
  168. opts.onLoadSuccess = successfun;
  169. }
  170. var errorfun = window[erroFunName];
  171. if (typeof erroFunName == 'function') {
  172. errorfun = erroFunName;
  173. opts.onLoadError = errorfun;
  174. }
  175. opts.ReGetListData(target, sWhere, iPageNum);
  176. return true;
  177. }
  178. return true;
  179. },
  180. /**
  181. * 功能描述:增加一行或多行的行数据(只作用于jQuery集合中的第一个多记录表)。
  182. * 功能详细说明:此处增加只是在页面多记录表中增加显示内容,并未增加实际数据。
  183. *
  184. * @param sGltID
  185. * (必需) 多记录配置ID,String
  186. * @param oDatas(必需)
  187. * 行数据对象
  188. * @Returns: int 添加后当前页面的总行数
  189. *
  190. * <pre>
  191. * 使用方法举例:
  192. * var rowDatas=[
  193. * {
  194. * &quot;ETEXT&quot;:&quot;20011502&quot;,&quot;RDATE&quot;:&quot;2111-11-02&quot;,
  195. * &quot;EDATE&quot;:&quot;2211-12-12&quot;,&quot;SPBZ&quot;:&quot;1&quot;,
  196. * &quot;ROWNUM_&quot;:&quot;3&quot;,&quot;TBID&quot;:null,&quot;RTEXT&quot;:&quot;20111202&quot;,
  197. * &quot;_DIC_SPBZ&quot;:&quot;已审批&quot;,&quot;SPBZ_CMB&quot;:&quot;已审批&quot;
  198. * }
  199. * ];
  200. * var rstLen=CFW.oEGlt.fnAddRows('demo_api_eglt_test', rowDatas);
  201. * alert("fnAddRows()返回结果: " + rstLen); //输出测试 打印返回结果
  202. * </pre>
  203. */
  204. fnAddRows : function(sGltID, oDatas) {
  205. if (CFW.oValid.fnIsNull(sGltID, "CFW.oEGlt.fnAddRows 多记录表配置ID")) {
  206. return;
  207. }
  208. if (CFW.oValid.fnIsNull(oDatas, "CFW.oEGlt.fnAddRows 行数据对象")) {
  209. return;
  210. }
  211. var rowsData = [];
  212. if ($.isArray(oDatas)) {
  213. rowsData = oDatas;
  214. } else {
  215. rowsData = [ oDatas ];
  216. }
  217. // 如果没有新增数据,那么什么都不用该处理
  218. if (rowsData.length == 0) {
  219. return $("#" + sGltID);
  220. }
  221. return $("#" + sGltID)
  222. .first()
  223. .map(
  224. function() {
  225. // 获取本多记录表已经有的行数据
  226. var opts = $.data(this, 'fweditgrid').options;
  227. var view = $.data(this, 'fweditgrid').view;
  228. var table = view.children('table')[0];
  229. var data = opts.data;
  230. var rows = data.rows || [];
  231. var startRow = rows.length;
  232. // 增加行数据
  233. rows = rows.concat(rowsData);
  234. data.rows = rows;
  235. // 增加总计
  236. data.total += rowsData.length;
  237. var iPageNum = (parseInt(opts.pageNumber, 10) - 1)
  238. * parseInt(opts.pageSize, 10);
  239. // 逐行处理
  240. var frag = document.createDocumentFragment();
  241. for ( var iRow = startRow, len = rows.length; iRow < len; iRow++) {
  242. var tr = CFW.oEGlt._fnGenOneRow(opts, opts.data.headers,
  243. iPageNum + 1, iRow, rows);
  244. frag.appendChild(tr);
  245. }
  246. table.tBodies[0].appendChild(frag);
  247. view[0].scrollTop = view[0].scrollHeight;
  248. // 调整底部的颜色
  249. CFW.oEGlt._fnSetAlt(this);
  250. return rows.length;
  251. }).get(0);
  252. // return $('#'+sGltID).fweditgrid('addRows',oDatas);
  253. },
  254. /**
  255. * 功能描述:更新多记录表中的行数据。 功能详细说明:此处更新只是更新页面上多记录表的显示内容,并未更新实际数据。
  256. *
  257. * @param sGltID
  258. * (必需) 多记录配置ID,String
  259. * @param aDatas
  260. * oDatas 行数据对象,可* 以不传,不传表示根据多记录表现有
  261. * 数据刷新界面ui。如果配置了第二个参数,那么将用传入的参数替换原有数据。
  262. *
  263. * <pre>
  264. * 使用方法举例:
  265. * 使用方法:
  266. * //要更新的行数据
  267. * var rowDatas=[
  268. * {
  269. * &quot;ETEXT&quot;:&quot;20011502&quot;,&quot;RDATE&quot;:&quot;2111-11-02&quot;,
  270. * &quot;EDATE&quot;:&quot;2211-12-12&quot;,&quot;SPBZ&quot;:&quot;1&quot;,
  271. * &quot;ROWNUM_&quot;:&quot;3&quot;,&quot;TBID&quot;:null,
  272. * &quot;RTEXT&quot;:&quot;20111202&quot;,
  273. * &quot;_DIC_SPBZ&quot;:&quot;已审批&quot;,&quot;SPBZ_CMB&quot;:&quot;已审批&quot;
  274. * }
  275. * ];
  276. * CFW.oEGlt.fnUpdateRows('demo_api_eglt_test'); 无参数
  277. * CFW.oEGlt.fnUpdateRows('demo_api_eglt_test',rowDatas); 带参数
  278. * </pre>
  279. */
  280. fnUpdateRows : function() {
  281. if (CFW.oValid.fnIsNull(arguments[0], "CFW.oEGlt.fnUpdateRows 多记录表配置ID")) {
  282. return;
  283. }
  284. var rowsData = null;
  285. // 获取新行的数据,如果是单值,那么用数组包装,如果是数组那个直接赋值
  286. // 如果参数个数不对,那么报错处理
  287. if (arguments.length == 1) {
  288. } else if (arguments.length == 2) {
  289. if ($.isArray(arguments[1])) {
  290. rowsData = arguments[1];
  291. } else {
  292. rowsData = [ arguments[1] ];
  293. }
  294. }
  295. return $("#" + arguments[0]).each(function() {
  296. // 获取本多记录表已经有的行数据
  297. var opts = $.data(this, 'fweditgrid').options;
  298. var data = opts.data;
  299. // 如果有传入新的行数据,那么全部用新记录替换旧记录
  300. if (rowsData) {
  301. data.rows = rowsData;
  302. } else {
  303. // 没有的话,当作刷新页面数据处理
  304. }
  305. CFW.oEGlt._fnLoadData(this, data);
  306. // createMsg(this);
  307. CFW.oEGlt._fnShowInfo(this);
  308. });
  309. },
  310. /**
  311. * 按当前条件刷新列表
  312. * @param String sListID(必需) 多记录表的配置ID名称
  313. * @return true、false
  314. * <pre>
  315. * 使用举例:
  316. * CFW.oEGlt.fnRefreshData('fw_blank_todolist') ;
  317. * </pre>
  318. */
  319. fnRefreshData : function (sListID) {
  320. var target = eval('document.all.' + sListID);
  321. var opts;
  322. if (jQuery.data(target, 'fwdatagrid') != null) {
  323. opts = jQuery.data(target, 'fwdatagrid').options;
  324. var sWhere=opts.whereCls;
  325. var iPageNum=opts.pageNumber;
  326. opts.ReGetListData(target, sWhere, iPageNum);
  327. return true;
  328. }
  329. if (jQuery.data(target, 'fweditgrid') != null) {
  330. opts = jQuery.data(target, 'fweditgrid').options;
  331. var sWhere=opts.whereCls;
  332. var iPageNum=opts.pageNumber;
  333. opts.ReGetListData(target, sWhere, iPageNum);
  334. return true;
  335. }
  336. return true;
  337. },
  338. /**
  339. * 功能描述:删除多记录表格中的行。 功能详细说明:此处删除只是删除页面上多记录表的显示内容,并未删除实际数据。
  340. *
  341. * @param sGltID
  342. * (必需) 多记录配置ID,String
  343. * @param aArrayIndex
  344. * aArrayIndex 行索引数组,类型Array 数组;不传表示全部删除
  345. *
  346. * <pre>
  347. * 使用方法举例:
  348. * 使用方法1:调用以下方法删除第1、3行
  349. * CFW.oEGlt.fnRemoveRows('demo_api_eglt_test',[1,3]);
  350. * 使用方法2:全部删除:
  351. * CFW.oEGlt.fnRemoveRows('demo_api_eglt_test');
  352. * </pre>
  353. */
  354. fnRemoveRows : function() {
  355. if (CFW.oValid.fnIsNull(arguments[0], "CFW.oEGlt.fnRemoveRows 多记录表配置ID")) {
  356. return;
  357. }
  358. var rowIndices = new Array();
  359. // 获取删除行的索引数据,如果是单值,那么用数组包装,如果是数组那个直接赋值
  360. if (arguments.length == 1) {
  361. rowIndices = null;
  362. } else if (arguments.length == 2) {
  363. if ($.isArray(arguments[1])) {
  364. rowIndices = arguments[1];
  365. } else {
  366. rowIndices = [ arguments[1] ];
  367. }
  368. }
  369. // 如果传入的是空串,那么不处理
  370. if (rowIndices != null && rowIndices.length == 0) {
  371. return this;
  372. }
  373. return $("#" + arguments[0]).each(function() {
  374. var opts = $.data(this, 'fweditgrid').options;
  375. var view = $.data(this, 'fweditgrid').view;
  376. var data = opts.data;
  377. var rows = data.rows || [];
  378. var table = view.children('table')[0];
  379. // 如果本来就没数据,那么什么都不做
  380. if (!rows || rows.length == 0)
  381. return;
  382. // 删除行数据
  383. // 如果是不传入行数据,那么删除所有
  384. if (rowIndices == null) {
  385. // 全部删除处理
  386. rows = [];
  387. // 删除所有行的数据
  388. $(table.tBodies[0]).empty();
  389. // createMsg(this);
  390. } else {// 部分删除处理
  391. // 根据索引删除现有数据,从后到前删除行数据
  392. rowIndices.sort(function(a, b) {
  393. return a - b;
  394. }).reverse();
  395. // 删除数据模型(由后向前删除)
  396. for (var i=0;i< rowIndices.length;i++) {
  397. var k = parseInt(rowIndices[i], 10);
  398. rows.splice(k, 1);
  399. }
  400. // 删除ui相关的东西
  401. for (var index=0;index<rowIndices.length;index++) {
  402. var kst = parseInt(rowIndices[index], 10);
  403. $('tr[fweditgrid-row-index=' + kst + ']', table).remove();
  404. }
  405. // createMsg(this);
  406. // 重新排序
  407. CFW.oEGlt._fnModifyRowAttr(this);
  408. // 调整底部的颜色
  409. CFW.oEGlt._fnSetAlt(this);
  410. if (rows.length > 0) {
  411. // 保持同样的滚动偏移量
  412. view.scrollTop(view.scrollTop());
  413. }
  414. }
  415. data.rows = rows;
  416. // 减少总计
  417. data.total = rows.length;
  418. });
  419. },
  420. /**
  421. * 功能描述:可编辑多记录表设置列控件只读 (‘disable’)。
  422. * 功能详细说明:设置多记录表某列控件只读(该函数只能对多记录表中配置了可编辑的列有效, 对不可编辑列无效)
  423. *
  424. * @param sGltID
  425. * (必需) 多记录配置ID,String
  426. * @param sFields
  427. * 列别名,String
  428. * @param bBlag(必需)
  429. * boolean值,可选值为true或者false,true时,表示设置fields对应
  430. *
  431. * <pre>
  432. * 使用方法举例:
  433. * 使用方法:设置多记录表demo_api_eglt_test的PSBZ(审批标志) 列只读
  434. * fnSetItemsReadOnly('demo_api_eglt_test','SPBZ',true);
  435. * 设置整个多记录表只读时, 不传入第二个参数:
  436. * fnSetItemsReadOnly('demo_api_eglt_test',true);
  437. * 取消只读只需要修改上例最后一个参数,有true改成false即可
  438. * </pre>
  439. */
  440. fnSetItemsReadOnly : function(sGltID, fields, flag) {
  441. if (CFW.oValid.fnIsNull(sGltID, "CFW.oEGlt.fnSetItemsReadOnly 多记录表配置ID")) {
  442. return;
  443. }
  444. if (CFW.oValid.fnIsNull(fields, "CFW.oEGlt.fnSetItemsReadOnly 参数boolean值")) {
  445. return;
  446. }
  447. if (arguments.length == 2) {
  448. flag = fields;
  449. fields = true;// 传入两个表示对所有列操作
  450. }
  451. // 校验flag的参数类型
  452. if (flag != true && flag != false) {
  453. CFW.oWin.fnAlert('fnSetItemsReadOnly函数的flag参数必需是true或者false; flag:' + flag);
  454. return this;
  455. }
  456. // 校验fields的参数类型
  457. if (typeof fields == 'string') {
  458. // 先转为数组
  459. fields = [ fields ];
  460. } else if (!$.isArray(fields) && !fields) {
  461. CFW.oWin.fnAlert('fnSetItemsReadOnly函数的fields参数必需是字符串、数组或者true');
  462. return this;
  463. }
  464. return $("#" + sGltID).each(function() {
  465. // 每个多记录表单独处理
  466. var opts = $.data(this, 'fweditgrid').options;
  467. var grid = $.data(this, 'fweditgrid').grid;
  468. var headers = opts.data.headers;
  469. var v_fields;
  470. if (fields!=null && $.isArray(fields)) {
  471. v_fields = fields;
  472. } else {
  473. // true用headers替换
  474. v_fields = headers;
  475. }
  476. // 数组转成map
  477. var v_map = {};
  478. for (var index=0;index<v_fields.length;index++) {
  479. v_map[v_fields[index]] = flag;
  480. }
  481. // 合并原来的disableMap
  482. $.extend(opts.disableMap, v_map);
  483. if (!opts.mywin) {
  484. // 如果窗口还没初始化,那么不处理,交给loadData处理
  485. return;
  486. }
  487. // 获取所有控件
  488. $('.fweditgrid-view tbody input', grid).each(function() {
  489. // 不处理hidden
  490. if (this.type == 'hidden')
  491. return;
  492. var nd = this.nd.replace(/_CMB$/gi, "");
  493. if (opts.disableMap[nd]) {
  494. // 记录为只读的列,必需设置为只读
  495. if (this.className.indexOf('readOnly') == -1) {// 只处理需要处理的
  496. CFW.oGt.fnToDisabledObj(this);
  497. }
  498. } else {
  499. // 复选框特殊处理, 因为 框架没有添加上 readOnly属性
  500. if (this.type == "checkbox" && this.disabled) {
  501. $(this).removeAttr("disabled");
  502. }
  503. // 未记录的列,或者记录为false的列,取消只读
  504. if (this.className.indexOf('readOnly') != -1) {// 只处理需要处理的
  505. CFW.oGt.fnReObjReadOnly(this);
  506. // 如果是字典控件,那么需要将readOnly设置回去
  507. if (this.nd != nd) {
  508. this.readOnly = true;
  509. }
  510. }
  511. }
  512. });
  513. });
  514. },
  515. /**
  516. * 功能描述:获取可编辑多记录表的数据集。 功能详细说明:主要用于获取可编辑多记录表中所有数据对象,也可以获取每行中某个数据对象的值,
  517. * 或者获取整个数据集对象行数等。
  518. *
  519. * @param sTableId(必需)
  520. * 多记录表配置ID,类型:Stirng
  521. * @param bAllData
  522. * boolean值,true表示全部获取, false只获取可编辑字段; 默认 true
  523. * @Returns 数据集对象
  524. *
  525. * <pre>
  526. * 使用方法举例:
  527. * var rowsData=CFW.oEGlt.fnGetRows('demo_api_eglt_test'); // JSON格式
  528. * alert(JSON.stringify(rowsData)); //输出测试: 打印出 获取到的JSON对象,转换为字符串
  529. * </pre>
  530. */
  531. fnGetRows : function(sTableId,bAllData) {
  532. if (CFW.oValid.fnIsNull(sTableId, "CFW.oEGlt.fnGetData 多记录表配置ID")) {
  533. return;
  534. }
  535. var eGltObj = $("#" + sTableId);
  536. return eGltObj.first().map(
  537. function() {
  538. var opts = $.data(this, 'fweditgrid').options;
  539. var view = $.data(this, 'fweditgrid').view;
  540. var headers = opts.data.headers;
  541. var rows = opts.data.rows;
  542. var emptyRow = {};
  543. // 准备一个模板空行
  544. for ( var i = 0; i < opts.columns; i++) {
  545. var h = headers[i];
  546. if(!bAllData){
  547. emptyRow[h] = null;
  548. }
  549. }
  550. // 清空行数据
  551. for ( var i=0; i<rows.length;i++) {
  552. rows[i] = $.extend(rows[i], emptyRow);
  553. }
  554. if(!bAllData){
  555. /* 在这里去掉了 不可编辑的字段 */
  556. var str = JSON.stringify(rows);
  557. $("#" + sTableId + " tbody tr:eq(0) label").each(
  558. function(i) {
  559. labelN = $(this).attr("nd");
  560. str = str.replace(new RegExp("\"" + labelN
  561. + "\":null,", "gm"), "");// 在前面
  562. str = str.replace(new RegExp(",\"" + labelN
  563. + "\":null", "gm"), "");// 在后面
  564. });
  565. rows = JSON.parse(str);
  566. }
  567. // 获取有行标识的记录
  568. $('tbody [rw]', view).filter(
  569. ':checkbox:checked,:radio:checked').each(
  570. function() {
  571. if (parseInt($(this).attr('rw')) >= rows.length) {
  572. return;
  573. }
  574. if (this.nodeName == "INPUT") {
  575. rows[$(this).attr('rw')][$(this).attr('nd')] = this.value;
  576. }
  577. }).end().not(':checkbox,:radio').each(function() {
  578. if (parseInt($(this).attr('rw')) >= rows.length) {
  579. return;
  580. }
  581. if (this.nodeName == "INPUT") {
  582. rows[$(this).attr('rw')][$(this).attr('nd')] = this.value;
  583. }
  584. });
  585. opts.data.rows = rows;
  586. var rows2 = $.extend(true, [], rows);
  587. return rows2;
  588. }).get();
  589. },
  590. /**
  591. * 功能描述: 多记录表获取checkbox列的行号 功能详细说明:主要用于获取多记录中,获取复选框checkbox所在行号,
  592. * 第二个参数就是复选框checkbox的别名。
  593. *
  594. * @param sGltID
  595. * (必需) 多记录配置ID,String
  596. * @param sAlias(必需)
  597. * 表示checkbox列的列别名,类型:Stirng
  598. * @returns 行号 数组
  599. *
  600. * <pre>
  601. * 使用方法举例:
  602. * 使用方法:以下方法获取选中复选框checkbox别名为TBID的行号数组。
  603. * var datas=CFW.oEGlt.fnNListGetRowIndexByWhere('demo_api_eglt_test', 'TBID');
  604. * alert(datas);
  605. * </pre>
  606. */
  607. fnNListGetRowIndexByWhere : function(sGltID, sAlias) {
  608. if (CFW.oValid.fnIsNull(sGltID, "CFW.oEGlt.fnNListGetRowIndexByWhere 多记录表配置ID")) {
  609. return;
  610. }
  611. if (CFW.oValid.fnIsNull(sAlias, "CFW.oEGlt.fnNListGetRowIndexByWhere checkbox列的列别名")) {
  612. return;
  613. }
  614. return $("#" + sGltID).map(function() {
  615. // 获取别名下所有已选checkbox
  616. return $('[nd=' + sAlias + ']:checked', this).map(function() {
  617. return parseInt($(this).attr("rw"), 10);
  618. }).get();
  619. }).get();
  620. },
  621. /**
  622. * 功能描述:可编辑多记录表翻页监听函数 (‘regBeforePageFun’) 功能详细说明:
  623. * 注册翻页前的响应函数,如果函数返回非true,那么系统不触发翻页操作。
  624. *
  625. * @param sGltID
  626. * (必需) 多记录配置ID,String
  627. * @param fnPageFun
  628. * (必需) 响应函数对象 function
  629. *
  630. * <pre>
  631. * 使用方法举例:
  632. * function fnPageFunFalse() {
  633. * alert("fnPageFunFalse: return false");
  634. * return false; //不翻页
  635. * }
  636. * function fnPageFunTrue() {
  637. * alert("fnPageFunTrue: return true");
  638. * return true; //翻页
  639. * }
  640. * 方法1: 可编辑多记录表demo_api_eglt_test 注册翻页监听函数 fnPageFunTrue
  641. * CFW.oEGlt.fnRegBeforePageFun('demo_api_eglt_test',fnPageFunTrue):
  642. * 方法2: 可编辑多记录表demo_api_eglt_test 注册翻页监听函数 fnPageFunFalse
  643. * CFW.oEGlt.fnRegBeforePageFun('demo_api_eglt_test',fnPageFunFalse):
  644. * 方法3: 可编辑多记录表demo_api_eglt_test 取消翻页监听函数
  645. * CFW.oEGlt.fnRegBeforePageFun('demo_api_eglt_test'):
  646. * </pre>
  647. */
  648. fnRegBeforePageFun : function() {
  649. var sGltID=arguments[0];
  650. var fnPageFun=arguments.length==2?arguments[1]:null;
  651. if (CFW.oValid.fnIsNull(sGltID, "CFW.oEGlt.fnNListGetRowIndexByWhere 多记录表配置ID")) {
  652. return;
  653. }
  654. if (fnPageFun != null && !$.isFunction(fnPageFun)) {
  655. alert('fnRegBeforePageFun函数的fnPageFun入参必须是function对象');
  656. return $("#" + sGltID);
  657. }
  658. return $("#" + sGltID).each(function() {
  659. $.data(this, 'beforePage', fnPageFun);
  660. });
  661. },
  662. /**
  663. * 功能描述: 更新和获取多记录表某列的值 (‘SetItem’) 功能详细说明:可以通过行号和列号,更新或者获取指定某字段值。更新某列值时,可以设置
  664. * sNewValue的参数,当获取某列值时,此参数可以不传入。同时,也可以通过字段名,获取 列的值。
  665. *
  666. * @param sGltID
  667. * (必需) 多记录配置ID,String
  668. * @param iRowIndex
  669. * 行索引,int
  670. * @param iColIndex
  671. * 列索引,int(或字段别名, String)
  672. * @param sNewValue
  673. * 设置值,类型String
  674. *
  675. * <pre>
  676. * 使用方法举例:
  677. * 使用方法1:更新多记录表某列的值 通过行号和列号(或字段名),更新指定某字段或者某列的值。
  678. * 使用方法举例:
  679. * 使用方法1:更新多记录表指定 行索引为2,列索引为6的值为: 1
  680. * CFW.oEGlt.fnSetItem('demo_api_eglt_test', 2, 6, {'SPBZ' : 1});
  681. * 使用方法2:更新多记录表索引列为6的值为0
  682. * CFW.oEGlt.fnSetItem('demo_api_eglt_test',6,{'SPBZ':0}) ;
  683. * </pre>
  684. */
  685. fnSetItem : function() {
  686. if (CFW.oValid.fnIsNull(arguments[0], "CFW.oEGlt.fnSetItem 多记录表配置ID")) {
  687. return;
  688. }
  689. if (CFW.oValid.fnIsNull(arguments[1], "CFW.oEGlt.fnSetItem 多记录表指定位置")) {
  690. return;
  691. }
  692. if (CFW.oValid.fnIsNull(arguments[2], "CFW.oEGlt.fnSetItem 设置值")) {
  693. return;
  694. }
  695. var rowIndices, fieldName, newValue;
  696. var len = arguments.length;
  697. if (len == 3) {
  698. // 更新某列的值 .fweditgrid('field',true,'XB',{'XB':1,'_DIC_XB':'男'}
  699. rowIndices = true;
  700. fieldName = arguments[1];
  701. newValue = arguments[2];
  702. } else if (len == 4) {
  703. // 设置指定 某行某列的值 fweditgrid('field',0,'XB',{'XB':1,'_DIC_XB':'男'}
  704. if (!CFW.oValid.fnIsInteger(arguments[1])) {
  705. CFW.oWin.fnAlert('iRowIndex入参有误,只能是整形数值');
  706. return null;
  707. }
  708. rowIndices = arguments[1];
  709. fieldName = arguments[2];
  710. newValue = arguments[3];
  711. }
  712. // 如果 fieldName 是 列索引, 需要转换为 列名称
  713. if (CFW.oValid.fnIsInteger(fieldName)) {
  714. fieldName = $(
  715. "#" + arguments[0] + " tbody tr:eq(0) td:eq(" + fieldName
  716. + ")").children().last().attr("nd");
  717. }
  718. // 写别名列处理
  719. return $("#" + arguments[0])
  720. .each(
  721. function () {
  722. var vRowIndices = null;// 存放待更新的行的行索引
  723. var rows = $.data(this, 'fweditgrid').options.data.rows;
  724. var dicts = $.data(this, 'fweditgrid').dicts;
  725. var opts = $.data(this, 'fweditgrid').options;
  726. var view = $.data(this, 'fweditgrid').view;
  727. if (rowIndices == true
  728. && typeof rowIndices == 'boolean') {
  729. // 更新所有行,那么获取所有行的行索引
  730. vRowIndices = [];
  731. for (var i=0; i<rows.length;i++) {
  732. vRowIndices.push(parseInt(i, 10));
  733. }
  734. } else if ($.isArray(rowIndices)) {
  735. vRowIndices = rowIndices;
  736. } else {
  737. vRowIndices = [ rowIndices ];
  738. }
  739. var vNewValue = null;// 存放待更新的行对应列的值
  740. if (newValue != undefined || newValue != null) {
  741. if ($.isArray(newValue)) {
  742. vNewValue = newValue;
  743. } else {
  744. vNewValue = [];
  745. for (var i=0; i<rows.length;i++) {
  746. vNewValue.push(newValue);
  747. }
  748. }
  749. }
  750. var isDict = false;// 默认认为不是字典项
  751. var dict = null;
  752. // 判断该别名是否字典项
  753. if (dicts != undefined
  754. && dicts[fieldName] != undefined) {
  755. isDict = true;
  756. dict = dicts[fieldName] || {};
  757. }
  758. $('[nd=' + fieldName + ']', view)
  759. .each(
  760. function () {
  761. var pos = $.inArray(
  762. parseInt(this.rw,
  763. 10),
  764. vRowIndices);
  765. if (pos == -1) {
  766. return;
  767. }
  768. // 只处理所需的行的数据
  769. if (this.type == 'checkbox'
  770. || this.type == 'radio') {
  771. // 更新模型的数据
  772. rows[parseInt(this.rw)][fieldName] = vNewValue[pos][fieldName];
  773. // 单选按钮和多选按钮值不相符的都取消选中状态
  774. if (this.value != vNewValue[pos][fieldName]) {
  775. this.checked = false;
  776. } else {
  777. this.checked = true;
  778. }
  779. } else if (this.type == 'hidden') {
  780. // 隐藏控件先修改成新的值,后修改关联控件的值
  781. var code = vNewValue[pos][fieldName];
  782. if (code == null) {
  783. code = "";
  784. }
  785. this.value = code;
  786. rows[parseInt(this.rw)][fieldName] = code;
  787. if (this.className
  788. .indexOf('gltcom') == -1) {
  789. // 一般只读控件的处理,修改label值
  790. // 准备显示的值
  791. var showValue = this.value;
  792. if (isDict) {
  793. showValue = (dict[this.value] == null) ? ''
  794. : dict[this.value];
  795. }
  796. var labelNode = this.previousSibling;
  797. while (labelNode != null
  798. && labelNode.nodeName != 'LABEL') {
  799. labelNode = labelNode.previousSibling;
  800. }
  801. if (labelNode) {
  802. labelNode.innerHTML = showValue;
  803. }
  804. } else {
  805. // 字典项处理
  806. if (isDict) {
  807. var showValue = (dict[this.value] == null) ? ''
  808. : dict[this.value];
  809. // 获取字典控件
  810. var comboxNode = this.previousSibling;
  811. while (comboxNode != null
  812. && comboxNode.nodeName != 'INPUT') {
  813. comboxNode = comboxNode.previousSibling;
  814. }
  815. comboxNode.value = showValue;
  816. }
  817. }
  818. } else if (this.nodeName == "LABEL") {
  819. // 隐藏控件先修改成新的值,后修改关联控件的值
  820. var code = vNewValue[pos][fieldName];
  821. if (code == null) {
  822. code = "";
  823. }
  824. this.value = code;
  825. rows[parseInt(this.rw)][fieldName] = code;
  826. // 字典项处理
  827. if (isDict) {
  828. var showValue = (dict[this.value] == null) ? ''
  829. : dict[this.value];
  830. // 获取字典控件
  831. var comboxNode = this.previousSibling;
  832. while (comboxNode != null
  833. && comboxNode.nodeName != 'INPUT') {
  834. comboxNode = comboxNode.previousSibling;
  835. }
  836. comboxNode.value = showValue;
  837. } else {
  838. this.innerHTML = code;
  839. }
  840. } else {
  841. // 普通录入直接修改成新的值
  842. var code = vNewValue[pos][fieldName];
  843. if (code == null) {
  844. code = "";
  845. }
  846. this.value = code;
  847. rows[parseInt(this.rw)][fieldName] = code;
  848. }
  849. });
  850. });
  851. },
  852. /**
  853. * 生成一行数据。
  854. *
  855. * @param options
  856. * 多记录表参数
  857. * @param startRow
  858. * 起始行号,不分页时取1,分页上页最大行号+1
  859. * @param fixTable
  860. * 固定表数据区域对象
  861. * @param extTable
  862. * 扩展表数据区域对象
  863. * @param rowNum
  864. * 行索引
  865. * @param rowsData
  866. * 行数据
  867. */
  868. _fnGenOneRow : function(options, headers, startRow, rowNum, rowsData) {
  869. function inputFun(input) {
  870. var rowId = rowNum + parseInt(input.rw);
  871. input.rw = rowId;
  872. if (input.type == 'checkbox' || input.type == 'radio') {
  873. // 处理checkbox或者radiobox的情况
  874. // 判断后台记录是否存在,有则设置对应的值,没有则清空
  875. var value = (rowsData[rowId] || {})[input.nd];
  876. if (value == null) {
  877. value = '';
  878. }
  879. if (input.name != input.nd) {
  880. input.name = (rowId).toString(10) + input.nd;
  881. }
  882. // 设置选中状态
  883. input.checked = (input.value == value);
  884. // 只读设置
  885. if (options.disableMap[input.nd]) {
  886. input.disabled = true;
  887. }
  888. } else if (/.*_CMB/.test(input.nd)) {
  889. // 处理字典控件
  890. var value = (rowsData[rowId] || {})['_DIC_'
  891. + input.nd.substr(0, input.nd.length - 4)];
  892. if (value == null) {
  893. value = '';
  894. }
  895. input.value = value;
  896. // 只读设置
  897. if (options.disableMap[input.nd.substr(0, input.nd.length - 4)]) {
  898. input.disabled = true;
  899. }
  900. } else {
  901. // 处理一般控件
  902. var value = (rowsData[rowId] || {})[input.nd];
  903. if (value == null) {
  904. value = '';
  905. }
  906. input.value = value;
  907. // 只读设置
  908. if (options.disableMap[input.nd]) {
  909. input.disabled = true;
  910. }
  911. }
  912. CFW.oGt._fnObjInit(input);
  913. }
  914. function labelFun(label) {
  915. // 判断后台记录是否存在,有则设置对应的值,没有则清空
  916. var rowId = rowNum + parseInt(label.rw);
  917. var labelValue = null;
  918. // 先看看有没有对应的字典项
  919. labelValue = (rowsData[rowId] || {})['_DIC_' + label.nd];
  920. // 如果没有则只用列的实际值
  921. if (labelValue == null) {
  922. labelValue = (rowsData[rowId] || {})[label.nd];
  923. }
  924. if (labelValue == null) {
  925. labelValue = '';
  926. }
  927. var value = (rowsData[rowId] || {})[label.nd];
  928. if (value == null) {
  929. value = '';
  930. }
  931. label.value = value;
  932. label.rw = rowId;
  933. label.innerHTML = labelValue;
  934. }
  935. var tr = options.tr.cloneNode(true);
  936. var t = document.createElement('TR');
  937. t = tr;
  938. // $(t).html($(tr).html());
  939. // 设置rowIndex
  940. t['fweditgrid-row-index'] = rowNum;
  941. // 设置序号列
  942. t.firstChild/* td */.innerHTML = startRow + rowNum;
  943. // 输入控件一个个的遍历
  944. var set = t.getElementsByTagName('INPUT');
  945. for ( var i = 0, len = set.length; i < len; i++) {
  946. inputFun(set[i]);
  947. }
  948. // label控件一个个处理
  949. set = t.getElementsByTagName('LABEL');
  950. for ( var i = 0, len = set.length; i < len; i++) {
  951. labelFun(set[i]);
  952. }
  953. return t;
  954. },
  955. /**
  956. * 设置间隔行的不同颜色
  957. */
  958. _fnSetAlt : function (target) {
  959. var opts = $.data(target, 'fweditgrid').options;
  960. var grid = $.data(target, 'fweditgrid').grid;
  961. var view = $.data(target, 'fweditgrid').view;
  962. var trs = view.children('table')[0].getElementsByTagName('TBODY')[0]
  963. .getElementsByTagName('TR');
  964. // 生成各行不同颜色的效果
  965. for ( var i = 0, l = trs.length; i < l; i++) {
  966. var thisTr = trs[i];
  967. if (thisTr['fweditgrid-row-index'] == undefined) {
  968. continue;
  969. }
  970. var className = ' ' + thisTr.className + ' ';
  971. var pair = [ ' fweditgrid-row-alt ', ' fweditgrid-row ' ];
  972. if (parseInt(thisTr['fweditgrid-row-index']) % 2 != 0) {
  973. pair = [ ' fweditgrid-row ', ' fweditgrid-row-alt ' ];
  974. }
  975. // 删除可能的class
  976. className = className.replace(pair[0], ' ');
  977. // 添加新的class
  978. if (className.indexOf(pair[1]) < 0) {
  979. className += pair[1];
  980. }
  981. thisTr.className = $.trim(className);
  982. }
  983. },
  984. /**
  985. * 装载数据到列表中
  986. */
  987. _fnLoadData : function (target, data) {
  988. // var startTime = new Date();
  989. var grid = $.data(target, 'fweditgrid').grid;
  990. var opts = $.data(target, 'fweditgrid').options;
  991. var view = $.data(target, 'fweditgrid').view;
  992. var headers = data.headers;
  993. var total = data.total;
  994. var rows = data.rows;
  995. var sValue = "";
  996. var table = view.children('table')[0];
  997. var ViewBody = table.tBodies[0];
  998. $(ViewBody).remove();
  999. var iPageNum = 0;
  1000. // 计算当前页的起始行号
  1001. iPageNum = (parseInt(opts.pageNumber, 10) - 1)
  1002. * parseInt(opts.pageSize, 10);
  1003. opts.total = total;
  1004. opts.data = null;
  1005. opts.data = data;
  1006. opts.rowxh = iPageNum + 1;
  1007. var frag = document.createDocumentFragment();
  1008. // 循环每一行的数据
  1009. // var startTime = new Date();
  1010. for ( var i = 0; i < rows.length; i++) {
  1011. var tr = CFW.oEGlt._fnGenOneRow(opts, headers, iPageNum + 1, i, rows);
  1012. frag.appendChild(tr);
  1013. }// for
  1014. //
  1015. var tbody = document.createElement('TBODY');
  1016. tbody.appendChild(frag);
  1017. table.appendChild(tbody);
  1018. CFW.oEGlt._fnSetAlt(target);
  1019. // showErrMsg('loadData:'+(new Date()-startTime),5);
  1020. },
  1021. // 显示页码
  1022. _fnShowInfo : function(target) {
  1023. var opts = $.data(target, 'fweditgrid').options;
  1024. var pager = $.data(target, 'fweditgrid').pager;
  1025. var total = parseInt(opts.total, 10); // 总共的行数
  1026. var pageCount = Math.ceil(opts.total / opts.pageSize);
  1027. var num = pager.find('input.fweditgrid-num');
  1028. num.val(opts.pageNumber);
  1029. num.parent().next().find('span').html(
  1030. opts.afterPageText.replace(/{pages}/, pageCount));
  1031. var pinfo = opts.displayMsg;
  1032. pinfo = pinfo.replace(/{from}/, opts.pageSize * (opts.pageNumber - 1) + 1);
  1033. pinfo = pinfo.replace(/{to}/, Math.min(opts.pageSize * (opts.pageNumber),
  1034. opts.total));
  1035. pinfo = pinfo.replace(/{total}/, opts.total);
  1036. pager.find('div.fweditgrid-info').html(pinfo);
  1037. $('a[icon=fweditgrid-first],a[icon=fweditgrid-prev]', pager).linkbutton({
  1038. disabled : (opts.pageNumber == 1)
  1039. });
  1040. $('a[icon=fweditgrid-next],a[icon=fweditgrid-last]', pager).linkbutton({
  1041. disabled : (opts.pageNumber >= pageCount)
  1042. });
  1043. if (opts.loading) {
  1044. pager.find('a[icon=fweditgrid-load]').find('.fweditgrid-load')
  1045. .addClass('fweditgrid-loading');
  1046. } else {
  1047. pager.find('a[icon=fweditgrid-load]').find('.fweditgrid-load')
  1048. .removeClass('fweditgrid-loading');
  1049. }
  1050. },
  1051. /**
  1052. * 修改行号以及序号等 因为每次删除后 行号以及序号等都会发生变化
  1053. */
  1054. _fnModifyRowAttr : function (target) {
  1055. var grid = $.data(target, 'fweditgrid').grid;
  1056. var opts = $.data(target, 'fweditgrid').options;
  1057. var view = $.data(target, 'fweditgrid').view;
  1058. var table = view.children('table')[0];
  1059. var xh = parseInt(opts.rowxh, 10);
  1060. $.each(table.tBodies[0].rows, function(indexInArray) {
  1061. this['fweditgrid-row-index'] = indexInArray;
  1062. $('input', this).each(function() {
  1063. this['rw'] = indexInArray;
  1064. });
  1065. this.cells[0].innerHTML = xh + indexInArray;
  1066. });
  1067. },
  1068. /**
  1069. * 功能说明:获取可编辑多记录表的数据集
  1070. * @param sTableId 必须,配置多记录表单的ID字符
  1071. * @return JSON数组,包含了每一行的数据
  1072. * <pre>
  1073. * CFW.oEGlt.fnGetEditGridData('gltId');
  1074. * </pre>
  1075. */
  1076. fnGetEditGridData : function(sTableId){
  1077. var rows = $("#"+sTableId).fweditgrid("getRows");
  1078. return rows;
  1079. }
  1080. };