| /** 表格扩展模块 date:2020-02-29   License By http://easyweb.vip */ | 
| layui.define(['layer', 'table', 'laytpl', 'contextMenu'], function (exports) { | 
|     var $ = layui.jquery; | 
|     var layer = layui.layer; | 
|     var table = layui.table; | 
|     var laytpl = layui.laytpl; | 
|     var contextMenu = layui.contextMenu; | 
|     var device = layui.device(); | 
|     var tbSearchAttr = 'tb-search';  // 前端搜索属性 | 
|     var tbRefreshAttr = 'tb-refresh';  // 刷新按钮属性 | 
|     var tbExportAttr = 'tb-export';  // 导出按钮属性 | 
|     var txFieldPre = 'txField_';  // templte列filed前缀 | 
|     var tableX = {}; | 
|   | 
|     /* 合并相同单元格 */ | 
|     tableX.merges = function (tableId, indexs, fields, sort) { | 
|         if (typeof fields === 'boolean') { | 
|             sort = fields; | 
|             fields = undefined; | 
|         } | 
|         var $tb = $('[lay-filter="' + tableId + '"]+.layui-table-view>.layui-table-box>.layui-table-body>table'); | 
|         var $trs = $tb.find('>tbody>tr'); | 
|         // 循环合并每一列 | 
|         for (var i = 0; i < indexs.length; i++) { | 
|             if (fields) { | 
|                 merge(tableId, indexs[i], fields[i]); | 
|             } else { | 
|                 merge(tableId, indexs[i]); | 
|             } | 
|         } | 
|         $trs.find('[del="true"]').remove();  // 移除多余的单元格 | 
|         // 监听排序事件 | 
|         if (sort === undefined || sort) { | 
|             table.on('sort(' + tableId + ')', function () { | 
|                 tableX.merges(tableId, indexs, fields, false); | 
|             }); | 
|         } | 
|   | 
|         // 合并一列 | 
|         function merge(tableId, index, field) { | 
|             var data = table.cache[tableId]; | 
|             if (data.length > 0) { | 
|                 var lastValue, spanNum = 1; | 
|                 if (field) { | 
|                     lastValue = data[0][field]; | 
|                 } else { | 
|                     lastValue = $trs.eq(0).find('td').eq(index).find('.layui-table-cell').html(); | 
|                 } | 
|                 for (var i = 1; i < data.length; i++) { | 
|                     var currentValue; | 
|                     if (field) { | 
|                         currentValue = data[i][field]; | 
|                     } else { | 
|                         currentValue = $trs.eq(i).find('td').eq(index).find('.layui-table-cell').html(); | 
|                     } | 
|                     if (currentValue === lastValue) { | 
|                         spanNum++; | 
|                         if (i === data.length - 1) { | 
|                             $trs.eq(i - spanNum + 1).find('td').eq(index).attr('rowspan', spanNum); | 
|                             for (var j = 1; j < spanNum; j++) { | 
|                                 $trs.eq(i - j + 1).find('td').eq(index).attr('del', 'true'); | 
|                             } | 
|                         } | 
|                     } else { | 
|                         $trs.eq(i - spanNum).find('td').eq(index).attr('rowspan', spanNum); | 
|                         for (var k = 1; k < spanNum; k++) { | 
|                             $trs.eq(i - k).find('td').eq(index).attr('del', 'true'); | 
|                         } | 
|                         spanNum = 1; | 
|                         lastValue = currentValue; | 
|                     } | 
|                 } | 
|             } | 
|         } | 
|     }; | 
|   | 
|     /* 表格行绑定鼠标右键 */ | 
|     tableX.bindCtxMenu = function (tableId, items) { | 
|         var data = table.cache[tableId]; | 
|         var elem = '#' + tableId + '+.layui-table-view .layui-table-body tr'; | 
|         $(elem).bind('contextmenu', function (event) { | 
|             var $this = $(this); | 
|             $(elem).removeClass('layui-table-click'); | 
|             $this.addClass('layui-table-click'); | 
|             var ctxItems; | 
|             if (typeof items === 'function') ctxItems = items(data[$this.data('index')], event.currentTarget); | 
|             else ctxItems = items; | 
|   | 
|             function getCtxItems(menus) { | 
|                 if (!menus) return; | 
|                 var result = []; | 
|                 for (var i = 0; i < menus.length; i++) { | 
|                     result.push({ | 
|                         icon: menus[i].icon, | 
|                         name: menus[i].name, | 
|                         _click: menus[i].click, | 
|                         click: function (e, e2) { | 
|                             var $tr = $(e2.currentTarget); | 
|                             this._click && this._click(data[$tr.data('index')], e2.currentTarget); | 
|                             $tr.removeClass('layui-table-click'); | 
|                         }, | 
|                         subs: getCtxItems(menus[i].subs) | 
|                     }); | 
|                 } | 
|                 return result; | 
|             } | 
|   | 
|             contextMenu.show(getCtxItems(ctxItems), event.clientX, event.clientY, event); | 
|             return false; | 
|         }); | 
|     }; | 
|   | 
|     /* 导出任意数据 */ | 
|     tableX.exportData = function (param) { | 
|         var cols = param.cols;  // 表头 | 
|         var data = param.data;  // 数据 | 
|         var fileName = param.fileName;  // 文件名 | 
|         var fileType = param.expType;  // 类型,xls、csv | 
|         var option = param.option;  // url方式加载的配置 | 
|         option || (option = {}); | 
|         if (device.ie) return layer.msg('不支持ie导出'); | 
|         // data为url先请求数据 | 
|         if (typeof data === 'string') { | 
|             var loadIndex = layer.load(2); | 
|             option.url = data; | 
|             tableX.loadUrl(option, function (res) { | 
|                 layer.close(loadIndex); | 
|                 param.data = res; | 
|                 tableX.exportData(param); | 
|             }); | 
|             return; | 
|         } | 
|         // 列参数补全 | 
|         for (var i = 0; i < cols.length; i++) { | 
|             for (var j = 0; j < cols[i].length; j++) { | 
|                 if (cols[i][j].type === undefined) { | 
|                     cols[i][j].type = 'normal'; | 
|                 } | 
|                 if (cols[i][j].hide === undefined) { | 
|                     cols[i][j].hide = false; | 
|                 } | 
|             } | 
|         } | 
|         var titles = [], fields = [], expData = []; | 
|         // 获取表头和表头字段名 | 
|         table.eachCols(undefined, function (i, item) { | 
|             if (item.type === 'normal' && !item.hide) { | 
|                 titles.push(item.title || ''); | 
|                 fields.push(item.field || (txFieldPre + i)); | 
|             } | 
|         }, cols); | 
|         // 获取templet后的数据 | 
|         var fullData = tableX.parseTbData(cols, tableX.deepClone(data), true); | 
|         for (var n = 0; n < fullData.length; n++) { | 
|             var rowItem = []; | 
|             for (var m = 0; m < fields.length; m++) { | 
|                 var text = fullData[n][fields[m]]; | 
|                 text && (text = text.toString().replace(/,/g, ',')); | 
|                 rowItem.push(text); | 
|             } | 
|             expData.push(rowItem.join(',')); | 
|         } | 
|         // 创建下载文件的a标签 | 
|         var alink = document.createElement('a'); | 
|         var type = ({csv: 'text/csv', xls: 'application/vnd.ms-excel'})[fileType || 'xls']; | 
|         var content = encodeURIComponent(titles.join(',') + '\r\n' + expData.join('\r\n')); | 
|         alink.href = 'data:' + type + ';charset=utf-8,\ufeff' + content; | 
|         alink.download = (fileName || 'table') + '.' + (fileType || 'xls'); | 
|         document.body.appendChild(alink); | 
|         alink.click(); | 
|         document.body.removeChild(alink); | 
|     }; | 
|   | 
|     /* 导出表格数据(高级) */ | 
|     tableX.exportDataX = function (param) { | 
|         layui.use('excel', function () { | 
|             var excel = layui.excel; | 
|             var cols = param.cols;  // 表头 | 
|             var data = param.data;  // 数据 | 
|             var fileName = param.fileName;  // 文件名 | 
|             var fileType = param.expType;  // 类型,xls、xlsx | 
|             var option = param.option;  // url方式加载的配置 | 
|             option || (option = {}); | 
|             fileType || (fileType = 'xlsx'); | 
|             // data为url先请求数据 | 
|             if (data && typeof data === 'string') { | 
|                 var loadIndex = layer.load(2); | 
|                 option.url = data; | 
|                 tableX.loadUrl(option, function (res) { | 
|                     layer.close(loadIndex); | 
|                     param.data = res; | 
|                     tableX.exportDataX(param); | 
|                 }); | 
|                 return; | 
|             } | 
|             // 列参数补全 | 
|             for (var i = 0; i < cols.length; i++) { | 
|                 for (var j = 0; j < cols[i].length; j++) { | 
|                     if (cols[i][j].type === undefined) { | 
|                         cols[i][j].type = 'normal'; | 
|                     } | 
|                     if (cols[i][j].hide === undefined) { | 
|                         cols[i][j].hide = false; | 
|                     } | 
|                 } | 
|             } | 
|             // 获取表头和表头字段名 | 
|             var titles = {}, fields = []; | 
|             table.eachCols(undefined, function (i, item) { | 
|                 if (item.type === 'normal' && !item.hide) { | 
|                     var field = item.field || (txFieldPre + i); | 
|                     fields.push(field); | 
|                     titles[field] = item.title || ''; | 
|                 } | 
|             }, cols); | 
|             // 格式化数据 | 
|             var fullData = tableX.parseTbData(cols, tableX.deepClone(data), true); | 
|             var expData = excel.filterExportData(fullData, fields); | 
|             expData.unshift(titles); | 
|             excel.exportExcel({sheet1: expData}, (fileName || 'table') + '.' + fileType, fileType); | 
|         }); | 
|     }; | 
|   | 
|     /* 后端导出数据拼接参数 */ | 
|     tableX.exportDataBack = function (url, where, method) { | 
|         where || (where = {}); | 
|         if (!method || method.toString().toLowerCase() === 'get') { | 
|             var param = ''; | 
|             for (var f in where) { | 
|                 if (!param) { | 
|                     param = ('?' + f + '=' + where[f]); | 
|                 } else { | 
|                     param += ('&' + f + '=' + where[f]); | 
|                 } | 
|             } | 
|             window.open(url + param); | 
|         } else { | 
|             var htmlStr = '<html><body><form id="eFrom" action="' + url + '" method="' + method + '">'; | 
|             for (var f2 in where) { | 
|                 htmlStr += ('<textarea name="' + f2 + '">' + where[f2] + '</textarea>'); | 
|             } | 
|             htmlStr += '</form></body></html>'; | 
|             $('#exportFrame').remove(); | 
|             $('body').append('<iframe id="exportFrame" style="display: none;"></iframe>'); | 
|             var eFrame = document.getElementById('exportFrame'); | 
|             var eWindow = eFrame.contentWindow; | 
|             var eDocument = eWindow.document; | 
|             eWindow.focus(); | 
|             eDocument.open(); | 
|             eDocument.write(htmlStr); | 
|             eDocument.close(); | 
|             eDocument.getElementById('eFrom').submit(); | 
|         } | 
|     }; | 
|   | 
|     /* 渲染表格,后端排序 */ | 
|     tableX.render = function (param) { | 
|         var tableId = $(param.elem).attr('lay-filter'); | 
|         param.autoSort = false;  // 关闭默认排序 | 
|         var insTb = table.render(param);  // 渲染表格 | 
|         // 排序监听 | 
|         table.on('sort(' + tableId + ')', function (obj) { | 
|             var sortField = obj.field, sortType = obj.type; // 排序字段、类型 | 
|             var sortWhere = $.extend(param.where, {sort: sortField, order: sortType}); | 
|             insTb.reload({where: sortWhere, page: {curr: 1}}); | 
|         }); | 
|         return insTb; | 
|     }; | 
|   | 
|     /* 渲染表格,前端分页 */ | 
|     tableX.renderFront = function (param) { | 
|         var insTb, tableId = $(param.elem).attr('lay-filter'); | 
|         param.autoSort = false;  // 关闭默认排序 | 
|         // 没有field的templet列补上,因为排序必须有filed字段,否则点击排序会报错 | 
|         for (var i = 0; i < param.cols.length; i++) { | 
|             for (var j = 0; j < param.cols[i].length; j++) { | 
|                 if (param.cols[i][j].templet && !param.cols[i][j].field) { | 
|                     param.cols[i][j].field = txFieldPre + i + '_' + j; | 
|                 } | 
|             } | 
|         } | 
|         if (param.url) {  // url方式 | 
|             var xParam = tableX.deepClone(param); | 
|             xParam.data = []; | 
|             xParam.url = undefined; | 
|             insTb = table.render(xParam);  // 先渲染表格结构 | 
|             // 提供刷新方法 | 
|             insTb.reloadUrl = function (p) { | 
|                 var reParam = tableX.deepClone(param); | 
|                 p && (reParam = $.extend(reParam, p)); | 
|                 $(param.elem + '+.layui-table-view>.layui-table-box').append('<div class="layui-table-init"><i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i></div>'); | 
|                 // 获取url数据 | 
|                 tableX.loadUrl(reParam, function (data) { | 
|                     insTb.reload({url: '', data: data, page: {curr: 1}}); | 
|                     tableX.putTbData(tableId, tableX.parseTbData(reParam.cols, data));  // 缓存数据 | 
|                     $('input[' + tbSearchAttr + '="' + tableId + '"]').val('');  // 清空搜索输入框 | 
|                     window.tbX.cacheSearch[tableId] = undefined;  // 重置搜索结果 | 
|                 }); | 
|             }; | 
|             insTb.reloadUrl(); | 
|         } else { | 
|             insTb = table.render(param);  // 渲染表格 | 
|             // 提供刷新的方法 | 
|             insTb.reloadData = function (p) { | 
|                 insTb.reload(p); | 
|                 tableX.parseTbData(param.cols, p.data);  // 解析temple列 | 
|                 tableX.putTbData(tableId, p.data); | 
|                 $('input[' + tbSearchAttr + '="' + tableId + '"]').val('');  // 清空搜索输入框 | 
|                 window.tbX.cacheSearch[tableId] = undefined;  // 重置搜索结果 | 
|             }; | 
|             tableX.putTbData(tableId, tableX.parseTbData(param.cols, param.data));  // 缓存数据 | 
|         } | 
|         tableX.renderAllTool(insTb);  // 渲染工具组件 | 
|         return insTb; | 
|     }; | 
|   | 
|     /* 加载表格数据 */ | 
|     tableX.loadUrl = function (options, callback) { | 
|         // 响应数据的自定义格式 | 
|         options.response = $.extend({ | 
|             statusName: 'code', | 
|             statusCode: 0, | 
|             msgName: 'msg', | 
|             dataName: 'data', | 
|             countName: 'count' | 
|         }, options.response); | 
|         var response = options.response; | 
|         var where = options.where;   // 参数 | 
|         if (options.contentType && options.contentType.indexOf('application/json') === 0) { | 
|             where = JSON.stringify(where);  // 提交 json 格式 | 
|         } | 
|         $.ajax({ | 
|             type: options.method || 'get', | 
|             url: options.url, | 
|             contentType: options.contentType, | 
|             data: where, | 
|             dataType: 'json', | 
|             headers: options.headers || {}, | 
|             success: function (res) { | 
|                 // 如果有数据解析的回调,则获得其返回的数据 | 
|                 if (typeof options.parseData === 'function') { | 
|                     res = options.parseData(res) || res; | 
|                 } | 
|                 // 检查数据格式是否符合规范 | 
|                 if (res[response.statusName] != response.statusCode) { | 
|                     var msgText = res[response.msgName] || ('返回的数据不符合规范,正确的成功状态码 (' + response.statusName + ') 应为:' + response.statusCode); | 
|                     layer.msg(msgText, {icon: 2}); | 
|                 } else { | 
|                     callback(res[response.dataName]); | 
|                 } | 
|             }, | 
|             error: function (e, m) { | 
|                 layer.msg('数据接口请求异常:' + m, {icon: 2}); | 
|             } | 
|         }); | 
|     }; | 
|   | 
|     /* 解析数据表格templet列 */ | 
|     tableX.parseTbData = function (cols, dataList, overwrite) { | 
|         var templets = [];  // 需要解析的列 | 
|         table.eachCols(undefined, function (i, item) { | 
|             if (item.templet) { | 
|                 var one = {field: ((item.field && (overwrite || item.field.indexOf(txFieldPre) === 0)) ? item.field : ('txField_' + i))}; | 
|                 if (typeof item.templet === 'string') { | 
|                     one.templet = function (d) {  // templet列使用laytpl渲染 | 
|                         var rsStr = undefined; | 
|                         laytpl($(item.templet).html()).render(d, function (html) { | 
|                             rsStr = html; | 
|                         }); | 
|                         return rsStr; | 
|                     } | 
|                 } else { | 
|                     one.templet = item.templet; | 
|                 } | 
|                 templets.push(one); | 
|             } | 
|         }, cols); | 
|         for (var i = 0; i < dataList.length; i++) { | 
|             var current = dataList[i]; | 
|             for (var j = 0; j < templets.length; j++) { | 
|                 var htmlStr = '<div>' + templets[j].templet(current) + '</div>'; | 
|                 current[templets[j].field] = $(htmlStr).not('.export-hide').text().replace(/(^\s*)|(\s*$)/g, '');  // 去除前后空格 | 
|             } | 
|         } | 
|         return dataList; | 
|     }; | 
|   | 
|     /* 缓存表格的数据 */ | 
|     tableX.putTbData = function (tableId, dataList) { | 
|         window.tbX.cache[tableId] = dataList; | 
|     }; | 
|   | 
|     /* 获取表格缓存的数据 */ | 
|     tableX.getTbData = function (tableId) { | 
|         var dataList = window.tbX.cache[tableId]; | 
|         return tableX.deepClone(dataList || table.cache[tableId]); | 
|     }; | 
|   | 
|     /* 搜索数据 */ | 
|     tableX.filterData = function (dataList, searchName, searchValue) { | 
|         var newList = [], sfs; | 
|         for (var i = 0; i < dataList.length; i++) { | 
|             var obj = dataList[i]; | 
|             if (!sfs) {  // 搜索的字段 | 
|                 if (!searchName) { | 
|                     sfs = []; | 
|                     for (var f in obj) { | 
|                         if (!obj.hasOwnProperty(f)) continue; | 
|                         sfs.push(f); | 
|                     } | 
|                 } else { | 
|                     sfs = searchName.split(','); | 
|                 } | 
|             } | 
|             for (var j = 0; j < sfs.length; j++) { | 
|                 if (tableX.isContains(obj[sfs[j]], searchValue)) { | 
|                     newList.push(obj); | 
|                     break; | 
|                 } | 
|             } | 
|         } | 
|         return newList; | 
|     }; | 
|   | 
|     /* 字符串是否包含 */ | 
|     tableX.isContains = function (str1, str2) { | 
|         str1 || (str1 = ''); | 
|         str2 || (str2 = ''); | 
|         str1 = str1.toString().toLowerCase(); | 
|         str2 = str2.toString().toLowerCase(); | 
|         if (str1 === str2 || str1.indexOf(str2) >= 0) { | 
|             return true; | 
|         } | 
|         return false; | 
|     }; | 
|   | 
|     /* 渲染所有组件 */ | 
|     tableX.renderAllTool = function (insTb) { | 
|         renderRefresh(insTb);  // 刷新 | 
|         renderFrontSort(insTb);  // 排序 | 
|         renderFrontSearch(insTb);  // 搜索 | 
|         renderExport(insTb);  // 导出 | 
|     }; | 
|   | 
|     /* 深度克隆对象 */ | 
|     tableX.deepClone = function (obj) { | 
|         var result; | 
|         var oClass = tableX.isClass(obj); | 
|         if (oClass === 'Object') { | 
|             result = {}; | 
|         } else if (oClass === 'Array') { | 
|             result = []; | 
|         } else { | 
|             return obj; | 
|         } | 
|         for (var key in obj) { | 
|             if (!obj.hasOwnProperty(key)) continue; | 
|             var copy = obj[key]; | 
|             if (tableX.isClass(copy) === 'Object') { | 
|                 result[key] = arguments.callee(copy);//递归调用 | 
|             } else if (tableX.isClass(copy) === 'Array') { | 
|                 result[key] = arguments.callee(copy); | 
|             } else { | 
|                 result[key] = obj[key]; | 
|             } | 
|         } | 
|         return result; | 
|     }; | 
|   | 
|     /* 获取变量类型 */ | 
|     tableX.isClass = function (o) { | 
|         if (o === null) | 
|             return 'Null'; | 
|         if (o === undefined) | 
|             return 'Undefined'; | 
|         return Object.prototype.toString.call(o).slice(8, -1); | 
|     }; | 
|   | 
|     // 创建数据缓存对象 | 
|     window.tbX || (window.tbX = {}); | 
|     window.tbX.cache || (window.tbX.cache = {}); | 
|     window.tbX.cacheSearch || (window.tbX.cacheSearch = {}); | 
|   | 
|     // 前端搜索 | 
|     var renderFrontSearch = function (insTb) { | 
|         var tableId = insTb.config.id, $input = $('input[' + tbSearchAttr + '="' + tableId + '"]'); | 
|         if (!($input && $input.length > 0)) { | 
|             return; | 
|         } | 
|         if (!$input.attr('placeholder')) { | 
|             $input.attr('placeholder', '输入关键字按回车键搜索'); | 
|         } | 
|         $input.off('keydown').on('keydown', function (event) { | 
|             if (event.keyCode !== 13) { | 
|                 return; | 
|             } | 
|             var searchName = $input.attr('name');  // 搜索的字段名,用逗号分隔 | 
|             var searchValue = $input.val().replace(/(^\s*)|(\s*$)/g, '');  // 搜索关键字 | 
|             var loadIndex = layer.msg('搜索中..', {icon: 16, shade: 0.01, time: 0}); | 
|             var dataList = tableX.getTbData(tableId); | 
|             var newDataList = tableX.filterData(dataList, searchName, searchValue); | 
|             window.tbX.cacheSearch[tableId] = newDataList;  // 缓存搜索后的数据用于排序 | 
|             insTb.reload({url: '', data: newDataList, page: {curr: 1}}); | 
|             layer.close(loadIndex); | 
|         }); | 
|     }; | 
|   | 
|     // 前端排序 | 
|     var renderFrontSort = function (insTb) { | 
|         var tableId = insTb.config.id; | 
|         table.on('sort(' + tableId + ')', function (obj) { | 
|             var sortField = obj.field, sortType = obj.type; // 排序字段、类型 | 
|             var loadIndex = layer.msg('加载中..', {icon: 16, shade: 0.01, time: 0}); | 
|             var dataList = window.tbX.cacheSearch[tableId];  // 表格搜索后的数据 | 
|             dataList || (dataList = tableX.getTbData(tableId)); | 
|             if (sortType) { | 
|                 dataList = dataList.sort(function (o1, o2) { | 
|                     var o1Str = o1[sortField], o2Str = o2[sortField]; | 
|                     if (sortType === 'asc') {  // 升序 | 
|                         return (o1Str === o2Str) ? 0 : ((o1Str < o2Str) ? -1 : 1); | 
|                     } else {  // 降序 | 
|                         return (o1Str === o2Str) ? 0 : ((o1Str < o2Str) ? 1 : -1); | 
|                     } | 
|                 }); | 
|             } | 
|             insTb.reload({initSort: obj, url: '', data: dataList, page: {curr: 1}}); | 
|             layer.close(loadIndex); | 
|         }); | 
|     }; | 
|   | 
|     // 表格刷新按鈕 | 
|     var renderRefresh = function (insTb) { | 
|         $('[' + tbRefreshAttr + '="' + insTb.config.id + '"]').off('click').on('click', function () { | 
|             if (insTb.reloadUrl) { | 
|                 insTb.reloadUrl(); | 
|             } else { | 
|                 insTb.reload({page: {curr: 1}}); | 
|             } | 
|         }); | 
|     }; | 
|   | 
|     // 渲染导出按钮 | 
|     var renderExport = function (insTb) { | 
|         var tableId = insTb.config.id; | 
|         $('[' + tbExportAttr + '="' + tableId + '"]').off('click').on('click', function (event) { | 
|             if ($(this).find('.tbx-dropdown-menu').length > 0) { | 
|                 return; | 
|             } | 
|             if (event !== void 0) { | 
|                 event.preventDefault(); | 
|                 event.stopPropagation(); | 
|             } | 
|             var htmlStr = '<div class="tbx-dropdown-menu">'; | 
|             htmlStr += '      <div class="tbx-dropdown-menu-item" data-type="check">导出选中数据</div>'; | 
|             htmlStr += '      <div class="tbx-dropdown-menu-item" data-type="current">导出当前页数据</div>'; | 
|             htmlStr += '      <div class="tbx-dropdown-menu-item" data-type="all">导出全部数据</div>'; | 
|             htmlStr += '   </div>'; | 
|             $(this).append(htmlStr); | 
|             $(this).addClass('tbx-dropdown-btn'); | 
|             $(this).parent().css('position', 'relative'); | 
|             $(this).parent().css('z-index', '9998'); | 
|             $('.tbx-dropdown-menu').off('click').on('click', '.tbx-dropdown-menu-item', function (event) { | 
|                 var type = $(this).data('type'); | 
|                 if (type === 'check') { | 
|                     var checkRows = table.checkStatus(tableId); | 
|                     if (checkRows.data.length === 0) { | 
|                         layer.msg('请选择要导出的数据', {icon: 2}); | 
|                     } else { | 
|                         $('.tbx-dropdown-menu').remove(); | 
|                         tableX.exportData({ | 
|                             fileName: insTb.config.title, | 
|                             cols: insTb.config.cols, | 
|                             data: checkRows.data | 
|                         }); | 
|                     } | 
|                 } else if (type === 'current') { | 
|                     tableX.exportData({ | 
|                         fileName: insTb.config.title, | 
|                         cols: insTb.config.cols, | 
|                         data: table.cache[tableId] | 
|                     }); | 
|                 } else if (type === 'all') { | 
|                     tableX.exportData({ | 
|                         fileName: insTb.config.title, | 
|                         cols: insTb.config.cols, | 
|                         data: tableX.getTbData(tableId) | 
|                     }); | 
|                 } | 
|                 if (event !== void 0) { | 
|                     event.preventDefault(); | 
|                     event.stopPropagation(); | 
|                 } | 
|             }); | 
|         }); | 
|         $(document).off('click.tbxDropHide').on('click.tbxDropHide', function () { | 
|             $('.tbx-dropdown-menu').remove(); | 
|         }); | 
|     }; | 
|   | 
|     /* css样式 */ | 
|     var getCommonCss = function () { | 
|         var cssStr = '.tbx-dropdown-btn {'; | 
|         cssStr += '        position: relative;'; | 
|         cssStr += '   }'; | 
|         cssStr += '   .tbx-dropdown-btn:hover {'; | 
|         cssStr += '        opacity: 1'; | 
|         cssStr += '   }'; | 
|         cssStr += '   .tbx-dropdown-menu {'; | 
|         cssStr += '        position: absolute;'; | 
|         cssStr += '        top: 100%;'; | 
|         cssStr += '        right: 0;'; | 
|         cssStr += '        padding: 5px 0;'; | 
|         cssStr += '        margin: 5px 0 0 0;'; | 
|         cssStr += '        overflow: visible;'; | 
|         cssStr += '        min-width: 110px;'; | 
|         cssStr += '        background: #fff;'; | 
|         cssStr += '        border-radius: 2px;'; | 
|         cssStr += '        box-shadow: 0 2px 4px rgba(0, 0, 0, .12);'; | 
|         cssStr += '        border: 1px solid #d2d2d2;'; | 
|         cssStr += '        z-index: 9998;'; | 
|         cssStr += '        cursor: default;'; | 
|         cssStr += '   }'; | 
|         cssStr += '   .tbx-dropdown-menu .tbx-dropdown-menu-item {'; | 
|         cssStr += '        display: block;'; | 
|         cssStr += '        color: #555;'; | 
|         cssStr += '        font-size: 14px;'; | 
|         cssStr += '        padding: 10px 15px;'; | 
|         cssStr += '        text-decoration: none;'; | 
|         cssStr += '        white-space: nowrap;'; | 
|         cssStr += '        cursor: pointer;'; | 
|         cssStr += '        user-select: none;'; | 
|         cssStr += '        line-height: normal;'; | 
|         cssStr += '   }'; | 
|         cssStr += '   .tbx-dropdown-menu .tbx-dropdown-menu-item:hover {'; | 
|         cssStr += '        background-color: #eeeeee;'; | 
|         cssStr += '   }'; | 
|         cssStr += '   .export-show {'; | 
|         cssStr += '        display: none;'; | 
|         cssStr += '   }'; | 
|         return cssStr; | 
|     }; | 
|   | 
|     $('head').append('<style id="ew-css-tbx" type="text/css">' + getCommonCss() + '</style>'); | 
|     exports("tableX", tableX); | 
| }); |