var form;
//权限列表目标标记
var tree_target = [];
var total_level = 5;//权限总级别
//背景颜色配置
var bg_arr = ['#FFF', '#FFF', '#FFF', '#FFF'];
layui.use(['form'], function () {
form = layui.form;
form.render();
form.on('checkbox(group_form)', function(data){
var checked = $(this).prop('checked');
var target = $(this).attr('data-target');
target = target.split(',');
var curr_data = find_data_by_target(tree_data, target);
curr_data['checked'] = checked;
down_alter(curr_data['child_list'], checked);
up_alter(tree_data, target);
$("#tree_box").html(createTable(tree_data));
form.render();
});
$("#tree_box").html(createTable(tree_data));
form.render();
});
function createTable(data){
var html = "
";
var compile_tree_result = compile_tree(data, 0, '');
html += ''+compile_tree_result.first_html+'
';
html += compile_tree_result.last_html;
html += "
";
return html;
}
//编译树
function compile_tree(data, level, html) {
var child_num_arr = [];
var rowspan_num = 0;
var total_child_num = 0;
var total_num = 0;
var html_obj = [];
var first_html = "";
var last_html = "";
$.each(data,function(i,data_item){
var child_num = data_item['child_num'];
child_num_arr.push(child_num);
total_num += 1;
total_child_num += child_num;
var checked = data_item['checked'];
html_obj.push({checked:checked,child_num:child_num,data:data_item,name:data_item.name});
})
if(total_num > 0){
if(total_child_num > 0){
var is_first = true;
$.each(html_obj,function(i,item){
var item_obj = item.data;
var item_html = "";
var rowspan = 0;
var name = item['name'];
tree_target[level] = name;
tree_target = tree_target.slice(0, level + 1);
var checked_html = item.checked ? 'checked' : '';
var input_html = '';
var child_num = item.child_num;
var colspan_html = "";
var child_first_html = "";
var child_last_html = "";
if (child_num > 0){
var item_result = compile_tree(item_obj['child_list'], level + 1, '');
var rowspan = item_result.rowspan;
var child_first_html = item_result.first_html;
var child_last_html = item_result.last_html;
}
if(child_first_html == '' ){
var colspan_num = total_level - level;
colspan_html = " colspan="+colspan_num;
}
if(!is_first){
item_html += '';
}
if(rowspan > 1){
rowspan_num = rowspan_num + rowspan;
item_html += '| ';
}else{
rowspan_num += 1;
item_html += ' | ';
}
item_html += input_html;
item_html += ' | ';
item_html += child_first_html;
if(!is_first) {
item_html += '
';
}
item_html += child_last_html;
if(is_first){
first_html += item_html;
is_first = false;
}else{
last_html += item_html;
}
})
}else{
var colspan_num = total_level - level;
var colspan_html = " colspan="+colspan_num;
first_html += '';
rowspan_num = 1;
$.each(html_obj,function(i,item){
var name = item['name'];
tree_target[level] = name;
tree_target = tree_target.slice(0, level + 1);
var checked_html = item.checked ? 'checked' : '';
var input_html = '';
first_html += input_html;
})
first_html += ' | ';
}
}
return {rowspan:rowspan_num,first_html:first_html,last_html:last_html};
}
//通过标记找到数据位置
function find_data_by_target(list, target) {
var data = list;
for (var per in target) {
if (per == 0) {
data = data[target[per]];
} else {
data = data['child_list'][target[per]];
}
}
return data;
}
//向上遍历
function up_alter(list, target) {
target = target.slice(0, target.length - 1);
if (target.length == 0) return;
var curr_data = find_data_by_target(tree_data, target);
var count = 0;
for (var per in curr_data['child_list']) {
if (curr_data['child_list'][per]['checked']) {
count++;
break;
}
}
if (count == 0) {
curr_data['checked'] = false;
} else {
curr_data['checked'] = true;
}
up_alter(list, target);
}
//向下遍历
function down_alter(list, checked) {
for (var per in list) {
list[per]['checked'] = checked;
if (list[per]['child_num'] > 0) down_alter(list[per]['child_list'], checked)
}
}
//绑定点击事件
$("#tree_box").on('click', '.menu-cell input', function () {
var checked = $(this).prop('checked');
var target = $(this).attr('data-target');
target = target.split(',');
var curr_data = find_data_by_target(tree_data, target);
curr_data['checked'] = checked;
down_alter(curr_data['child_list'], checked);
up_alter(tree_data, target);
$("#tree_box").html(createTable(tree_data));
form.render();
});