fwnupgrid.js 52 KB

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