; layui.define("jquery", function(e) { "use strict"; var o = layui.jquery, a = layui.hint(), f = layui.form, r = "layui-tree-enter", i = function(e) { this.options = e }, t = { arrow: ["", ""], checkbox: ["", ""], radio: ["", ""], branch: ["folder-close", "folder"], leaf: "leaf" }, tt = {}, TreeTable = function() { this.mapping = {}; }, TreeNode = function(item) { this.item = item; this.nodes = []; }; i.prototype.expand = function(treeNode, isOpened, e) { var o = this; var subTreeNodes = treeNode.nodes; if (subTreeNodes && subTreeNodes.length > 0) { for (var ind = 0; ind < subTreeNodes.length; ind++) { var subTreeNode = subTreeNodes[ind]; var subTrNode = document.getElementById(subTreeNode.id); if (subTrNode) { !isOpened ? (e.data("spread", null), subTrNode.setAttribute('class', 'layui-hide layui-anim layui-anim-fadein')) : (e.data("spread", !0), subTrNode.setAttribute('class', 'layui-anim layui-anim-fadein')) } if (isOpened && !subTreeNode.isOpened) { continue; } o.expand(subTreeNode, isOpened, e); } } }, i.prototype.traverseModel = function(treeTable, parentNode, item, childrenAttrs) { var o = this; if (item) { var treeNode = new TreeNode(item); if (parentNode) { treeNode.parentId = parentNode.id; treeNode.id = item.id; treeNode.level = parentNode.level + 1; parentNode.nodes[parentNode.nodes.length] = treeNode; treeNode.parent = parentNode; } else { treeNode.id = item.id; treeNode.level = 0; } treeNode.isOpened = false; treeTable.mapping[treeNode.id] = treeNode; var children = item[childrenAttrs]; if (children && children.constructor == Array) { for (var i = 0; i < children.length; i++) { o.traverseModel(treeTable, treeNode, children[i], childrenAttrs); } } } }, i.prototype.initGird = function(e) { var ob = this, i = ob.options; i = o.extend({}, i, {checkbox: i.checkbox?i.checkbox:false , spreadable :i.spreadable?i.spreadable:false}); var tableHeaderStr = ''; tableHeaderStr += (i.checkbox == false ? '' : ''); for (var ind = 0; ind < i.layout.length; ind++) { var headerClass = i.layout[ind].headerClass ? ' class="' + i.layout[ind].headerClass + '"' : ''; tableHeaderStr += '' + i.layout[ind].name + ''; } tableHeaderStr += ''; tableHeaderStr = o(tableHeaderStr); var treeTable = new TreeTable(); var root = { id: 'root', children: i.nodes } ob.traverseModel(treeTable, null, root, ['children']); tt[e.selector] = treeTable; e.addClass("layui-tree layui-treetable"), i.skin && e.addClass("layui-tree-skin-" + i.skin), ob.treeGird(e), ob.checkboxEvent(e, i), e.wrapInner(''), e.wrapInner('
'), ob.on(e); return e; }, i.prototype.treeGird = function(e, a) { var r = this, i = r.options, n = a || i.nodes, nt = tt[e.selector]; layui.each(n, function(a, n) { if (n.children) { layui.each(n.children, function(index, item) { item.pid = n.id; }); } var treeNode = nt.mapping[n.id]; var indent = ""; if (treeNode.level > 1) { for (var ind = 1; ind < treeNode.level; ind++) { indent += ''; } } var p; if (i.spreadable) { n.spread = true, p = false, treeNode.isOpened = true; } else { p = treeNode.parentId == 'root' ? null : treeNode.parentId; } var l = n.children && n.children.length > 0, str = o(['', function() { if (i.checkbox){ return ''; } }(), function() { var ret = "" for (var ind = 0; ind < i.layout.length; ind++) { if (i.layout[ind].treeNodes) { ret += '
  • ' + (indent + (l ? '' + (n.spread ? t.arrow[1] : t.arrow[0]) + "" : "")) + '" + ('' + "") + ("" + (n.name || "未命名") + "
  • "); } else if (i.layout[ind].render) { ret += '' + i.layout[ind].render(JSON.stringify(n)) + '' } else { ret += '' + n[i.layout[ind].field] + ''; } } return ret; }(), ""].join("")); e.append(str), l && (r.treeGird(e, n.children)), r.spreadGird(str, n, e.selector), i.drag && r.drag(str, n); r.changed(str, n) }) },i.prototype.checkboxEvent = function (e, options){ var nt = tt[e.selector]; f.on('checkbox(allChoose)', function(data){ var child = o(data.elem).parents('table').find('tbody input[type="checkbox"]'); child.each(function(index, item){ item.checked = data.elem.checked; }); f.render('checkbox'); }); f.on('checkbox(*)',function(data){ var node = nt.mapping[data.value].item; if (options.callback && options.callback.beforeCheck) { if (options.callback.beforeCheck(node)){ // 允许勾选或取消勾选 data.elem.checked ? data.othis.addClass('layui-form-checked') : data.othis.removeClass('layui-form-checked'); }else{ // 不允许勾选或取消勾选 data.elem.checked = !data.elem.checked; !data.elem.checked ? data.othis.removeClass('layui-form-checked') :data.othis.addClass('layui-form-checked'); return true; } } node.checked = data.elem.checked; var sib = o(data.elem).parents('table').find('tbody input[type="checkbox"]:checked').length; var total = o(data.elem).parents('table').find('tbody input[type="checkbox"]').length; if(sib == total){ o(data.elem).parents('table').find('thead input[type="checkbox"]').prop("checked",true); f.render(); }else{ o(data.elem).parents('table').find('thead input[type="checkbox"]').prop("checked",false); f.render(); } if (options.callback && options.callback.onCheck) { return options.callback.onCheck(node); } }); },i.prototype.changed = function(e, o) { var r = this; if (o.pid == undefined || o.pid == null) { e.children("input").on("change", function() { var childUl = e.children("ul"), checked = this.checked; childUl.find("input").prop("checked", checked); }) } else { e.children("input").on("change", function() { var that = this; if (!this.checked) { if (o.children && o.children.length > 0) { var childUl = e.children("ul"), checked = this.checked; childUl.find("input").prop("checked", checked); } r.cancelParentsCheckboxCheck(that); } else { r.parentsChecked(this, this.checked); if (o.children && o.children.length > 0) { var childUl = e.children("ul"), checked = this.checked; childUl.find("input").prop("checked", checked); } } }); } }, i.prototype.cancelParentsCheckboxCheck = function(ele) { if (!ele) { return; } var r = this, siblingInputs = r.siblingInputs(ele), parentId = ele.getAttribute("data-parent-id"), parentInput = null, bool = true, childrendInputs = null, hasOneChildrenInputCheck = false; if (parentId != 'undefined') { parentInput = document.getElementById(parentId); childrendInputs = r.currentChildrenInputs(parentInput); } for (var i = 0, len = siblingInputs.length; i < len; i++) { if (siblingInputs[i].checked) { bool = false; break; } } if (!childrendInputs || childrendInputs.length == 0) { hasOneChildrenInputCheck = false; } else { for (var j = 0, len2 = childrendInputs.length; j < len2; j++) { if (childrendInputs[j].getAttribute("data-parent-id") != "undefined") { if (childrendInputs[j].checked) { hasOneChildrenInputCheck = true; break; } } } } if (bool && !hasOneChildrenInputCheck) { r.inputChecked(parentInput, false); } this.cancelParentsCheckboxCheck(parentInput); }, i.prototype.siblingInputs = function(ele) { var that = this; if (ele) { var parent = ele.parentElement, parents = parent.parentElement, childrens = parents.children, siblingInputs = []; } else { return null; } for (var i = 0, len = childrens.length; i < len; i++) { if (childrens[i] != parent) { if (childrens[i].children[0].nodeName == "INPUT") { siblingInputs.push(childrens[i].children[0]); } if (childrens[i].children[1].nodeName == "INPUT") { siblingInputs.push(childrens[i].children[1]); } } } parent = null; parents = null; childrens = null; return siblingInputs; }, i.prototype.currentChildrenInputs = function(ele) { var parent = ele.parentElement, childrenInputs = []; if (parent.getElementsByTagName("ul").length > 0) { var uls = parent.getElementsByTagName("ul"); for (var i = 0, len = uls.length; i < len; i++) { var inputs = uls[i].getElementsByTagName("input"); for (var j = 0, len2 = inputs.length; j < len2; j++) { childrenInputs.push(inputs[j]); } } } return childrenInputs; }, i.prototype.inputChecked = function(ele, checked) { ele.checked = checked; }, i.prototype.parentsChecked = function(e, checked) { var r = this, i = r.options, selector = i.elem, currentInput = e; if (currentInput && (currentInput.nodeName == "INPUT")) { var parentId = currentInput.getAttribute("data-parent-id"), parentInput = null; setTimeout(function() { r.check(currentInput, checked); if (parentId) { r.parentsChecked(document.getElementById(parentId), checked); } }, 50); } }, i.prototype.findParents = function(ele, selector) { var parent = ele.parentElement, that = this; if (selector.substr(0, 1) == "#") { if (parent) { if (parent.id != selector.substr(1)) { that.findParents(parent, selector); } else { return parent; } } } else if (selector.substr(0, 1) == ".") { if (parent) { var classnameArr = parent.className.split(" "), len = classnameArr.length, selectt = selector.substr(1), hasSelector = false; if (len > 0) { for (var i = 0; i < len; i++) { if (classnameArr[i] == selectt) { hasSelector = true; break; } } } if (!hasSelector) { that.findParents(parent, selector); } else if (hasSelector) { return parent; } } } }, i.prototype.num = 1, i.prototype.uuid = function() { var that = this, randomStr = ['l', 'a', 'y', 'e', 'r', 'n', 'i'], randomNum = Math.floor(Math.random() * 6); return function() { var str = ""; for (var i = 0; i <= randomNum; i++) { str += randomStr[Math.floor(Math.random() * 6)]; } return "layer_" + new Date().getTime() + "_" + (that.num++) + "_" + (++that.num) + "_" + str; }(); }, i.prototype.check = function(input, bool) { if (bool) { input.checked = true; } else { input.checked = false; } }, i.prototype.click = function(e, o) { var a = this, r = a.options; e.children("a").on("click", function(e) { layui.stope(e), r.click(o) }) }, i.prototype.spreadGird = function(e, o, el) { var a = this, r = (a.options, e.find(".layui-tree-spread")), nodeId = e[0].id, ri = e.find(".layui-tree-branch"), nt = tt[el], l = function() { var treeNode = nt.mapping[nodeId]; var isOpened = treeNode.isOpened; if (isOpened){ if (a.options.callback && a.options.callback.beforeCollapse && !a.options.callback.beforeCollapse(treeNode)) return true; }else{ if (a.options.callback && a.options.callback.beforeExpand && !a.options.callback.beforeExpand(treeNode)) return true; } a.expand(treeNode, !isOpened, e); isOpened ? (e.data("spread", null), r.html(t.arrow[0]), ri.removeClass(t.branch[1]), ri.addClass(t.branch[0])) : (e.data("spread", !0), r.html(t.arrow[1]), ri.removeClass(t.branch[0]), ri.addClass(t.branch[1])) treeNode.isOpened = !isOpened; if (isOpened){ if (a.options.callback && a.options.callback.onCollapse && !a.options.callback.onCollapse(treeNode)) return true; }else{ if (a.options.callback && a.options.callback.onExpand && !a.options.callback.onExpand(treeNode)) return true; } }; (r.on("click", l), ri.parent().on("dblclick", l)) }, i.prototype.on = function(e) { var a = this, i = a.options, t = "layui-tree-drag"; e.find("i").on("selectstart", function(e) { return !1 }), i.drag && o(document).on("mousemove", function(e) { var r = a.move; if (r.from) { var i = (r.to, o('
    ')); e.preventDefault(), o("." + t)[0] || o("body").append(i); var n = o("." + t)[0] ? o("." + t) : i; n.addClass("layui-show").html(r.from.elem.children("a").html()), n.css({ left: e.pageX + 10, top: e.pageY + 10 }) } }).on("mouseup", function() { var e = a.move; e.from && (e.from.elem.children("a").removeClass(r), e.to && e.to.elem.children("a").removeClass(r), a.move = {}, o("." + t).remove()) }) }, i.prototype.move = {}, i.prototype.drag = function(e, a) { var i = this, t = (i.options, e.children("a")), n = function() { var t = o(this), n = i.move; n.from && (n.to = { item: a, elem: e }, t.addClass(r)) }; t.on("mousedown", function() { var o = i.move; o.from = { item: a, elem: e } }), t.on("mouseenter", n).on("mousemove", n).on("mouseleave", function() { var e = o(this), a = i.move; a.from && (delete a.to, e.removeClass(r)) }) }, i.prototype.getLastChildNode = function(node){ var a = this, lastChildNode if (node.children){ lastChildNode = this.getLastChildNode(node.children[node.children.length-1]); }else{ lastChildNode = node; } return lastChildNode; }, i.prototype.addNodes = function(v, parentNode, newNodes, isLastChild){ var a = this, i = a.options, nt = tt[i.elem]; layui.each(newNodes, function(an, n) { if (n.children) { layui.each(n.children, function (index, item) { item.pid = n.id; }); } var treeNode = nt.mapping[n.id]; var indent = ""; if (treeNode.level > 1) { for (var ind = 1; ind < treeNode.level; ind++) { indent += ''; } } var p; if (i.spreadable) { n.spread = true, p = false, treeNode.isOpened = true; } else { p = treeNode.parentId == 'root' ? null : treeNode.parentId; } if (isLastChild) { if (parentNode) p = nt.mapping[parentNode.id].isOpened ? false : true; else p = false; } var l = n.children && n.children.length > 0, str = o(['', function () { if (i.checkbox) { return ''; } }(), function () { var ret = "" for (var ind = 0; ind < i.layout.length; ind++) { if (i.layout[ind].treeNodes) { ret += '' + '
  • ' + (indent + (l ? '' + (n.spread ? t.arrow[1] : t.arrow[0]) + "" : "")) + '" + ('' + "") + ("" + (n.name || "未命名") + "
  • "); } else if (i.layout[ind].render) { ret += '' + i.layout[ind].render(JSON.stringify(n)) + '' } else { ret += '' + n[i.layout[ind].field] + ''; } } return ret; }(), ""].join("")); if (parentNode) { var lastChildNode; if (isLastChild) { lastChildNode = a.getLastChildNode(parentNode); }else { lastChildNode = parentNode; } v.find("tbody tr[id="+lastChildNode.id+"]").after(str); }else{ v.find("tbody").append(str); } l && (a.addNodes(v, n, n.children, false)), a.spreadGird(str, n, v.selector), i.drag && a.drag(str, n); a.changed(str, n) }) }, i.prototype.removeNodes = function(v, treeNode){ var a = this, i = a.options, nt = tt[i.elem]; delete nt.mapping[treeNode.id]; var trNode = v.find("tbody tr[id="+treeNode.id+"]"); trNode.remove(); for (var i = 0; i < treeNode.nodes.length; i++){ a.removeNodes(v, nt.mapping[treeNode.nodes[i].id]) } }, i.prototype.expandNode = function (nt, node, v, a, isOpened, sonSign){ var treeNode = nt.mapping[node.id]; var e = v.find("tbody tr[id=" + treeNode.id + "]"); var r = (a.options, e.find(".layui-tree-spread")); if (isOpened){ if (!treeNode.isOpened) o(r).trigger("click"); }else{ if (treeNode.isOpened) o(r).trigger("click"); } if (sonSign) { for (var key in nt.mapping) { var childNode = nt.mapping[key]; if (childNode.parentId == node.id) { if (isOpened){ if (!childNode.isOpened) o(v.find("tbody tr[id=" + childNode.id + "]").find(".layui-tree-spread")).trigger("click"); }else{ if (treeNode.isOpened) o(v.find("tbody tr[id=" + childNode.id + "]").find(".layui-tree-spread")).trigger("click"); } } } } }, e("treetable", function(e) { var r = new i(e = e || {}), telem = o(e.elem); var v = r.initGird(telem); layui.addcss("modules/treetable/treetable.css"); var funs = { getNode : function(idValue){ if (!idValue) return; var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; for (var key in nt.mapping) { var treeNode = nt.mapping[key]; if (treeNode.id == idValue) { return treeNode.item; } } }, getNodeByParam : function(key, value, parentNode){ if (key == null || value == null) return; var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; var arr = new Array(); for (var k in nt.mapping) { var treeNode = nt.mapping[k]; if (treeNode.item[key] == value) { var node = parentNode == null ? arr.push(treeNode.item):(parentNode.id == treeNode.parent.id ? arr.push(treeNode.item) : null); return node; } } return arr; }, getNodesByParam : function(key, value, parentNode){ if (key == null || value == null) return; var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; var arr = new Array(); for (var k in nt.mapping) { var treeNode = nt.mapping[k]; if (treeNode.item[key] == value) { parentNode == null ? arr.push(treeNode.item):(parentNode.id == treeNode.parent.id ? arr.push(treeNode.item) : null); } } return arr; }, getNodes : function(){ var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; for (var key in nt.mapping) { var treeNode = nt.mapping[key]; if (treeNode && treeNode.item && treeNode.id != 'root'){ arr.push(treeNode.item); } } return arr; },addNode : function(parentNode, newNodes){ var i = r.options, n = a || i.nodes, nt = tt[v.selector]; var arr = []; if (!Array.isArray(newNodes)){ arr.push(newNodes) }else{ arr = newNodes; } var treeTable = new TreeTable(); r.traverseModel(treeTable, parentNode? nt.mapping[parentNode.id]:nt.mapping['root'], newNodes, ['children']); for (var tttt in treeTable.mapping){ if ('root' == tttt) continue; nt.mapping[tttt] = treeTable.mapping[tttt]; } r.addNodes(v, parentNode, arr, true); f.render(); },editNodeName : function(node){ var i = r.options, n = a || i.nodes, nt = tt[v.selector]; var treeNode = nt.mapping[node.id]; treeNode.item = node; var trNode = v.find("tbody tr[id="+node.id+"] td li a cite"); trNode.text(node.name); f.render(); },removeNode : function(node){ var i = r.options, n = a || i.nodes, nt = tt[v.selector]; var treeNode = nt.mapping[node.id]; r.removeNodes(v, treeNode); f.render(); },getSelected : function() { var arr = new Array(); var nt = tt[v.selector] o(e.elem).find("input[type=checkbox]:checked").each(function(index, v) { var treeNode = nt.mapping[v.value]; if (treeNode && treeNode.item && treeNode.id != 'root'){ arr.push(treeNode.item); } }); return arr; },getUnSelected : function() { var arr = new Array(); var nt = tt[v.selector] o(e.elem).find("input[type=checkbox]:not(:checked)").each(function(index, v) { var treeNode = nt.mapping[v.value]; if (treeNode && treeNode.item && treeNode.id != 'root'){ arr.push(treeNode.item); } }); return arr; },expand : function() { var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; for (var key in nt.mapping) { var treeNode = nt.mapping[key]; if (treeNode.id == 'root') continue; var isOpened = treeNode.isOpened; if (isOpened) continue; var e = o('#' + treeNode.id), r = (a.options, e.find(".layui-tree-spread")), ri = e.find(".layui-tree-branch"); oi.expand(treeNode, !isOpened, e); isOpened ? (e.data("spread", null), r.html(t.arrow[0]), ri.removeClass(t.branch[1]), ri.addClass(t.branch[0])) : (e.data("spread", !0), r.html(t.arrow[1]), ri.removeClass(t.branch[0]), ri.addClass(t.branch[1])) treeNode.isOpened = !isOpened; } },collapse : function() { var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; for (var key in nt.mapping) { var treeNode = nt.mapping[key]; if (treeNode.id == 'root') continue; var isOpened = treeNode.isOpened; if (!isOpened) continue; var e = o('#' + treeNode.id), r = (a.options, e.find(".layui-tree-spread")), ri = e.find(".layui-tree-branch"); oi.expand(treeNode, !isOpened, e); isOpened ? (e.data("spread", null), r.html(t.arrow[0]), ri.removeClass(t.branch[1]), ri.addClass(t.branch[0])) : (e.data("spread", !0), r.html(t.arrow[1]), ri.removeClass(t.branch[0]), ri.addClass(t.branch[1])) treeNode.isOpened = !isOpened; } }, destory : function (){ var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; var treeO = o(v.selector); if (treeO) treeO.empty(), delete tt[v.selector]; }, expandNode : function(node, sonSign){ var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; r.expandNode(nt, node, v, a, true, sonSign); }, collapseNode : function(node, sonSign){ var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; r.expandNode(nt, node, v, a, false, sonSign); }, checkNode : function (node, check){ var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; var ck = v.find("tbody tr[id=" + node.id + "] "); ck.find('input[type=checkbox]').attr("checked", check); ck.find('input[type=checkbox]')[0].checked = check; check ? ck.find('.layui-form-checkbox').addClass('layui-form-checked') : ck.find('.layui-form-checkbox').removeClass('layui-form-checked') }, setChkDisabled : function(node, disabled){ var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; var ck = v.find("tbody tr[id=" + node.id + "] "); ck.find('input[type=checkbox]').attr("disabled",disabled); disabled ? ck.find('.layui-form-checkbox').addClass('layui-checkbox-disbaled layui-disabled') : ck.find('.layui-form-checkbox').removeClass('layui-checkbox-disbaled layui-disabled'); }, checkAllNodes : function(check){ var a = this, oi = new i(v = v || {}), nt = tt[v.selector]; for (var key in nt.mapping) { var treeNode = nt.mapping[key]; if (treeNode && treeNode.item && treeNode.id != 'root'){ var ck = v.find("tbody tr[id=" + treeNode.id + "] "); ck.find('input[type=checkbox]').attr("checked", check); ck.find('input[type=checkbox]')[0].checked = check; check ? ck.find('.layui-form-checkbox').addClass('layui-form-checked') : ck.find('.layui-form-checkbox').removeClass('layui-form-checked') } } var all = v.find('thead input[type="checkbox"]'); all.attr("checked", check); all[0].checked = check; check ? all.parents('tr').find('.layui-form-checkbox').addClass('layui-form-checked') : all.parents('tr').find('.layui-form-checkbox').removeClass('layui-form-checked') } } for (var key in funs){ v[key] = funs[key]; } if (e.callback) { v.onCheck = e.callback.onCheck; } return telem[0] ? v : a.error("layui.tree 没有找到" + e.elem + "元素"); }) });