tree.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. var form;
  2. //权限列表目标标记
  3. var tree_target = [];
  4. var total_level = 5;//权限总级别
  5. //背景颜色配置
  6. var bg_arr = ['#FFF', '#FFF', '#FFF', '#FFF'];
  7. layui.use(['form'], function () {
  8. form = layui.form;
  9. form.render();
  10. form.on('checkbox(group_form)', function(data){
  11. var checked = $(this).prop('checked');
  12. var target = $(this).attr('data-target');
  13. target = target.split(',');
  14. var curr_data = find_data_by_target(tree_data, target);
  15. curr_data['checked'] = checked;
  16. down_alter(curr_data['child_list'], checked);
  17. up_alter(tree_data, target);
  18. $("#tree_box").html(createTable(tree_data));
  19. form.render();
  20. });
  21. $("#tree_box").html(createTable(tree_data));
  22. form.render();
  23. });
  24. function createTable(data){
  25. var html = "<table class='layui-table'>";
  26. var compile_tree_result = compile_tree(data, 0, '');
  27. html += '<tr>'+compile_tree_result.first_html+'</tr>';
  28. html += compile_tree_result.last_html;
  29. html += "</table>";
  30. return html;
  31. }
  32. //编译树
  33. function compile_tree(data, level, html) {
  34. var child_num_arr = [];
  35. var rowspan_num = 0;
  36. var total_child_num = 0;
  37. var total_num = 0;
  38. var html_obj = [];
  39. var first_html = "";
  40. var last_html = "";
  41. $.each(data,function(i,data_item){
  42. var child_num = data_item['child_num'];
  43. child_num_arr.push(child_num);
  44. total_num += 1;
  45. total_child_num += child_num;
  46. var checked = data_item['checked'];
  47. html_obj.push({checked:checked,child_num:child_num,data:data_item,name:data_item.name});
  48. })
  49. if(total_num > 0){
  50. if(total_child_num > 0){
  51. var is_first = true;
  52. $.each(html_obj,function(i,item){
  53. var item_obj = item.data;
  54. var item_html = "";
  55. var rowspan = 0;
  56. var name = item['name'];
  57. tree_target[level] = name;
  58. tree_target = tree_target.slice(0, level + 1);
  59. var checked_html = item.checked ? 'checked' : '';
  60. var input_html = '<input class="group-checkbox" type="checkbox" ' + checked_html + ' lay-filter="group_form" lay-skin="primary" '+ checked_html +' title="'+item['data']['title']+'" data-target="' + tree_target.toString() + '" value="' + name + '"/>';
  61. var child_num = item.child_num;
  62. var colspan_html = "";
  63. var child_first_html = "";
  64. var child_last_html = "";
  65. if (child_num > 0){
  66. var item_result = compile_tree(item_obj['child_list'], level + 1, '');
  67. var rowspan = item_result.rowspan;
  68. var child_first_html = item_result.first_html;
  69. var child_last_html = item_result.last_html;
  70. }
  71. if(child_first_html == '' ){
  72. var colspan_num = total_level - level;
  73. colspan_html = " colspan="+colspan_num;
  74. }
  75. if(!is_first){
  76. item_html += '<tr>';
  77. }
  78. if(rowspan > 1){
  79. rowspan_num = rowspan_num + rowspan;
  80. item_html += '<td rowspan = "'+rowspan+'" '+colspan_html+' >';
  81. }else{
  82. rowspan_num += 1;
  83. item_html += '<td '+colspan_html+'>';
  84. }
  85. item_html += input_html;
  86. item_html += '</td>';
  87. item_html += child_first_html;
  88. if(!is_first) {
  89. item_html += '</tr>';
  90. }
  91. item_html += child_last_html;
  92. if(is_first){
  93. first_html += item_html;
  94. is_first = false;
  95. }else{
  96. last_html += item_html;
  97. }
  98. })
  99. }else{
  100. var colspan_num = total_level - level;
  101. var colspan_html = " colspan="+colspan_num;
  102. first_html += '<td '+colspan_html+' >';
  103. rowspan_num = 1;
  104. $.each(html_obj,function(i,item){
  105. var name = item['name'];
  106. tree_target[level] = name;
  107. tree_target = tree_target.slice(0, level + 1);
  108. var checked_html = item.checked ? 'checked' : '';
  109. var input_html = '<input class="group-checkbox" type="checkbox" ' + checked_html + ' lay-filter="group_form" lay-skin="primary" '+ checked_html +' title="'+item['data']['title']+'" data-target="' + tree_target.toString() + '" value="' + name + '"/>';
  110. first_html += input_html;
  111. })
  112. first_html += '</td>';
  113. }
  114. }
  115. return {rowspan:rowspan_num,first_html:first_html,last_html:last_html};
  116. }
  117. //通过标记找到数据位置
  118. function find_data_by_target(list, target) {
  119. var data = list;
  120. for (var per in target) {
  121. if (per == 0) {
  122. data = data[target[per]];
  123. } else {
  124. data = data['child_list'][target[per]];
  125. }
  126. }
  127. return data;
  128. }
  129. //向上遍历
  130. function up_alter(list, target) {
  131. target = target.slice(0, target.length - 1);
  132. if (target.length == 0) return;
  133. var curr_data = find_data_by_target(tree_data, target);
  134. var count = 0;
  135. for (var per in curr_data['child_list']) {
  136. if (curr_data['child_list'][per]['checked']) {
  137. count++;
  138. break;
  139. }
  140. }
  141. if (count == 0) {
  142. curr_data['checked'] = false;
  143. } else {
  144. curr_data['checked'] = true;
  145. }
  146. up_alter(list, target);
  147. }
  148. //向下遍历
  149. function down_alter(list, checked) {
  150. for (var per in list) {
  151. list[per]['checked'] = checked;
  152. if (list[per]['child_num'] > 0) down_alter(list[per]['child_list'], checked)
  153. }
  154. }
  155. //绑定点击事件
  156. $("#tree_box").on('click', '.menu-cell input', function () {
  157. var checked = $(this).prop('checked');
  158. var target = $(this).attr('data-target');
  159. target = target.split(',');
  160. var curr_data = find_data_by_target(tree_data, target);
  161. curr_data['checked'] = checked;
  162. down_alter(curr_data['child_list'], checked);
  163. up_alter(tree_data, target);
  164. $("#tree_box").html(createTable(tree_data));
  165. form.render();
  166. });