tree.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. /** layui-v2.5.6 MIT License By https://www.layui.com */ ;
  2. layui.define("form", function(e) {
  3. "use strict";
  4. var i = layui.$,
  5. a = layui.form,
  6. n = layui.layer,
  7. t = "tree",
  8. r = {
  9. config: {},
  10. index: layui[t] ? layui[t].index + 1e4 : 0,
  11. set: function(e) {
  12. var a = this;
  13. return a.config = i.extend({}, a.config, e), a
  14. },
  15. on: function(e, i) {
  16. return layui.onevent.call(this, t, e, i)
  17. }
  18. },
  19. l = function() {
  20. var e = this,
  21. i = e.config,
  22. a = i.id || e.index;
  23. return l.that[a] = e, l.config[a] = i, {
  24. config: i,
  25. reload: function(i) {
  26. e.reload.call(e, i)
  27. },
  28. getChecked: function() {
  29. return e.getChecked.call(e)
  30. },
  31. setChecked: function(i) {
  32. return e.setChecked.call(e, i)
  33. }
  34. }
  35. },
  36. c = "layui-hide",
  37. d = "layui-disabled",
  38. s = "layui-tree-set",
  39. o = "layui-tree-iconClick",
  40. h = "layui-icon-triangle-d",
  41. u = "layui-icon-triangle-r",
  42. p = "layui-tree-entry",
  43. f = "layui-tree-main",
  44. y = "layui-tree-txt",
  45. v = "layui-tree-pack",
  46. C = "layui-tree-spread",
  47. k = "layui-tree-setLineShort",
  48. m = "layui-tree-showLine",
  49. x = "layui-tree-lineExtend",
  50. b = function(e) {
  51. var a = this;
  52. a.index = ++r.index, a.config = i.extend({}, a.config, r.config, e), a.render()
  53. };
  54. b.prototype.config = {
  55. data: [],
  56. showCheckbox: !1,
  57. showLine: !0,
  58. accordion: !1,
  59. onlyIconControl: !1,
  60. isJump: !1,
  61. edit: !1,
  62. text: {
  63. defaultNodeName: "未命名",
  64. none: "无数据"
  65. }
  66. }, b.prototype.reload = function(e) {
  67. var a = this;
  68. layui.each(e, function(e, i) {
  69. i.constructor === Array && delete a.config[e]
  70. }), a.config = i.extend(!0, {}, a.config, e), a.render()
  71. }, b.prototype.render = function() {
  72. var e = this,
  73. a = e.config;
  74. e.checkids = [];
  75. var n = i('<div class="layui-tree' + (a.showCheckbox ? " layui-form" : "") + (a.showLine ? " layui-tree-line" : "") + '" lay-filter="LAY-tree-' + e.index + '"></div>');
  76. e.tree(n);
  77. var t = a.elem = i(a.elem);
  78. if(t[0]) {
  79. if(e.key = a.id || e.index, e.elem = n, e.elemNone = i('<div class="layui-tree-emptyText">' + a.text.none + "</div>"), t.html(e.elem), 0 == e.elem.find(".layui-tree-set").length) return e.elem.append(e.elemNone);
  80. a.showCheckbox && e.renderForm("checkbox"), e.elem.find(".layui-tree-set").each(function() {
  81. var e = i(this);
  82. e.parent(".layui-tree-pack")[0] || e.addClass("layui-tree-setHide"), !e.next()[0] && e.parents(".layui-tree-pack").eq(1).hasClass("layui-tree-lineExtend") && e.addClass(k), e.next()[0] || e.parents(".layui-tree-set").eq(0).next()[0] || e.addClass(k)
  83. }), e.events()
  84. }
  85. }, b.prototype.renderForm = function(e) {
  86. a.render(e, "LAY-tree-" + this.index)
  87. }, b.prototype.tree = function(e, a) {
  88. var n = this,
  89. t = n.config,
  90. r = a || t.data;
  91. layui.each(r, function(a, r) {
  92. var l = r.children && r.children.length > 0,
  93. o = i('<div class="layui-tree-pack" ' + (r.spread ? 'style="display: block;"' : "") + '"></div>'),
  94. h = i(['<div data-id="' + r.id + '" class="layui-tree-set' + (r.spread ? " layui-tree-spread" : "") + (r.checked ? " layui-tree-checkedFirst" : "") + '">', '<div class="layui-tree-entry">', '<div class="layui-tree-main">', function() {
  95. return t.showLine ? l ? '<span class="layui-tree-iconClick layui-tree-icon"><i class="layui-icon ' + (r.spread ? "layui-icon-triangle-r" : "layui-icon-triangle-d") + '"></i></span>' : '<span class="layui-tree-iconClick"><i class="layui-icon layui-icon-file"></i></span>' : '<span class="layui-tree-iconClick"><i class="layui-tree-iconArrow ' + (l ? "" : c) + '"></i></span>'
  96. }(), function() {
  97. return t.showCheckbox ? '<input type="checkbox" name="' + (r.field || "layuiTreeCheck_" + r.id) + '" same="layuiTreeCheck" lay-skin="primary" ' + (r.disabled ? "disabled" : "") + ' value="' + r.id + '">' : ""
  98. }(), function() {
  99. return t.isJump && r.href ? '<a href="' + r.href + '" target="_blank" class="' + y + '">' + (r.title || r.label || t.text.defaultNodeName) + "</a>" : '<span class="' + y + (r.disabled ? " " + d : "") + '">' + (r.title || r.label || t.text.defaultNodeName) + "</span>"
  100. }(), "</div>", function() {
  101. if(!t.edit) return "";
  102. var e = {
  103. add: '<i class="layui-icon layui-icon-add-1" data-type="add"></i>',
  104. update: '<i class="layui-icon layui-icon-edit" data-type="update"></i>',
  105. del: '<i class="layui-icon layui-icon-delete" data-type="del"></i>'
  106. },
  107. i = ['<div class="layui-btn-group layui-tree-btnGroup">'];
  108. return t.edit === !0 && (t.edit = ["update", "del"]), "object" == typeof t.edit ? (layui.each(t.edit, function(a, n) {
  109. i.push(e[n] || "")
  110. }), i.join("") + "</div>") : void 0
  111. }(), "</div></div>"].join(""));
  112. l && (h.append(o), n.tree(o, r.children)), e.append(h), h.prev("." + s)[0] && h.prev().children(".layui-tree-pack").addClass("layui-tree-showLine"), l || h.parent(".layui-tree-pack").addClass("layui-tree-lineExtend"), n.spread(h, r), t.showCheckbox && (r.checked && n.checkids.push(r.id), n.checkClick(h, r)), t.edit && n.operate(h, r)
  113. })
  114. }, b.prototype.spread = function(e, a) {
  115. var n = this,
  116. t = n.config,
  117. r = e.children("." + p),
  118. l = r.children("." + f),
  119. c = r.find("." + o),
  120. k = r.find("." + y),
  121. m = t.onlyIconControl ? c : l,
  122. x = "";
  123. m.on("click", function(i) {
  124. var a = e.children("." + v),
  125. n = m.children(".layui-icon")[0] ? m.children(".layui-icon") : m.find(".layui-tree-icon").children(".layui-icon");
  126. if(a[0]) {
  127. if(e.hasClass(C)) e.removeClass(C), a.slideUp(200), n.removeClass(u).addClass(h);
  128. else if(e.addClass(C), a.slideDown(200), n.addClass(u).removeClass(h), t.accordion) {
  129. var r = e.siblings("." + s);
  130. r.removeClass(C), r.children("." + v).slideUp(200), r.find(".layui-tree-icon").children(".layui-icon").removeClass(u).addClass(h)
  131. }
  132. } else x = "normal"
  133. }), k.on("click", function() {
  134. var n = i(this);
  135. n.hasClass(d) || (x = e.hasClass(C) ? t.onlyIconControl ? "open" : "close" : t.onlyIconControl ? "close" : "open", t.click && t.click({
  136. elem: e,
  137. state: x,
  138. data: a
  139. }))
  140. })
  141. }, b.prototype.setCheckbox = function(e, i, a) {
  142. var n = this,
  143. t = (n.config, a.prop("checked"));
  144. if(!a.prop("disabled")) {
  145. if("object" == typeof i.children || e.find("." + v)[0]) {
  146. var r = e.find("." + v).find('input[same="layuiTreeCheck"]');
  147. r.each(function() {
  148. this.disabled || (this.checked = t)
  149. })
  150. }
  151. var l = function(e) {
  152. if(e.parents("." + s)[0]) {
  153. var i, a = e.parent("." + v),
  154. n = a.parent(),
  155. r = a.prev().find('input[same="layuiTreeCheck"]');
  156. t ? r.prop("checked", t) : (a.find('input[same="layuiTreeCheck"]').each(function() {
  157. this.checked && (i = !0)
  158. }), i || r.prop("checked", !1)), l(n)
  159. }
  160. };
  161. l(e), n.renderForm("checkbox")
  162. }
  163. }, b.prototype.checkClick = function(e, a) {
  164. var n = this,
  165. t = n.config,
  166. r = e.children("." + p),
  167. l = r.children("." + f);
  168. l.on("click", 'input[same="layuiTreeCheck"]+', function(r) {
  169. layui.stope(r);
  170. var l = i(this).prev(),
  171. c = l.prop("checked");
  172. l.prop("disabled") || (n.setCheckbox(e, a, l), t.oncheck && t.oncheck({
  173. elem: e,
  174. checked: c,
  175. data: a
  176. }))
  177. })
  178. }, b.prototype.operate = function(e, a) {
  179. var t = this,
  180. r = t.config,
  181. l = e.children("." + p),
  182. d = l.children("." + f);
  183. l.children(".layui-tree-btnGroup").on("click", ".layui-icon", function(l) {
  184. layui.stope(l);
  185. var f = i(this).data("type"),
  186. b = e.children("." + v),
  187. g = {
  188. data: a,
  189. type: f,
  190. elem: e
  191. };
  192. if("add" == f) {
  193. b[0] || (r.showLine ? (d.find("." + o).addClass("layui-tree-icon"), d.find("." + o).children(".layui-icon").addClass(h).removeClass("layui-icon-file")) : d.find(".layui-tree-iconArrow").removeClass(c), e.append('<div class="layui-tree-pack"></div>'));
  194. var w = r.operate && r.operate(g),
  195. N = {};
  196. if(N.title = r.text.defaultNodeName, N.id = w, t.tree(e.children("." + v), [N]), r.showLine)
  197. if(b[0]) b.hasClass(x) || b.addClass(x), e.find("." + v).each(function() {
  198. i(this).children("." + s).last().addClass(k)
  199. }), b.children("." + s).last().prev().hasClass(k) ? b.children("." + s).last().prev().removeClass(k) : b.children("." + s).last().removeClass(k), !e.parent("." + v)[0] && e.next()[0] && b.children("." + s).last().removeClass(k);
  200. else {
  201. var T = e.siblings("." + s),
  202. L = 1,
  203. A = e.parent("." + v);
  204. layui.each(T, function(e, a) {
  205. i(a).children("." + v)[0] || (L = 0)
  206. }), 1 == L ? (T.children("." + v).addClass(m), T.children("." + v).children("." + s).removeClass(k), e.children("." + v).addClass(m), A.removeClass(x), A.children("." + s).last().children("." + v).children("." + s).last().addClass(k)) : e.children("." + v).children("." + s).addClass(k)
  207. }
  208. if(!r.showCheckbox) return;
  209. if(d.find('input[same="layuiTreeCheck"]')[0].checked) {
  210. var I = e.children("." + v).children("." + s).last();
  211. I.find('input[same="layuiTreeCheck"]')[0].checked = !0
  212. }
  213. t.renderForm("checkbox")
  214. } else if("update" == f) {
  215. var F = d.children("." + y).html();
  216. d.children("." + y).html(""), d.append('<input type="text" class="layui-tree-editInput">'), d.children(".layui-tree-editInput").val(F).focus();
  217. var j = function(e) {
  218. var i = e.val().trim();
  219. i = i ? i : r.text.defaultNodeName, e.remove(), d.children("." + y).html(i), g.data.title = i, r.operate && r.operate(g)
  220. };
  221. d.children(".layui-tree-editInput").blur(function() {
  222. j(i(this))
  223. }), d.children(".layui-tree-editInput").on("keydown", function(e) {
  224. 13 === e.keyCode && (e.preventDefault(), j(i(this)))
  225. })
  226. } else n.confirm('确认删除该节点 "<span style="color: #999;">' + (a.title || "") + '</span>" 吗?', function(a) {
  227. if(r.operate && r.operate(g), g.status = "remove", n.close(a), !e.prev("." + s)[0] && !e.next("." + s)[0] && !e.parent("." + v)[0]) return e.remove(), void t.elem.append(t.elemNone);
  228. if(e.siblings("." + s).children("." + p)[0]) {
  229. if(r.showCheckbox) {
  230. var l = function(e) {
  231. if(e.parents("." + s)[0]) {
  232. var a = e.siblings("." + s).children("." + p),
  233. n = e.parent("." + v).prev(),
  234. r = n.find('input[same="layuiTreeCheck"]')[0],
  235. c = 1,
  236. d = 0;
  237. 0 == r.checked && (a.each(function(e, a) {
  238. var n = i(a).find('input[same="layuiTreeCheck"]')[0];
  239. 0 != n.checked || n.disabled || (c = 0), n.disabled || (d = 1)
  240. }), 1 == c && 1 == d && (r.checked = !0, t.renderForm("checkbox"), l(n.parent("." + s))))
  241. }
  242. };
  243. l(e)
  244. }
  245. if(r.showLine) {
  246. var d = e.siblings("." + s),
  247. h = 1,
  248. f = e.parent("." + v);
  249. layui.each(d, function(e, a) {
  250. i(a).children("." + v)[0] || (h = 0)
  251. }), 1 == h ? (b[0] || (f.removeClass(x), d.children("." + v).addClass(m), d.children("." + v).children("." + s).removeClass(k)), e.next()[0] ? f.children("." + s).last().children("." + v).children("." + s).last().addClass(k) : e.prev().children("." + v).children("." + s).last().addClass(k), e.next()[0] || e.parents("." + s)[1] || e.parents("." + s).eq(0).next()[0] || e.prev("." + s).addClass(k)) : !e.next()[0] && e.hasClass(k) && e.prev().addClass(k)
  252. }
  253. } else {
  254. var y = e.parent("." + v).prev();
  255. if(r.showLine) {
  256. y.find("." + o).removeClass("layui-tree-icon"), y.find("." + o).children(".layui-icon").removeClass(u).addClass("layui-icon-file");
  257. var w = y.parents("." + v).eq(0);
  258. w.addClass(x), w.children("." + s).each(function() {
  259. i(this).children("." + v).children("." + s).last().addClass(k)
  260. })
  261. } else y.find(".layui-tree-iconArrow").addClass(c);
  262. e.parents("." + s).eq(0).removeClass(C), e.parent("." + v).remove()
  263. }
  264. e.remove()
  265. })
  266. })
  267. }, b.prototype.events = function() {
  268. var e = this,
  269. a = e.config;
  270. e.elem.find(".layui-tree-checkedFirst");
  271. e.setChecked(e.checkids), e.elem.find(".layui-tree-search").on("keyup", function() {
  272. var n = i(this),
  273. t = n.val(),
  274. r = n.nextAll(),
  275. l = [];
  276. r.find("." + y).each(function() {
  277. var e = i(this).parents("." + p);
  278. if(i(this).html().indexOf(t) != -1) {
  279. l.push(i(this).parent());
  280. var a = function(e) {
  281. e.addClass("layui-tree-searchShow"), e.parent("." + v)[0] && a(e.parent("." + v).parent("." + s))
  282. };
  283. a(e.parent("." + s))
  284. }
  285. }), r.find("." + p).each(function() {
  286. var e = i(this).parent("." + s);
  287. e.hasClass("layui-tree-searchShow") || e.addClass(c)
  288. }), 0 == r.find(".layui-tree-searchShow").length && e.elem.append(e.elemNone), a.onsearch && a.onsearch({
  289. elem: l
  290. })
  291. }), e.elem.find(".layui-tree-search").on("keydown", function() {
  292. i(this).nextAll().find("." + p).each(function() {
  293. var e = i(this).parent("." + s);
  294. e.removeClass("layui-tree-searchShow " + c)
  295. }), i(".layui-tree-emptyText")[0] && i(".layui-tree-emptyText").remove()
  296. })
  297. }, b.prototype.getChecked = function() {
  298. var e = this,
  299. a = e.config,
  300. n = [],
  301. t = [];
  302. e.elem.find(".layui-form-checked").each(function() {
  303. n.push(i(this).prev()[0].value)
  304. });
  305. var r = function(e, a) {
  306. layui.each(e, function(e, t) {
  307. layui.each(n, function(e, n) {
  308. if(t.id == n) {
  309. var l = i.extend({}, t);
  310. return delete l.children, a.push(l), t.children && (l.children = [], r(t.children, l.children)), !0
  311. }
  312. })
  313. })
  314. };
  315. return r(i.extend({}, a.data), t), t
  316. }, b.prototype.setChecked = function(e) {
  317. var a = this;
  318. a.config;
  319. a.elem.find("." + s).each(function(a, n) {
  320. var t = i(this).data("id"),
  321. r = i(n).children("." + p).find('input[same="layuiTreeCheck"]'),
  322. l = r.next();
  323. if("number" == typeof e) {
  324. if(t == e) return r[0].checked || l.click(), !1
  325. } else "object" == typeof e && layui.each(e, function(e, i) {
  326. if(i == t && !r[0].checked) return l.click(), !0
  327. })
  328. })
  329. }, l.that = {}, l.config = {}, r.reload = function(e, i) {
  330. var a = l.that[e];
  331. return a.reload(i), l.call(a)
  332. }, r.getChecked = function(e) {
  333. var i = l.that[e];
  334. return i.getChecked()
  335. }, r.setChecked = function(e, i) {
  336. var a = l.that[e];
  337. return a.setChecked(i)
  338. }, r.render = function(e) {
  339. var i = new b(e);
  340. return l.call(i)
  341. }, e(t, r)
  342. });