fweditgrid.js 71 KB

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