treetable.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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. if (!param.treeIdName) {
  43. layer.msg('参数treeIdName不能为空', {icon: 5});
  44. return;
  45. }
  46. tt.id = tt[param.treeIdName];
  47. }
  48. if (!tt.pid) {
  49. if (!param.treePidName) {
  50. layer.msg('参数treePidName不能为空', {icon: 5});
  51. return;
  52. }
  53. tt.pid = tt[param.treePidName];
  54. }
  55. }
  56. var sort = function (s_pid, data) {
  57. for (var i = 0; i < data.length; i++) {
  58. if (data[i].pid == s_pid) {
  59. var len = mData.length;
  60. if (len > 0 && mData[len - 1].id == s_pid) {
  61. mData[len - 1].isParent = true;
  62. }
  63. mData.push(data[i]);
  64. sort(data[i].id, data);
  65. }
  66. }
  67. };
  68. sort(param.treeSpid, tNodes);
  69. param.prevUrl = param.url;
  70. param.url = undefined;
  71. param.data = mData;
  72. param.page = {
  73. count: param.data.length,
  74. limit: param.data.length
  75. };
  76. param.cols[0][param.treeColIndex].templet = function (d) {
  77. var mId = d.id;
  78. var mPid = d.pid;
  79. var isDir = d.isParent;
  80. var emptyNum = treetable.getEmptyNum(mPid, mData);
  81. var iconHtml = '';
  82. for (var i = 0; i < emptyNum; i++) {
  83. iconHtml += '<span class="treeTable-empty"></span>';
  84. }
  85. if (isDir) {
  86. iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
  87. } else {
  88. iconHtml += '<i class="layui-icon layui-icon-file"></i>';
  89. }
  90. iconHtml += '&nbsp;&nbsp;';
  91. var ttype = isDir ? 'dir' : 'file';
  92. var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
  93. return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
  94. };
  95. param.done = function (res, curr, count) {
  96. $(param.elem).next().addClass('treeTable');
  97. $('.treeTable .layui-table-page').css('display', 'none');
  98. $(param.elem).next().attr('treeLinkage', param.treeLinkage);
  99. if (param.treeDefaultClose) {
  100. treetable.foldAll(param.elem);
  101. }
  102. if (doneCallback) {
  103. doneCallback(res, curr, count);
  104. }
  105. };
  106. // 渲染表格
  107. table.render(param);
  108. var result = instances.some(item=>item.key===param.elem);
  109. if(!result){
  110. instances.push({key:param.elem,value:param});
  111. }
  112. },
  113. reload: function(elem) {
  114. instances.forEach(function(item){
  115. if(item.key === elem) {
  116. $(elem).next().remove();
  117. item.value.data = undefined;
  118. item.value.url = item.value.prevUrl;
  119. treetable.render(item.value);
  120. }
  121. })
  122. },
  123. search: function(elem,keyword) {
  124. var $tds = $(elem).next('.treeTable').find('.layui-table-body tbody tr td');
  125. if (!keyword) {
  126. $tds.css('background-color', 'transparent');
  127. layer.msg("请输入关键字", {icon: 5});
  128. return;
  129. }
  130. var searchCount = 0;
  131. $tds.each(function () {
  132. $(this).css('background-color', 'transparent');
  133. if ($(this).text().indexOf(keyword) >= 0) {
  134. $(this).css('background-color', 'rgba(250,230,160,0.5)');
  135. if (searchCount == 0) {
  136. $('body,html').stop(true);
  137. $('body,html').animate({scrollTop: $(this).offset().top - 150}, 500);
  138. }
  139. searchCount++;
  140. }
  141. });
  142. if (searchCount == 0) {
  143. layer.msg("没有匹配结果", {icon: 5});
  144. } else {
  145. treetable.expandAll(elem);
  146. }
  147. },
  148. getEmptyNum: function (pid, data) {
  149. var num = 0;
  150. if (!pid) {
  151. return num;
  152. }
  153. var tPid;
  154. for (var i = 0; i < data.length; i++) {
  155. if (pid == data[i].id) {
  156. num += 1;
  157. tPid = data[i].pid;
  158. break;
  159. }
  160. }
  161. return num + treetable.getEmptyNum(tPid, data);
  162. },
  163. // 展开/折叠行
  164. toggleRows: function ($dom, linkage) {
  165. var type = $dom.attr('lay-ttype');
  166. if ('file' == type) {
  167. return;
  168. }
  169. var mId = $dom.attr('lay-tid');
  170. var isOpen = $dom.hasClass('open');
  171. if (isOpen) {
  172. $dom.removeClass('open');
  173. } else {
  174. $dom.addClass('open');
  175. }
  176. $dom.closest('tbody').find('tr').each(function () {
  177. var $ti = $(this).find('.treeTable-icon');
  178. var pid = $ti.attr('lay-tpid');
  179. var ttype = $ti.attr('lay-ttype');
  180. var tOpen = $ti.hasClass('open');
  181. if (mId == pid) {
  182. if (isOpen) {
  183. $(this).hide();
  184. if ('dir' == ttype && tOpen == isOpen) {
  185. $ti.trigger('click');
  186. }
  187. } else {
  188. $(this).show();
  189. if (linkage && 'dir' == ttype && tOpen == isOpen) {
  190. $ti.trigger('click');
  191. }
  192. }
  193. }
  194. });
  195. },
  196. // 检查参数
  197. checkParam: function (param) {
  198. if (!param.treeSpid && param.treeSpid != 0) {
  199. layer.msg('参数treeSpid不能为空', {icon: 5});
  200. return false;
  201. }
  202. if (!param.treeColIndex && param.treeColIndex != 0) {
  203. layer.msg('参数treeColIndex不能为空', {icon: 5});
  204. return false;
  205. }
  206. return true;
  207. },
  208. // 展开所有
  209. expandAll: function (dom) {
  210. $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
  211. var $ti = $(this).find('.treeTable-icon');
  212. var ttype = $ti.attr('lay-ttype');
  213. var tOpen = $ti.hasClass('open');
  214. if ('dir' == ttype && !tOpen) {
  215. $ti.trigger('click');
  216. }
  217. });
  218. },
  219. // 折叠所有
  220. foldAll: function (dom) {
  221. $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
  222. var $ti = $(this).find('.treeTable-icon');
  223. var ttype = $ti.attr('lay-ttype');
  224. var tOpen = $ti.hasClass('open');
  225. if ('dir' == ttype && tOpen) {
  226. $ti.trigger('click');
  227. }
  228. });
  229. }
  230. };
  231. // 给图标列绑定事件
  232. $('body').on('click', '.treeTable .treeTable-icon', function () {
  233. var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage');
  234. if ('true' == treeLinkage) {
  235. treetable.toggleRows($(this), true);
  236. } else {
  237. treetable.toggleRows($(this), false);
  238. }
  239. });
  240. exports('treetable', treetable);
  241. });