tablePlus.js 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. layui.define(function(exports) {
  2. //tablePlus在原来的table模块的基础上实现了批量数据导出功能,实现defaultToolbar中筛选列记忆功能,实现了外部搜索功能
  3. var table = layui.table;
  4. var form = layui.form;
  5. var MOD_NAME='tablePlus';
  6. var tablePlus=$.extend({},table);
  7. tablePlus._render = tablePlus.render;
  8. tablePlus.excel = function(total,options){
  9. //console.log(options);
  10. let _page = parseInt(total/options.excel_limit);
  11. let page = total%options.excel_limit>0?(_page+1):_page;
  12. let pageHtml='<p style="padding:16px 10px 0; text-align:center; color:red">由于导出数据比较消耗服务器资源,建议使用搜索功能筛选好数据再导出</p><p style="padding:5px 10px 10px; text-align:center; color:red">如果点击导出后,没有立即导出文件,请耐心等待一下,30秒内请勿重复点击。</p><p style="padding:0 10px; text-align:center;">共查询到<strong> '+total+' </strong>条数据,每次最多导出<strong>'+options.excel_limit+'</strong>条,共<strong>'+page+'</strong>页,请点击下面的页码导出</p><div id="exportPage" class="layui-box layui-laypage" style="padding:10px 0; width:100%;text-align:center;">';
  13. for (i = 1; i <= page; i++) {
  14. pageHtml += '<a href="javascript:;" data-page="'+i+'">'+i+'</a>';
  15. }
  16. pageHtml+='</div>';
  17. layer.open({
  18. type: 1,
  19. title: '导出数据',
  20. area:['580px','240px'],
  21. content: pageHtml,
  22. success:function(res){
  23. let tableWhere = JSON.parse(JSON.stringify(options.where));
  24. tableWhere.limit=options.excel_limit;
  25. $('#exportPage').on('click','a',function(){
  26. tableWhere.page=$(this).data('page');
  27. let msg = layer.msg('正在导出数据...', {time:3000});
  28. $.ajax({
  29. url: options.url,
  30. data: tableWhere,
  31. success:function(res){
  32. table.exportFile(options.id, res.data,'csv');
  33. setTimeout(function(){
  34. layer.msg('导出完成');
  35. },2000)
  36. }
  37. });
  38. })
  39. }
  40. });
  41. }
  42. //重写渲染方法
  43. tablePlus.render=function(params){
  44. if(params.excel_auth === undefined){
  45. params.excel_auth = 1;
  46. }
  47. if(params.excel_limit === undefined){
  48. params.excel_limit = 10000;
  49. }
  50. if(params.cols_save === undefined){
  51. params.cols_save = false;
  52. }
  53. if(params.limit === undefined){
  54. params.limit = 20;
  55. }
  56. if(params.page === undefined){
  57. params.page = true;
  58. }
  59. if(params.cellMinWidth === undefined){
  60. params.cellMinWidth = 80;
  61. }
  62. if(params.help === undefined){
  63. params.help = '无帮助说明';
  64. }
  65. if(params.order_field === undefined){
  66. params.order_field = 'order_field';
  67. }
  68. if(params.order_type === undefined){
  69. params.order_type = 'order_type';
  70. }
  71. let defaultToolbar = [
  72. 'filter',
  73. {
  74. name: 'exports',
  75. onClick: function(obj) {
  76. // 当前示例配置项
  77. let options = obj.config;
  78. let total = obj.data.length;
  79. // 弹出面板
  80. obj.openPanel({
  81. list: [ // 列表
  82. '<li data-type="page">导出当前页</li>',
  83. '<li data-type="all">导出全部</li>'
  84. ].join(''),
  85. done: function(panel, list) {
  86. list.on('click', function() {
  87. if(options.excel_auth==0){
  88. layer.msg('无权限导出');
  89. return false;
  90. }
  91. if(total==0){
  92. layer.msg('暂无数据');
  93. return false;
  94. }
  95. let type = $(this).data('type')
  96. if(type === 'page') {
  97. // 调用内置导出方法
  98. let msg = layer.msg('正在导出数据...', {time:1000});
  99. table.exportFile(options.id, null, 'csv');
  100. }else if(type === 'all') {
  101. let tableWhere = JSON.parse(JSON.stringify(options.where));
  102. tableWhere.limit=options.excel_limit;
  103. if(total<=tableWhere.limit){
  104. tableWhere.page=1;
  105. let msg = layer.msg('正在导出数据...', {time:3000});
  106. $.ajax({
  107. url: options.url,
  108. data: tableWhere,
  109. success:function(res){
  110. table.exportFile(options.id, res.data,'csv');
  111. setTimeout(function(){
  112. layer.msg('导出完成');
  113. },3000)
  114. }
  115. });
  116. }
  117. else{
  118. tablePlus.excel(total,options)
  119. }
  120. }
  121. });
  122. }
  123. });
  124. }
  125. },{
  126. title:'数据说明',
  127. icon: 'layui-icon-help',
  128. layEvent: 'LAYTABLE_HELP',
  129. onClick: function(obj) {
  130. layer.open({
  131. shadeClose: true,
  132. title:'帮助说明',
  133. type: 1,
  134. content: '<div style="padding:20px 15px; min-width:300px; line-height:1.8">'+obj.config.help+'</div>'
  135. })
  136. }
  137. }
  138. ]
  139. if(params.defaultToolbar != false){
  140. params.defaultToolbar = defaultToolbar;
  141. }
  142. if(params.cols_save == true){
  143. // 从本地存储获取用户保存的列显示设置
  144. let savedCols = localStorage.getItem('col-filter-'+params.url);
  145. let colsStatus = savedCols ? JSON.parse(savedCols) : {};
  146. let cols = params.cols;
  147. for (var i=0;i<cols[0].length;i++){
  148. if(cols[0][i].field!=undefined && colsStatus[cols[0][i].field] != undefined){
  149. cols[0][i].hide=colsStatus[cols[0][i].field];
  150. }
  151. }
  152. params.cols = cols;
  153. if(typeof params.done === "function"){
  154. let _done = params.done;
  155. params.done = function(data, curr, count){
  156. let obj = this;
  157. _done(data, curr, count);
  158. obj.elem.next().on('mousedown', 'input[lay-filter="LAY_TABLE_TOOL_COLS"]+', function(){
  159. var input = $(this).prev()[0];
  160. layui.data ('col-filter-'+params.url,{
  161. key: input.name,
  162. value: input.checked
  163. })
  164. });
  165. }
  166. }
  167. else{
  168. params.done = function(data){
  169. let obj = this;
  170. obj.elem.next().on('mousedown', 'input[lay-filter="LAY_TABLE_TOOL_COLS"]+', function(){
  171. var input = $(this).prev()[0];
  172. layui.data ('col-filter-'+params.url,{
  173. key: input.name,
  174. value: input.checked
  175. })
  176. });
  177. }
  178. }
  179. }
  180. var init = tablePlus._render(params);
  181. //监听搜索提交
  182. form.on('submit(table-search)', function(data) {
  183. init.reload({
  184. where: data.field,
  185. page: {curr: 1}
  186. });
  187. return false;
  188. });
  189. // 触发排序事件
  190. let filter = $(params.elem).attr('lay-filter');
  191. table.on('sort('+filter+')', function(obj){
  192. $('[name="'+params.order_field+'"]').val(obj.field);
  193. $('[name="'+params.order_type+'"]').val(obj.type);
  194. var searchObject = form.val('barsearchform');
  195. layui.pageTable.reload({
  196. where:searchObject,
  197. page: {curr: 1}
  198. });
  199. });
  200. //重置搜索提交
  201. $('body').on('click', '[lay-filter="table-reset"]', function () {
  202. let prev = $(this).prev();
  203. if (typeof(prev) != "undefined" ) {
  204. setTimeout(function () {
  205. prev.click();
  206. }, 20)
  207. }
  208. if(typeof params.searchreset === "function"){
  209. params.searchreset();
  210. }
  211. });
  212. return init;
  213. //console.log(params);
  214. };
  215. exports(MOD_NAME, tablePlus);
  216. });