jquery-bootstree.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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 bootstree(element, options){
  10. var obj = element;
  11. var can = options;
  12. var rand = can.rand;
  13. var me = this;
  14. this.bool = false;
  15. this.changedata = false;
  16. //初始化
  17. this.init = function(){
  18. if(rand=='')rand=js.getrand();
  19. this._init();
  20. this._create();
  21. if(can.autoLoad && !isempt(can.url))this._load();
  22. };
  23. this._init = function(){
  24. var a,s,i;
  25. for(i=0; i<can.columns.length; i++){
  26. a = can.columns[i];
  27. if(typeof(a.align)=='undefined')can.columns[i].align='center';
  28. if(a.xtype=='treecolumn')can.columns[i].align='left';
  29. }
  30. s='<div style="position:relative;border:1px #dddddd solid;" class="bootstree" id="treebody_'+rand+'"></div>';
  31. obj.html(s);
  32. };
  33. this._create = function(){
  34. var a = can.columns;
  35. var s = '',i,len=a.length,hs;
  36. this._zoi = -1;
  37. this._zoiarr = [];
  38. this.changedata = false;
  39. if(!can.hideHeaders){
  40. s+='<div>';
  41. s+='<ul style="border-bottom:1px #dedede solid;border-top-width:0px;margin:0">';
  42. if(can.checked)s+='<li style="width:40px;text-align:center"><input id="seltablecheck_'+rand+'" type="checkbox"></li>';
  43. for(i=0;i<len;i++){
  44. hs = '';
  45. s+='<li '+hs+' style="width:'+a[i].width+';text-align:'+a[i].align+'">&nbsp;&nbsp;';
  46. if(can.celleditor&&a[i].editor)s+='<i class="icon-pencil"></i>&nbsp;';
  47. s+='<b>'+a[i].text+'</b>';
  48. s+='</li>';
  49. }
  50. s+='</ul>';
  51. s+='</div>';
  52. }
  53. s+=this._createjd(can.data, 0, 'treenode');
  54. $('#treebody_'+rand+'').html(s);
  55. obj.find("i[temp='nodeclick']").click(function(){
  56. me._explade(this);
  57. });
  58. this.trobj = obj.find('ul[dataid]');
  59. this.trobj.click(function(event){
  60. me._itemclick(this, event, 0);
  61. });
  62. this.trobj.dblclick(function(event){
  63. me._itemdblclick(this, event);
  64. });
  65. $('#seltablecheck_'+rand+'').click(function(){
  66. js.selall(this, 'treecheck_'+rand+'');
  67. });
  68. }
  69. this.viewreload = function(){
  70. this._create();
  71. };
  72. this._itemclick= function(o1, e, lx){
  73. this.trobj.css('background','');
  74. var o = $(o1);
  75. o.css('background', can.selectColor);
  76. var oi = parseFloat(o.attr('oi'));
  77. var a = this._zoiarr[oi];
  78. this.changedata = a;
  79. this.changeid = a.id;
  80. if(lx==0)can.itemclick(a, oi, e);
  81. if(lx==1)can.itemdblclick(a, oi, e);
  82. };
  83. this._itemdblclick=function(o1,e){
  84. this._itemclick(o1,e,1)
  85. };
  86. this._explade = function(o){
  87. var o1 = $(o);
  88. var sid = o1.attr('nodeclick');
  89. var exp = o1.attr('expanded');
  90. if(exp=='true'){
  91. obj.find("div[nodexu='"+sid+"']").hide();
  92. o1.attr('expanded','false');
  93. }else{
  94. obj.find("div[nodexu='"+sid+"']").show();
  95. o1.attr('expanded','true');
  96. }
  97. }
  98. this._createjd = function(d, oi, xlx){
  99. var a = can.columns;
  100. var s = '',i,len=d.length,j,jlen = a.length,s1,ionc,s2='',s3,id, diss='',ov;
  101. for(i=0;i<len;i++){
  102. id = xlx+'_'+i;
  103. s2 = '';
  104. if(d[i].children){
  105. if(d[i].children.length>0){
  106. diss = '';
  107. if(!d[i].expanded)diss='none';
  108. s2= this._createjd(d[i].children, oi+1, id);
  109. s2 = '<div style="display:'+diss+';" nodexu="'+id+'">'+s2+'</div>';
  110. }
  111. }
  112. this._zoi++;
  113. ov = d[i];
  114. this._zoiarr[this._zoi] = ov;
  115. s+='<ul oi="'+this._zoi+'" style="margin:0" dataid="'+ov.id+'">';
  116. if(can.checked){
  117. s+='<li style="width:40px;text-align:center"><input name="treecheck_'+rand+'" value="'+this._zoi+'" type="checkbox"></li>';
  118. }
  119. for(j=0;j<jlen;j++){
  120. s1 = ov[a[j].dataIndex];
  121. if(!s1)s1='';
  122. if(typeof(a[j].renderer)=='function'){
  123. s3 = a[j].renderer(s1, ov);
  124. if(!isempt(s3))s1=s3;
  125. }
  126. s+='<li style="width:'+a[j].width+';text-align:'+a[j].align+'">';
  127. if(a[j].xtype == 'treecolumn'){
  128. ionc = 'folder-close-alt';
  129. if(s2=='')ionc='file-alt';
  130. if(ov.icons)ionc = ov.icons;
  131. s+= '<div style="padding-left:'+(24*oi+10)+'px">';
  132. s+= this._getshlist(ov, this._zoi);
  133. s+= ' <i nodeclick="'+id+'" style="cursor:pointer" class="icon-'+ionc+'"';
  134. if(s2 != '')s+=' temp="nodeclick"';
  135. if(ov.expanded)s+=' expanded="true"';
  136. s+= '></i> ';
  137. s+= s1;
  138. s+= '</div>';
  139. }else{
  140. s+= s1;
  141. }
  142. s+='</li>';
  143. }
  144. s+='</ul>';
  145. s+=s2;
  146. }
  147. return s;
  148. };
  149. this._getshlist = function(a, oi){
  150. var s= '',chk='',dis='';
  151. if(typeof(a.checked)=='boolean'){
  152. if(a.checked)chk='checked';
  153. if(a.disabled)dis='disabled';
  154. s = '<input name="treecheck_'+rand+'" '+chk+' '+dis+' value="'+oi+'" type="checkbox" >';
  155. }
  156. return s;
  157. };
  158. //获取选中
  159. this.getchecked = function(){
  160. var s = js.getchecked('treecheck_'+rand+''),
  161. o = $("input[name='treecheck_"+rand+"']");
  162. var a = [],i;
  163. if(s!=''){
  164. var a1 = s.split(',');
  165. for(i=0; i<a1.length; i++){
  166. oi = parseInt(a1[i]);
  167. a.push(this._zoiarr[oi]);
  168. }
  169. }else if(o.size()==0){
  170. if(this.changedata)a.push(this.changedata);
  171. }
  172. return a;
  173. };
  174. this.setparams = function(cans, relo){
  175. if(!cans)cans={};
  176. can.params = js.apply(can.params,cans);
  177. if(relo)this._load();
  178. };
  179. this._load = function(){
  180. if(this.bool)return;
  181. var h= obj.height()-2,
  182. w= obj.width()-2,
  183. s = '';
  184. s='<div id="modeshow_'+rand+'" style="filter:Alpha(opacity=20);opacity:0.2;height:'+h+'px;width:'+w+'px;overflow:hidden;z-index:3;position:absolute;left:0px;line-height:'+h+'px;top:0px;background:#000000;color:white" align="center"><img src="images/mloading.gif" align="absmiddle"></div>';
  185. $('#treebody_'+rand+'').append(s);
  186. this.bool = true;
  187. var parm = can.params;
  188. $.ajax({
  189. type:can.method,url:can.url,
  190. data:parm,
  191. success:function(da){
  192. if(!get('treebody_'+rand+''))return;
  193. var a = js.decode(da);
  194. me._loaddataback(a);
  195. $('#modeshow_'+rand+'').remove();
  196. me.bool = false;
  197. },
  198. error: function(e){
  199. $('#modeshow_'+rand+'').remove();
  200. js.msg('msg',e.responseText);
  201. me.bool = false;
  202. }
  203. });
  204. };
  205. this._loaddataback = function(a){
  206. var d = a.rows ? a.rows : a;
  207. can.data = d;
  208. this._create();
  209. can.load(a, this);
  210. };
  211. this.reload = function(){
  212. this._load();
  213. };
  214. this.loadData = function(d){
  215. this._loaddataback(d);
  216. };
  217. this.del = function(csa){
  218. if(this.bool)return;
  219. var a = js.apply({msg:'确定要删除选中的记录吗?',success:function(){},checked:false,check:function(){},id:this.changeid,url:'',params:{}},csa);
  220. if(!a.id ||a.url==''||a.id=='0')return;
  221. js.confirm(a.msg,function(lx){
  222. if(lx=='yes'){
  223. me._delok(a);
  224. }
  225. });
  226. };
  227. this._delok = function(ds){
  228. js.msg('wait','删除中...');
  229. this.bool=true;
  230. var url = ds.url,ss = js.apply({id:ds.id},ds.params);
  231. $.ajax({
  232. url:url,type:'POST',data:ss,dataType:'json',
  233. success:function(a1){
  234. me.bool=false;
  235. if(a1.code==200){
  236. js.msg('success','删除成功');
  237. ds.success();
  238. me.reload();
  239. }else{
  240. js.msg('msg',a1.msg);
  241. }
  242. },
  243. error:function(e){
  244. js.msg('msg','err:'+e.responseText);
  245. me.bool = false;
  246. }
  247. });
  248. };
  249. };
  250. $.fn.bootstree = function(options){
  251. var defaultVal = {
  252. data:[],rand:'',columns:[],hideHeaders:false,selectColor:'#DFF0D8',method:'GET',
  253. itemdblclick:function(){},checked:false,autoLoad:true,url:'',params:{},
  254. itemclick:function(da, index, e){},load:function(){}
  255. };
  256. var can = $.extend({}, defaultVal, options);
  257. var clsa = new bootstree($(this), can);
  258. clsa.init();
  259. return clsa;
  260. };
  261. })(jQuery);