// 树形数据展示 ;(function($){ var self; var TableTree=function(param){ self=this; this.defaults={ tree: $(".timo-tree"), treeTable: ".timo-tree-table", // 表格类名 treeIcon: "", treeFill: "", hideRank: 3, oldActive: null, oldButton: null, scrollTop: 90, } this.options=$.extend({},this.defaults,param); } TableTree.prototype={ // 初始化 init: function(){ // 获取树形列表数据 var tree = self.options.tree; $.get(tree.data('url'),function(result){ if(result.data.length > 0){ // zTree传递列表数据 self.zTreeReady(result.data); // 树形表格传递列表数据 self.tableTree(result.data); // 开启树形表格子级开关 self.toggleChild(); } }); }, // 操作zTree组件 zTreeReady: function(listData){ var setting = { view: { addHoverDom: addHoverDom, removeHoverDom: removeHoverDom, }, edit: { enable: true, }, data: { simpleData: { enable: true } }, callback: { onClick: onClick, onExpand: onExpand, onCollapse: onCollapse, beforeEditName: beforeEditName, beforeRemove: beforeRemove, } }; function onClick(event, treeId, treeNode, clickFlag) { var tNode = $("[tree-id='"+treeNode.id+"']"); if(self.options.treeActive != null){ self.options.treeActive.removeClass("tree-active"); } self.options.treeActive = tNode; tNode.addClass("tree-active"); $(document).scrollTop(tNode.offset().top-self.options.scrollTop); } function onExpand(event, treeId, treeNode) { var tNode = $("[tree-id='"+treeNode.id+"']"); self.expandChild(tNode, true); } function onCollapse(event, treeId, treeNode) { var tNode = $("[tree-id='"+treeNode.id+"']"); self.expandChild(tNode, false); } function addHoverDom(treeId, treeNode){ var node = $("#" + treeNode.tId + "_span"); if (treeNode.editNameFlag || $("#addBtn_"+treeNode.tId).length>0) return; var addNode = ""; node.after(addNode); var btn = $("#addBtn_"+treeNode.tId); if (btn) btn.bind("click", function(){ var popup = $(".popup-add"); var url = popup.data('url'); popup.attr("data-url", url + "/" + treeNode.id); popup.click(); popup.attr("data-url", url); return false; }); } function removeHoverDom(treeId, treeNode) { $("#addBtn_"+treeNode.tId).unbind().remove(); } function beforeEditName(treeId, treeNode) { var trNode = $("[tree-id='"+ treeNode.id +"']"); var edit = trNode.find(".popup-edit"); edit.click(); return false; } function beforeRemove(treeId, treeNode) { var trNode = $("[tree-id='"+ treeNode.id +"']"); var del = trNode.find(".popup-delete"); del.click(); return false; } // 封装zTree数据 var zNodes = []; listData.forEach(function (val) { var nav = { id: val.id, pId: val.pid, name: val.title }; if(nav.pId == 0){ nav.isParent = true; nav.open = true; } zNodes.push(nav); }); // zTree组件初始化 $(document).ready(function(){ $.fn.zTree.init(self.options.tree.find(".ztree"), setting, zNodes); }); }, // 封装树形表格 tableTree: function(listData){ // 封装树形结构数据 var newList = []; var treeList = []; listData.forEach(function (item) { newList[item.id] = item; }); listData.forEach(function (item) { if(newList[item.pid] != undefined){ if(newList[item.pid].children == undefined){ newList[item.pid].children = []; } newList[item.pid].children.push(item); }else{ treeList.push(item); } }); // 获取表格展示模型 var tbody = $(self.options.treeTable+" tbody"); var template = tbody.html(); tbody.empty(); tbody.css("visibility", "visible"); // 填充数据 var regex=/\{\{([$A-Za-z]+?)\}\}/g; var rank = 1; self.expandTree(treeList, rank, function (item, rank) { var callback = template.replace(regex,function($1){ var point = $1.substring(2,$1.length-2); if(point == "title"){ var icon = self.options.treeIcon; if(item.children == undefined){ icon = self.options.treeFill; } var fill = ""; for(var i=0; i= self.options.hideRank); return isHide ? "tree-hidd" : ""; }else{ return item[point]; } }); tbody.append(callback); }); }, // 展开树形数据 expandTree: function (list, rank, callback) { list.forEach(function(item){ callback(item, rank); if(item.children != undefined){ self.expandTree(item.children, ++rank, callback); rank -= 1; } }); }, // 树形表格子级开关 toggleChild: function() { $(".toggle-icon").click(function (){ var trNode = $(this).parents("tr"); var id = trNode.attr("tree-id"); var childs = $("[tree-pid='"+id+"']"); var isClose = childs.hasClass("tree-hidd"); self.expandChild(trNode, isClose); }); }, // 递归所有子级开关 expandChild :function (trNode, isClose){ var id = trNode.attr("tree-id"); var childs = $("[tree-pid='"+id+"']"); if(!isClose){ childs.addClass("tree-hidd"); childs.each(function (key, item) { self.expandChild($(item), isClose); }); }else { childs.removeClass("tree-hidd"); } } } $.fn.timoTree=function(param){ var tableTree=new TableTree(param); return tableTree.init(); } })(jQuery); // 树形选择器 (function($){ var self; var SelectTree=function(param){ self=this; this.defaults={ tree: $(".select-tree"), rootTree: null, onSelected: function () {} } this.options=$.extend({},this.defaults,param); } SelectTree.prototype={ // 初始化 init: function(){ // 获取树形列表数据 var tree = self.options.tree; // 构造悬浮选择器 self.selector(); // 重构选择框 self.resetSelect(tree); // 点击时显示悬浮选择器 tree.click(function(){ var node = $(this); $.get(node.data('url'),function(result){ //if(result.data.length > 0){ // 显示定位悬浮选择器 self.position(node); // zTree传递列表数据 self.zTreeReady(result.data, node); //} }); }); }, // 操作zTree组件 zTreeReady: function(listData, node){ var setting = { view: { dblClickExpand: false }, data: { simpleData: { enable: true } }, callback: { onClick: function(event, treeId, treeNode){ node.val(treeNode.name); node.siblings("[type='hidden']").val(treeNode.id); $(".selectContent").hide(); self.options.onSelected(treeNode); } } }; // 封装zTree数据 var zNodes = []; if(self.options.rootTree != null){ zNodes.push({id: 0, name: self.options.rootTree, open: true}); } listData.forEach(function (val) { var nav = { id: val.id, pId: val.pid, name: val.title }; if(nav.pId == 0){ nav.isParent = true; nav.open = true; } zNodes.push(nav); }); $(document).ready(function(){ $.fn.zTree.init($(".selectContent>.ztree"), setting, zNodes); }); }, // 构造悬浮选择器 selector: function () { $("body").append("\n" + "
" + " " + "
"); }, // 重构选择框 resetSelect: function(tree){ tree.each(function (key, item) { var name = $(item).attr("name"); var value = $(item).data("value"); $(item).removeAttr("name"); $(item).attr("readonly",true); var input = $(""); if(value != undefined) input.val(value); $(item).after(input); $(item).after(""); }); }, // 显示定位悬浮选择器 position: function (tree) { var source = self.options.tree; var offset = tree.offset(); $(".selectContent").css({ top: offset.top + tree.outerHeight() + 'px', left: offset.left + 'px', width: source.innerWidth() }).show(); $("body").bind("click", function (e) { var target = $(e.target).parents(".selectContent"); if(!target.length > 0){ $(".selectContent").hide(); } }); }, } $.fn.selectTree=function(param){ var selectTree=new SelectTree(param); return selectTree.init(); } })(jQuery);