treetable.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. layui.define(['layer', 'table','http'], function (exports) {
  2. var $ = layui.jquery;
  3. var layer = layui.layer;
  4. var table = layui.table;
  5. var http = layui.http;
  6. var treetable = {
  7. // 渲染树形表格
  8. render: function (param) {
  9. // 检查参数
  10. if (!treetable.checkParam(param)) {
  11. return;
  12. }
  13. // 获取数据
  14. if (param.data) {
  15. treetable.init(param, param.data);
  16. } else {
  17. http.get(param.url,param.where,true,function (res) {
  18. // res.data.forEach(e => {
  19. // if (e.parentId == null){
  20. // e.parentId = 'null'
  21. // }
  22. // })
  23. treetable.init(param, res.data);
  24. })
  25. // $.getJSON(param.url, param.where, function (res) {
  26. //
  27. // });
  28. }
  29. },
  30. // 渲染表格
  31. init: function (param, data) {
  32. var mData = [];
  33. var doneCallback = param.done;
  34. var tNodes = data;
  35. // 补上id和pid字段
  36. for (var i = 0; i < tNodes.length; i++) {
  37. var tt = tNodes[i];
  38. if (!tt.id) {
  39. if (!param.treeIdName) {
  40. layer.msg('参数treeIdName不能为空', {icon: 5});
  41. return;
  42. }
  43. tt.id = tt[param.treeIdName];
  44. }
  45. if (!tt.pid) {
  46. if (!param.treePidName) {
  47. layer.msg('参数treePidName不能为空', {icon: 5});
  48. return;
  49. }
  50. tt.pid = tt[param.treePidName];
  51. }
  52. }
  53. // 对数据进行排序
  54. var sort = function (s_pid, data) {
  55. for (var i = 0; i < data.length; i++) {
  56. if (data[i].pid == s_pid) {
  57. var len = mData.length;
  58. if (len > 0 && mData[len - 1].id == s_pid) {
  59. mData[len - 1].isParent = true;
  60. }
  61. mData.push(data[i]);
  62. sort(data[i].id, data);
  63. }
  64. }
  65. };
  66. sort(param.treeSpid, tNodes);
  67. // 重写参数
  68. param.url = undefined;
  69. param.data = mData;
  70. param.page = {
  71. count: param.data.length,
  72. limit: param.data.length
  73. };
  74. param.cols[0][param.treeColIndex].templet = function (d) {
  75. var mId = d.id;
  76. var mPid = d.pid;
  77. var isDir = d.isParent;
  78. var emptyNum = treetable.getEmptyNum(mPid, mData);
  79. var iconHtml = '';
  80. for (var i = 0; i < emptyNum; i++) {
  81. iconHtml += '<span class="treeTable-empty"></span>';
  82. }
  83. if (isDir) {
  84. iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
  85. } else {
  86. iconHtml += '<i class="layui-icon layui-icon-file"></i>';
  87. }
  88. iconHtml += '&nbsp;&nbsp;';
  89. var ttype = isDir ? 'dir' : 'file';
  90. var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
  91. return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
  92. };
  93. param.done = function (res, curr, count) {
  94. $(param.elem).next().addClass('treeTable');
  95. $('.treeTable .layui-table-page').css('display', 'none');
  96. $(param.elem).next().attr('treeLinkage', param.treeLinkage);
  97. // 绑定事件换成对body绑定
  98. /*$('.treeTable .treeTable-icon').click(function () {
  99. treetable.toggleRows($(this), param.treeLinkage);
  100. });*/
  101. if (param.treeDefaultClose) {
  102. treetable.foldAll(param.elem);
  103. }
  104. if (doneCallback) {
  105. doneCallback(res, curr, count);
  106. }
  107. };
  108. // 渲染表格
  109. table.render(param);
  110. },
  111. // 计算缩进的数量
  112. getEmptyNum: function (pid, data) {
  113. var num = 0;
  114. if (!pid) {
  115. return num;
  116. }
  117. var tPid;
  118. for (var i = 0; i < data.length; i++) {
  119. if (pid == data[i].id) {
  120. num += 1;
  121. tPid = data[i].pid;
  122. break;
  123. }
  124. }
  125. return num + treetable.getEmptyNum(tPid, data);
  126. },
  127. // 展开/折叠行
  128. toggleRows: function ($dom, linkage) {
  129. var type = $dom.attr('lay-ttype');
  130. if ('file' == type) {
  131. return;
  132. }
  133. var mId = $dom.attr('lay-tid');
  134. var isOpen = $dom.hasClass('open');
  135. if (isOpen) {
  136. $dom.removeClass('open');
  137. } else {
  138. $dom.addClass('open');
  139. }
  140. $dom.closest('tbody').find('tr').each(function () {
  141. var $ti = $(this).find('.treeTable-icon');
  142. var pid = $ti.attr('lay-tpid');
  143. var ttype = $ti.attr('lay-ttype');
  144. var tOpen = $ti.hasClass('open');
  145. if (mId == pid) {
  146. if (isOpen) {
  147. $(this).hide();
  148. if ('dir' == ttype && tOpen == isOpen) {
  149. $ti.trigger('click');
  150. }
  151. } else {
  152. $(this).show();
  153. if (linkage && 'dir' == ttype && tOpen == isOpen) {
  154. $ti.trigger('click');
  155. }
  156. }
  157. }
  158. });
  159. },
  160. // 检查参数
  161. checkParam: function (param) {
  162. if (!param.treeSpid && param.treeSpid != 0) {
  163. layer.msg('参数treeSpid不能为空', {icon: 5});
  164. return false;
  165. }
  166. if (!param.treeColIndex && param.treeColIndex != 0) {
  167. layer.msg('参数treeColIndex不能为空', {icon: 5});
  168. return false;
  169. }
  170. return true;
  171. },
  172. // 展开所有
  173. expandAll: function (dom) {
  174. $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
  175. var $ti = $(this).find('.treeTable-icon');
  176. var ttype = $ti.attr('lay-ttype');
  177. var tOpen = $ti.hasClass('open');
  178. if ('dir' == ttype && !tOpen) {
  179. $ti.trigger('click');
  180. }
  181. });
  182. },
  183. // 折叠所有
  184. foldAll: function (dom) {
  185. $(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () {
  186. var $ti = $(this).find('.treeTable-icon');
  187. var ttype = $ti.attr('lay-ttype');
  188. var tOpen = $ti.hasClass('open');
  189. if ('dir' == ttype && tOpen) {
  190. $ti.trigger('click');
  191. }
  192. });
  193. }
  194. };
  195. layui.link(layui.cache.base + 'treetable-lay/treetable.css');
  196. // 给图标列绑定事件
  197. $('body').on('click', '.treeTable .treeTable-icon', function () {
  198. var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage');
  199. if ('true' == treeLinkage) {
  200. treetable.toggleRows($(this), true);
  201. } else {
  202. treetable.toggleRows($(this), false);
  203. }
  204. });
  205. exports('treetable', treetable);
  206. });