(function ($) { Tree = $.fm.Tree = Control.subClass({ template: [ '
', '
', ], init: function(options) { this.checkable = false; this.autoExpended = true; this.childrenIndex = 0; Control.call(this, options); this.createElements(); if (this.url) { var me = this; Server.getData(this.url, function(data) { Loading.hide(); if (me.onGetData) { data = me.onGetData(data); } me.loadData(data); }); } else if (this.data) { this.loadData(this.data); } }, createElements: function() { var me = this; this.canvas.addClass("tree"); var tree = $(this.template.join("")); this.body = $("#tree-body", tree); this.canvas.append(tree); }, loadData: function(array) { this.data = this.parseArray(array); // this.parseArray(array) this.doLoadData(null, this.data, 0); }, parseArray: function(array) { var i, l, id = "id", parent = "parentid", children = "children"; if (!id || id == "" || !array) return []; if ($.isArray(array)) { var r = []; var tmpMap = {}; for (i = 0; i < array.length; i++) { tmpMap[array[i][id]] = array[i]; } for (i = 0; i < array.length; i++) { if (tmpMap[array[i][parent]] && array[i][id] != array[i][parent]) { if (!tmpMap[array[i][parent]][children]) tmpMap[array[i][parent]][children] = []; tmpMap[array[i][parent]][children].push(array[i]); } else { r.push(array[i]); } } return r; } else { return [array]; } }, doLoadData: function(parent, array, level) { var node; var cnt = array.length || 1; for (var i = 0; i < cnt; i++) { var line = array[i]; node = new $.fm.Tree.Node({ node_checkable: this.checkable, tree: this, parent: parent, isLast: i == cnt - 1, isRoot: !parent, isLeaf: !line.children, level: level, expended: line.children && (this.autoExpended || line.expended), record: line }); node.isRoot ? this.body.append(node.element) : parent.element.children.append(node.element); if (line.children) { this.doLoadData(node, line.children, level + 1); } } }, addNode: function(parent, data) { data['tree'] = this; data['parent'] = parent; data['isLast'] = true; data['isLeaf'] = (data['isLeaf'] != null) ? data['isLeaf'] : true; if (parent) { data['level'] = parent.level + 1; var lastNode = parent.children ? parent.children[parent.children.length - 1] : null; if (lastNode) { lastNode.setLast(false); } } var node = new $.fm.Tree.Node(data); // node.render(); if (parent) { parent.element.children.append(node.element); parent.expand(); } else { this.element.ul.append(node.element); } this.doNodeSelect(node); }, doNodeSelect: function(node) { if (this.selected) { this.selected.unSelect(); } node.select(); this.selected = node; if (this.onNodeSelect) { this.onNodeSelect(node); } }, onNodeSelectCheckable: function(node) { node.selectCheckable(node); }, getSelectAll: function() { var allcheckbox = $("input[type='checkbox']", this.body); var selectAll = []; for (var i = 0; i < allcheckbox.length; i++) { var checkbox = $(allcheckbox.get(i)); if (checkbox.is(':checked')) { selectAll.push(checkbox.attr('node_name')); } } return selectAll; }, setSelectNodes: function(array) { if (array.length > 0) { for (var i = 0; i < array.length; i++) { for (var aa in array[i]) { this.setSelectNode(array[i][aa]); } } } }, setSelectNode: function(node_name) { var allcheckbox = $("input[node_name='" + node_name + "']", this.body); allcheckbox.prop("checked", true); }, cancelSelectNodes: function() { var allcheckbox = $("input[type='checkbox']", this.body); allcheckbox.prop("checked", false); } }); $.fm.Tree.Node = Control.subClass({ template_node: [ '
  • ', '
    ', '
  • ' ], template_node_box: '
    ', template_node_icon: '
    ', template_node_text: '', template_node_children: '', template_node_checkbox: [ '
    ', '
    ', '', '
    ', '
    ', '
    ' ], init: function(options) { this.selected = false; this.expended = false; this.children = []; this.autoSize = false; this.node_checkable = false; Control.call(this, options); this.createElements(); }, createElements: function() { var me = this; var element = this.element = this.doCreateElements(); if (element.button) { element.button.click(function() { if (me.expended) { me.collapse(); } else { me.expand(); } }); } /*window.oncontextmenu=function(e){ //取消默认的浏览器自带右键 很重要!! e.preventDefault(); }*/ element.text.click(function(e) { if (!me.selected) { me.tree.doNodeSelect(me); } if (me.node_checkable) { me.tree.onNodeSelectCheckable(me); } }); }, doCreateElements: function() { //1. create element var element = $(this.template_node.join("")); var body = $("#node-body", element); if (this.isRoot) { element.addClass("l-onlychild"); } else if (this.isLast) { element.addClass("l-last"); } //2. create box var me = this; var parentlevel = this.parentLevel(me); for (var i = 0; i <= this.level; i++) { var box = $(this.template_node_box); /*if (me.record.code == "test04") { var aza=1; }*/ if (this.isLeaf) { if (i == 0) { if (this.parent) { this.isLast ? box.addClass("l-note-last") : box.addClass("l-note"); } } else if ((i < this.level) && (this.parent && !me.parent.isLast)) { if (!parentlevel || i < this.level - parentlevel) { box.addClass("l-line"); } } else { me = me.parent; if (me.isLast) { parentlevel = this.parentLevel(me); } } body.prepend(box); } else { if (i == 0 && (this.parent && !this.parent.isLast) && this.parent.level > 0) { box.addClass("l-line"); } else if (i == (this.level)) { this.expended ? box.addClass("l-expandable-open") : box.addClass("l-expandable-close"); element.button = box; } else if (i && (i <= this.level) && (me.parent && !me.parent.isLast) && me.parent.level > 0) { if (parentlevel && i == parentlevel - 1) { box.addClass("l-line"); } } else { me = me.parent; if (!me.isLast) { parentlevel = this.parentLevel(me); } } // box.addClass("aa" + i); // box.attr("name", me.record.code); if (i == this.level) { body.append(box); } else { body.prepend(box); } } } //3. create icon element.icon = $(this.template_node_icon); if (this.tree.renderNodeIcon) { this.tree.renderNodeIcon(element.icon); } else if (this.isLeaf) { element.icon.addClass("tree-body-icon-leaf"); } else { this.expended ? element.icon.addClass("tree-body-icon-folder-open") : element.icon.addClass("tree-body-icon-folder"); } body.append(element.icon); //4. create text element.text = $(this.template_node_text); if (this.tree.renderNodeText) { this.tree.renderNodeText(element.text, this.record ? this.record : this); } else { var value = this.name || (this.record ? this.record.name : "empty"); element.text.html(value) } // create checkbox if (this.node_checkable) { var node_checkbox = $(this.template_node_checkbox.join("")); node_checkbox.input = $("input", node_checkbox); node_checkbox.input.attr("node_name", this.record.id); element.text.prepend(node_checkbox); } body.append(element.text); //5. create children if (!this.isLeaf) { var children = element.children = $(this.template_node_children); this.expended ? children.show() : children.hide(); element.append(children); } return element; }, parentLevel: function(me) { var current = me; for (var i = 1; i <= current.level; i++) { if (me.parent && me.parent.isLast) { return me.parent.level; } me = me.parent; } return null; }, selectCheckable: function(me) { //1. 选中/取消所有子文件 var allcheckbox = $("input[type='checkbox']", me.element); if (allcheckbox.prop("checked")) { allcheckbox.prop("checked", false); } else { allcheckbox.prop("checked", true); } //2. 选中/取消所有上级文件 var current = me; me = me.element.parent(); for (var i = 0; i < current.level; i++) { var div = $("div", me.parent()[0]); var allcheckbox_2 = $("input[type='checkbox']", div[0]); allcheckbox_2.prop("checked", this.isSelectParent($("input[type='checkbox']", me))); me = me.parent().parent(); } }, isSelectParent: function(allcheckbox) { for (var i = 0; i < allcheckbox.length; i++) { var checkbox = $(allcheckbox.get(i)); if (checkbox.is(':checked')) { return true; } } return false; }, getSelectAllNode: function() { }, expand: function() { this.expended = true; this.element.button.removeClass("l-expandable-close").addClass("l-expandable-open"); this.element.icon.removeClass("tree-body-icon-folder").addClass("tree-body-icon-folder-open"); this.element.children.css({display: 'block'}); if (this.tree.afterExpand) { this.tree.afterExpand(this); } }, collapse: function() { this.expended = false; this.element.button.removeClass("l-expandable-open").addClass("l-expandable-close"); this.element.icon.removeClass("tree-body-icon-folder-open").addClass("tree-body-icon-folder"); this.element.children.css({display: 'none'}); if (this.tree.afterCollapse) { this.tree.afterCollapse(this); } }, select: function() { this.selected = true; this.element.icon.addClass("node-selected"); this.element.text.addClass("node-selected"); }, unSelect: function() { this.selected = false; this.element.icon.removeClass("node-selected"); this.element.text.removeClass("node-selected"); }, setLast: function(flag) { if (this.isLast == flag) { return; } this.isLast = flag; if (this.element) { if (flag) { this.element.line.removeClass('l-note'); this.element.line.addClass('l-note-last'); } else { this.element.line.removeClass('l-note-last'); this.element.line.addClass('l-note'); } } }, render: function() { } }); })(jQuery);