treetable.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. layui.define(['layer', 'table'], function (exports) {
  2. var $ = layui.jquery;
  3. var layer = layui.layer;
  4. var table = layui.table;
  5. var instances = [];
  6. var treetable = {
  7. render: function (param) {
  8. param.method = param.method?param.method:"GET";
  9. if (!treetable.checkParam(param)) {
  10. return;
  11. }
  12. if (param.data) {
  13. treetable.init(param, param.data);
  14. } else {
  15. if(param.method === 'post' || param.method === 'POST') {
  16. $.post(param.url, param.where, function(res){
  17. if(param.parseData){
  18. res = param.parseData(res);
  19. param.data = res.data;
  20. }
  21. treetable.init(param, res.data);
  22. });
  23. } else {
  24. $.get(param.url, param.where, function(res){
  25. if(param.parseData){
  26. res = param.parseData(res);
  27. param.data = res.data;
  28. }
  29. treetable.init(param, res.data);
  30. });
  31. }
  32. }
  33. },
  34. // 渲染表格
  35. init: function (param, data) {
  36. var mData = [];
  37. var doneCallback = param.done;
  38. var tNodes = data;
  39. for (var i = 0; i < tNodes.length; i++) {
  40. var tt = tNodes[i];
  41. if (!tt.id) {
  42. tt.id = tt[param.treeIdName];
  43. }
  44. if (!tt.pid) {
  45. tt.pid = tt[param.treePidName] || 0; //变更
  46. }
  47. }
  48. /*var sort = function (s_pid, data) {
  49. for (var i = 0; i < data.length; i++) {
  50. if (data[i].pid == s_pid) {
  51. var len = mData.length;
  52. if (len > 0 && mData[len - 1].id == s_pid) {
  53. mData[len - 1].isParent = true;
  54. }
  55. mData.push(data[i]);
  56. sort(data[i].id, data);
  57. }
  58. }
  59. };
  60. sort(param.treeSpid, tNodes);*/
  61. var map = {}; // 变更
  62. for (var k in data) {
  63. map[data[k].id] = data[k];
  64. }
  65. for (var j in map) {
  66. if(map[j].pid && map[map[j].pid]) {
  67. var parent = map[map[j].pid];
  68. if (!parent.children) {
  69. parent.children = [];
  70. parent.isParent = true;
  71. }
  72. parent.children.push(map[j]);
  73. }
  74. }
  75. var tree = [];
  76. for (var l in map) {
  77. if (!map[l].pid || !map[map[l].pid]) {
  78. map[l].isRoot = true;
  79. tree.push(map[l]);
  80. }
  81. }
  82. function travel(item)
  83. {
  84. mData.push(item);
  85. if (item.children) {
  86. for (var g in item.children) {
  87. travel(item.children[g]);
  88. }
  89. }
  90. }
  91. for (var h in tree) {
  92. travel(tree[h]);
  93. }
  94. param.prevUrl = param.url;
  95. param.url = undefined;
  96. param.data = mData;
  97. param.page = {
  98. count: param.data.length,
  99. limit: param.data.length
  100. };
  101. param.cols[0][param.treeColIndex].templet = function (d) {
  102. var mId = d.id;
  103. var mPid = d.pid;
  104. var isDir = d.isParent;
  105. var emptyNum = treetable.getEmptyNum(mPid, mData);
  106. var iconHtml = '';
  107. for (var i = 0; i < emptyNum; i++) {
  108. iconHtml += '<span class="treeTable-empty"></span>';
  109. }
  110. if (isDir) {
  111. iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
  112. } else {
  113. iconHtml += '<i class="layui-icon layui-icon-file"></i>';
  114. }
  115. iconHtml += '&nbsp;&nbsp;';
  116. var ttype = isDir ? 'dir' : 'file';
  117. var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
  118. return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
  119. };
  120. param.done = function (res, curr, count) {
  121. $(param.elem).next().addClass('treeTable');
  122. $('.treeTable .layui-table-page').css('display', 'none');
  123. $(param.elem).next().attr('treeLinkage', param.treeLinkage);
  124. if (param.treeDefaultClose) {
  125. treetable.foldAll(param.elem);
  126. }
  127. if (doneCallback) {
  128. doneCallback(res, curr, count);
  129. }
  130. };
  131. // 渲染表格
  132. table.render(param);
  133. var result = instances.some(item=>item.key===param.elem);
  134. if(!result){
  135. instances.push({key:param.elem,value:param});
  136. }
  137. },
  138. reload: function(elem) {
  139. instances.forEach(function(item){
  140. if(item.key === elem) {
  141. $(elem).next().remove();
  142. item.value.data = undefined;
  143. item.value.url = item.value.prevUrl;
  144. treetable.render(item.value);
  145. }
  146. })
  147. },
  148. search: function(elem,keyword) {
  149. var $tds = $(elem).next('.treeTable').find('.layui-table-body tbody tr td');
  150. if (!keyword) {
  151. $tds.css('background-color', 'transparent');
  152. layer.msg("请输入关键字", {icon: 5});
  153. return;
  154. }
  155. var searchCount = 0;
  156. $tds.each(function () {
  157. $(this).css('background-color', 'transparent');
  158. if ($(this).text().indexOf(keyword) >= 0) {
  159. $(this).css('background-color', 'rgba(250,230,160,0.5)');
  160. if (searchCount == 0) {
  161. $('body,html').stop(true);
  162. $('body,html').animate({scrollTop: $(this).offset().top - 150}, 500);
  163. }
  164. searchCount++;
  165. }
  166. });
  167. if (searchCount == 0) {
  168. layer.msg("没有匹配结果", {icon: 5});
  169. } else {
  170. treetable.expandAll(elem);
  171. }
  172. },
  173. getEmptyNum: function (pid, data) {
  174. var num = 0;
  175. if (!pid) {
  176. return num;
  177. }
  178. var tPid;
  179. for (var i = 0; i < data.length; i++) {
  180. if (pid == data[i].id) {
  181. num += 1;
  182. tPid = data[i].pid;
  183. break;
  184. }
  185. }
  186. return num + treetable.getEmptyNum(tPid, data);
  187. },
  188. // 展开/折叠行
  189. toggleRows: function ($dom, linkage) {
  190. var type = $dom.attr('lay-ttype');
  191. if ('file' == type) {
  192. return;
  193. }
  194. var mId = $dom.attr('lay-tid');
  195. var isOpen = $dom.hasClass('open');
  196. if (isOpen) {
  197. $dom.removeClass('open');
  198. } else {
  199. $dom.addClass('open');
  200. }
  201. $dom.closest('tbody').find('tr').each(function () {
  202. var $ti = $(this).find('.treeTable-icon');
  203. var pid = $ti.attr('lay-tpid');
  204. var ttype = $ti.attr('lay-ttype');
  205. var tOpen = $ti.hasClass('open');
  206. if (mId == pid) {
  207. if (isOpen) {
  208. $(this).hide();
  209. if ('dir' == ttype && tOpen == isOpen) {
  210. $ti.trigger('click');
  211. }
  212. } else {
  213. $(this).show();
  214. if (linkage && 'dir' == ttype && tOpen == isOpen) {
  215. $ti.trigger('click');
  216. }
  217. }
  218. }
  219. });
  220. },
  221. // 检查参数
  222. checkParam: function (param) {
  223. /*if (!param.treeSpid && param.treeSpid != 0) {
  224. layer.msg('参数treeSpid不能为空', {icon: 5});
  225. return false;
  226. }*/
  227. if (!param.treeIdName) {
  228. layer.msg('参数treeIdName不能为空', {icon: 5});
  229. return false;
  230. }
  231. if (!param.treePidName) {
  232. layer.msg('参数treePidName不能为空', {icon: 5});
  233. return false;
  234. }
  235. if (!param.treeColIndex && param.treeColIndex != 0) {
  236. layer.msg('参数treeColIndex不能为空', {icon: 5});
  237. return false;
  238. }
  239. return true;
  240. },
  241. // 展开所有
  242. expandAll: function (dom) {
  243. $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
  244. var $ti = $(this).find('.treeTable-icon');
  245. var ttype = $ti.attr('lay-ttype');
  246. var tOpen = $ti.hasClass('open');
  247. if ('dir' == ttype && !tOpen) {
  248. $ti.trigger('click');
  249. }
  250. });
  251. },
  252. // 折叠所有
  253. foldAll: function (dom) {
  254. $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
  255. var $ti = $(this).find('.treeTable-icon');
  256. var ttype = $ti.attr('lay-ttype');
  257. var tOpen = $ti.hasClass('open');
  258. if ('dir' == ttype && tOpen) {
  259. $ti.trigger('click');
  260. }
  261. });
  262. }
  263. };
  264. // 给图标列绑定事件
  265. $('body').on('click', '.treeTable .treeTable-icon', function () {
  266. var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage');
  267. if ('true' == treeLinkage) {
  268. treetable.toggleRows($(this), true);
  269. } else {
  270. treetable.toggleRows($(this), false);
  271. }
  272. });
  273. exports('treetable', treetable);
  274. });