You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

618 lines
24 KiB

  1. /*
  2. * 版 本 Learun-ADMS-Ultimate V7.0.0 数字化智慧校园(http://www.learun.cn)
  3. * Copyright (c) 2013-2018 北京泉江科技有限公司
  4. * 创建人:陈彬彬
  5. * 日 期:2017.03.22
  6. * 描 述:learunTree
  7. */
  8. (function ($, learun) {
  9. "use strict";
  10. $.lrtree = {
  11. getItem: function (path, dfop) {
  12. var ap = path.split(".");
  13. var t = dfop.data;
  14. for (var i = 0; i < ap.length; i++) {
  15. if (i == 0) {
  16. t = t[ap[i]];
  17. }
  18. else {
  19. t = t.ChildNodes[ap[i]];
  20. }
  21. }
  22. return t;
  23. },
  24. render: function ($self) {
  25. var dfop = $self[0]._lrtree.dfop;
  26. // 渲染成树
  27. var $treeRoot = $('<ul class="lr-tree-root" ></ul>');
  28. var _len = dfop.data.length;
  29. for (var i = 0; i < _len; i++) {
  30. var $node = $.lrtree.renderNode(dfop.data[i], 0, i, dfop);
  31. $treeRoot.append($node);
  32. }
  33. $self.append($treeRoot);
  34. $self.lrscroll();
  35. dfop = null;
  36. },
  37. renderNode: function (node, deep, path, dfop) {
  38. if (node.shide) {
  39. return "";
  40. }
  41. node._deep = deep;
  42. node._path = path;
  43. // 渲染成单个节点
  44. var nid = node.id.replace(/[^\w]/gi, "_");
  45. var title = node.title || node.text;
  46. var $node = $('<li class="lr-tree-node"></li>');
  47. var $nodeDiv = $('<div id="' + dfop.id + '_' + nid + '" tpath="' + path + '" title="' + title + '" dataId="' + dfop.id + '" class="lr-tree-node-el" ></div>');
  48. if (node.hasChildren) {
  49. var c = (node.isexpand || dfop.isAllExpand) ? 'lr-tree-node-expanded' : 'lr-tree-node-collapsed';
  50. $nodeDiv.addClass(c);
  51. }
  52. else {
  53. $nodeDiv.addClass('lr-tree-node-leaf');
  54. }
  55. // span indent
  56. var $span = $('<span class="lr-tree-node-indent"></span>');
  57. if (deep == 1) {
  58. $span.append('<img class="lr-tree-icon" src="' + dfop.cbiconpath + 's.gif"/>');
  59. }
  60. else if (deep > 1) {
  61. $span.append('<img class="lr-tree-icon" src="' + dfop.cbiconpath + 's.gif"/>');
  62. for (var j = 1; j < deep; j++) {
  63. $span.append('<img class="lr-tree-icon" src="' + dfop.cbiconpath + 's.gif"/>');
  64. }
  65. }
  66. $nodeDiv.append($span);
  67. // img
  68. var $img = $('<img class="lr-tree-ec-icon" src="' + dfop.cbiconpath + 's.gif"/>');
  69. $nodeDiv.append($img);
  70. // checkbox
  71. if (node.showcheck) {
  72. if (node.checkstate == null || node.checkstate == undefined) {
  73. node.checkstate = 0;
  74. }
  75. var $checkBox = $('<img id="' + dfop.id + '_' + nid + '_cb" + class="lr-tree-node-cb" src="' + dfop.cbiconpath + dfop.icons[node.checkstate] + '" />');
  76. $nodeDiv.append($checkBox);
  77. }
  78. // 显示的小图标
  79. if (node.icon != -1) {
  80. if (!!node.icon) {
  81. $nodeDiv.append('<i class="' + node.icon + '"></i>&nbsp;');
  82. } else if (node.hasChildren) {
  83. if (node.isexpand || dfop.isAllExpand) {
  84. $nodeDiv.append('<i class="fa fa-folder-open" style="width:15px">&nbsp;</i>');
  85. }
  86. else {
  87. $nodeDiv.append('<i class="fa fa-folder" style="width:15px">&nbsp;</i>');
  88. }
  89. }
  90. else {
  91. $nodeDiv.append('<i class="fa fa-file-o"></i>&nbsp;');
  92. }
  93. }
  94. // a
  95. var ahtml = '<a class="lr-tree-node-anchor" href="javascript:void(0);">';
  96. ahtml += '<span data-value="' + node.id + '" class="lr-tree-node-text" >' + node.text + '</span>';
  97. ahtml += '</a>';
  98. $nodeDiv.append(ahtml);
  99. // 节点事件绑定
  100. $nodeDiv.on('click', $.lrtree.nodeClick);
  101. if (!node.complete) {
  102. $nodeDiv.append('<div class="lr-tree-loading"><img class="lr-tree-ec-icon" src="' + dfop.cbiconpath + 'loading.gif"/></div>');
  103. }
  104. $node.append($nodeDiv);
  105. if (node.hasChildren) {
  106. var $treeChildren = $('<ul class="lr-tree-node-ct" >');
  107. if (!node.isexpand && !dfop.isAllExpand) {
  108. $treeChildren.css('display', 'none');
  109. }
  110. if (node.ChildNodes) {
  111. var l = node.ChildNodes.length;
  112. for (var k = 0; k < l; k++) {
  113. node.ChildNodes[k].parent = node;
  114. var $childNode = $.lrtree.renderNode(node.ChildNodes[k], deep + 1, path + "." + k, dfop);
  115. $treeChildren.append($childNode);
  116. }
  117. $node.append($treeChildren);
  118. }
  119. }
  120. node.render = true;
  121. dfop = null;
  122. return $node;
  123. },
  124. renderNodeAsync: function ($this, node, dfop) {
  125. var $treeChildren = $('<ul class="lr-tree-node-ct" >');
  126. if (!node.isexpand && !dfop.isAllExpand) {
  127. $treeChildren.css('display', 'none');
  128. }
  129. if (node.ChildNodes) {
  130. var l = node.ChildNodes.length;
  131. for (var k = 0; k < l; k++) {
  132. node.ChildNodes[k].parent = node;
  133. var $childNode = $.lrtree.renderNode(node.ChildNodes[k], node._deep + 1, node._path + "." + k, dfop);
  134. $treeChildren.append($childNode);
  135. }
  136. $this.parent().append($treeChildren);
  137. }
  138. return $treeChildren;
  139. },
  140. renderToo: function ($self) {
  141. var dfop = $self[0]._lrtree.dfop;
  142. // 渲染成树
  143. var $treeRoot = $self.find('.lr-tree-root');
  144. $treeRoot.html('');
  145. var _len = dfop.data.length;
  146. for (var i = 0; i < _len; i++) {
  147. var $node = $.lrtree.renderNode(dfop.data[i], 0, i, dfop);
  148. $treeRoot.append($node);
  149. }
  150. dfop = null;
  151. },
  152. nodeClick: function (e) {
  153. var et = e.target || e.srcElement;
  154. var $this = $(this);
  155. var $parent = $('#' + $this.attr('dataId'));
  156. var dfop = $parent[0]._lrtree.dfop;
  157. if (et.tagName == 'IMG') {
  158. var $et = $(et);
  159. var $ul = $this.next('.lr-tree-node-ct');
  160. if ($et.hasClass("lr-tree-ec-icon")) {
  161. if ($this.hasClass('lr-tree-node-expanded')) {
  162. $ul.slideUp(200, function () {
  163. $this.removeClass('lr-tree-node-expanded');
  164. $this.addClass('lr-tree-node-collapsed');
  165. });
  166. }
  167. else if ($this.hasClass('lr-tree-node-collapsed')) {
  168. // 展开
  169. var path = $this.attr('tpath');
  170. var node = $.lrtree.getItem(path, dfop);
  171. if (!node.complete) {
  172. if (!node._loading) {
  173. node._loading = true;// 表示正在加载数据
  174. $this.find('.lr-tree-loading').show();
  175. learun.httpAsync('GET', dfop.url, { parentId: node.id }, function (data) {
  176. if (!!data) {
  177. node.ChildNodes = data;
  178. $ul = $.lrtree.renderNodeAsync($this, node, dfop);
  179. $ul.slideDown(200, function () {
  180. $this.removeClass('lr-tree-node-collapsed');
  181. $this.addClass('lr-tree-node-expanded');
  182. });
  183. node.complete = true;
  184. $this.find('.lr-tree-loading').hide();
  185. }
  186. node._loading = false;
  187. });
  188. }
  189. }
  190. else {
  191. $ul.slideDown(200, function () {
  192. $this.removeClass('lr-tree-node-collapsed');
  193. $this.addClass('lr-tree-node-expanded');
  194. });
  195. }
  196. }
  197. }
  198. else if ($et.hasClass("lr-tree-node-cb")) {
  199. var path = $this.attr('tpath');
  200. var node = $.lrtree.getItem(path, dfop);
  201. if (node.checkstate == 1) {
  202. node.checkstate = 0;
  203. }
  204. else {
  205. node.checkstate = 1;
  206. }
  207. $et.attr('src', dfop.cbiconpath + dfop.icons[node.checkstate]);
  208. $.lrtree.checkChild($.lrtree.check, node, node.checkstate, dfop);
  209. $.lrtree.checkParent($.lrtree.check, node, node.checkstate, dfop);
  210. if (!!dfop.nodeCheck) {
  211. dfop.nodeCheck(node, $this);
  212. }
  213. }
  214. }
  215. else {
  216. var path = $this.attr('tpath');
  217. var node = $.lrtree.getItem(path, dfop);
  218. dfop.currentItem = node;
  219. $('#' + dfop.id).find('.lr-tree-selected').removeClass('lr-tree-selected');
  220. $this.addClass('lr-tree-selected');
  221. if (!!dfop.nodeClick) {
  222. dfop.nodeClick(node, $this);
  223. }
  224. if (dfop.isTextCheck) {
  225. setTimeout(function () {
  226. $this.find('.lr-tree-node-cb').trigger('click');
  227. });
  228. }
  229. }
  230. return false;
  231. },
  232. check: function (item, state, type, dfop) {
  233. var pstate = item.checkstate;
  234. if (type == 1) {
  235. item.checkstate = state;
  236. }
  237. else {// go to childnodes
  238. var cs = item.ChildNodes;
  239. var l = cs.length;
  240. var ch = true;
  241. for (var i = 0; i < l; i++) {
  242. cs[i].checkstate = cs[i].checkstate || 0;
  243. if ((state == 1 && cs[i].checkstate != 1) || state == 0 && cs[i].checkstate != 0) {
  244. ch = false;
  245. break;
  246. }
  247. }
  248. if (ch) {
  249. item.checkstate = state;
  250. }
  251. else {
  252. item.checkstate = 2;
  253. }
  254. }
  255. //change show
  256. if (item.render && pstate != item.checkstate) {
  257. var nid = item.id.replace(/[^\w]/gi, "_");
  258. var et = $("#" + dfop.id + "_" + nid + "_cb");
  259. if (et.length == 1) {
  260. et.attr("src", dfop.cbiconpath + dfop.icons[item.checkstate]);
  261. }
  262. }
  263. },
  264. checkParent: function (fn, node, state, dfop) {
  265. var p = node.parent;
  266. while (p) {
  267. var r = fn(p, state, 0, dfop);
  268. if (r === false) {
  269. break;
  270. }
  271. p = p.parent;
  272. }
  273. },
  274. checkChild: function (fn, node, state, dfop) {
  275. if (fn(node, state, 1, dfop) != false) {
  276. if (node.ChildNodes != null && node.ChildNodes.length > 0) {
  277. var cs = node.ChildNodes;
  278. for (var i = 0, len = cs.length; i < len; i++) {
  279. $.lrtree.checkChild(fn, cs[i], state, dfop);
  280. }
  281. }
  282. }
  283. },
  284. search: function (keyword, data) {
  285. var res = false;
  286. $.each(data, function (i, row) {
  287. var flag = false;
  288. if (!learun.validator.isNotNull(keyword).code || row.text.indexOf(keyword) != -1) {
  289. flag = true;
  290. }
  291. if (row.hasChildren) {
  292. if ($.lrtree.search(keyword, row.ChildNodes)) {
  293. flag = true;
  294. }
  295. }
  296. if (flag) {
  297. res = true;
  298. row.isexpand = true;
  299. row.shide = false;
  300. }
  301. else {
  302. row.shide = true;
  303. }
  304. });
  305. return res;
  306. },
  307. findItem: function (data, id, value) {
  308. var _item = null;
  309. _fn(data, id, value);
  310. function _fn(_cdata, _id, _value) {
  311. for (var i = 0, l = _cdata.length; i < l; i++) {
  312. if (_cdata[i][id] == value) {
  313. _item = _cdata[i];
  314. return true;
  315. }
  316. if (_cdata[i].hasChildren && _cdata[i].ChildNodes.length > 0) {
  317. if (_fn(_cdata[i].ChildNodes, _id, _value)) {
  318. return true;
  319. }
  320. }
  321. }
  322. return false;
  323. }
  324. return _item;
  325. },
  326. listTotree: function (data, parentId, id, text, value, check) {
  327. // 只适合小数据计算
  328. var resdata = [];
  329. var mapdata = {};
  330. for (var i = 0, l = data.length; i < l; i++) {
  331. var item = data[i];
  332. mapdata[item[parentId]] = mapdata[item[parentId]] || [];
  333. mapdata[item[parentId]].push(item);
  334. }
  335. _fn(resdata, '0');
  336. function _fn(_data, vparentId) {
  337. var pdata = mapdata[vparentId] || [];
  338. for (var j = 0, l = pdata.length; j < l; j++) {
  339. var _item = pdata[j];
  340. var _point = {
  341. id: _item[id],
  342. text: _item[text],
  343. value: _item[value],
  344. showcheck: check,
  345. checkstate: false,
  346. hasChildren: false,
  347. isexpand: false,
  348. complete: true,
  349. ChildNodes: []
  350. };
  351. if (_fn(_point.ChildNodes, _item[id])) {
  352. _point.hasChildren = true;
  353. _point.isexpand = true;
  354. }
  355. _data.push(_point);
  356. }
  357. return _data.length > 0;
  358. }
  359. return resdata;
  360. },
  361. treeTotree: function (data, id, text, value, check, childId) {
  362. var resdata = [];
  363. _fn(resdata, data);
  364. function _fn(todata,fromdata) {
  365. for (var i = 0, l = fromdata.length; i < l; i++) {
  366. var _item = fromdata[i];
  367. var _point = {
  368. id: _item[id],
  369. text: _item[text],
  370. value: _item[value],
  371. showcheck: check,
  372. checkstate: false,
  373. hasChildren: false,
  374. isexpand: true,
  375. complete: true,
  376. ChildNodes: []
  377. };
  378. if (_item[childId].length > 0) {
  379. _point.hasChildren = true;
  380. _fn(_point.ChildNodes, _item[childId]);
  381. }
  382. todata.push(_point);
  383. }
  384. }
  385. return resdata;
  386. },
  387. addNode: function ($self, node, Id, index) {// 下一版本完善
  388. var dfop = $self[0]._lrtree.dfop;
  389. if (!!Id)// 在最顶层
  390. {
  391. dfop.data.splice(index, 0, node);
  392. var $node = $.lrtree.renderNode(node, 0, index, dfop);
  393. if ($self.find('.lr-tree-root>li').length == 0) {
  394. $self.find('.lr-tree-root>li').append($node);
  395. }
  396. else {
  397. $self.find('.lr-tree-root>li').eq(index).before($node);
  398. }
  399. }
  400. else {
  401. var $parentId = $self.find('#' + dfop.id + '_' + Id);
  402. var path = $parentId.attr('tpath');
  403. var $node = $.lrtree.renderNode(node, 0, path + '.' + index, dfop);
  404. if ($parentId.next().children().length == 0) {
  405. $parentId.next().children().append($node);
  406. }
  407. else {
  408. $parentId.next().children().eq(index).before($node);
  409. }
  410. }
  411. },
  412. setValue: function ($self) {
  413. var dfop = $self[0]._lrtree.dfop;
  414. if (dfop.data.length == 0) {
  415. setTimeout(function () {
  416. $.lrtree.setValue($self);
  417. }, 100);
  418. }
  419. else {
  420. $self.find('span[data-value="' + dfop._value + '"]').trigger('click');
  421. }
  422. }
  423. };
  424. $.fn.lrtree = function (settings) {
  425. var dfop = {
  426. icons: ['checkbox_0.png', 'checkbox_1.png', 'checkbox_2.png'],
  427. method: "GET",
  428. url: false,
  429. param: null,
  430. /* [{
  431. id,
  432. text,
  433. value,
  434. showcheck,bool
  435. checkstate,int
  436. hasChildren,bool
  437. isexpand,bool
  438. complete,bool
  439. ChildNodes,[]
  440. }]*/
  441. data: [],
  442. isAllExpand: false,
  443. cbiconpath: top.$.rootUrl + '/Content/images/learuntree/',
  444. // 点击事件(节点信息),节点$对象
  445. nodeClick: false,
  446. // 选中事件(节点信息),节点$对象
  447. nodeCheck: false
  448. };
  449. $.extend(dfop, settings);
  450. var $self = $(this);
  451. dfop.id = $self.attr("id");
  452. if (dfop.id == null || dfop.id == "") {
  453. dfop.id = "learuntree" + new Date().getTime();
  454. $self.attr("id", dfop.id);
  455. }
  456. $self.html('');
  457. $self.addClass("lr-tree");
  458. $self[0]._lrtree = { dfop: dfop };
  459. $self[0]._lrtree.dfop.backupData = dfop.data;
  460. if (dfop.url) {
  461. learun.httpAsync(dfop.method, dfop.url, dfop.param, function (data) {
  462. $self[0]._lrtree.dfop.data = data || [];
  463. $self[0]._lrtree.dfop.backupData = $self[0]._lrtree.dfop.data;
  464. $.lrtree.render($self);
  465. });
  466. }
  467. else {
  468. $.lrtree.render($self);
  469. }
  470. // pre load the icons
  471. if (dfop.showcheck) {
  472. for (var i = 0; i < 3; i++) {
  473. var im = new Image();
  474. im.src = dfop.cbiconpath + dfop.icons[i];
  475. }
  476. }
  477. dfop = null;
  478. return $self;
  479. };
  480. $.fn.lrtreeSet = function (name,op) {
  481. var $self = $(this);
  482. var dfop = $self[0]._lrtree.dfop;
  483. var getCheck = function (items, buff, fn) {
  484. for (var i = 0, l = items.length; i < l; i++) {
  485. if ($self.find('#' + dfop.id + '_' + items[i].id.replace(/-/g, '_')).parent().css('display') != 'none') {
  486. (items[i].showcheck == true && (items[i].checkstate == 1 || items[i].checkstate == 2)) && buff.push(fn(items[i]));
  487. if (!items[i].showcheck || (items[i].showcheck == true && (items[i].checkstate == 1 || items[i].checkstate == 2))) {
  488. if (items[i].ChildNodes != null && items[i].ChildNodes.length > 0) {
  489. getCheck(items[i].ChildNodes, buff, fn);
  490. }
  491. }
  492. }
  493. }
  494. };
  495. var getCheck2 = function (items, buff, fn) {
  496. for (var i = 0, l = items.length; i < l; i++) {
  497. (items[i].showcheck == true && (items[i].checkstate == 1 || items[i].checkstate == 2) && !items[i].hasChildren) && buff.push(fn(items[i]));
  498. if (!items[i].showcheck || (items[i].showcheck == true && (items[i].checkstate == 1 || items[i].checkstate == 2))) {
  499. if (items[i].ChildNodes != null && items[i].ChildNodes.length > 0) {
  500. getCheck2(items[i].ChildNodes, buff, fn);
  501. }
  502. }
  503. }
  504. };
  505. var setNoCheck = function (items, buff, fn) {
  506. for (var i = 0, l = items.length; i < l; i++) {
  507. if (items[i].showcheck) {
  508. items[i].checkstate = 0;
  509. }
  510. if (items[i].ChildNodes != null && items[i].ChildNodes.length > 0) {
  511. setNoCheck(items[i].ChildNodes);
  512. }
  513. }
  514. };
  515. switch (name) {
  516. case 'allNoCheck':
  517. $self.find('.lr-tree-node-cb').attr('src', dfop.cbiconpath + 'checkbox_0.png');
  518. setNoCheck(dfop.data);
  519. break;
  520. case 'allCheck':
  521. $self.find('.lr-tree-node-cb[src$="checkbox_0.png"]').each(function () {
  522. var $this = $(this);
  523. if ($this.parent().parent().find('.lr-tree-node-ct').length == 0) {
  524. $this.trigger('click');
  525. }
  526. $this = null;
  527. });
  528. break;
  529. case 'setCheck':
  530. var list = op;
  531. $.each(list, function (id, item) {
  532. var $div = $self.find('#' + dfop.id + '_' + item.replace(/-/g, '_'));
  533. if ($div.next().length == 0) {
  534. $div.find('.lr-tree-node-cb').trigger('click');
  535. }
  536. });
  537. break;
  538. case 'setValue':
  539. dfop._value = op;
  540. $.lrtree.setValue($self);
  541. break;
  542. case 'currentItem':
  543. return dfop.currentItem;
  544. break;
  545. case 'getCheckNodesEx':// 只获取最下面的选中元素
  546. var buff = [];
  547. getCheck2(dfop.data, buff, function (item) { return item; });
  548. return buff;
  549. break;
  550. case 'getCheckNodes':
  551. var buff = [];
  552. getCheck(dfop.data, buff, function (item) {return item; });
  553. return buff;
  554. break;
  555. case 'getCheckNodeIds':
  556. var buff = [];
  557. getCheck(dfop.data, buff, function (item) {return item.id; });
  558. return buff;
  559. break;
  560. case 'getCheckNodeIdsByPath':
  561. var buff = [];
  562. var pathlist
  563. getCheck(dfop.data, buff, function (item) { return item.id; });
  564. return buff;
  565. break;
  566. case 'search':
  567. $.lrtree.search(op.keyword, dfop.data);
  568. if (learun.validator.isNotNull(op.keyword).code) {
  569. dfop._isSearch = true;
  570. }
  571. else if (dfop._isSearch) {
  572. dfop._isSearch = false;
  573. }
  574. $.lrtree.renderToo($self);
  575. break;
  576. case 'refresh':
  577. $.extend(dfop, op || {});
  578. if (!!dfop.url) {
  579. learun.httpAsync(dfop.method, dfop.url, dfop.param, function (data) {
  580. $self[0]._lrtree.dfop.data = data || [];
  581. $self[0]._lrtree.dfop.backupData = $self[0]._lrtree.dfop.data;
  582. $.lrtree.renderToo($self);
  583. dfop._isSearch = false;
  584. });
  585. }
  586. else {
  587. $self[0]._lrtree.dfop.backupData = $self[0]._lrtree.dfop.data;
  588. $.lrtree.renderToo($self);
  589. dfop._isSearch = false;
  590. }
  591. break;
  592. case 'addNode':
  593. break;
  594. case 'updateNode':
  595. break;
  596. }
  597. }
  598. })(jQuery, top.learun);