fwnupgrid.js 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714
  1. (function($) {
  2. /**
  3. * 装载数据到列表中
  4. */
  5. function loadData(target, data) {
  6. var grid = $.data(target, 'fwnupgrid').grid;
  7. var opts = $.data(target, 'fwnupgrid').options;
  8. var view = $.data(target, 'fwnupgrid').view;
  9. var ifrozenColumns = opts.frozenColumns;
  10. var icolumns = opts.columns;
  11. var headers = data.headers;
  12. var total = data.total;
  13. var rows = data.rows;
  14. var tr;
  15. var iRow = 0;
  16. var xh = 0;
  17. var table = view.children('table')[0];
  18. var ViewBody = table.tBodies[0];
  19. $(ViewBody).remove();
  20. var iPageNum = 0;
  21. // 计算当前页的起始行号
  22. iPageNum = (parseInt(opts.pageNumber, 10) - 1) * parseInt(opts.pageSize, 10);
  23. opts.total = total;
  24. opts.data = null;
  25. opts.data = data;
  26. opts.rowxh = iPageNum + 1;
  27. var iMaxRecordRow = Math.ceil(rows.length/opts.nupRow)*opts.nupRow;
  28. // 循环每一行的数据,优先拼接所有行的数据
  29. var ptr = "";
  30. var frag = document.createDocumentFragment();
  31. tr = opts.tr.cloneNode(true);
  32. var tr1 = $(tr).html();
  33. for ( var iGltRow = 0; iGltRow < iMaxRecordRow; iGltRow+=opts.nupRow) {
  34. //准备多记录表一行的数据,预先更新rw行索引的值
  35. ptr += ("<tr>" + tr1 + "</tr>").replace(/rw=\"(\d+)\"/g,
  36. function(matchpart, rowNumber) {
  37. return 'rw="' + (parseInt(rowNumber) + iGltRow) + '"';
  38. });
  39. }
  40. var tbody=document.createElement('TBODY');
  41. $(tbody).html(ptr);
  42. table.appendChild(tbody);
  43. var errMsg ='';
  44. //处理一般控件
  45. $(table).find('input')
  46. .filter(':checkbox,:radio').each(function(index, element){
  47. //处理radio和checkbox
  48. //判断后台记录是否存在,有则设置对应的值,没有则清空
  49. var qelement = $(element);
  50. var rowId = parseInt(element.rw);
  51. var value = (rows[rowId]||{})[element.nd];
  52. if(value == null){
  53. value = '';
  54. }
  55. var attrs = {};
  56. if(this.name==element.nd){
  57. }else{
  58. attrs['name']=(rowId).toString(10)+element.nd;
  59. }
  60. if($(element).val()==value){
  61. attrs['checked']='checked';
  62. }else{
  63. attrs['checked']=false;
  64. }
  65. qelement.attr(attrs);
  66. //只读设置
  67. if(opts.disableMap[element.nd]){
  68. CFW.oGt.fnToDisabledObj(element);
  69. }
  70. }).end().not('checkbox,:radio').each(function(index, element){
  71. if(element.nd.indexOf('_CMB')>-1){
  72. //处理字典控件
  73. //判断后台记录是否存在,有则设置对应的值,没有则清空
  74. var value = (rows[parseInt(element.rw)]||{})
  75. ['_DIC_' + element.nd.substr(0,element.nd.length-4)];
  76. if(value == null){
  77. value = '';
  78. }
  79. element.value = value;
  80. //只读设置
  81. if(opts.disableMap[element.nd.substr(0,element.nd.length-4)]){
  82. CFW.oGt.fnToDisabledObj(element);
  83. }
  84. }else{
  85. //处理一般input控件(非radio和checkbox)
  86. var value = (rows[parseInt(element.rw)]||{})[element.nd];
  87. if(value == null){
  88. value = '';
  89. }
  90. element.value=value;
  91. //只读设置
  92. if(opts.disableMap[element.nd]){
  93. CFW.oGt.fnToDisabledObj(element);
  94. }
  95. }
  96. });
  97. //处理只读label控件
  98. $(table).find('label[nd]').each(function(index, element){
  99. //判断后台记录是否存在,有则设置对应的值,没有则清空
  100. var labelValue = null;
  101. //先看看有没有对应的字典项
  102. var qelement = $(element);
  103. labelValue = (rows[parseInt(element.rw)]||{})['_DIC_' + element.nd];
  104. //如果没有则只用列的实际值
  105. if(labelValue == null){
  106. labelValue = (rows[parseInt(element.rw)]||{})[element.nd] ;
  107. }
  108. if(labelValue == null){
  109. labelValue = '';
  110. }
  111. var value = (rows[parseInt(element.rw)]||{})[element.nd];
  112. if(value == null){
  113. value = '';
  114. }
  115. element.value=value;
  116. qelement.html(labelValue);
  117. });
  118. setAlt(target);
  119. CFW.oGt._fnInitObject(opts.confid);
  120. }
  121. /**
  122. * 单击上下页时获取数据库的多记录数据
  123. */
  124. function request(target,pageNumber,pageSize,callFun) {
  125. var grid = $.data(target, 'fwnupgrid').grid;
  126. var opts = $.data(target, 'fwnupgrid').options;
  127. var param;
  128. var where = opts.whereCls;
  129. var confid = opts.confid;
  130. var dsId = opts.dsId;
  131. var dynDictWhereCls = JSON.stringify(opts.dynDictWhereCls);
  132. var rowstart = (pageNumber - 1) * pageSize + 1;
  133. var pSize = pageSize;
  134. if(_ENCRYPT_WHERE){
  135. if(where!=null&&where!='null'&&where!=''&&where!='undefined'){
  136. where=stringToHex(encrypt(WHEREKEY,where));
  137. }
  138. }
  139. var param = $.extend({}, {
  140. 'confid' : confid,
  141. 'dynDictWhereCls' : dynDictWhereCls,
  142. 'dsId' : dsId,
  143. 'rowstart' : rowstart,
  144. 'pageSize' : pSize,
  145. 'whereCls' : where
  146. });
  147. if (!opts.url)return;
  148. setLoadStatus(target, true);
  149. var wrap = $('.fwnupgrid-wrap', grid);
  150. $('<div class="fwnupgrid-mask"></div>').css({
  151. display : 'block',
  152. width : wrap.width(),
  153. height : wrap.height()
  154. }).appendTo(wrap);
  155. $('<div class="fwnupgrid-mask-msg"></div>').html(opts.loadMsg).appendTo(wrap).css(
  156. {display : 'block',
  157. left : (wrap.width() - $('.fwnupgrid-mask-msg',grid).outerWidth()) / 2,
  158. top : (wrap.height() - $('.fwnupgrid-mask-msg',grid).outerHeight()) / 2
  159. });
  160. $.ajax({
  161. type : opts.method,
  162. url : opts.url,
  163. data : param,
  164. dataType : 'json',
  165. cache : false,
  166. success : function(data) {
  167. if(data!=null && data[headtoken]!=null){
  168. token=data[headtoken];//更新全局变量token标志
  169. }
  170. if("1"!=data.FHZ){//出错了,弹出错误提醒
  171. if("CSRF" == data.FHZ){
  172. showMsg(data.MSG||'',3);
  173. }else if("-1" == data.FHZ){
  174. _FW.oFtl.fnAlert(data.MSG||'');
  175. }
  176. $(grid).find('a[icon=fwnupgrid-load]').find('.fwnupgrid-load').removeClass('fwnupgrid-loading');
  177. $('div.fwnupgrid-mask', grid).remove();
  178. $('div.fwnupgrid-mask-msg', grid).remove();
  179. return;
  180. }
  181. if (callFun != null && typeof(callFun) === "function"){
  182. callFun();
  183. }
  184. opts.loading = false;
  185. $(grid).find('a[icon=fwnupgrid-load]').find('.fwnupgrid-load').removeClass('fwnupgrid-loading');
  186. $('div.fwnupgrid-mask', grid).remove();
  187. $('div.fwnupgrid-mask-msg', grid).remove();
  188. loadData(target, data);
  189. createMsg(target);
  190. showInfo(target);
  191. if (opts.onLoadSuccess) {
  192. opts.onLoadSuccess.apply(this, arguments);
  193. }
  194. },
  195. error : function(XMLHttpRequest, textStatus, errorThrown) {
  196. opts.loading = false;
  197. $('.fwnupgrid-mask', grid).remove();
  198. $('.fwnupgrid-mask-msg', grid).remove();
  199. var tipMsg = XMLHttpRequest.responseText;
  200. CFW.oWin.fnAlert("错误信息:" + tipMsg);
  201. $(grid).find('a[icon=fwnupgrid-load]')
  202. .find('.fwnupgrid-load').removeClass('fwnupgrid-loading');
  203. if (opts.onLoadError) {
  204. opts.onLoadError.apply(this, arguments);
  205. }
  206. },
  207. beforeSend:function(XMLHttpRequest ){
  208. var cToken = $.cookie(headtoken) || token;XMLHttpRequest.setRequestHeader(headtoken,cToken);
  209. }
  210. });
  211. }
  212. function createMsg(target) {
  213. /*
  214. var grid = $.data(target, 'fwnupgrid').grid;
  215. var opts = $.data(target, 'fwnupgrid').options;
  216. var rows = opts.data.rows;
  217. $('div.fwnupgrid-mask:first', grid).remove();
  218. $('div.fwnupgrid-mask-msg2:first', grid).remove();
  219. if (rows.length == 0) {
  220. var wrap = $('div.fwnupgrid-wrap:first', grid);
  221. $('<div class="fwnupgrid-mask"></div>').css({
  222. display : 'block',
  223. width : wrap.width(),
  224. height : wrap.height()
  225. }).appendTo(wrap);
  226. $('<div class="fwnupgrid-mask-msg2"></div>').html(opts.tipMsg).appendTo(wrap).css({
  227. display : 'block',
  228. left : (wrap.width() - $('div.fwnupgrid-mask-msg2', grid).outerWidth()) / 2,
  229. top : (wrap.height() - $('div.fwnupgrid-mask-msg2', grid).outerHeight()) / 2
  230. });
  231. }
  232. */
  233. }
  234. function setLoadStatus(target, loading) {
  235. var opts = $.data(target, 'fwnupgrid').options;
  236. var grid = $.data(target, 'fwnupgrid').grid;
  237. if (!opts.hasPage) {
  238. return true;
  239. }
  240. var pager = $('fwnupgrid-pager', grid);
  241. opts.loading = loading;
  242. if (opts.loading) {
  243. pager.find('a[icon=fwnupgrid-load]').find('.fwnupgrid-load').addClass('fwnupgrid-loading');
  244. } else {
  245. pager.find('a[icon=fwnupgrid-load]').find('.fwnupgrid-load').removeClass('fwnupgrid-loading');
  246. }
  247. return true;
  248. }
  249. // 设置分页栏的信息
  250. function buildPage(target) {
  251. var opts = $.data(target, 'fwnupgrid').options;
  252. var grid = $.data(target, 'fwnupgrid').grid;
  253. var expbtn = opts.expbtn;
  254. if (!opts.hasPage && $.trim(expbtn).length == 0) {
  255. return true;
  256. }
  257. if(opts.data.total>1){opts.total = opts.data.total;}
  258. var pager = $('.fwnupgrid .fwnupgrid-wrap .fwnupgrid-pager', grid);
  259. var t = $('<table cellspacing="0" cellpadding="0" border="0"><tr></tr></table>').appendTo(pager);
  260. var tr = $('tr', t);
  261. if (opts.hasPage) {
  262. var ps = $('<input class="fwnupgrid-page-list"></input>');
  263. $('<td></td>').append(ps).appendTo(tr);
  264. ps.val(opts.pageSize);
  265. //预先准备需要插入到分页栏的所有html数据,然后一次性appendTo到tr中
  266. var xxc = '<td><div class="fwnupgrid-btn-separator"></div></td>';
  267. xxc += '<td><a href=\"javascript:void(0)\" icon=\"fwnupgrid-first\"></a></td>';
  268. xxc += '<td><a href=\"javascript:void(0)\" icon=\"fwnupgrid-prev\"></a></td>';
  269. xxc += '<td><div class=\"fwnupgrid-btn-separator\"></div></td>';
  270. xxc += '<td><span style=\"padding-left:6px;\">'+opts.beforePageText+'</span></td>';
  271. xxc += '<td><input class=\"fwnupgrid-num\" type=\"text\" value=\"1\" size=\"5\"></td>';
  272. xxc += '<td><span style=\"padding-right:6px;\"></span></td>';
  273. xxc += '<td><div class=\"fwnupgrid-btn-separator\"></div></td>';
  274. xxc += '<td><a href=\"javascript:void(0)\" icon=\"fwnupgrid-next\"></a></td>';
  275. xxc += '<td><a href=\"javascript:void(0)\" icon=\"fwnupgrid-last\"></a></td>';
  276. xxc += '<td><div class=\"fwnupgrid-btn-separator\"></div></td>';
  277. xxc += '<td><a href=\"javascript:void(0)\" icon=\"fwnupgrid-load\"></a></td>';
  278. xxc += '<td><div class=\"fwnupgrid-btn-separator\"></div></td>';
  279. tr.append(xxc);
  280. $.each(['NEW'], function(index, value) {
  281. if (expbtn.indexOf(value) == '-1') {
  282. return;
  283. }
  284. $("<td><a href=\"javascript:void(0)\" class=\"fwnupgrid-new\">新增一行</a></td>").appendTo(tr);
  285. });
  286. }
  287. $("<div class=fwnupgrid-info></div>").appendTo(pager);
  288. $("<div style=\"clear:both\"></div>").appendTo(pager);
  289. $("a[icon^=fwnupgrid]", pager).linkbutton({
  290. plain : true
  291. });
  292. if (opts.hasPage) {
  293. showInfo(target);
  294. pager.find('a[class=fwnupgrid-new]').bind('click.fwnupgrid', function(){
  295. $(target).fwnupgrid("addRows");
  296. });
  297. pager.find('a[icon=fwnupgrid-first]').unbind('.fwnupgrid').bind('click.fwnupgrid', function() {
  298. if (opts.pageNumber > 1)selectPage(target, 1);
  299. });
  300. pager.find('a[icon=fwnupgrid-prev]').unbind('.fwnupgrid').bind('click.fwnupgrid', function() {
  301. if (opts.pageNumber > 1)selectPage(target, opts.pageNumber - 1);
  302. });
  303. pager.find('a[icon=fwnupgrid-next]').unbind('.fwnupgrid').bind('click.fwnupgrid', function() {
  304. var pageCount = Math.ceil(opts.total / opts.pageSize);
  305. if (opts.pageNumber < pageCount) selectPage(target, opts.pageNumber + 1);
  306. });
  307. pager.find('a[icon=fwnupgrid-last]').unbind('.fwnupgrid').bind('click.fwnupgrid', function(){
  308. var pageCount = Math.ceil(opts.total / opts.pageSize);
  309. if (opts.pageNumber < pageCount)selectPage(target, pageCount);
  310. });
  311. pager.find('a[icon=fwnupgrid-load]').unbind('.fwnupgrid').bind('click.fwnupgrid', function(){
  312. selectPage(target, opts.pageNumber);
  313. });
  314. pager.find('input.fwnupgrid-num').unbind('.fwnupgrid').bind('keydown.fwnupgrid',function(e) {
  315. if (event.keyCode == 8 || event.keyCode == 9
  316. || event.keyCode == 46) {
  317. return true;
  318. }
  319. if (e.keyCode == 13) {
  320. var pageNumber = parseInt($(this).val()) || 1;
  321. selectPage(target, pageNumber);
  322. }
  323. // 小键盘的数字区
  324. if (e.keyCode >= 96 && e.keyCode <= 105) {
  325. return true;
  326. }
  327. // 键盘的数字区
  328. if ((e.keyCode >= 48 && e.keyCode <= 57
  329. && e.ctrlKey == false && e.shiftKey == false)) {
  330. return true;
  331. }
  332. return false;
  333. });
  334. pager.find('.fwnupgrid-page-list').unbind('.fwnupgrid').bind('keydown',function(e) {
  335. if (event.keyCode == 8 || event.keyCode == 9
  336. || event.keyCode == 46) {
  337. return true;
  338. }
  339. // 小键盘的数字区
  340. if (e.keyCode >= 96 && e.keyCode <= 105) {
  341. return true;
  342. }
  343. // 键盘的数字区
  344. if ((e.keyCode >= 48 && e.keyCode <= 57
  345. && e.ctrlKey == false && e.shiftKey == false)) {
  346. return true;
  347. }
  348. return false;
  349. });
  350. $('.fwnupgrid-page-list', pager).each(function() {
  351. this.value = opts.pageSize;
  352. });
  353. pager.find('.fwnupgrid-page-list').unbind('.fwnupgrid').bind(
  354. 'change.fwnupgrid', function() {
  355. if($(this).val()>200){
  356. CFW.oWin.fnAlert("每页显示的行数不能大于200!");
  357. return true;
  358. }
  359. opts.pageSize = $(this).val();
  360. if (opts.pageSize == 0) {
  361. opts.pageSize = 1;
  362. this.value = 1;
  363. }
  364. // 这里处理的目的是当列表的表头和表尾都有分页栏时,同步两个分页栏的框显示一致。
  365. $('.fwnupgrid-page-list', pager).each(function() {
  366. this.value = opts.pageSize;
  367. });
  368. var pageCount = Math.ceil(opts.total / opts.pageSize);
  369. selectPage(target, opts.pageNumber);
  370. });
  371. }
  372. }
  373. // 显示页码
  374. function showInfo(target) {
  375. var opts = $.data(target, 'fwnupgrid').options;
  376. var total = parseInt(opts.total, 10); // 总共的行数
  377. var pageCount = Math.ceil(opts.total / opts.pageSize);
  378. var num = $(target).find('input.fwnupgrid-num');
  379. num.val(opts.pageNumber);
  380. num.parent().next().find('span').html(opts.afterPageText.replace(/{pages}/, pageCount));
  381. var pinfo = opts.displayMsg;
  382. pinfo = pinfo.replace(/{from}/, opts.pageSize * (opts.pageNumber - 1) + 1);
  383. pinfo = pinfo.replace(/{to}/, Math.min(opts.pageSize * (opts.pageNumber), opts.total));
  384. pinfo = pinfo.replace(/{total}/, opts.total);
  385. $(target).find('.fwnupgrid-info').html(pinfo);
  386. $('a[icon=fwnupgrid-first],a[icon=fwnupgrid-prev]', target).linkbutton({
  387. disabled : (opts.pageNumber == 1)
  388. });
  389. $('a[icon=fwnupgrid-next],a[icon=fwnupgrid-last]', target).linkbutton({
  390. disabled : (opts.pageNumber >= pageCount)
  391. });
  392. if (opts.loading) {
  393. $(target).find('a[icon=fwnupgrid-load]').find('.fwnupgrid-load').addClass('fwnupgrid-loading');
  394. } else {
  395. $(target).find('a[icon=fwnupgrid-load]').find('.fwnupgrid-load').removeClass('fwnupgrid-loading');
  396. }
  397. }
  398. function setLoadStatus(target, loading) {
  399. var opts = $.data(target, 'fwnupgrid').options;
  400. var grid = $.data(target, 'fwnupgrid').grid;
  401. if (!opts.hasPage) {
  402. return true;
  403. }
  404. var pager = $('fwnupgrid-pager', grid);
  405. opts.loading = loading;
  406. if (opts.loading) {
  407. pager.find('a[icon=fwnupgrid-load]').find('.fwnupgrid-load').addClass('fwnupgrid-loading');
  408. } else {
  409. pager.find('a[icon=fwnupgrid-load]').find('.fwnupgrid-load').removeClass('fwnupgrid-loading');
  410. }
  411. return true;
  412. }
  413. // 选择一页
  414. function selectPage(target, page) {
  415. //取响应的函数。
  416. var beforePageFun = $.data(target,'beforePage');
  417. if (beforePageFun != null && $.isFunction(beforePageFun)
  418. && !beforePageFun.call(target)) {
  419. //响应函数如果返回非true,那么不处理翻页
  420. return;
  421. }
  422. var opts = $.data(target, 'fwnupgrid').options;
  423. var pageCount = Math.ceil(opts.total / opts.pageSize);
  424. var pageNumber = page;
  425. if (page < 1)
  426. pageNumber = 1;
  427. if (page > pageCount)
  428. pageNumber = pageCount;
  429. request(target,pageNumber,opts.pageSize,function(){
  430. opts.pageNumber = pageNumber;
  431. });
  432. }
  433. /**
  434. * 获取固定区和扩展区中的行各列的对齐和高度
  435. */
  436. function getHeaderStyle(grid) {
  437. return $('.fwnupgrid-cell[lastRowIndex]', grid).map(function(){
  438. return {
  439. 'style' : $(this).parent().attr('_al'),
  440. 'width' : $(this).outerWidth()
  441. };
  442. }).get();
  443. }
  444. /**
  445. * 设置大小 列宽等
  446. */
  447. function setSize(target) {
  448. var grid = $.data(target, 'fwnupgrid').grid;
  449. var opts = $.data(target, 'fwnupgrid').options;
  450. var view = $.data(target, 'fwnupgrid').view;
  451. /*重置宽度,否则无法缩小*/
  452. view.width(0).parent().width(0);
  453. if (opts.fit == true) {
  454. var p = grid.parent();
  455. opts.width = p.width();
  456. opts.height = p.height();
  457. }
  458. var tmp = opts.width + '';
  459. var iPos = tmp.indexOf('%');
  460. if (iPos != -1) {
  461. opts.width = 'auto';
  462. }
  463. if (opts.width != 'auto') {
  464. opts.width = parseInt(opts.width, 10);
  465. }
  466. var gridWidth = opts.width;
  467. if (gridWidth == 'auto') {
  468. gridWidth = view.closest('.fwnupgrid').outerWidth();
  469. }
  470. var innerWidth = gridWidth - grid.outerWidth() + grid.width();
  471. //修复:每次单击分页栏的刷新按钮时框体会自动撑大一点的问题
  472. if((innerWidth - view.width()) < 20){
  473. innerWidth = view.parent().width();
  474. }
  475. view.width(innerWidth)
  476. .parent()//.fwnupgrid-wrap'
  477. .width(innerWidth);
  478. var tmp = opts.height + '';
  479. var iPos = tmp.indexOf('%');
  480. // 凡是包含有100%的都设成自动高度否则会报错
  481. if (iPos != -1) {
  482. opts.height = 'auto';
  483. }
  484. if (opts.height != 'auto') {
  485. opts.height = parseInt(opts.height, 10);
  486. }
  487. view.height(opts.height);
  488. }
  489. /**
  490. *初始化多记录表表头的checkbox事件,双击事件等
  491. */
  492. function initHeader(target){
  493. var grid = $.data(target, 'fwnupgrid').grid;
  494. $('div.fwnupgrid-view input.fwnupgrid-header-check',grid).click(function(){
  495. //取得本checkbox所代表的列的索引
  496. var index = parseInt(this.parentNode.lastRowIndex)-1;
  497. //取得列别名
  498. var opts = $.data(target, 'fwnupgrid').options;
  499. var alias = opts.data.headers[index];
  500. var inputs = target.getElementsByTagName('input');
  501. for(var i=0;i<inputs.length;i++){
  502. if(inputs[i].name===alias){
  503. //找到别名相同的就根据表头checkbox的状态设置选中状态
  504. inputs[i].checked=this.checked;
  505. }
  506. }
  507. });
  508. //设置标题头,双击可排序
  509. $('[lastRowIndex]',target).dblclick(function(){
  510. var data = $.data(target, 'fwnupgrid').options.data;
  511. var headers = data.headers;
  512. if($('input',this).length>0){
  513. //过滤checkbox列
  514. return;
  515. }
  516. var vthis = $(this);
  517. //获取排序列的别名
  518. var alias = headers[this.lastRowIndex-1];
  519. var sortOrder = vthis.attr('sortOrder');
  520. //重置其它列的排序序号
  521. $('[lastRowIndex] span:last-child',target).text('');
  522. if(!sortOrder||'desc'==sortOrder){//升序排序
  523. vthis.attr('sortOrder','asc');
  524. vthis.find('span:last').text('+');
  525. data.rows.sort(function(o1,o2){
  526. if(o1[alias] == o2[alias]){
  527. return 0;
  528. }
  529. return (o1[alias] < o2[alias]) ? -1 : 1;
  530. });
  531. }else{//降序排序
  532. vthis.attr('sortOrder','desc');
  533. vthis.find('span:last').text('-');
  534. data.rows.sort(function(o1,o2){
  535. if(o1[alias] == o2[alias]){
  536. return 0;
  537. }
  538. return (o1[alias] < o2[alias]) ? 1 : -1;
  539. });
  540. }
  541. loadData(target,data);
  542. });
  543. }
  544. /**
  545. * set the common properties
  546. */
  547. function setProperties(target) {
  548. var grid = $.data(target, 'fwnupgrid').grid;
  549. var opts = $.data(target, 'fwnupgrid').options;
  550. var view = $.data(target, 'fwnupgrid').view;
  551. var data = opts.data;
  552. var headers = data.headers;
  553. var icol = 1;
  554. setAlt(target);
  555. var body = view.children('table')[0];
  556. if (opts.nowrap == false) {
  557. $(body[0]).find('td').css('white-space','normal');
  558. }
  559. initHeader(target);
  560. }
  561. /**
  562. * 设置间隔行的不同颜色
  563. */
  564. function setAlt(target){
  565. var grid = $.data(target, 'fwnupgrid').grid;
  566. var view = $.data(target, 'fwnupgrid').view;
  567. //隐藏掉多出来的空记录控件
  568. var nupRow = $.data(target, 'fwnupgrid').options.nupRow;
  569. var rows = $.data(target, 'fwnupgrid').options.data.rows;
  570. if(!rows||rows.length==0){
  571. //隐藏第一行
  572. $('.fwnupgrid-view:first', grid).find('input[rw]:first')//查找到最后一行的第一个控件
  573. .closest('tr.gltDataTableTr')//找到自己的td
  574. .hide();//全部隐藏
  575. }else{
  576. //处理一般控件
  577. $('.fwnupgrid-view:first', grid).find('input[rw="'+(rows.length-1)+'"]:last')//查找到最后一行的第一个控件
  578. .closest('td[field]')//找到自己的td
  579. .nextAll()//找到之后的所有td
  580. .hide();//全部隐藏
  581. }
  582. var trs = view.children('table')[0].getElementsByTagName('TBODY')[0].getElementsByTagName('TR');
  583. //生成各行不同颜色的效果
  584. for ( var i = 0, l = trs.length; i < l; i++ ) {
  585. var thisTr = trs[i];
  586. if(thisTr['fwnupgrid-row-index']==undefined){
  587. continue;
  588. }
  589. var className = ' '+thisTr.className+' ';
  590. var pair=[' fwnupgrid-row-alt ',' fwnupgrid-row '];
  591. if(parseInt(thisTr['fwnupgrid-row-index'])%2!=0){
  592. pair=[' fwnupgrid-row ',' fwnupgrid-row-alt '];
  593. }
  594. //删除可能的class
  595. className = className.replace(pair[0],' ');
  596. //添加新的class
  597. if(className.indexOf(pair[1])<0){
  598. className+=pair[1];
  599. }
  600. thisTr.className=$.trim(className);
  601. }
  602. }
  603. /**
  604. * 键盘单击上键时移动 下拉框的选项
  605. */
  606. function selectPrev(target,input,combox){
  607. var panelbody = $('.gltcombox-panel-body',combox);
  608. var item = panelbody.find('div.gltcombox-item-selected');
  609. if (item.length){
  610. var prev = item.prev(':visible');
  611. if (prev.length){
  612. item = prev;
  613. }else{
  614. item = panelbody.find('div.gltcombox-item:visible:last');
  615. }
  616. } else {
  617. item = panelbody.find('div.gltcombox-item:visible:last');
  618. }
  619. var value = item.attr('value');
  620. setValue(target,combox,input,$.trim(item.text()),value);
  621. if (item.position().top <= 0){
  622. var h = panelbody.scrollTop() + item.position().top;
  623. panelbody.scrollTop(h);
  624. } else if (item.position().top + item.outerHeight() > panelbody.height()){
  625. var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
  626. panelbody.scrollTop(h);
  627. }
  628. }
  629. /**
  630. * 键盘单击下键时移动 下拉框的选项
  631. */
  632. function selectNext(target,input,combox){
  633. var panelbody = $('.gltcombox-panel-body',combox);
  634. var item = panelbody.find('div.gltcombox-item-selected');
  635. if (item.length){
  636. var next = item.next(':visible');
  637. if (next.length){
  638. item = next;
  639. }else{
  640. item = panelbody.find('div.gltcombox-item:visible:first');
  641. }
  642. } else {
  643. item = panelbody.find('div.gltcombox-item:visible:first');
  644. }
  645. var value = item.attr('value');
  646. setValue(target,combox,input,$.trim(item.text()),value);
  647. if (item.position().top <= 0){
  648. var h = $(combox).scrollTop() + item.position().top;
  649. panelbody.scrollTop(h);
  650. } else if (item.position().top + item.outerHeight() > panelbody.height()){
  651. var h = panelbody.scrollTop() + item.position().top + item.outerHeight() - panelbody.height();
  652. panelbody.scrollTop(h);
  653. }
  654. }
  655. function selectCur(target,input,combox){
  656. var panelbody = $('.gltcombox-panel-body',combox);
  657. var item = panelbody.find('div.gltcombox-item-selected');
  658. //没有选项就不处理
  659. if(item.length==0)return;
  660. var value = item.attr('value');
  661. setValue(target,combox,input,$.trim(item.text()),value,true);
  662. }
  663. /**
  664. * 设置该值 HIDDEN input 保存字典值
  665. */
  666. function setValue(target,combox,input,text,value,confirm){
  667. var panelbody = $('.gltcombox-panel-body',combox);
  668. panelbody.find('div.gltcombox-item-selected').removeClass('gltcombox-item-selected');
  669. panelbody.find('div.gltcombox-item[value=' + value + ']').addClass('gltcombox-item-selected');
  670. if(confirm){
  671. var obj=getComHidden(target,input);
  672. input.value = text;
  673. obj.value = value;
  674. var fun = window[input.doselect];
  675. if(fun){
  676. fun(input,{AAA102:value,AAA103:text});
  677. }
  678. }
  679. }
  680. /**
  681. * 获取下拉字典项保存字典值的HIDDEN input 对象
  682. */
  683. function getComHidden(target,input){
  684. var obj;
  685. var nd = input.nd.replace(/_CMB/gi, "");;
  686. var rw = input.rw;
  687. $('input[nd='+nd+'][rw='+rw+'][class^=gltcom]',target).each(function(){
  688. obj = this;
  689. return false;
  690. });
  691. return obj;
  692. }
  693. /**
  694. * 初始化下拉框
  695. * @param input 录入控件
  696. * @param comname 下拉字典的名称
  697. * @return 无
  698. */
  699. function setComBox(target,combox,input){
  700. var panel = $('.gltcombox-panel-body',combox);
  701. $('.gltcombox-item', panel).unbind('hover');
  702. $('.gltcombox-item', panel).unbind('click');
  703. $('.gltcombox-item', panel).hover(
  704. function(){$(this).addClass('gltcombox-item-hover');},
  705. function(){$(this).removeClass('gltcombox-item-hover');}
  706. ).click(function(){
  707. var item = $(this);
  708. $(combox).css({
  709. display:'none'
  710. });
  711. setValue(target,combox,input,item.text(),item.attr('value'),true);
  712. });
  713. panel.find('div.gltcombox-item').each(function(){
  714. var item = $(this);
  715. item.show();
  716. });
  717. //鼠标点击其他地方就隐藏列表
  718. $(document).bind('mousedown', function(e){
  719. $('div.gltcombox-panel').hide();
  720. });
  721. //鼠标移动到上面屏蔽掉
  722. panel.bind('mousedown', function(e){
  723. return false;
  724. });
  725. jQuery(input).bind('mousedown', function(e){
  726. return false;
  727. });
  728. //当录入框第一次获取录入焦点,初始话该控件的事件
  729. if($.data(input, 'input') == null){
  730. $(input).data('input', {});
  731. //单击ENTER键失去焦点时
  732. $(input).bind('keydown',function(e){
  733. if(e.keyCode==13||e.keyCode==9){
  734. $(combox).css({
  735. display:'none'
  736. });
  737. selectCur(target,input,combox);
  738. }
  739. });
  740. //按上下左右键时选择下拉框的内容
  741. $(input).bind('keyup', function(e){
  742. switch(e.keyCode){
  743. case 37: // left
  744. case 38: // up
  745. selectPrev(target,input,combox);
  746. break;
  747. case 39: // right
  748. case 40: // down
  749. selectNext(target,input,combox);
  750. break;
  751. case 16://shift
  752. return true;
  753. break;
  754. case 17://ctrl
  755. return true;
  756. break;
  757. case 18://atl
  758. return true;
  759. break;
  760. case 32://空格
  761. return true;
  762. break;
  763. default:
  764. if(!input.readOnly){
  765. setTimeout(function(){
  766. filter(target,combox,input);
  767. },1000*0.3); //延迟两秒处理
  768. }
  769. }
  770. });
  771. }
  772. }
  773. /**
  774. * 过滤下拉框的内容
  775. */
  776. function filter(target,combox,input){
  777. var query = input.value;
  778. var panel = $('.gltcombox-panel-body',combox);
  779. var hidden = getComHidden(target,input);
  780. hidden.value =""; //原来的值
  781. panel.find('div.gltcombox-item').each(function(){
  782. var item = $(this);
  783. if (item.text().indexOf(query) == 0){
  784. item.show();
  785. if (item.text() == query){
  786. item.addClass('gltcombox-item-selected');
  787. hidden.value = item.attr('value');
  788. }
  789. } else {
  790. item.hide();
  791. }
  792. });
  793. }
  794. /**
  795. * 生成下拉框的DIV
  796. */
  797. function iniDicts(target){
  798. var opts = $.data(target, 'fwnupgrid').options;
  799. var dicts = opts.data.dicts;
  800. var confid = opts.confid;
  801. var div ="";
  802. var dt;
  803. for(key in dicts){
  804. var dts = dicts[key];
  805. var div = "<DIV id=\""+confid+"_"+key+"\" class=\"gltcombox-panel\" style=\"width:124px; display:none;\">";
  806. div += "<div style=\"height:200px\" class=gltcombox-panel-body>";
  807. for(ky in dts){
  808. div += "<div class=gltcombox-item value=\""+ky+"\">"+dts[ky]+"</div>";
  809. }
  810. div += "<div class=\"gltcombox-item gltcombox-item-selected\" value=\"\">&nbsp;</div>";
  811. div += " </div> ";
  812. div += " </DIV> ";
  813. $(div).appendTo('body');
  814. }
  815. }
  816. /**
  817. *修改行号以及序号等
  818. *因为每次删除后 行号以及序号等都会发生变化
  819. */
  820. function modifyRowAttr(target){
  821. var grid = $.data(target, 'fwnupgrid').grid;
  822. var opts = $.data(target, 'fwnupgrid').options;
  823. var view = $.data(target, 'fwnupgrid').view;
  824. var table = view.children('table')[0];
  825. var xh =parseInt(opts.rowxh,10);
  826. $.each(table.tBodies[0].rows,function(indexInArray){
  827. this['fwnupgrid-row-index']=indexInArray;
  828. $('input',this).each(function(){this['rw']=indexInArray;});
  829. this.cells[0].innerHTML=xh+indexInArray;
  830. });
  831. }
  832. function storeRow(target){
  833. var grid = $.data(target, 'fwnupgrid').grid;
  834. var opts = $.data(target, 'fwnupgrid').options;
  835. var view = $.data(target, 'fwnupgrid').view;
  836. var table = view.children('table')[0];
  837. var tr ="";
  838. var rowxh = 0;
  839. opts.tr = table.tBodies[0].rows[0].cloneNode(true);
  840. opts.rowxh = 1;
  841. }
  842. /**
  843. * 重新刷新记录表的内容
  844. * 修改了WHERE条件后,重新执行查询
  845. */
  846. function ReLoadData(target, where) {
  847. var opts = $.data(target, 'fwnupgrid').options;
  848. opts.whereCls = where;
  849. request(target,pageNum,opts.pageSize,function(){
  850. opts.pageNumber = 1;
  851. });
  852. }
  853. /**
  854. * 多记录表的成员函数
  855. */
  856. var methods = {
  857. /**
  858. * 设置并获取某行某列的值
  859. * @param rowIndices
  860. * 指定更新的列,可以有三个类型true,整形和整形数组。
  861. * 表示更新多记录表所有的行中的数据,
  862. * 单个整形值表示更新多记录表中某行的对应别名中的值,
  863. * 整形数组表示更新多记录表中指定行中对应别名的值
  864. * @param fieldName
  865. * 字段别名
  866. * @param newValue 新的值,可以是当个值,也可以是值数组。
  867. * 不设置该值时表示获取列操作,设置值时表示设置列操作。
  868. * 每个值需要{fieldName:fieldValue}格式,如果是字典项,
  869. * 需要增加'_DIC_'+fieldName这个属性,传入对应的字典中文值
  870. * 可能的使用情况:
  871. * $.fwnupgrid('field',true,String,Object) return jQuery例子$('#test_glt').fwnupgrid('field',true,'XB',{'XB':1,'_DIC_XB':'男'})
  872. * 设置多记录表中所有行中性别列的值,代码值为1,中文显示为“男”,返回原jQuery集合对象
  873. * $.fwnupgrid('field',true,String) return Array 例子$('#test_glt').fwnupgrid('field',true,'XB')
  874. * 获取多记录表中所有行中性别列的值,返回数组,数组中包含每行对应列中别名为'XB'对应的值,
  875. * 如果值是字典列,那么同时返回中文,可能的结果是:[{'XB':1,'_DIC_XB':'男'},{'XB':1,'_DIC_XB':'男'}]
  876. *
  877. * $.fwnupgrid('field',Integer,String,Object) return jQuery例子$('#test_glt').fwnupgrid('field',0,'XB',{'XB':1,'_DIC_XB':'男'})
  878. * 设置多记录表中第一行中性别列的值,代码值为1,中文显示为“男”,返回原jQuery集合对象
  879. * $.fwnupgrid('field',Integer,String) return Array 例子$('#test_glt').fwnupgrid('field',0,'XB')
  880. * 获取多记录表中第一行中性别列的值,返回数组,数组中包含每行对应列中别名为'XB'对应的值,
  881. * 如果值是字典列,那么同时返回中文,可能的结果是:[{'XB':1,'_DIC_XB':'男'}]
  882. *
  883. * $.fwnupgrid('field',Array,String,Object) return jQuery例子$('#test_glt').fwnupgrid('field',[0,1],'XB',{'XB':1,'_DIC_XB':'男'})
  884. * 设置多记录表中第1、2行中性别列的值,代码值为1,中文显示为“男”,返回原jQuery集合对象
  885. * $.fwnupgrid('field',Array,String) return Array 例子$('#test_glt').fwnupgrid('field',[0,1],'XB')
  886. * 获取多记录表中第1、2行中性别列的值,返回数组,数组中包含每行对应列中别名为'XB'对应的值,
  887. * 如果值是字典列,那么同时返回中文,可能的结果是:[{'XB':1,'_DIC_XB':'男'},{'XB':1,'_DIC_XB':'男'}]
  888. *
  889. * $.fwnupgrid('field',Array,String,Array) return jQuery例子$('#test_glt').fwnupgrid('field',[0,1],'XB',[{'XB':1,'_DIC_XB':'男'},{'XB':2,'_DIC_XB':'女'])
  890. * 分别设置多记录表中第1、2行中性别列的值,第一行代码值为1,中文显示为“男”,第二行代码值为1,中文显示为“女”,返回原jQuery集合对象
  891. *
  892. */
  893. field:function(rowIndices,fieldName,newValue){
  894. //入参校验,rowIndices必须为true,整形数值,或者整形数组
  895. if (rowIndices == undefined || rowIndices == null
  896. || (typeof rowIndices != 'boolean'
  897. && typeof rowIndices != 'number'
  898. && !$.isArray(rowIndices))) {
  899. CFW.oWin.fnAlert('rowIndices入参有误,只能是true,整形数值,或者整形数组');
  900. return null;
  901. }
  902. if(newValue==undefined){
  903. //处理获取
  904. return this.map(function(){
  905. var vRowIndices = null;//存放待更新的行的行索引
  906. var rows = $.data(this, 'fwnupgrid').options.data.rows;
  907. var opts = $.data(this, 'fwnupgrid').options;
  908. if (rowIndices == true) {
  909. // 更新所有行,那么获取所有行的行索引
  910. vRowIndices = [];
  911. for (i in rows) {
  912. vRowIndices.push(parseInt(i));
  913. }
  914. }else if($.isArray(rowIndices)){
  915. vRowIndices=rowIndices;
  916. }else{
  917. vRowIndices=[rowIndices];
  918. }
  919. var rst = [];
  920. if(!opts.mywin){
  921. //如果窗口还没初始化的话,直接从模型中获取数据
  922. for (i in vRowIndices) {
  923. rst[i]={};
  924. rst[i][fieldName] = rows[vRowIndices[i]];
  925. }
  926. }else{
  927. //预先初始化,避免checkbox或者radiobox一项都没选中时,导致undefined的问题
  928. for (i in vRowIndices) {
  929. rst[i]={};
  930. rst[i][fieldName] = null;
  931. }
  932. $(':input[nd="'+fieldName+'"]', grid).each(function(){
  933. var pos = $.inArray(parseInt(this.rw),vRowIndices);
  934. if(pos == -1){
  935. return ;
  936. }
  937. //只提取所需的行的数据
  938. if(this.type=='checkbox'||this.type=='radio'){
  939. //单选按钮和多选按钮只记录选中行的值
  940. if(this.checked){
  941. rst[pos][fieldName]=this.value;
  942. }
  943. }else{
  944. //普通按钮直接记录其值
  945. rst[pos][fieldName]=this.value;
  946. }
  947. });
  948. }
  949. var dicFieldName = '_DIC_' + fieldName;//准备别名对应字典的名称
  950. //判断该别名是否字典项
  951. if (dicts[fieldName] != undefined) {
  952. //获取字典项
  953. var dict = dicts[fieldName]||{};
  954. //结果集增加字典项中文列
  955. for(i in rst){
  956. var codeValue=rst[i][fieldName];
  957. if(codeValue==null){
  958. rst[i][dicFieldName] = null;
  959. }else{
  960. rst[i][dicFieldName]=(dict[codeValue] == null)?null:dict[codeValue];
  961. }
  962. }
  963. }
  964. return rst;
  965. }).get();
  966. }else{
  967. //处理设置
  968. return this.each(function(){
  969. var vRowIndices = null;//存放待更新的行的行索引
  970. var rows = $.data(this, 'fwnupgrid').options.data.rows;
  971. var dicts = $.data(this, 'fwnupgrid').dicts;
  972. var opts = $.data(this, 'fwnupgrid').options;
  973. var grid = $.data(this, 'fwnupgrid').grid;
  974. if (rowIndices == true) {
  975. // 更新所有行,那么获取所有行的行索引
  976. vRowIndices = [];
  977. for (i in rows) {
  978. vRowIndices.push(parseInt(i));
  979. }
  980. }else if($.isArray(rowIndices)){
  981. vRowIndices=rowIndices;
  982. }else{
  983. vRowIndices=[rowIndices];
  984. }
  985. var vNewValue = null;//存放待更新的行对应列的值
  986. if(newValue != undefined||newValue != null){
  987. if($.isArray(newValue)){
  988. vNewValue = newValue;
  989. }else{
  990. vNewValue = [];
  991. for (i in rows) {
  992. vNewValue.push(newValue);
  993. }
  994. }
  995. }
  996. var isDict = false;//默认认为不是字典项
  997. var dict = null;
  998. //判断该别名是否字典项
  999. if (dicts!= undefined && dicts[fieldName] != undefined) {
  1000. isDict = true;
  1001. dict = dicts[fieldName]||{};
  1002. }
  1003. $(':input[nd='+fieldName+']', grid).each(function(){
  1004. var pos = $.inArray(parseInt(this.rw),vRowIndices);
  1005. if(pos == -1){
  1006. return ;
  1007. }
  1008. //只处理所需的行的数据
  1009. if(this.type=='checkbox'||this.type=='radio'){
  1010. //更新模型的数据
  1011. rows[parseInt(this.rw)][fieldName]= vNewValue[pos][fieldName];
  1012. //单选按钮和多选按钮值不相符的都取消选中状态
  1013. if(this.value!=vNewValue[pos][fieldName]){
  1014. this.checked=false;
  1015. }else{
  1016. this.checked=true;
  1017. }
  1018. }else if(this.type=='hidden'){
  1019. //普通按钮直接修改成新的值
  1020. var code = vNewValue[pos][fieldName];
  1021. if(code == null){
  1022. code = "";
  1023. }
  1024. this.value = code;
  1025. rows[parseInt(this.rw)][fieldName] = code;
  1026. if(this.className.indexOf('gltcom')==-1){
  1027. //一般只读控件的处理,修改label值
  1028. //准备显示的值
  1029. var showValue = this.value;
  1030. if(isDict){
  1031. showValue = (dict[this.value]==null)?'':dict[this.value];
  1032. }
  1033. var labelNode = this.previousSibling;
  1034. while(labelNode!=null&&labelNode.nodeName!='LABEL'){
  1035. labelNode = labelNode.previousSibling;
  1036. }
  1037. if(labelNode){
  1038. labelNode.innerHTML=showValue;
  1039. }
  1040. }else{
  1041. //字典项处理
  1042. if(isDict){
  1043. var showValue = (dict[this.value]==null)?'':dict[this.value];
  1044. //获取字典控件
  1045. var comboxNode = this.previousSibling;
  1046. while(comboxNode!=null&&comboxNode.nodeName!='INPUT'){
  1047. comboxNode = comboxNode.previousSibling;
  1048. }
  1049. comboxNode.value=showValue;
  1050. }
  1051. }
  1052. }else{
  1053. //普通按钮直接修改成新的值
  1054. var code = vNewValue[pos][fieldName];
  1055. if(code == null){
  1056. code = "";
  1057. }
  1058. this.value = code;
  1059. rows[parseInt(this.rw)][fieldName] = code;
  1060. }
  1061. });
  1062. });
  1063. }
  1064. },
  1065. /**
  1066. * 设置多记录表某列控件只读(该函数只能对多记录表中配置了可编辑的列有效,对不可编辑列无效)
  1067. * @param fields 需要控制只读的列,可以是字符串,表示某列;可以是数组,表示某些列;可以是值true,表示所有列
  1068. * @param flag boolean值,可选值为true或者false,true时,表示设置fields对应的列为只读,false时表示设置对应的列为非只读。
  1069. */
  1070. disable:function(fields,flag){
  1071. if (arguments.length == 0 ||arguments.length >2) {
  1072. CFW.oWin.fnAlert('disable函数,要求传入一个或两个参数');
  1073. return this;
  1074. }else if(arguments.length==1){
  1075. flag = fields;
  1076. fields=true;//传入两个表示对所有列操作
  1077. }
  1078. //校验flag的参数类型
  1079. if(flag!=true&&flag!=false){
  1080. CFW.oWin.fnAlert('disable函数的flag参数必需是true或者false');
  1081. return this;
  1082. }
  1083. //校验fields的参数类型
  1084. if(typeof fields == 'string'){
  1085. //先转为数组
  1086. fields = [fields];
  1087. }else if(!$.isArray(fields)&&fields!==true){
  1088. CFW.oWin.fnAlert('disable函数的fields参数必需是字符串、数组或者true');
  1089. return this;
  1090. }
  1091. return this.each(function(){
  1092. //每个多记录表单独处理
  1093. var opts = $.data(this, 'fwnupgrid').options;
  1094. var grid = $.data(this, 'fwnupgrid').grid;
  1095. var headers = opts.data.headers;
  1096. var v_fields;
  1097. if (fields == true) {
  1098. // true用headers替换
  1099. v_fields = headers;
  1100. } else {
  1101. v_fields = fields;
  1102. }
  1103. // 数组转成map
  1104. var v_map = {};
  1105. for (index in v_fields) {
  1106. v_map[v_fields[index]] = flag;
  1107. }
  1108. //合并原来的disableMap
  1109. $.extend(opts.disableMap,v_map);
  1110. if(!opts.mywin){
  1111. //如果窗口还没初始化,那么不处理,交给loadData处理
  1112. return ;
  1113. }
  1114. //获取所有控件
  1115. $('.fwnupgrid-body input', grid).each(function() {
  1116. //不处理hidden
  1117. if(this.type=='hidden')return;
  1118. var nd = this.nd.replace(/_CMB$/gi, "");
  1119. if (opts.disableMap[nd]) {
  1120. // 记录为只读的列,必需设置为只读
  1121. if (this.className.indexOf('readOnly')==-1) {// 只处理需要处理的
  1122. CFW.oGt.fnToDisabledObj(this);
  1123. }
  1124. } else {
  1125. // 未记录的列,或者记录为false的列,取消只读
  1126. if (this.className.indexOf('readOnly')!=-1) {// 只处理需要处理的
  1127. CFW.oGt.fnReObjReadOnly(this);
  1128. //如果是字典控件,那么需要将readOnly设置回去
  1129. if (this.nd != nd) {
  1130. this.readOnly = true;
  1131. }
  1132. }
  1133. }
  1134. });
  1135. });
  1136. },
  1137. /**
  1138. * 保存录入数据到DATA对象并返回多记表的数据集
  1139. */
  1140. getRows : function(){
  1141. return this.first().map(function(){
  1142. var grid = $.data(this, 'fwnupgrid').grid;
  1143. var opts = $.data(this, 'fwnupgrid').options;
  1144. var headers = opts.data.headers;
  1145. var rows = opts.data.rows;
  1146. if(!opts.mywin){
  1147. //如果窗口还没初始化,那么直接返回列表数据
  1148. return rows;
  1149. }
  1150. var emptyRow = {};
  1151. //准备一个模板空行
  1152. for(var i=0;i<opts.columns;i++){
  1153. emptyRow[headers[i]]=null;
  1154. }
  1155. //清空行数据
  1156. for(var i in rows){
  1157. rows[i] = $.extend(rows[i],emptyRow);
  1158. }
  1159. //获取有行标识的记录
  1160. $('.fwnupgrid-view table input[rw]', grid)
  1161. .filter(':checkbox:checked,:radio:checked').each(function(){
  1162. if(parseInt(this.rw)>=rows.length){
  1163. return;
  1164. }
  1165. rows[this.rw][this.nd]=this.value;
  1166. }).end()
  1167. .not(':checkbox,:radio').each(function(){
  1168. if(parseInt(this.rw)>=rows.length){
  1169. return;
  1170. }
  1171. rows[this.rw][this.nd]=this.value;
  1172. });
  1173. // 回写最新的数据
  1174. opts.data.rows = rows;
  1175. return rows;
  1176. }).get();
  1177. },
  1178. /**
  1179. * 增加一行或多行的行数据(只作用于jQuery集合中的第一个多记录表)
  1180. *
  1181. * @param options 新的一行或多行数据,可以是object单行数据或array多行数据
  1182. * @returns int 添加后当前页面的总行数
  1183. */
  1184. addRows : function(options) {
  1185. var rowsData = [];
  1186. // 获取新增行的数据,如果是单值,那么用数组包装,如果是数组那个直接赋值
  1187. // 如果参数个数不对,那么报错处理
  1188. if (arguments.length == 0) {
  1189. alert('addRows函数,要求传入一个参数');
  1190. } else if (arguments.length == 1) {
  1191. if ($.isArray(options)) {
  1192. rowsData = options;
  1193. } else {
  1194. rowsData = [ options ];
  1195. }
  1196. } else {
  1197. alert('addRows函数,要求传入一个参数');
  1198. }
  1199. // 如果没有新增数据,那么什么都不用该处理
  1200. if (rowsData.length == 0) {
  1201. return this;
  1202. }
  1203. return this.first().map(function() {
  1204. // 获取本多记录表已经有的行数据
  1205. var opt = $.data(this, 'fwnupgrid').options;
  1206. var view = $.data(this, 'fwnupgrid').view;
  1207. var table = view.children('table')[0];
  1208. var data = opt.data;
  1209. var rows = data.rows || [];
  1210. // 增加行数据
  1211. rows = rows.concat(rowsData);
  1212. data.rows = rows;
  1213. // 增加总计
  1214. opt.pageSize = rows.length;
  1215. data.total = rows.length;
  1216. var target = this;
  1217. if(!opt.mywin){
  1218. //如果窗口还没初始化,那么延迟处理
  1219. $(target).clearQueue('lazyAction').queue('lazyAction',function(){
  1220. loadData(target, data);
  1221. view[0].scrollTop = view[0].scrollHeight;
  1222. });
  1223. }else{
  1224. //已经初始化了就直接执行
  1225. loadData(this, data);
  1226. }
  1227. createMsg(this);
  1228. if (opt.hasPage) {
  1229. showInfo(this);
  1230. }
  1231. return rows.length;
  1232. }).get(0);
  1233. },
  1234. /**
  1235. * 更新行数据
  1236. *
  1237. * @param options
  1238. * 可选,如果不传任何数据,默认表示刷新本多记录表,如果传入新的列表数据
  1239. * ,那么直接替换原来的多记录表的数据,同时刷新界面展示
  1240. * @returns jQuery
  1241. */
  1242. updateRows : function(options) {
  1243. var rowsData = null;
  1244. // 获取新行的数据,如果是单值,那么用数组包装,如果是数组那个直接赋值
  1245. // 如果参数个数不对,那么报错处理
  1246. if (arguments.length == 0) {
  1247. } else if (arguments.length == 1) {
  1248. if ($.isArray(options)) {
  1249. rowsData = options;
  1250. } else {
  1251. rowsData = [ options ];
  1252. }
  1253. } else {
  1254. $.error('updateRows函数,要求传入一个参数');
  1255. }
  1256. return this.each(function() {
  1257. var errMsg ="";
  1258. // 获取本多记录表已经有的行数据
  1259. var opt = $.data(this, 'fwnupgrid').options;
  1260. var data = opt.data;
  1261. var rows = data.rows || [];
  1262. // 如果有传入新的行数据,那么全部用新记录替换旧记录
  1263. if (rowsData) {
  1264. data.rows = rowsData;
  1265. } else {
  1266. // 没有的话,当作刷新页面数据处理
  1267. }
  1268. // 增加总计
  1269. data.total = data.rows.length;
  1270. var target = this;
  1271. if(!opt.mywin){
  1272. //如果窗口还没初始化,那么延迟处理
  1273. $(target).clearQueue('lazyAction').queue('lazyAction',function(){
  1274. loadData(target, data);
  1275. });
  1276. }else{
  1277. //已经初始化的话直接执行
  1278. loadData(this, data);
  1279. }
  1280. createMsg(this);
  1281. if (opt.hasPage) {
  1282. showInfo(this);
  1283. }
  1284. });
  1285. },
  1286. /**
  1287. * 删除行数据
  1288. *
  1289. * @param options
  1290. * @returns jQuery
  1291. */
  1292. removeRows : function(options) {
  1293. var rowIndices = new Array();
  1294. // 获取删除行的索引数据,如果是单值,那么用数组包装,如果是数组那个直接赋值
  1295. if (arguments.length == 0) {
  1296. rowIndices = null;
  1297. } else if (arguments.length == 1) {
  1298. if ($.isArray(options)) {
  1299. rowIndices = options;
  1300. } else {
  1301. rowIndices = [ options ];
  1302. }
  1303. } else {
  1304. $.error('removeRows函数,要求最多传入一个参数');
  1305. }
  1306. // 如果传入的是空串,那么不处理
  1307. if (rowIndices && rowIndices.length == 0) {
  1308. return this;
  1309. }
  1310. return this.each(function() {
  1311. var opt = $.data(this, 'fwnupgrid').options;
  1312. // 获取本多记录表已经有的行数据
  1313. var data = opt.data;
  1314. var rows = data.rows || [];
  1315. // 如果本来就没数据,那么什么都不做
  1316. if (!rows || rows.length == 0)
  1317. return;
  1318. // 删除行数据
  1319. // 如果是不传入行数据,那么删除所有
  1320. if (rowIndices == null) {
  1321. rows = [];
  1322. } else {
  1323. // 根据索引删除现有数据,从后到前删除行数据
  1324. rowIndices.sort(function(a, b) {
  1325. return a - b;
  1326. }).reverse();
  1327. for (i in rowIndices) {
  1328. rows.splice(rowIndices[i], 1);
  1329. }
  1330. }
  1331. data.rows = rows;
  1332. // 减少总计
  1333. data.total = rows.length;
  1334. var target = this;
  1335. if(!opt.mywin){
  1336. //如果窗口还没初始化,那么延迟处理
  1337. $(target).clearQueue('lazyAction').queue('lazyAction',function(){
  1338. loadData(target, data);
  1339. });
  1340. }else{
  1341. //已经初始化的话直接执行
  1342. loadData(this, data);
  1343. }
  1344. createMsg(this);
  1345. if (opt.hasPage) {
  1346. showInfo(this);
  1347. }
  1348. });
  1349. },
  1350. /**
  1351. * 显示下拉框
  1352. * @param input 录入控件
  1353. * @param comname 下拉字典的名称
  1354. * @returns 无
  1355. */
  1356. showComBox : function(input,comname){
  1357. return this.each(function(){
  1358. var opts = $.data(this, 'fwnupgrid').options;
  1359. var zIndex = opts.zIndex;
  1360. var iLeft = $(input).offset().left;
  1361. var iTop = $(input).offset().top + 20;
  1362. var combox = $('#'+comname);
  1363. var comobj;
  1364. eval('comobj=document.all.'+comname);
  1365. setComBox(this,comobj,input);
  1366. var hidden = getComHidden(this,input);
  1367. var panel = $(comobj).find('div.gltcombox-panel-body');
  1368. panel.find('div.gltcombox-item-selected').removeClass('gltcombox-item-selected');
  1369. panel.find('div.gltcombox-item[value=' + hidden.value + ']').addClass('gltcombox-item-selected');
  1370. var ind = parseInt(combox.css('zIndex'),10);
  1371. if(zIndex>ind){
  1372. ind = zIndex;
  1373. };
  1374. combox.css({
  1375. display:'block',
  1376. left:iLeft,
  1377. top:iTop,
  1378. zIndex:ind
  1379. });
  1380. });
  1381. },
  1382. /**
  1383. * 初始化可编辑多记录表单
  1384. */
  1385. init : function(options) {
  1386. options = options || {};
  1387. return this.each(function() {
  1388. var state = $.data(this, 'fwnupgrid');
  1389. var opts;
  1390. if (state) {
  1391. opts = $.extend(state.options, options);
  1392. state.options = opts;
  1393. } else {
  1394. opts = $.extend({}, $.fn.fwnupgrid.defaults, {fit:$(this).attr('fit') == 'true'}, options);
  1395. $(this).css('width', null).css('height', null)
  1396. .addClass('fwresize').bind('fwresize',function(){setSize(target);});
  1397. var view = $(this).children().children().children('.fwnupgrid-view');//主数据区域
  1398. $.data(this,'fwnupgrid', {options:opts, grid:$(this), view:view, dicts:opts.data.dicts});
  1399. var state = $.data(this, 'fwnupgrid');
  1400. var target = this;
  1401. var b = false;
  1402. //检查该多记录的上层是否是弹出窗口(window)
  1403. $(this).parents('.window').each(function(){
  1404. b=true;
  1405. return false;
  1406. });
  1407. if(!b){
  1408. //检查该多记录的上层是否是TAB页(window)
  1409. $(this).parents('[myclass=fwtab]').each(function(){
  1410. b=true;
  1411. state.options.fwtab = true;
  1412. return false;
  1413. });
  1414. }
  1415. //TAB页必须先处理 WINDOW则不用奇怪,要不然显示有问题
  1416. if(state.options.fwtab){
  1417. //setSize(this);
  1418. }
  1419. $(window).resize(function(){
  1420. setSize(target);
  1421. });
  1422. setProperties(target);
  1423. //处理目的:多记录包含在弹出窗口内时不初始化
  1424. if(!b&&$(target).is(':visible')){
  1425. setSize(target);
  1426. createMsg(target);
  1427. buildPage(this);
  1428. state.options.mywin = true;
  1429. iniDicts(target);
  1430. storeRow(target);
  1431. if (opts.onLoadSuccess) {
  1432. opts.onLoadSuccess.apply(target, arguments);
  1433. }
  1434. }else{
  1435. //绑定事件,监听后期可能的初始化事件,一旦初始化,立即重新渲染
  1436. $(document).bind('gridlazyInit',function(){
  1437. if(!$(target).is(':visible')){
  1438. return ;
  1439. }
  1440. var opts = $.data(target, 'fwnupgrid').options;
  1441. //window必须这样处理,tab不用,要不然显示有问题
  1442. if(!opts.fwtab){
  1443. //setSize(target);
  1444. }
  1445. if(!opts.mywin){
  1446. setSize(target);
  1447. opts.mywin = true;
  1448. buildPage(target);
  1449. createMsg(target);
  1450. iniDicts(target);
  1451. storeRow(target);
  1452. if (opts.onLoadSuccess) {
  1453. opts.onLoadSuccess.apply(target, arguments);
  1454. }
  1455. }
  1456. //触发因隐藏而没有执行的操作,可能有些操作在多记录表显示之前已经执行了,
  1457. //但由于没有显示出来所以没有完全执行到位,需要在这里做后续的处理
  1458. $(target).dequeue('lazyAction');
  1459. });
  1460. }
  1461. }
  1462. });
  1463. },
  1464. /**
  1465. * 获取已选项
  1466. * @param alias 列别名
  1467. */
  1468. getSelected:function(alias){
  1469. return this.map(function() {
  1470. //获取别名下所有已选checkbox
  1471. return $('[nd='+alias+']:checked',this)
  1472. .map(function(){
  1473. return parseInt(this.rw,10);
  1474. }).get();
  1475. }).get();
  1476. },
  1477. /**
  1478. * 注册翻页前的响应函数。
  1479. * 如果函数返回非true,那么系统不触发翻页操作。
  1480. * @param pageFun 自定义的响应函数,可以为空,空表示取消之前注册的函数。
  1481. */
  1482. beforePage:function(pageFun){
  1483. if(pageFun!=null&&!$.isFunction(pageFun)){
  1484. alert('beforePage函数的唯一入参必须是function对象');
  1485. return this;
  1486. }
  1487. return this.each(function(){
  1488. $.data(this,'beforePage',pageFun);
  1489. });
  1490. }
  1491. };
  1492. $.fn.fwnupgrid = function(options) {
  1493. if (methods[options]) {
  1494. return methods[options].apply(this, Array.prototype.slice.call(
  1495. arguments, 1));
  1496. } else if (typeof options === 'object' || !options) {
  1497. return methods.init.apply(this, arguments);
  1498. } else {
  1499. $.error('Method ' + options + ' does not exist on fwnupgrid');
  1500. }
  1501. };
  1502. $.fn.fwnupgrid.defaults = {
  1503. title : null,
  1504. iconCls : null,
  1505. border : true,
  1506. width : 'auto',
  1507. height : 'auto',
  1508. frozenColumns : null,
  1509. columns : null,
  1510. striped : true,
  1511. method : 'post',
  1512. nowrap : true,
  1513. idField : null,
  1514. expbtn : null,
  1515. url : null,
  1516. whereCls : null,
  1517. confid : null,
  1518. dsId : null,
  1519. dynDictWhereCls : null,
  1520. subTotalAlign : 'bottom',
  1521. loadMsg : '正在处理中 ...',
  1522. tipMsg : '没有相关的数据!',
  1523. hasPage : true,// 是否显示标题
  1524. rownumbers : false,
  1525. singleSelect : false,
  1526. fit : false,
  1527. queryParams : {},
  1528. sortName : null,
  1529. sortOrder : 'asc',
  1530. data : null,
  1531. beforePageText : '页码',
  1532. afterPageText : '共 {pages} 页',
  1533. displayMsg : '第 {from} 到 {to} 行 共 {total} 行',
  1534. total : 1,
  1535. pageSize : 20,
  1536. pageNumber : 1,
  1537. loading : false,
  1538. buttons : null,
  1539. mywin:false,//用于判断是否已经被弹出窗口初始化过详见 fwwindow: setEditGird
  1540. zIndex:0,
  1541. tr:null,
  1542. rowxh:1,
  1543. fwtab:false,
  1544. showRefresh : true,
  1545. disableMap:{},
  1546. ReGetListData : function(target, where) {
  1547. ReLoadData(target, where);
  1548. }
  1549. };
  1550. })(jQuery);