jquery-bootstable.js 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  1. /**
  2. * bootstable 表格插件
  3. * caratename:雨中磐石(rainrock)
  4. * caratetime:2014-04-06 21:40:00
  5. * email:admin@rockoa.com
  6. * homepage:www.rockoa.com
  7. */
  8. (function ($) {
  9. function bootstable(element, options){
  10. var obj = element;
  11. var can = options;
  12. var rand = js.getrand();
  13. var me = this;
  14. this.data = can.data;
  15. this.count = 0;
  16. this.page = 1;
  17. this.changedata = {};
  18. this.changeid = 0;
  19. this.bool = false;
  20. this.where = can.where;
  21. this.highorderstr = '';
  22. this.otherparams = {};
  23. this.loadci = 0;
  24. this.options= can;
  25. this.init = function(){
  26. this.tablename=can.tablename;
  27. can.tablename=jm.encrypt(can.tablename);
  28. this._init();
  29. this._create();
  30. if(can.autoLoad){
  31. this._loaddata(1);
  32. }
  33. if(can.fanye)this._fanye();
  34. };
  35. this.getData= function(fid){
  36. var a = this.data;
  37. if(fid)a= this.json[fid];
  38. if(!isNaN(fid))a= this.data[fid];
  39. return a;
  40. };
  41. this.getCount= function(){
  42. return this.count;
  43. };
  44. this.getJson= function(){
  45. return this.json;
  46. };
  47. this._init = function(){
  48. var sas = can.modedir;
  49. if(!sas)sas='index:';
  50. sas = sas.split(':');
  51. if(can.url=='')can.url = js.getajaxurl('publicstore', sas[0], sas[1]);
  52. if(can.cellurl=='')can.cellurl = js.getajaxurl('publicsavevalue', sas[0], sas[1]);
  53. this.setColumns(can.columns);
  54. s='<div style="position:relative;'+can.bodyStyle+'" id="tablebody_'+rand+'"></div><div id="tablefanye_'+rand+'"></div>';
  55. obj.html(s);
  56. $('#tablebody_'+rand+'').scroll(function(){
  57. me._scrollTopla($(this));
  58. });
  59. if(can.tree)window['stabletree'+rand+'']=function(j,o1){me.stabletree(j,o1)}
  60. };
  61. this.setColumns=function(cols){
  62. can.columns=cols;var a,i;
  63. for(i=0; i<can.columns.length; i++){
  64. a = can.columns[i];
  65. if(typeof(a.align)=='undefined')can.columns[i].align='center';
  66. if(a.dataIndex=='caozuo')can.columns[i] = this._caozuochengs(a,i);
  67. }
  68. };
  69. this.getcolumns = function(){
  70. return can.columns;
  71. };
  72. this.setCans = function(cas){
  73. for(var i in cas)can[i]=cas[i];
  74. };
  75. this._create = function(){
  76. var a = can.columns;
  77. var s = '',i,len=a.length,val,s1,s2='',cols,s3='',s4='',s5='',le,st,ov,j,j1,na,attr,sty='',hs='',dis,dlen=this.data.length,mcol;
  78. s+='<table id="tablemain_'+rand+'" class="rock-table table table-striped table-bordered table-hover" style="margin:0px">';
  79. if(!can.hideHeaders){
  80. mcol = window['maincolor'];
  81. if(!mcol)mcol='#3399FF';
  82. s+='<thead><tr><th width="40" thxu="-1" class="rock-table-th"></th>';
  83. if(can.checked)s+='<th width="40" class="rock-table-th"><div align="center"><input id="seltablecheck_'+rand+'" type="checkbox"></div></th>';
  84. var nstr = js.getoption(this.tablekeymd5()),nda={};
  85. if(nstr)nda = JSON.parse(nstr);
  86. for(i=0;i<len;i++){
  87. hs = '';
  88. attr = '';
  89. cols = a[i].colspan;
  90. na = a[i].dataIndex;
  91. if(nda[na])for(j in nda[na])a[i][j]=nda[na][j];
  92. if(can.sort == na)hs='color:'+mcol+';';
  93. if(a[i].width)attr+=' width="'+a[i].width+'"';
  94. if(a[i].tooltip)attr+=' title="'+a[i].tooltip+'"';
  95. if(cols && cols>1)attr+=' colspan="'+cols+'"';
  96. s+='<th nowrap '+attr+' thxu="'+i+'" class="rock-table-th"><div style="'+hs+'" align="'+a[i].align+'" lfields="'+na+'">';
  97. if(can.celleditor&&a[i].editor)s+='<i class="icon-pencil"></i>&nbsp;';
  98. s+=a[i].text;
  99. if(a[i].sortable){
  100. s+='&nbsp;';
  101. if(can.sort == na){
  102. s+='<i tempsort="'+i+'" lx="'+((can.dir=='desc')?'asc':'desc')+'" class="icon-sort-'+((can.dir=='desc')?'down':'up')+' cursor"></i>';
  103. }else{
  104. s+='<i tempsort="'+i+'" lx="desc" class="icon-sort cursor"></i>';
  105. }
  106. }
  107. s+='</div></th>';
  108. if(cols>1)i=i+cols-1;
  109. }
  110. s+='</tr></thead>';
  111. }
  112. s+='<tbody id="tbody_'+rand+'">';
  113. s+='</tbody></table>';
  114. $('#tablebody_'+rand+'').html(s);
  115. for(j=0;j<dlen;j++){
  116. s=this.createrows(j);
  117. $('#tbody_'+rand+'').append(s);
  118. }
  119. s='';
  120. this.trobj = obj.find('tr[dataid]');
  121. this.trobj.click(function(event){
  122. me._itemclick(this, event);
  123. });
  124. this.trobj.dblclick(function(event){
  125. me._itemdblclick(this, event);
  126. });
  127. if(typeof(can.celldblclick)=='function'){
  128. obj.find('td[cell]').dblclick(function(event){
  129. me._celldblclick(this, event);
  130. });
  131. }
  132. if(can.celleditor){
  133. var o = obj.find('td[fields]');
  134. o[can.celledittype](function(){
  135. me._celleditla(this);
  136. });
  137. }
  138. obj.find("a[temp='caozuomenu_"+rand+"']").click(function(){
  139. me._caozuochengss(this);
  140. return false;
  141. });
  142. $('#seltablecheck_'+rand+'').click(function(){
  143. js.selall(this, 'tablecheck_'+rand+'');
  144. });
  145. obj.find('i[tempsort]').click(function(){
  146. me._clickorder(this);
  147. });
  148. obj.find('th[thxu]').dblclick(function(){
  149. me._dblclickth(this);
  150. });
  151. };
  152. this.insert=function(d, funs,inid){
  153. d = js.apply({id:'auto'}, d);
  154. this.data.push(d);
  155. var j = this.data.length-1;
  156. var s=this.createrows(j);
  157. this.count++;
  158. if(!inid){
  159. $('#tbody_'+rand+'').append(s);
  160. }else{
  161. obj.find('tr[dataid="'+inid+'"]').after(s);
  162. }
  163. if(typeof(funs)=='function'){
  164. funs(this,j);
  165. }
  166. };
  167. this.createrows=function(j){
  168. var a = can.columns;
  169. var s = '',i,len=a.length,val,s1,s2='',s3='',s4='',s5='',le,st,ov,j,j1,na,attr,sty='',hs='',dis,trsty='',xu;
  170. ov = this.data[j];
  171. s3 = can.rendertr(ov, this, j);
  172. s4 = can.rowsbody(ov, this, j);
  173. if(s4)s5='rowspan="2"';
  174. if(!s3 && ((can.statuschange && ov.status==0) || (ov.ishui==1) || (ov.status==5))){
  175. trsty='color:#aaaaaa;';
  176. }
  177. if(ov.trbgcolor)trsty+='background:'+ov.trbgcolor+';';
  178. if(ov.trstyle)trsty+=''+ov.trstyle+';';
  179. if(trsty)trsty='style="'+trsty+'"';
  180. s='<tr class="rock-table-tr" clickbo="false" oi="'+j+'" dataid="'+ov.id+'" '+s3+' '+trsty+'>';
  181. xu = ov.trxu;if(!xu)xu=j+1+can.pageSize*(this.page-1);
  182. s+='<td '+s5+' align="right" width="40" class="rock-table-td">'+xu+'</td>';
  183. if(can.checked){
  184. dis = '';
  185. if(ov.checkdisabled)dis='disabled';
  186. s+='<td align="center" class="rock-table-td" width="40">';
  187. if(ov.id)s+='<input oi="'+j+'" name="tablecheck_'+rand+'" '+dis+' value="'+ov.id+'" type="checkbox">';
  188. s+='</td>';
  189. }
  190. for(i=0;i<len;i++){
  191. na = a[i].dataIndex;
  192. val = ov[na];
  193. attr= '';
  194. sty = '';
  195. if(isempt(val)){
  196. val = '';
  197. this.data[j][na]=val;
  198. }
  199. if(ov.colums_type=='hj' && i==0)val='合计';
  200. if(a[i].type == 'checkbox' && ov.id){
  201. s1 = '<img height="20" width="20" src="images/checkbox'+val+'.png">';
  202. }else{
  203. s1 = val;
  204. if(ov[na+'_textcn'])s1 = ov[na+'_textcn'];
  205. }
  206. if(typeof(a[i].renderer)=='function'){
  207. s3 = a[i].renderer(val, ov, j);
  208. if(!isempt(s3))s1=s3;
  209. }
  210. s2 = '';
  211. if(i == 0 && can.tree){
  212. st = ov.stotal;
  213. le = ov.level;
  214. for(j1=1;j1<le;j1++)s2+='<img src="images/white.gif" class="icons">&nbsp; ';
  215. s2 += '<i onclick="stabletree'+rand+'('+j+',this)" class="icon-'+((st>0)?'folder-close-alt':'file-alt')+'"></i>&nbsp;';
  216. }
  217. if(can.celleditor &&a[i].editor)attr+=' fields="'+na+'"';
  218. if(a[i].width)attr+=' width="'+a[i].width+'"';
  219. if(typeof(a[i].renderstyle)=='function'){
  220. s3 = a[i].renderstyle(val, ov, j);
  221. if(!isempt(s3))sty+=''+s3+';';
  222. }
  223. if(typeof(a[i].renderattr)=='function'){
  224. s3 = a[i].renderattr(val, ov, j);
  225. if(!isempt(s3))attr+=' '+s3+'';
  226. }
  227. if(ov[''+na+'_color'])sty+='color:'+ov[''+na+'_color']+';';
  228. if(ov[''+na+'_style'])sty+=''+ov[''+na+'_style']+';';
  229. if(ov[''+na+'_title'])attr+=' title="'+ov[''+na+'_title']+'"';
  230. s+='<td class="rock-table-td" align="'+a[i].align+'" '+attr+' style="'+sty+'" row="'+j+'" cell="'+i+'">'+s2+''+s1+'</td>';
  231. }
  232. s+='</tr>';
  233. if(s4)s+='<tr class="rock-table-tr"><td class="rock-table-td" colspan="'+(len+1)+'">'+s4+'</td></tr>';
  234. return s;
  235. };
  236. this._tredat={};
  237. this.stabletree=function(j,o1){
  238. if(!can.loadtree)return;
  239. var ov = this.data[j];
  240. if(!ov.stotal || ov.stotal<1 || this._tredat[j])return;
  241. var das = this._loaddata(1, true);
  242. das.pvalue = ov.id;
  243. das.level = ov.level+1;
  244. this.bool = true;
  245. this._tredat[j]=true;
  246. o1.className='icon-spinner';
  247. $.ajax({
  248. url:can.url,type:can.method,data:das,dataType:'json',
  249. success:function(ret){
  250. o1.className='icon-folder-open-alt';
  251. me.showtreeda(ret.rows,das.pvalue);
  252. me.bool = false;
  253. },
  254. error: function(e){
  255. o1.className='icon-folder-close-alt';
  256. js.msg('msg',e.responseText);
  257. me.bool = false;
  258. }
  259. });
  260. };
  261. this.showtreeda=function(da,pj){
  262. if(!da)return;var len = da.length,o1,i;if(len==0)return;
  263. for(i=len-1;i>=0;i--){
  264. this.insert(da[i],false,pj);
  265. if(can.celleditor){
  266. o1 = obj.find('tr[dataid="'+da[i].id+'"]').find('td[fields]');
  267. o1[can.celledittype](function(){
  268. me._celleditla(this);
  269. });
  270. }
  271. }
  272. this.trobj = obj.find('tr[dataid]');
  273. this.trobj.unbind();
  274. this.trobj.click(function(event){
  275. me._itemclick(this, event);
  276. });
  277. this.trobj.dblclick(function(event){
  278. me._itemdblclick(this, event);
  279. });
  280. obj.find("a[temp='caozuomenu_"+rand+"']").unbind().click(function(){
  281. me._caozuochengss(this);
  282. return false;
  283. });
  284. };
  285. this._celldblclick = function(o1,e){
  286. var o = $(o1);
  287. var cell = parseFloat(o.attr('cell')), row = parseFloat(o.attr('row'));
  288. var farr = can.columns[cell],
  289. d = this.data[row];
  290. can.celldblclick(farr, d, o1, cell, row, e);
  291. };
  292. this._scrollTopla= function(o){
  293. if(can.hideHeaders)return;
  294. var top = o.scrollTop();
  295. if(top<40){
  296. var o1 = $('#headerla_'+rand+'');
  297. o1.hide();
  298. o1.html('');
  299. }else{
  300. var off = obj.offset();
  301. var a = can.columns,s='',i,len=a.length,w1,o2;
  302. if(!get('headerla_'+rand+'')){
  303. s = '<div style="position:fixed;left:'+(off.left)+'px;top:'+(off.top)+'px;width:100%;overflow:hidden; background:rgba(255,255,255,0.5);border-bottom:0px #dddddd solid;z-index:2" id="headerla_'+rand+'"></div>';
  304. obj.append(s);
  305. }
  306. var o1 = $('#headerla_'+rand+'');
  307. o1.show();
  308. o1.css({left:''+(off.left)+'px',top:''+(off.top)+'px',width:''+($('#tablemain_'+rand+'').width())+'px'});
  309. if(o1.html()==''){
  310. s = '';
  311. s+='<table class="rock-table table table-striped table-bordered" style="margin:0px" width="100%">';
  312. s+='<tr><th width="40" class="rock-table-th"></th>';
  313. if(can.checked)s+='<th width="40" class="rock-table-th"></th>';
  314. for(i=0;i<len;i++){
  315. o2 = obj.find("div[lfields='"+a[i].dataIndex+"']");
  316. w1 = o2[0].clientWidth-1;
  317. w1 = 'width:'+w1+'px';
  318. s+='<th class="rock-table-th"><div style="'+w1+'" align="'+a[i].align+'">'+o2.html()+'</div></th>';
  319. }
  320. s+='</tr>';
  321. s+='</table>';
  322. o1.html(s);
  323. }
  324. }
  325. };
  326. this._celleditla = function(o1){
  327. if(this.bool)return;
  328. var o = $(o1),
  329. fields = o.attr('fields'),
  330. row = parseFloat(o.attr('row')),
  331. cell = parseFloat(o.attr('cell'));
  332. var a = this.data[row],i,len,sel,d,
  333. b = can.columns[cell],
  334. l = o.offset(),
  335. w = o1.clientWidth,
  336. h = o1.clientHeight,
  337. at = '',
  338. v = a[fields];if(!a.id)return;
  339. $('#edittable_'+rand+'').remove();
  340. if(b.editorbefore && !b.editorbefore(a))return;
  341. if(!b.textmsg)b.textmsg='';
  342. var s = '<div id="edittable_'+rand+'" style="position:absolute;z-index:2;left:'+(l.left)+'px;top:'+(l.top+h)+'px; background:white;border-radius:15px">';
  343. s+='<div style="border:var(--border);background:var(--main-bgcolor);padding:10px;box-shadow:0px 0px 10px rgba(0,0,0,0.3);border-radius:10px">';
  344. s+=' <div>&nbsp;<b>'+b.text+'</b>:&nbsp;<span id="msgteita_'+rand+'">'+b.textmsg+'</span></div>';
  345. s+=' <div class="blank10"></div>';
  346. var wss = 200;
  347. if(b.editorwidth)wss=b.editorwidth;
  348. var flx = b.type,attr=b.editorattr;
  349. if(!flx)flx='text';
  350. if(!attr)attr='';
  351. if(b.repEmpty)attr+=' onblur="this.value=strreplace(this.value)" ';
  352. if(flx=='checkbox'){
  353. if(v=='1')at='checked';
  354. s+='<div><label><input type="checkbox" id="inputedit_'+rand+'" '+at+' value="1"> '+b.text+'</label></div>';
  355. }else if(flx=='textarea'){
  356. s+='<div><textarea type="text" style="width:'+wss+'px;height:100px" '+attr+' id="inputedit_'+rand+'" class="input">'+v+'</textarea></div>';
  357. }else if(flx=='select' && b.store){
  358. d=b.store;
  359. s+='<div><select style="width:'+wss+'px" id="inputedit_'+rand+'" '+attr+' class="input">';
  360. len=b.store.length;for(i=0;i<len;i++){
  361. sel='';if(d[i][0]==v||d[i][1]==v)sel='selected';
  362. s+='<option value="'+d[i][0]+'" '+sel+'>'+d[i][1]+'</option>';
  363. }
  364. s+='</select></div>';
  365. }else if(flx=='date'){
  366. s+='<div><input type="text" style="width:'+wss+'px" id="inputedit_'+rand+'" '+attr+' class="input datesss" onclick="js.datechange(this)" readonly value="'+v+'"></div>';
  367. }else{
  368. s+='<div><input type="'+flx+'" style="width:'+wss+'px" id="inputedit_'+rand+'" '+attr+' class="input" value="'+v+'"></div>';
  369. }
  370. s+=' <div class="blank10"></div>';
  371. if(!can.cellautosave || b.noautosave)s+=' <div><a id="inputeditsave_'+rand+'" href="javascript:"><i class="icon-ok"></i> 确定</a >&nbsp; &nbsp; <a href="javascript:" class="hui" onclick="$(\'#edittable_'+rand+'\').remove()"><i class="icon-remove"></i> 取消</a></div>';
  372. s+='</div>';
  373. s+='<div align="center"><div class="arrow-down"></div></div>';
  374. s+='</div>';
  375. $('body').append(s);
  376. var o2 = get('edittable_'+rand+'');
  377. var jg = (w-o2.clientWidth)*0.5;
  378. $(o2).css({left:''+(l.left+jg)+'px',top:''+(l.top-o2.clientHeight)+'px'});
  379. var o3 = get('inputedit_'+rand+'');
  380. o3.focus();
  381. $(o3).keyup(function(e){
  382. if(e.keyCode==13)this.blur();
  383. });
  384. var arr = {oldvalue:v,fields:fields,type:b.type,id:a.id,obj:o,row:row}
  385. if(!can.cellautosave || b.noautosave){
  386. $('#inputeditsave_'+rand+'').click(function(){
  387. me._editforcuschen(this, arr, b);
  388. });
  389. }else{
  390. $(o3).blur(function(){
  391. me._editforcuschen(this, arr, b);
  392. });
  393. }
  394. };
  395. this._dblclickth=function(o1){
  396. var o = $(o1),xu = parseFloat(o.attr('thxu'));
  397. if(xu==-1){
  398. var kes = this.tablekeymd5();
  399. if(js.getoption(kes)){
  400. js.confirm('是否清空设置列的属性',function(jg){
  401. if(jg=='yes'){js.setoption(kes,'');js.msg('success','已清空可F5刷新查看');}
  402. });
  403. }
  404. return;
  405. }
  406. var d = can.columns[xu],dws=d.width,dw1='',dw2='';
  407. if(d.dataIndex=='caozuo')return;
  408. if(!dws)dws='';
  409. var st2 = ''+dws+'';
  410. if(st2.indexOf('%')>0)dw2='%';
  411. dw1 = st2.replace('px','').replace('%','');
  412. var str = '<div style="padding:10px">';
  413. str+='<div>列宽宽度:<input type="number" placeholder="当前'+o.width()+'px" min="0" autocomplete="off" style="width:110px" id="lie_width" class="input" value="'+dw1+'"><select style="width:90px" id="lie_widths" class="input"><option value="px">像素px</option><option value="%" '+((dw2=='%')?'selected':'')+'>百分比%</option></select></div>';
  414. str+='<div style="margin-top:10px">对齐方式:<select style="width:200px" id="lie_align" class="input"><option value="center">居中</option><option value="left" '+((d.align=='left')?'selected':'')+'>居左←</option><option value="right" '+((d.align=='right')?'selected':'')+'>居右→</option></select></div>';
  415. str+='</div>';
  416. js.tanbody('bootsthcog','设置列['+d.text+']的属性', 300,200,{
  417. html:str,
  418. btn:[{text:'确定'}]
  419. });
  420. $('#bootsthcog_btn0').click(function(){
  421. me._dblclickthclick(xu);
  422. });
  423. };
  424. this._dblclickthclick=function(xu){
  425. var d = can.columns[xu],w1=get('lie_width').value,d1={};
  426. d1.align = get('lie_align').value;
  427. d.align = d1.align;
  428. if(w1 && w1>0){
  429. d1.width = w1+get('lie_widths').value;
  430. d.width = d1.width;
  431. }
  432. js.tanclose('bootsthcog');
  433. this.reload();
  434. var sbd = true;
  435. if(can.modenum && can.listcreate && window['admintype']=='1'){
  436. var da = {modenum:can.modenum,align:d1.align,width:'',fields:d.dataIndex};
  437. if(d1.width)da.width = d1.width;
  438. js.ajax('index.php?d=flow&m=flowopt&a=savecolums',da,function(ret){
  439. if(ret.code==202)me._dblclickthsave(d,d1);
  440. },'get,json');
  441. sbd=false;
  442. }
  443. if(sbd)this._dblclickthsave(d,d1);
  444. };
  445. this._dblclickthsave=function(d,d1){
  446. var key = this.tablekeymd5(),str,da={};
  447. str = js.getoption(key);
  448. if(str)da = JSON.parse(str);
  449. da[d.dataIndex] = d1;
  450. js.setoption(key,JSON.stringify(da));
  451. };
  452. this.tablekeymd5=function(){
  453. var url = can.url;
  454. if(url.indexOf('rnd')>0)url = url.substr(0,url.indexOf('rnd')-1);
  455. var str = url+this.tablename+can.storeafteraction+can.storebeforeaction+can.defaultorder+can.onlytablekey;
  456. if(can.modenum)str+=can.modenum;
  457. return 'table'+md5(str);
  458. };
  459. this.signature= function(da, url){
  460. var time = parseInt(js.now('time')*0.001);
  461. var siaa = ''+NOWURL+''+url+''+da.tablename+''+time+'_'+adminid+'';
  462. var sign = md5(siaa);
  463. da.sys_signature= sign;
  464. da.sys_timeature= time;
  465. return da;
  466. };
  467. this._editforcuschen = function(o1, a, farr){
  468. var o1= get('inputedit_'+rand+'');
  469. var v = o1.value,ov = a.oldvalue;
  470. if(a.type=='checkbox')if(!o1.checked)v='0';
  471. var selv= v+'';
  472. if(a.type=='select')selv=o1.options[o1.selectedIndex].text;
  473. if(v==ov || selv==ov){
  474. $('#edittable_'+rand+'').remove();
  475. return;
  476. }
  477. var vid = 'msgteita_'+rand+'';
  478. js.setmsg('处理中...','#ff6600',vid);
  479. o1.disabled = true;
  480. this.bool = true;
  481. var data = {tablename:can.tablename,id:a.id,fieldname:a.fields,value:v,fieldsafteraction:can.fieldsafteraction};
  482. $.ajax({
  483. data:this.signature(data, can.cellurl),type:'post',url:can.cellurl,
  484. success:function(bstr){
  485. me.bool = false;
  486. $('#edittable_'+rand+'').remove();
  487. if(bstr!='success'){
  488. js.msg('msg', bstr);
  489. return;
  490. }
  491. js.setmsg('处理完成','green',vid);
  492. var ohtml = a.obj.html();
  493. ohtml = ohtml.replace(ov, v);
  494. if(a.type=='checkbox')ohtml='<img height="20" width="20" src="images/checkbox'+v+'.png">';
  495. if(a.type=='select')ohtml=selv;
  496. a.obj.html(ohtml);
  497. me.data[a.row][a.fields] = v;
  498. if(farr.editorafter)farr.editorafter();//保存后处理
  499. },
  500. error:function(e){
  501. js.msg('msg',e.responseText);
  502. me.bool = false;
  503. }
  504. });
  505. };
  506. this._itemclick= function(o1, e){
  507. var o = $(o1);
  508. if(can.selectColor){
  509. this.trobj.css('background','');
  510. o.css('background', can.selectColor);
  511. }else{
  512. this.trobj.removeClass(can.selectcls);
  513. o.addClass(can.selectcls);
  514. }
  515. var oi = parseFloat(o.attr('oi'));
  516. var a = this.data[oi];
  517. this.changedata = a;
  518. this.changeid = a.id;
  519. can.itemclick(a, oi, e);
  520. };
  521. this._itemdblclick= function(o1, e){
  522. var o = $(o1),oi,lxs,o1,cell,farr,o2;
  523. oi = parseFloat(o.attr('oi'));
  524. o2 = e.target;
  525. lxs = o2.nodeName.toLowerCase();
  526. if(lxs!='td'){
  527. o2 = e.target.parentNode;
  528. lxs = o2.nodeName.toLowerCase();
  529. }
  530. if(lxs=='td'){
  531. o1 = $(o2);
  532. cell= parseFloat(o1.attr('cell'));
  533. farr= can.columns[cell];
  534. if(farr && farr.editor)return;//单元格是编辑就退出
  535. }
  536. can.itemdblclick(this.changedata, oi, e);
  537. };
  538. this._loaddata = function(p, donbo){
  539. if(this.bool)return;
  540. this.changeid= 0;
  541. this.loadci++;
  542. this.changedata = {};
  543. var url = can.url;
  544. var das = {tablename_abc:can.tablename,defaultorder:can.defaultorder,keywhere:can.keywhere,where:this.where,sort:can.sort,dir:can.dir,loadci:this.loadci,storebeforeaction:can.storebeforeaction,storeafteraction:can.storeafteraction,modenum:can.modenum},
  545. s='',of=obj.offset();
  546. das.keywhere=jm.encrypt(das.keywhere.replace(/\'/g, '[F]'));
  547. das.where = jm.encrypt(das.where.replace(/\'/g, '[F]'));
  548. das.start = can.pageSize*(p-1);
  549. das.page = p;
  550. das.limit = can.pageSize;
  551. if(!can.fanye)das.limit = can.limit;
  552. das = js.apply(das, can.params);
  553. das = js.apply(das, this.otherparams);
  554. if(donbo)return das;
  555. this.page = p;
  556. var o1 = $('#tablebody_'+rand+'');
  557. var h= o1.height()-2,w= o1.width()-2;
  558. s='<div id="modeshow_'+rand+'" style="height:'+h+'px;width:'+w+'px;overflow:hidden;z-index:3;position:absolute;left:1px;line-height:'+h+'px;top:1px;background:rgba(0,0,0,0.2);color:white" align="center">'+js.ling(20)+'&nbsp;加载中...</div>';
  559. o1.append(s);
  560. can.beforeload();
  561. this.bool = true;
  562. $.ajax({
  563. url:url,type:can.method,data:das,
  564. success:function(da){
  565. if(!get('tablebody_'+rand+''))return;
  566. var a = js.decode(da);
  567. if(!a.rows){
  568. if(a.msg)da=a.msg;
  569. js.msg('msg',da);
  570. }else{
  571. me._loaddataback(a);
  572. }
  573. $('#modeshow_'+rand+'').remove();
  574. me.bool = false;
  575. },
  576. error: function(e){
  577. $('#modeshow_'+rand+'').remove();
  578. js.msg('msg',e.responseText);
  579. me.bool = false;
  580. }
  581. });
  582. };
  583. this.exceldown = function(bt, lxs,ocsn){
  584. if(this.bool)return;
  585. var excelfields='',excelheader='',i,a=can.columns;
  586. var np = (lxs==2) ? this.page : 1;
  587. var das = this._loaddata(np, true);
  588. das.limit = 10000;
  589. das.execldown = 'true';
  590. if(!bt)bt=nowtabs.name;
  591. das.exceltitle = bt;
  592. for(i=0;i<a.length;i++){
  593. if(!a[i].notexcel){
  594. excelfields+=','+a[i].dataIndex+'';
  595. excelheader+=','+a[i].text+'';
  596. }
  597. }
  598. das.excelfields = excelfields.substr(1);
  599. das.excelheader = excelheader.substr(1);
  600. if(lxs==1)return das;
  601. if(lxs==2){
  602. das.limit = can.pageSize;
  603. }
  604. if(ocsn)for(i in ocsn)das[i]=ocsn[i];
  605. das.exceltitle = jm.encrypt(das.exceltitle);
  606. das.excelfields = jm.encrypt(das.excelfields);
  607. das.excelheader = jm.encrypt(das.excelheader);
  608. this.bool = true;
  609. js.msg('wait', '导出处理中...');
  610. $.ajax({
  611. url:can.url,type:'POST',data:das,dataType:'json',
  612. success:function(a1){
  613. var lex = (nwjsgui)?'_self':'_blank';
  614. if(!a1.downCount)a1.downCount = a1.totalCount;
  615. js.msg('success', '处理成功,共有记录'+a1.totalCount+'条/导出'+a1.downCount+'条,点我直接<a class="a" href="'+a1.url+'" target="'+lex+'">[下载]</a>', 60);
  616. me.bool=false;
  617. },
  618. error:function(e){
  619. js.msg('msg','err:'+e.responseText);
  620. me.bool = false;
  621. }
  622. });
  623. };
  624. this.exceldownnow = function(bt){
  625. this.exceldown(bt,2);
  626. };
  627. this.setparams = function(cans, relo){
  628. if(!cans)cans={};
  629. this.otherparams = js.apply(this.otherparams,cans);
  630. this.page = 1;
  631. if(relo)this.reload();
  632. };
  633. this._loaddataback=function(a){
  634. this._tredat={};
  635. this.json = a;
  636. this.data = a.rows;
  637. this.count = a.totalCount;
  638. can.loadbefore(a, this);
  639. this._create();
  640. this._initfany();
  641. can.load(a, this, this.loadci);
  642. };
  643. this.loadData = function(d){
  644. this._loaddataback(d);
  645. };
  646. this._clickorder = function(o1){
  647. if(this.loadci==0)return;
  648. var o,oi,a,dir,sort;
  649. o = $(o1);
  650. oi = parseFloat(o.attr('tempsort'));
  651. a = can.columns[oi];
  652. sort = a.dataIndex;
  653. dir = o.attr('lx');
  654. this.order(sort, dir);
  655. };
  656. this.remove = function(ids){
  657. var sid = ids.split(','),id,i;
  658. for(i=0;i<sid.length;i++){
  659. id = sid[i];
  660. obj.find("tr[dataid='"+id+"']").remove();
  661. if(id == this.changeid){
  662. this.changeid= 0;
  663. this.changedata = {};
  664. }
  665. }
  666. };
  667. this.hiderows=function(ids){
  668. var sid = ids.split(','),id,i;
  669. for(i=0;i<sid.length;i++){
  670. id = sid[i];
  671. obj.find("tr[dataid='"+id+"']").hide();
  672. if(id == this.changeid){
  673. this.changeid= 0;
  674. this.changedata = {};
  675. }
  676. }
  677. };
  678. this.showrows=function(id){
  679. var sid = ids.split(','),id,i;
  680. for(i=0;i<sid.length;i++){
  681. id = sid[i];
  682. obj.find("tr[dataid='"+id+"']").show();
  683. }
  684. };
  685. this.showallrows=function(){
  686. obj.find("tr[dataid']").show();
  687. }
  688. this.order = function(a, b){
  689. if(!a)return;
  690. if(!b)b='asc';
  691. can.sort = a;
  692. can.dir = b;
  693. this.reload();
  694. };
  695. this.highorder = function(str){
  696. if(!str)str='';
  697. this.highorderstr = str;
  698. this.reload();
  699. };
  700. this.search = function(w, jg, slx){
  701. if(!w)w='';
  702. if(jg)w = this.where+' '+w;
  703. var s = can.outsearch(this);
  704. if(s)w+=' '+s+'';
  705. this.where = w;
  706. this._loaddata(1);
  707. return w;
  708. };
  709. this.reload = function(){
  710. this._loaddata(this.page);
  711. };
  712. this.del = function(csa){
  713. if(this.bool)return;
  714. var a = js.apply({msg:'确定要删除选中的{s}条记录吗?',success:function(){},checked:false,check:function(){}},csa);
  715. var s = ''+this.changeid+'',xz;
  716. if(a.checked)s=this.getchecked();
  717. if(s=='0'||s==''){
  718. js.msg('msg','没有选中记录');
  719. return;
  720. }
  721. xz = s.split(',').length;
  722. a.msg = a.msg.replace('{s}', ''+xz+'');
  723. js.confirm(a.msg,function(lx){
  724. a.check(lx);
  725. if(lx=='yes'){
  726. me._delok(s, a);
  727. }
  728. });
  729. };
  730. this.getchecked = function(){
  731. return js.getchecked('tablecheck_'+rand+'');
  732. };
  733. this.getcheckobj = function(){
  734. return $("input[name='tablecheck_"+rand+"']");
  735. };
  736. this.getcheckdata= function(){
  737. var o = this.getcheckobj(),len=o.length,i,o1,d=[];
  738. for(i=0;i<len;i++){
  739. o1=o[i];
  740. if(o1.checked){
  741. oi=parseFloat($(o1).attr('oi'));
  742. d.push(this.data[oi]);
  743. }
  744. }
  745. return d;
  746. };
  747. this._delok = function(sid, ds){
  748. js.msg('wait','删除'+sid+'中...');
  749. this.bool=true;
  750. var url = ds.url;if(!url)url=js.getajaxurl('publicdel','index');
  751. var ss = js.apply({modenum:can.modenum,table:can.tablename,id:sid},ds.params);
  752. $.ajax({
  753. url:url,type:'POST',data:ss,dataType:'json',
  754. success:function(a1){
  755. me.bool=false;
  756. if(a1.code==200){
  757. js.msg('success','删除成功');
  758. ds.success();
  759. me.reload();
  760. }else{
  761. js.msg('msg',a1.msg);
  762. }
  763. },
  764. error:function(e){
  765. js.msg('msg','err:'+e.responseText);
  766. me.bool = false;
  767. }
  768. });
  769. };
  770. this.settishi=function(nr){
  771. $('#bottomtishi_'+rand+'').html(nr);
  772. };
  773. this._fanye = function(){
  774. var s = '';
  775. s='<div style="margin-top:10px;display:flex;align-items:center;">'+
  776. '<div class="btn-group">'+
  777. '<button id="shouye_'+rand+'" type="button" data-toggle="tooltip" data-placement="top" title="首页" class="btn btn-default">&laquo;</button>'+
  778. '<button id="shang_'+rand+'" data-toggle="tooltip" data-placement="top" title="上一页" type="button" disabled class="btn btn-default">&lt;</button>'+
  779. '<button id="nowye_'+rand+'" type="button" disabled class="btn btn-default"> 第<span id="pages_'+rand+'">1</span>页/共<span id="maxpage_'+rand+'">0</span>页 <span class="caret"></span></button>'+
  780. '<button id="next_'+rand+'" type="button" data-toggle="tooltip" data-placement="top" title="下一页" disabled class="btn btn-default">&gt;</button>'+
  781. '<button id="lastye_'+rand+'" type="button" data-toggle="tooltip" data-placement="top" title="尾页" disabled class="btn btn-default">&raquo;</button>'+
  782. '</div> '+
  783. '<div style="margin-left:10px">'+
  784. ' <button id="refresh_'+rand+'" type="button" data-toggle="tooltip" data-placement="top" title="刷新" class="btn btn-default"><i class="icon-refresh"></i></button>'+
  785. '</div> '+
  786. '<div style="flex:1;margin:0px 10px" id="bottomtishi_'+rand+'"></div>'+
  787. '<div style="">'+
  788. '<span>共记录<span id="zjilu_'+rand+'">0</span>条</span> &nbsp;'+
  789. '每页<input maxlength="3" onblur="js.number(this)" onfocus="js.focusval=this.value" id="pagesize_'+rand+'" type="number" value="'+can.pageSize+'" style="width:40px;text-align:center;height:24px;border:var(--border);margin:0px 2px;font-size:12px;border-radius:5px;background:var(--main-bgcolor)">条&nbsp;'+
  790. '</div>'+
  791. '</div>';
  792. $('#tablefanye_'+rand+'').html(s);
  793. $('#shouye_'+rand+'').click(function(){me.firstPage();});
  794. $('#shang_'+rand+'').click(function(){me.backPage();});
  795. $('#next_'+rand+'').click(function(){me.nextPage();});
  796. $('#lastye_'+rand+'').click(function(){me.lastPage();});
  797. $('#refresh_'+rand+'').click(function(){me.reload();});
  798. $('#nowye_'+rand+'').rockmenu({
  799. top:33,width:150,
  800. data:[{name:'第1页',p:1}],
  801. beforeshow:function(o){
  802. o.setData(me._getpaged());
  803. o.setValue('第'+me.page+'页');
  804. },
  805. itemsclick:function(a){
  806. me.gotoPage(a.p);
  807. }
  808. });
  809. var o1 = $('#pagesize_'+rand+'');
  810. o1.blur(function(){me.setpageSize(this.value);});
  811. o1.keyup(function(e){if(e.keyCode==13)this.blur()});
  812. };
  813. this._getpaged = function(){
  814. var a = [],i=1,j=1,b,bg;
  815. i = this.page-5;
  816. j = this.page+5;
  817. if(i<1)i=1;
  818. if(j>this.maxPage)j=this.maxPage;
  819. for(b=i;b<=j;b++){
  820. a.push({name:'第'+b+'页',p:b});
  821. }
  822. return a;
  823. };
  824. this._initfany = function(){
  825. if(!can.fanye)return;
  826. $('#zjilu_'+rand+'').html(''+this.count+'');
  827. $('#pages_'+rand+'').html(''+this.page+'');
  828. this.maxPage = Math.ceil(this.count/can.pageSize);
  829. $('#maxpage_'+rand+'').html(''+this.maxPage+'');
  830. var bo1=false,bo2=false;
  831. if(this.maxPage <=1 || this.page<=1){
  832. bo1 = true;
  833. }
  834. get('shouye_'+rand+'').disabled=bo1;
  835. get('shang_'+rand+'').disabled=bo1;
  836. if(this.maxPage <=1){
  837. get('nowye_'+rand+'').disabled=true;
  838. }else{
  839. get('nowye_'+rand+'').disabled=false;
  840. }
  841. if(this.maxPage <=1 || this.page>=this.maxPage){
  842. bo2 = true;
  843. }
  844. get('next_'+rand+'').disabled=bo2;
  845. get('lastye_'+rand+'').disabled=bo2;
  846. };
  847. this._next = function(oi){
  848. var p = this.page+oi;
  849. if(p<=0)p=1;
  850. if(p>=this.maxPage)p=this.maxPage;
  851. this._loaddata(p);
  852. };
  853. this.firstPage = function(){
  854. this._loaddata(1);
  855. };
  856. this.backPage = function(){
  857. this._next(-1);
  858. };
  859. this.nextPage = function(){
  860. this._next(1);
  861. };
  862. this.gotoPage = function(p){
  863. this._loaddata(p);
  864. };
  865. this.lastPage = function(){
  866. this._loaddata(this.maxPage);
  867. };
  868. this.setpageSize = function(p){
  869. p = parseFloat(p);
  870. if(p<=0)p=can.pageSize;
  871. $('#pagesize_'+rand+'').val(''+p+'');
  872. if(can.pageSize == p)return;
  873. can.pageSize = p;
  874. this.page = 1;
  875. this.reload();
  876. };
  877. this._caozuochengs=function(a,oj){
  878. a.renderer=function(v,d,oi){
  879. var s='<a oi="'+oi+'" oj="'+oj+'" style="TEXT-DECORATION:none" temp="caozuomenu_'+rand+'">';
  880. if(this.opttype){
  881. s+=this.opttype;
  882. }else{
  883. s+='操作<i class="icon-angle-down"></i>';
  884. }
  885. s+='</a>';
  886. if(!d.id)s='&nbsp;';
  887. return s;
  888. };
  889. a.renderattr=function(){return 'nowrap'}
  890. a.notexcel=true;
  891. return a;
  892. };
  893. this._caozuochengss=function(o1){
  894. var oi,d,num,mid,modename,o2;
  895. o2= $(o1);
  896. oi= parseFloat(o2.attr('oi'));
  897. oj= parseFloat(o2.attr('oj'));
  898. d = this.getData(oi);
  899. num=can.modenum;if(num=='')num=this.tablename;
  900. mid = d.id;if(d.modenum)num=d.modenum;
  901. modename=can.modename;if(d.modename)modename=d.modename;
  902. new optmenuclass(o1,num,mid,this,modename,oi,can.columns[oj]);
  903. };
  904. this.geturlparams=function(bt,ocans){
  905. var cshu = this.exceldown(bt, 1),i;
  906. cshu.tablename_abc = jm.uncrypt(cshu.tablename_abc);
  907. cshu = js.apply(cshu,ocans);
  908. return [can.url, cshu];
  909. }
  910. };
  911. /**
  912. 表格中常用方法
  913. 1、reload(); //刷新数据源
  914. 2、getchecked();//获取复选框对应记录ID聚
  915. 3、getcheckdata();//获取复选框选中的数据数组[]
  916. 4、insert({name:''});//表格中插入一行
  917. 5、setparams({key:''},true);//设置参数并搜索
  918. 6、geturlparams();获取当前Url地址参数,订阅时用到的
  919. */
  920. if(typeof(bootsSelectColor)!='string')bootsSelectColor= 'rgba(0,0,0,0.1)';
  921. $.fn.bootstable = function(options){
  922. var defaultVal = {
  923. columns:[], //表头
  924. selectColor:bootsSelectColor, //选中时行颜色
  925. pageSize:15, //默认分页数
  926. limit:0, //没有分页时展示条数
  927. bodyStyle:'',
  928. height:0, //高度
  929. url:'', //请求地址
  930. celleditor:false, //是否可编辑单元格
  931. cellautosave:true, //编辑单元格是否自动保存
  932. celledittype:'dblclick', //编辑单元格用双击
  933. cellurl:'', //编辑单元格保存地址
  934. fieldsafteraction:'', //编辑单元格时保存后触发
  935. data:[], //初始数据
  936. autoLoad:true, //是否初始化后就加载
  937. tree:false, //是否树形显示
  938. itemdblclick:function(){}, //双击行调用
  939. searchwidth:500, //没用
  940. defaultorder:'', //默认排序
  941. where:'', //条件
  942. hideHeaders:false, //是否隐藏头部表头
  943. modename:'', //对应模块名称
  944. modenum:'', //对应模块编号
  945. statuschange:true, //当行的status=0时自动变成灰色
  946. checked:false, //是否多选
  947. fanye:false, //是否可翻页
  948. sort:'', //排序字段
  949. dir:'', //排序类型desc和asc
  950. storeafteraction:'', //数据源请求后先处理函数
  951. storebeforeaction:'',//数据源请求时先处理函数,可返回条件字段等
  952. loadtree:false,
  953. modedir:'', //当前文件路径,一般都是写:'{mode}:{dir}'
  954. keywhere:'', //条件
  955. params:{}, //其他参数
  956. tablename:'', //请求数据表格名,如有指定modenum,会加载对应模块上设置的表
  957. selectcls:'success', //选中样式
  958. itemclick:function(da, index, e){}, //单击行触发
  959. beforeload:function(){}, //数据加载前触发
  960. load:function(){}, //数据加载完成后触发
  961. loadbefore:function(){}, //数据加载完成后但还没有渲染出来时触发
  962. outsearch:function(){return ''}, //外搜索条件
  963. searchview:'', //没用
  964. method:'POST', //post请求
  965. rendertr:function(){return ''}, //少用
  966. rowsbody:function(){return ''}, //少用
  967. onlytablekey:'', //唯一的编号
  968. celldblclick:false //没用
  969. };
  970. if(typeof(bootstableobj)=='undefined')bootstableobj={};
  971. var can = $.extend({}, defaultVal, options);
  972. var clsa = new bootstable($(this), can);
  973. clsa.init();
  974. if(can.modenum!='')bootstableobj[can.modenum]=clsa;
  975. return clsa;
  976. };
  977. })(jQuery);
粤ICP备19079148号