/** @Name:layui.table 表格操作 @Author:贤心 @License:MIT @version:2.4.5 */ layui.define(['laytpl', 'laypage', 'layer', 'form', 'util'], function (exports) { "use strict"; var $ = layui.$ , laytpl = layui.laytpl , laypage = layui.laypage , layer = layui.layer , form = layui.form , util = layui.util , hint = layui.hint() , device = layui.device() //外部接口 , table = { config: { checkName: 'LAY_CHECKED' //是否选中状态的字段名 , indexName: 'LAY_TABLE_INDEX' //下标索引名 } //全局配置项 , cache: {} //数据缓存 , checkedMultiList: [] // 记录勾选数据缓存 , index: layui.table ? (layui.table.index + 10000) : 0 //设置全局项 , set: function (options) { var that = this; that.config = $.extend({}, that.config, options); return that; } //事件监听 , on: function (events, callback) { return layui.onevent.call(this, MOD_NAME, events, callback); } } //操作当前实例 , thisTable = function () { var that = this , options = that.config , id = options.id || options.index; id && (thisTable.config[id] = options); return { reload: function (options) { that.reload.call(that, options); that.getSortcols(); return thisTable.config[id] = $.extend({}, that.config, options); } , setColsWidth: function () { that.setColsWidth.call(that); } , resize: function () { //重置表格尺寸/结构 that.resize.call(that); } , config: options } } //字符常量 , MOD_NAME = 'table', ELEM = '.layui-table', THIS = 'layui-this', SHOW = 'layui-show', HIDE = 'layui-hide', DISABLED = 'layui-disabled', NONE = 'layui-none' , ELEM_VIEW = 'layui-table-view', ELEM_TOOL = '.layui-table-tool', ELEM_BOX = '.layui-table-box', ELEM_INIT = '.layui-table-init', ELEM_HEADER = '.layui-table-header', ELEM_BODY = '.layui-table-body', ELEM_MAIN = '.layui-table-main', ELEM_FIXED = '.layui-table-fixed', ELEM_FIXL = '.layui-table-fixed-l', ELEM_FIXR = '.layui-table-fixed-r', ELEM_TOTAL = '.layui-table-total', ELEM_PAGE = '.layui-table-page', ELEM_SORT = '.layui-table-sort', ELEM_EDIT = 'layui-table-edit', ELEM_HOVER = 'layui-table-hover' //thead区域模板 , TPL_HEADER = function (mode, options) { var rowCols = '{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}'; options = options || {}; // 判断否是卡片模式 if (mode == "cardListMode") { return [''].join(''); } else { return ['' , '' , '{{# layui.each(d.data.cols, function(i1, item1){ }}' , '' , '{{# layui.each(item1, function(i2, item2){ }}' , '{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}' , '{{# if(item2.fixed === "right"){ right = true; } }}' , function () { if (options.fixed && options.fixed !== 'right') { return '{{# if(item2.fixed && item2.fixed !== "right"){ }}'; } if (options.fixed === 'right') { return '{{# if(item2.fixed === "right"){ }}'; } return ''; }() , '{{# var isSort = !(item2.colGroup) && item2.sort; }}' , '' , (options.fixed ? '{{# }; }}' : '') , '{{# }); }}' , '' , '{{# }); }}' , '' , '
' , '
' , '{{# if(item2.type === "checkbox"){ }}' //复选框 , '' , '{{# } else { }}' , '{{item2.title||""}}' , '{{# if(isSort){ }}' , '' , '{{# } }}' , '{{# } }}' , '
' , '
'].join(''); } } //tbody区域模板 , TPL_BODY = function (mode) { // 判断否是卡片模式 if (mode == "cardListMode") { return ['
' , '
'].join('') } else { return ['' , '' , '
'].join('') } } //主模板 , TPL_MAIN = function (mode) { // 判断否是卡片模式 if (mode == "cardListMode") { return ['
' , '{{# if(d.data.toolbar){ }}' , '
' , '
' , '
' , '
' , '{{# } }}' , '
' , '{{# if(d.data.loading){ }}' , '
' , '' , '
' , '{{# } }}' , '{{# var left, right; }}' , '
' , TPL_HEADER(mode) , '
' , '
' , TPL_BODY(mode) , '
' , '
' , '{{# if(d.data.totalRow){ }}' , '
' , '
' , '' , '
' , '
' , '{{# } }}' , '{{# if(d.data.page){ }}' , '
' , '
' , '
' , '{{# } }}' , '' , '
'].join('') } else { return ['
' , '{{# if(d.data.toolbar){ }}' , '
' , '
' , '
' , '
' , '{{# } }}' , '
' , '{{# if(d.loading){ }}' , '
' , '' , '
' , '{{# } }}' , '{{# var left, right; }}' , '
' , TPL_HEADER(mode) , '
' , '
' , TPL_BODY(mode) , '
' , '{{# if(left){ }}' , '
' , '
' , TPL_HEADER(mode, { fixed: true }) , '
' , '
' , TPL_BODY(mode) , '
' , '
' , '{{# }; }}' , '{{# if(right){ }}' , '
' , '
' , TPL_HEADER(mode, { fixed: 'right' }) , '
' , '
' , '
' , TPL_BODY(mode) , '
' , '
' , '{{# }; }}' , '
' , '{{# if(d.data.totalRow && d.data.mode!="cardListMode"){ }}' , '
' , '' , '' , '
' , '
' , '{{# } }}' , '{{# if(d.data.page){ }}' , '
' , '
' , '
' , '{{# } }}' , '' , '
'].join('') } } , _WIN = $(window) , _DOC = $(document) //构造器 , Class = function (options) { var that = this; that.index = ++table.index; //响应数据的自定义格式 options.response = $.extend({ statusName: 'code' , statusCode: 0 , msgName: 'msg' , dataName: 'data' , countName: 'count' }, options.response); if (!options.sortcols && options.mode == 'cardListMode') { var arrs = []; //重新整理排序结构 layui.each(options.cols, function (i1, item1) { layui.each(item1, function (i2, item2) { if (item2.field && item2.type != "image") { arrs.push(item2) } }); }); that.config.sortcols = that.config.sortcols.concat([arrs]); } that.config = $.extend({}, that.config, table.config, options); //设置用户私有化参数 var upd = that.getUserPdata(); if (upd) { that.setUserPdata(upd); } that.render(); }; //默认配置 Class.prototype.config = { limit: 20 //每页显示的数量 , loading: true //请求数据时,是否显示loading , cellMinWidth: 60 //所有单元格默认最小宽度 , defaultToolbar: ['filter', 'exports', 'print'] //工具栏右侧图标 , mode: 'listMode' , sortcols: [[ //设置卡片列表排序字段 { type: 'checkbox', title: '全选' } ]] , vertical: false // 卡片状态 , text: { none: '无数据' } // 翻页勾选参数 , flipCheck: false // 是否开启翻页勾选 , onlyKey: 'RWID' // 数据唯一性字段 , attachFieldsName: [] // 对选中的数据保留指定的字段 }; //表格渲染 Class.prototype.render = function () { var that = this , options = that.config; options.elem = $(options.elem); options.where = options.where || {}; options.id = options.id || options.elem.attr('id') || options.index; //点击排序是否要重新加载表格数据 options.sortload = options.sortload == undefined ? true : options.sortload; //请求参数的自定义格式 options.request = $.extend({ pageName: 'page' , limitName: 'limit' }, options.request) //如果 page 传入 laypage 对象 if (typeof options.page === 'object') { options.limit = options.page.limit || options.limit; options.limits = options.page.limits || options.limits; that.page = options.page.curr = options.page.curr || 1; delete options.page.elem; // 如果是根据数据集来渲染着不需要吧翻页得回调事件删除掉 // if(!options.dataSource){ delete options.page.jump; // } } if (!options.elem[0]) return that; //高度铺满:full-差距值 if (options.height && /^full-\d+$/.test(options.height)) { that.fullHeightGap = options.height.split('-')[1]; options.height = _WIN.height() - that.fullHeightGap; } //初始化一些参数 that.setInit(); //开始插入替代元素 var othis = options.elem , img_table = ' layui-table-ext' , elem_view = (options.mode == 'listMode' ? ELEM_VIEW : (ELEM_VIEW + img_table)) , hasRender = othis.next('.' + ELEM_VIEW) //主容器 , reElem = that.elem = $(laytpl(TPL_MAIN(options.mode)).render({ VIEW_CLASS: elem_view , data: options , index: that.index //索引 })); options.index = that.index; //生成替代元素 hasRender[0] && hasRender.remove(); //如果已经渲染,则Rerender othis.after(reElem); //各级容器 that.layTool = reElem.find(ELEM_TOOL); that.layBox = reElem.find(ELEM_BOX); that.layHeader = reElem.find(ELEM_HEADER); that.layMain = reElem.find(ELEM_MAIN); that.layBody = reElem.find(ELEM_BODY); that.layFixed = reElem.find(ELEM_FIXED); that.layFixLeft = reElem.find(ELEM_FIXL); that.layFixRight = reElem.find(ELEM_FIXR); that.layTotal = reElem.find(ELEM_TOTAL); that.layPage = reElem.find(ELEM_PAGE); //初始化工具栏 that.renderToolbar(); //让表格平铺 that.fullSize(); //如果多级表头,则填补表头高度 if (options.cols.length > 1) { //补全高度 var th = that.layFixed.find(ELEM_HEADER).find('th'); th.height(that.layHeader.height() - 1 - parseFloat(th.css('padding-top')) - parseFloat(th.css('padding-bottom'))); } that.pullData(that.page); //请求数据 that.events(); //事件 }; // 卡片模式获取排序的字段 Class.prototype.getSortcols = function (arr) { var that = this, options = that.config; var unique = function (array) { var temp = []; var index = []; var l = array.length; for (var i = 0; i < l; i++) { for (var j = i + 1; j < l; j++) { if (array[i].field === array[j].field) { i++; j = i; } } temp.push(array[i]); index.push(i); } return temp; } if (options.sortcols[0].length == 1 && options.mode == 'cardListMode') { var lis = []; that.eachCols(function (i, item) { if (item.field && item.type == 'normal') { var sortStr = { field: item.field, title: item.title, hide: item.hide, key: item.key }; lis.push(sortStr); } }); var sortcolsArry = []; var lisArry = that.config.sortcols[0].concat(lis); var lisArry1 = unique(lisArry); sortcolsArry.push(lisArry1); that.config.sortcols = sortcolsArry; } }; //获取用户私有数据:自定义列 Class.prototype.getUserPdata = function () { var that = this, options = that.config; //是否配置了用户私有数据id if (options && options.updId) { var params = { 'updId': options.updId } // that.loadingnews(true); var updColumns; $.ajax({ type: 'post', url: layui.cache['contentPath'] + '/admin/coreupd/query', async: false, // contentType: options.contentType, data: params, dataType: 'json', success: function (res) { //如果有数据解析的回调,则获得其返回的数据 if (res && res[options.response.statusName] == options.response.statusCode) { updColumns = res[options.response.dataName] || []; } }, error: function (e, m) { //请求失败,不做任何处理 } }); if (updColumns) return updColumns; } } //设置用户私有数据:自定义列 Class.prototype.setUserPdata = function (updColumns) { var that = this, options = that.config; if (options && options.updId && updColumns) { var datas = {}; layui.each(updColumns, function (i1, data1) { if (data1 && data1.UPD_CONTENT) { data1 = eval('(' + data1.UPD_CONTENT + ')'); layui.each(data1, function (i2, data2) { if (data2 && data2.field) { datas[data2.field] = data2; } }); } }); if (!that.config.userPdatas) { $.extend(that.config, { 'userPdatas': {} }); } $.extend(that.config.userPdatas, datas); //设置自定义列 layui.each(options.cols, function (c1, item1) { layui.each(item1, function (c2, item2) { if (item2.field && datas[item2.field]) { // that.config.cols[c1][c2].hide = datas[item2.field].hide; item2.hide = datas[item2.field].hide; } }); }); } } //保存用户私有数据:自定义列 Class.prototype.saveUserPdata = function (updColumns) { var that = this, options = that.config; if (options && options.updId && updColumns) { var datas = {}; layui.each(updColumns, function (i2, data2) { if (data2 && data2.field) { datas[data2.field] = data2; } }); if (!that.config.userPdatas) { $.extend(that.config, { 'userPdatas': {} }); } $.extend(that.config.userPdatas, datas); var updCols = []; $.each(that.config.userPdatas, function (i, t) { updCols.push(t); }); var params = { 'UPD_CONTENT': JSON.stringify(updCols), 'UPD_SHIYCJID': options.updId, 'UPD_SHIFQY': 1 } $.ajax({ type: 'post', url: layui.cache['contentPath'] + '/admin/coreupd/modify', data: params, dataType: 'json', success: function (res) { //请求成功,不做任何处理 }, error: function (e, m) { //请求失败,不做任何处理 } }); } } //根据列类型,定制化参数 Class.prototype.initOpts = function (item) { var that = this , options = that.config , initWidth = { checkbox: 48 , radio: 48 , space: 15 , numbers: 40 }; //让 type 参数兼容旧版本 if (item.checkbox) item.type = "checkbox"; if (item.space) item.type = "space"; if (!item.type) item.type = "normal"; if (item.type !== "normal") { item.unresize = true; item.width = item.width || initWidth[item.type]; } }; //初始化一些参数 Class.prototype.setInit = function (type) { var that = this , options = that.config; options.clientWidth = options.width || function () { //获取容器宽度 //如果父元素宽度为0(一般为隐藏元素),则继续查找上层元素,直到找到真实宽度为止 var getWidth = function (parent) { var width, isNone; parent = parent || options.elem.parent() width = parent.width(); try { isNone = parent.css('display') === 'none'; } catch (e) { } if (parent[0] && (!width || isNone)) return getWidth(parent.parent()); return width; }; return getWidth(); }(); if (type === 'width') return options.clientWidth; //初始化列参数 layui.each(options.cols, function (i1, item1) { layui.each(item1, function (i2, item2) { //如果列参数为空,则移除 if (!item2) { item1.splice(i2, 1); return; } item2.key = i1 + '-' + i2; item2.hide = item2.hide || false; //设置列的父列索引 //如果是组合列,则捕获对应的子列 if (item2.colGroup || item2.colspan > 1) { var childIndex = 0; layui.each(options.cols[i1 + 1], function (i22, item22) { //如果子列已经被标注为{HAS_PARENT},或者子列累计 colspan 数等于父列定义的 colspan,则跳出当前子列循环 if (item22.HAS_PARENT || (childIndex > 1 && childIndex == item2.colspan)) return; item22.HAS_PARENT = true; item22.parentKey = i1 + '-' + i2; childIndex = childIndex + parseInt(item22.colspan > 1 ? item22.colspan : 1); }); item2.colGroup = true; //标注是组合列 } //根据列类型,定制化参数 that.initOpts(item2); }); }); }; //初始工具栏 Class.prototype.renderToolbar = function () { var that = this , options = that.config //添加工具栏左侧模板 var leftDefaultTemp = [ '
' , '
' , '
' ].join('') , elemToolTemp = that.layTool.find('.layui-table-tool-temp'); if (options.toolbar === 'default') { elemToolTemp.html(leftDefaultTemp); } else if (options.toolbar) { var toolbarHtml = $(options.toolbar).html() || ''; toolbarHtml && elemToolTemp.html( laytpl(toolbarHtml).render(options) ); } //添加工具栏右侧面板 var layout = { filter: { title: '筛选列' , layEvent: 'LAYTABLE_COLS' , icon: 'layui-icon-cols' } , exports: { title: '导出' , layEvent: 'LAYTABLE_EXPORT' , icon: 'layui-icon-export' } , print: { title: '打印' , layEvent: 'LAYTABLE_PRINT' , icon: 'layui-icon-print' } }, iconElem = []; if (typeof options.defaultToolbar === 'object') { layui.each(options.defaultToolbar, function (i, item) { var thisItem = layout[item]; if (thisItem) { iconElem.push('
' + '' + '
'); } }); } that.layTool.find('.layui-table-tool-self').html(iconElem.join('')); var elemtoolSelf = that.layTool.find('.layui-table-tool-self'); elemToolTemp.css("padding-right", elemtoolSelf.width() + 17 + 'px'); } //同步表头父列的相关值 Class.prototype.setParentCol = function (hide, parentKey) { var that = this , options = that.config , parentTh = that.layHeader.find('th[data-key="' + options.index + '-' + parentKey + '"]') //获取父列元素 , parentColspan = parseInt(parentTh.attr('colspan')) || 0; if (parentTh[0]) { var arrParentKey = parentKey.split('-') , getThisCol = options.cols[arrParentKey[0]][arrParentKey[1]]; hide ? parentColspan-- : parentColspan++; parentTh.attr('colspan', parentColspan); parentTh[parentColspan < 1 ? 'addClass' : 'removeClass'](HIDE); getThisCol.colspan = parentColspan; //同步 colspan 参数 getThisCol.hide = parentColspan < 1; //同步 hide 参数 //递归,继续往上查询是否有父列 var nextParentKey = parentTh.data('parentkey'); nextParentKey && that.setParentCol(hide, nextParentKey); } }; //多级表头补丁 Class.prototype.setColsPatch = function () { var that = this , options = that.config //同步表头父列的相关值 layui.each(options.cols, function (i1, item1) { layui.each(item1, function (i2, item2) { if (item2.hide) { that.setParentCol(item2.hide, item2.parentKey); } }); }); }; //动态分配列宽 Class.prototype.setColsWidth = function () { var that = this , options = that.config , colNums = 0 //列个数 , autoColNums = 0 //自动列宽的列个数 , autoWidth = 0 //自动列分配的宽度 , countWidth = 0 //所有列总宽度和 , cntrWidth = that.setInit('width'); //统计列个数 that.eachCols(function (i, item) { item.hide || colNums++; }); //减去边框差和滚动条宽 cntrWidth = cntrWidth - function () { return (options.skin === 'line' || options.skin === 'nob') ? 2 : colNums + 1; }() - that.getScrollWidth(that.layMain[0]) - 1; //计算自动分配的宽度 var getAutoWidth = function (back) { //遍历所有列 layui.each(options.cols, function (i1, item1) { layui.each(item1, function (i2, item2) { var width = 0 , minWidth = item2.minWidth || options.cellMinWidth; //最小宽度 if (!item2) { item1.splice(i2, 1); return; } if (item2.colGroup || item2.hide) return; if (!back) { width = item2.width || 0; if (/\d+%$/.test(width)) { //列宽为百分比 width = Math.floor((parseFloat(width) / 100) * cntrWidth); width < minWidth && (width = minWidth); } else if (!width) { //列宽未填写 item2.width = width = 0; autoColNums++; } } else if (autoWidth && autoWidth < minWidth) { autoColNums--; width = minWidth; } if (item2.hide) width = 0; countWidth = countWidth + width; }); }); //如果未填充满,则将剩余宽度平分 (cntrWidth > countWidth && autoColNums) && ( autoWidth = (cntrWidth - countWidth) / autoColNums ); } getAutoWidth(); getAutoWidth(true); //重新检测分配的宽度是否低于最小列宽 //记录自动列数 that.autoColNums = autoColNums; //设置列宽 that.eachCols(function (i3, item3) { var minWidth = item3.minWidth || options.cellMinWidth; if (item3.colGroup || item3.hide) return; //给位分配宽的列平均分配宽 if (item3.width === 0) { that.getCssRule(options.index + '-' + item3.key, function (item) { item.style.width = Math.floor(autoWidth >= minWidth ? autoWidth : minWidth) + 'px'; }); } //给设定百分比的列分配列宽 else if (/\d+%$/.test(item3.width)) { that.getCssRule(options.index + '-' + item3.key, function (item) { item.style.width = Math.floor((parseFloat(item3.width) / 100) * cntrWidth) + 'px'; }); } }); //填补 Math.floor 造成的数差 var patchNums = that.layMain.width() - that.getScrollWidth(that.layMain[0]) - that.layMain.children('table').outerWidth(); if (that.autoColNums && patchNums >= -colNums && patchNums <= colNums) { var getEndTh = function (th) { var field; th = th || that.layHeader.eq(0).find('thead th:last-child') field = th.data('field'); if (!field && th.prev()[0]) { return getEndTh(th.prev()) } return th } , th = getEndTh() , key = th.data('key'); that.getCssRule(key, function (item) { var width = item.style.width || th.outerWidth(); item.style.width = (parseFloat(width) + patchNums) + 'px'; //二次校验,如果仍然出现横向滚动条(通常是 1px 的误差导致) if (that.layMain.height() - that.layMain.prop('clientHeight') > 0) { item.style.width = (parseFloat(item.style.width) - 1) + 'px'; } }); } that.loading(!0); }; //重置表格尺寸/结构 Class.prototype.resize = function () { var that = this; that.fullSize(); //让表格铺满 that.setColsWidth(); //自适应列宽 that.scrollPatch(); //滚动条补丁 }; //表格完整重载 Class.prototype.reload = function (options) { var that = this, opts = that.config; if (that.config.data && that.config.data.constructor === Array) delete that.config.data; //判断是否切换模式 var bChangeMode = false; if (opts.updId && opts.mode && options.mode && opts.mode != options.mode) { bChangeMode = true; } that.config = $.extend({}, that.config, options); //同步获取用户私有数据 if (bChangeMode) { //设置用户私有化参数 var updDatas = that.getUserPdata(); if (updDatas) { that.setUserPdata(updDatas); } } that.render(); }; //页码 Class.prototype.page = 1; //获得数据 Class.prototype.pullData = function (curr) { var that = this , options = that.config , request = options.request , response = options.response , sort = function () { if (typeof options.initSort === 'object') { // 由于数据源可以多个字段排序,所以排序标识需要循环出来 if (options.dataSource && options.initSort) { for (var key in options.initSort) { that.sort(key, options.initSort[key]); } } else { that.sort(options.initSort.field, options.initSort.type); } } }; that.startTime = new Date().getTime(); //渲染开始时间 if (options.url) { //Ajax请求 var params = {}; if (options.page) { params[request.pageName] = String(curr); params[request.limitName] = String(options.limit); } //参数 var data = $.extend(params, options.where); if (options.contentType && options.contentType.indexOf("application/json") == 0) { //提交 json 格式 data = JSON.stringify(data); } $.ajax({ type: options.method || 'get' , url: options.url , contentType: options.contentType , traditional: options.traditional , data: data , dataType: 'json' , headers: options.headers || {} , success: function (res) { //如果有数据解析的回调,则获得其返回的数据 if (typeof options.parseData === 'function') { res = options.parseData(res) || res; } //检查数据格式是否符合规范 if (res[response.statusName] != response.statusCode) { that.renderForm(); that.layMain.html('
' + ( res[response.msgName] || ('返回的数据不符合规范,正确的成功状态码 (' + response.statusName + ') 应为:' + response.statusCode) ) + '
'); } else { that.renderData(res, curr, res[response.countName]), sort(); options.time = (new Date().getTime() - that.startTime) + ' ms'; //耗时(接口请求+视图渲染) } that.setColsWidth(); typeof options.done === 'function' && options.done(res, curr, res[response.countName]); } , error: function (e, m) { that.layMain.html('
数据接口请求异常:' + m + '
'); that.renderForm(); that.setColsWidth(); } }); } else if (options.dataSource) { //根据数据集渲染 var res = {} , startLimit = curr * options.limit - options.limit; if (typeof options.parseData === 'function') { res = options.parseData(res) || res; } res[response.dataName] = options.data; res[response.countName] = options.count; that.renderData(res, curr, res[response.countName]), sort(); options.time = (new Date().getTime() - that.startTime) + ' ms'; //耗时(接口请求+视图渲染) that.setColsWidth(); typeof options.done === 'function' && options.done(res, curr, res[response.countName]); } else if (options.data && options.data.constructor === Array) { //已知数据 var res = {} , startLimit = curr * options.limit - options.limit res[response.dataName] = options.data.concat().splice(startLimit, options.limit); res[response.countName] = options.data.length; that.renderData(res, curr, options.data.length), sort(); that.setColsWidth(); typeof options.done === 'function' && options.done(res, curr, res[response.countName]); } }; //遍历表头 Class.prototype.eachCols = function (callback) { var that = this; table.eachCols(null, callback, that.config.cols); return that; }; //遍历统计内容,用于卡片列表 Class.prototype.eachTotalCols = function (callback) { var that = this; table.eachTotalCols(null, callback, that.config.totalcols); return that; }; //数据渲染 Class.prototype.renderData = function (res, curr, count, sort) { var that = this , options = that.config , data = res[options.response.dataName] || [] , trs = [] , trs_fixed = [] , trs_fixed_r = [] //渲染视图 , render = function () { //后续性能提升的重点 var thisCheckedRowIndex; if (!sort && that.sortKey) { return that.sort(that.sortKey.field, that.sortKey.sort, true); } layui.each(data, function (i1, item1) { var tds = [], tds_fixed = [], tds_fixed_r = [], divs = [], infotds = [] , numbers = i1 + options.limit * (curr - 1) + 1; //序号 //if (item1.length === 0) return; if (!sort) { item1[table.config.indexName] = i1; } that.eachCols(function (i3, item3) { var field = item3.field || i3 , key = options.index + '-' + item3.key , content = item1[field] , title = item3.title; if (content === undefined || content === null) content = ''; if (item3.colGroup) return; if (options.mode == "imgListMode") { //td内容 if (item3.type == "checkbox" || item3.type == "radio" || item3.type == "numbers") { var td = []; td = ['' , '
' + function () { var tplData = $.extend(true, { LAY_INDEX: numbers }, item1) , checkName = table.config.checkName; //渲染不同风格的列 switch (item3.type) { case 'checkbox': // 分页勾选逻辑 start var itemValue = item1[that.config.onlyKey]; // 获取唯一值用于判断(默认rwid) var ischecked = that.checkedDefault(itemValue, i1); // 分页勾选逻辑 end return ''; break; case 'radio': if (tplData[checkName]) { thisCheckedRowIndex = i1; } return ''; break; case 'numbers': return numbers; break; }; }() , '
'].join(''); } else { var info = []; info = ['
  • ' , '
    ' + function () { var tplData = $.extend(true, { LAY_INDEX: numbers }, item1) //解析工具列模板 if (item3.toolbar) { return laytpl($(item3.toolbar).html() || '').render(tplData); } return item3.templet ? function () { return typeof item3.templet === 'function' ? item3.templet(tplData) : laytpl($(item3.templet).html() || String(content)).render(tplData) }() : content; }() , '
  • '].join(''); } divs.push(info); } else if (options.mode == "cardListMode") { //渲染不同风格的列 var tplData = $.extend(true, { LAY_INDEX: numbers }, item1) , checkName = table.config.checkName; var td = []; var infotd = [] switch (item3.type) { case 'checkbox': // 分页勾选逻辑 start var itemValue = item1[that.config.onlyKey]; // 获取唯一值用于判断(默认rwid) var ischecked = that.checkedDefault(itemValue, i1); // 分页勾选逻辑 end td = ['
    '].join(''); break; case 'radio': if (tplData[checkName]) { thisCheckedRowIndex = i1; } td = ['
    '].join(''); break; case 'image': td = ['
    ' + function () { var tplData = $.extend(true, { LAY_INDEX: numbers }, item1); return item3.templet ? function () { return typeof item3.templet === 'function' ? item3.templet(tplData) : laytpl($(item3.templet).html() || String(content)).render(tplData) }() : content; }() , '
    '].join(''); break; default: infotd = ['
    ' + function () { var tplData = $.extend(true, { LAY_INDEX: numbers }, item1); //解析工具列模板 if (item3.toolbar) { return laytpl($(item3.toolbar).html() || '').render(tplData); } return item3.templet ? function () { return typeof item3.templet === 'function' ? item3.templet(tplData) : laytpl($(item3.templet).html() || String(content)).render(tplData) }() : (title + ':' + content); }() , '
    '].join(''); }; if (infotd.length != 0) { infotds.push(infotd) } } else { //td内容 var td = ['' , '
    ' + function () { var tplData = $.extend(true, {}, { LAY_INDEX: numbers }, item1) , checkName = table.config.checkName; //渲染不同风格的列 switch (item3.type) { case 'checkbox': // 分页勾选逻辑 start var itemValue = item1[that.config.onlyKey]; // 获取唯一值用于判断(默认rwid) var ischecked = that.checkedDefault(itemValue, i1); // 分页勾选逻辑 end return ''; break; case 'radio': if (tplData[checkName]) { thisCheckedRowIndex = i1; } return ''; break; case 'numbers': return numbers; break; case 'currency': if (!item3.templet) { if (item3.tofix) { return table.formatNumberByPermil(parseFloat(item1[item3.field]).toFixed(parseInt(item3.tofix))); } else { return table.formatNumberByPermil(item1[item3.field]); } } break; }; //解析工具列模板 if (item3.toolbar) { return laytpl($(item3.toolbar).html() || '').render(tplData); } if (item3.edit == 'select' && item3.list) { var opts = item3.list(); for (let i = 0; i < opts.length; i++) { const opt = opts[i]; if (opt.key == content) { return opt.name } } } return item3.templet ? function () { return typeof item3.templet === 'function' ? item3.templet(tplData) : laytpl($(item3.templet).html() || String(content)).render(tplData) }() : (item3.tofix ? parseFloat(content).toFixed(parseInt(item3.tofix)) : content); }() , '
    '].join(''); } tds.push(td); if (options.mode != "cardListMode") { if (item3.fixed && item3.fixed !== 'right') tds_fixed.push(td); if (item3.fixed === 'right') tds_fixed_r.push(td); } }); // 三种列表模式拼接 if (options.mode == "imgListMode") { // 创建一个标题头部的数据,遍历一下赋值,只循环一次 var setsing_obj = options.setsing; var table_nfo_cell = ''; if (setsing_obj) { var ul_list = []; for (var j = 0, len = setsing_obj.length; j < len; j++) { if (item1) { ul_list.push('
  • ' + setsing_obj[j].title + ':' + item1[setsing_obj[j].field] + '
  • '); } } table_nfo_cell = '
    '; } trs.push('' + tds.join('') + '' + table_nfo_cell + '
    '); // trs_fixed.push('' + tds_fixed.join('') + ''); // trs_fixed_r.push('' + tds_fixed_r.join('') + ''); } else if (options.mode == "cardListMode") { if (options.vertical) { trs.push('
    ' + tds.join('') + '
    ' + infotds.join('') + '
    '); } else { trs.push('
    ' + tds.join('') + '
    ' + infotds.join('') + '
    '); } } else { trs.push('' + tds.join('') + ''); trs_fixed.push('' + tds_fixed.join('') + ''); trs_fixed_r.push('' + tds_fixed_r.join('') + ''); } }); that.layBody.scrollTop(0); that.layMain.find('.' + NONE).remove(); if (options.mode == "cardListMode") { var layConent = '.layui-table'; } else { var layConent = 'tbody'; } that.layMain.find(layConent).html(trs.join('')); if (options.mode == "listMode") { that.layFixLeft.find('tbody').html(trs_fixed.join('')); that.layFixRight.find('tbody').html(trs_fixed_r.join('')); } if ($(".imgbox a").length > 0) { var imgboxH = $(".imgbox a").height(); if (imgboxH) { $(".imgbox a").css("line-height", imgboxH + 'px'); } } // 表格里面有下拉框的添加样式 if ($(".layui-table-cell").find('select').length > 0) { $(".layui-table-cell").find('select').parent(".layui-table-cell").css('overflow', 'visible'); $(".layui-table-cell").find('select').parent(".layui-table-cell").addClass('layui-table-cell-active') } that.renderForm(); typeof thisCheckedRowIndex === 'number' && that.setThisRowChecked(thisCheckedRowIndex); that.syncCheckAll(); that.scrollPatch(); /* that.haveInit ? that.scrollPatch() : setTimeout(function(){ that.scrollPatch(); }, 50); that.haveInit = true; */ layer.close(that.tipsIndex); that.loadingnews(true); //同步表头父列的相关值 options.HAS_SET_COLS_PATCH || that.setColsPatch(); options.HAS_SET_COLS_PATCH = true; }; that.key = options.id || options.index; table.cache[that.key] = data; //记录数据 //设置当前选中数据参数开启翻页勾选状态 flipCheck if (that.config.flipCheck && table.checkedMultiList[that.key] == null) { table.checkedMultiList[that.key] = []; } //显示隐藏分页栏 that.layPage[(count == 0 || (data.length === 0 && curr == 1)) ? 'addClass' : 'removeClass'](HIDE); //排序 if (sort) { return render(); } if (data.length === 0) { that.renderForm(); that.layFixed.remove(); that.layMain.find('tbody').html(''); that.layMain.find('.' + NONE).remove(); // return that.layMain.append('
    '+ options.text.none +'
    '); var imgtop = 0, imgsize = 0, fontszie = 0, fonttop = 0; if (that.layMain.height() > 150) { imgtop = '40px'; imgsize = '80px'; fontszie = '22px'; fonttop = '10px' } else { imgtop = '10px'; imgsize = '40px'; fontszie = '14px'; fonttop = '5px' } return that.layMain.append('
    ' + '
    ' + ' ' + '
    ' + options.text.none + '
    ' + '
    ' + '
    '); } //
    // //
    没有数据
    //
    render(); //渲染数据 that.renderTotal(data); //数据合计 //同步分页状态 if (options.page) { options.page = $.extend({ elem: 'layui-table-page' + options.index , count: count , limit: options.limit , limits: options.limits || [20, 50, 100, 200, 500, 1000] , groups: 3 , layout: ['prev', 'page', 'next', 'skip', 'count', 'limit'] , prev: '' , next: '' , jump: function (obj, first) { if (!first) { //分页本身并非需要做以下更新,下面参数的同步,主要是因为其它处理统一用到了它们 //而并非用的是 options.page 中的参数(以确保分页未开启的情况仍能正常使用) //that.page = obj.curr; //更新页码 options.limit = obj.limit; //更新每页条数 that.loadingnews(); if (options.dataSource) { var ds = options.dataSource; ds.reload({ params: { page: obj.curr, limit: obj.limit } }); } else { that.pullData(obj.curr); } } } }, options.page); options.page.count = count; //更新总条数 laypage.render(options.page); } }; //数据合计行 Class.prototype.renderTotal = function (data) { var that = this , options = that.config , totalNums = {}; if (!options.totalRow) return; layui.each(data, function (i1, item1) { if (item1.length === 0) return; if (options.mode == "cardListMode") { that.eachTotalCols(function (i3, item3) { var field = item3.field || i3 , content = item1[field]; if (item3.totalRow) { totalNums[field] = that.add((totalNums[field] || 0), (parseFloat(content) || 0)); } }); } else { that.eachCols(function (i3, item3) { var field = item3.field || i3 , content = item1[field]; if (item3.totalRow) { totalNums[field] = that.add((totalNums[field] || 0), (parseFloat(content) || 0)); } }); } }); var tds = []; if (options.mode == "cardListMode") { that.eachTotalCols(function (i3, item3) { var field = item3.field || i3 if (item3.hide) return; //td内容 var td = ['
    ' + function () { var text = item3.totalRowText || '' , unit = item3.unit || '' , total = parseFloat(item3.total) || 0 , classname = item3.classname || 'total' + i3 , decimal = item3.decimal; if (item3.totalRow && !item3.checkstate) { return item3.totalRow ? (text + '' + (decimal ? totalNums[field].toFixed(2) : totalNums[field]) + '' + unit) : text; } else { return text + '' + (decimal ? total.toFixed(2) : total) + '' + unit; } }() , '
    '].join(''); tds.push(td); }); that.layTotal.find('.layui-table-total-box').html(tds.join('')); } else { that.eachCols(function (i3, item3) { var field = item3.field || i3; if (item3.hide) return; if (item3.tofix) { totalNums[field] = parseFloat(totalNums[field]).toFixed(parseInt(item3.tofix)); } //td内容 var td = ['' , '
    ' + function () { var text = item3.totalRowText || ''; return item3.totalRow ? (item3.type === 'currency' ? table.formatNumberByPermil((totalNums[field] || text)) : (totalNums[field] || text)) : text; }() , '
    '].join(''); tds.push(td); }); that.layTotal.find('tbody').html('' + tds.join('') + ''); } }; //选中数据合计行 Class.prototype.renderCheckTotal = function (data) { var that = this , options = that.config , totalNums = {}; if (!options.totalRow) return; layui.each(data, function (i1, item1) { if (item1.length === 0) return; that.eachTotalCols(function (i3, item3) { var field = item3.field || i3 , content = item1[field]; if (item3.totalRow) { totalNums[field] = that.add((totalNums[field] || 0), (parseFloat(content) || 0)); } }); }); that.eachTotalCols(function (i3, item3) { var field = item3.field || i3 if (item3.hide) return; var text = item3.totalRowText || '' , unit = item3.unit || '' , classname = item3.classname || 'total' + i3 , decimal = item3.decimal , checkNums = totalNums[field] ? totalNums[field] : 0.00; if (item3.checkstate) { if (item3.field) { that.layTotal.find('.layui-table-total-box .' + classname).text(decimal ? checkNums.toFixed(2) : checkNums); } else { that.layTotal.find('.layui-table-total-box .' + classname).text(data.length); } } }); }; Class.prototype.add = function (arg1, arg2) { var r1, r2, m, c; try { r1 = arg1.toString().split(".")[1].length; } catch (e) { r1 = 0; } try { r2 = arg2.toString().split(".")[1].length; } catch (e) { r2 = 0; } c = Math.abs(r1 - r2); m = Math.pow(10, Math.max(r1, r2)); if (c > 0) { var cm = Math.pow(10, c); if (r1 > r2) { arg1 = Number(arg1.toString().replace(".", "")); arg2 = Number(arg2.toString().replace(".", "")) * cm; } else { arg1 = Number(arg1.toString().replace(".", "")) * cm; arg2 = Number(arg2.toString().replace(".", "")); } } else { arg1 = Number(arg1.toString().replace(".", "")); arg2 = Number(arg2.toString().replace(".", "")); } return (arg1 + arg2) / m; }; //找到对应的列元素 Class.prototype.getColElem = function (parent, key) { var that = this , options = that.config; return parent.eq(0).find('.laytable-cell-' + (options.index + '-' + key) + ':eq(0)'); }; //渲染表单 Class.prototype.renderForm = function (type) { form.render(type, 'LAY-table-' + this.index); }; //标记当前行选中状态 Class.prototype.setThisRowChecked = function (index) { var that = this , options = that.config , ELEM_CLICK = 'layui-table-click' , ELEM_OBJ = (options.mode == 'cardListMode' ? '.card-item' : 'tr') , tr = that.layBody.find(ELEM_OBJ + '[data-index="' + index + '"]'); tr.addClass(ELEM_CLICK).siblings('tr').removeClass(ELEM_CLICK); }; //数据排序 Class.prototype.sort = function (th, type, pull, formEvent) { var that = this , field , res = {} , options = that.config , elemobj = (options.mode == 'cardListMode' ? 'li' : 'th') , filter = options.elem.attr('lay-filter') , data = table.cache[that.key], thisData; //字段匹配 if (typeof th === 'string') { that.layHeader.find(elemobj).each(function (i, item) { var othis = $(this) , _field = othis.data('field'); if (_field === th) { th = othis; field = _field; return false; } }); } try { var field = field || th.data('field') , key = th.data('key'); //如果欲执行的排序已在状态中,则不执行渲染 if (that.sortKey && !pull) { if (field === that.sortKey.field && type === that.sortKey.sort) { return; } } var elemSort = that.layHeader.find(elemobj + ' .laytable-cell-' + key).find(ELEM_SORT); if (!options.dataSource) { that.layHeader.find(elemobj).find(ELEM_SORT).removeAttr('lay-sort'); //清除其它标题排序状态 } elemSort.attr('lay-sort', type || null); if (options.mode != "cardListMode") { that.layFixed.find('th') } } catch (e) { return hint.error('Table modules: Did not match to field'); } //记录排序索引和类型 that.sortKey = { field: field , sort: type }; if (!options.sortload) { if (type === 'asc') { //升序 thisData = layui.sort(data, field); } else if (type === 'desc') { //降序 thisData = layui.sort(data, field, true); } else { //清除排序 thisData = layui.sort(data, table.config.indexName); delete that.sortKey; } } res[options.response.dataName] = thisData || data; that.renderData(res, that.page, that.count, true); // that.pullData(); if (formEvent) { layui.event.call(th, MOD_NAME, 'sort(' + filter + ')', { field: field , type: type }); } }; //请求loading Class.prototype.loading = function (hide) { var that = this , options = that.config; if (options.loading) { if (hide) { that.layInit && that.layInit.remove(); delete that.layInit; that.layBox.find(ELEM_INIT).remove() } else { that.layInit = $(['
    ' , '' , '
    '].join('')); that.layBox.append(that.layInit); } } }; Class.prototype.loadingnews = function (hide) { var that = this, index = layer.msg('数据查询中,请稍候...', { icon: 16, time: false, shade: 0.1 }); if (hide) { layer.close(index); } } //同步选中值状态 Class.prototype.setCheckData = function (index, checked) { var that = this , options = that.config , thisData = table.cache[that.key]; if (!thisData[index]) return; if (thisData[index].constructor === Array) return; thisData[index][options.checkName] = checked; }; //同步全选按钮状态 Class.prototype.syncCheckAll = function () { var that = this , options = that.config , checkAllElem = that.layHeader.find('input[name="layTableCheckbox"]') , syncColsCheck = function (checked) { that.eachCols(function (i, item) { if (item.type === 'checkbox') { item[options.checkName] = checked; } }); return checked; }; if (!checkAllElem[0]) return; if (table.checkStatus(that.key).isAll) { if (!checkAllElem[0].checked) { checkAllElem.prop('checked', true); that.renderForm('checkbox'); } syncColsCheck(true); } else { if (checkAllElem[0].checked) { checkAllElem.prop('checked', false); that.renderForm('checkbox'); } syncColsCheck(false); } }; //获取cssRule Class.prototype.getCssRule = function (key, callback) { var that = this , style = that.elem.find('style')[0] , sheet = style.sheet || style.styleSheet || {} , rules = sheet.cssRules || sheet.rules; layui.each(rules, function (i, item) { if (item.selectorText === ('.laytable-cell-' + key)) { return callback(item), true; } }); }; //让表格铺满 Class.prototype.fullSize = function () { var that = this , options = that.config , height = options.height, bodyHeight; if (that.fullHeightGap) { height = _WIN.height() - that.fullHeightGap; if (height < 135) height = 135; that.elem.css('height', height); } if (!height) return; //减去列头区域的高度 bodyHeight = parseFloat(height) - (that.layHeader.outerHeight() || 38); //此处的数字常量是为了防止容器处在隐藏区域无法获得高度的问题,暂时只对默认尺寸的表格做支持。 //减去工具栏的高度 if (options.toolbar) { bodyHeight = bodyHeight - (that.layTool.outerHeight() || 50); } //减去统计朗的高度 if (options.totalRow) { bodyHeight = bodyHeight - (that.layTotal.outerHeight() || 40); } //减去分页栏的高度 if (options.page) { bodyHeight = bodyHeight - (that.layPage.outerHeight() || 41) - 2; } that.layMain.css('height', bodyHeight); }; //获取滚动条宽度 Class.prototype.getScrollWidth = function (elem) { var width = 0; if (elem) { width = elem.offsetWidth - elem.clientWidth; } else { elem = document.createElement('div'); elem.style.width = '100px'; elem.style.height = '100px'; elem.style.overflowY = 'scroll'; document.body.appendChild(elem); width = elem.offsetWidth - elem.clientWidth; document.body.removeChild(elem); } return width; }; //滚动条补丁 Class.prototype.scrollPatch = function () { var that = this , options = that.config , elemobj = (options.mode == 'cardListMode' ? '.layui-table' : 'table') , layMainTable = that.layMain.children(elemobj) , scollWidth = that.layMain.width() - that.layMain.prop('clientWidth') //纵向滚动条宽度 , scollHeight = that.layMain.height() - that.layMain.prop('clientHeight') //横向滚动条高度 , getScrollWidth = that.getScrollWidth(that.layMain[0]) //获取主容器滚动条宽度,如果有的话 , outWidth = layMainTable.outerWidth() - that.layMain.width() //表格内容器的超出宽度 //添加补丁 , addPatch = function (elem) { if (scollWidth && scollHeight) { elem = elem.eq(0); if (!elem.find('.layui-table-patch')[0]) { var patchElem = $('
    '); //补丁元素 patchElem.find('div').css({ width: scollWidth }); elem.find('tr').append(patchElem); } } else { elem.find('.layui-table-patch').remove(); } } addPatch(that.layHeader); addPatch(that.layTotal); //固定列区域高度 var mainHeight = that.layMain.height() , fixHeight = mainHeight - scollHeight; that.layFixed.find(ELEM_BODY).css('height', layMainTable.height() > fixHeight ? fixHeight : 'auto'); //表格宽度小于容器宽度时,隐藏固定列 that.layFixRight[outWidth > 0 ? 'removeClass' : 'addClass'](HIDE); //操作栏 that.layFixRight.css('right', scollWidth - 1); }; //设置页面默认选中(在表格渲染input的时候调用) Class.prototype.checkedDefault = function (itemValue, index) { var that = this , options = that.config , ischecked = ""; if (options.flipCheck) { var getOnlyKey = that.config.onlyKey; if (table.checkedMultiList[that.key] != null && table.checkedMultiList[that.key].length > 0) { var objFilter = table.checkedMultiList[that.key].filter(function (filterItem, filterIndex) { return filterItem[getOnlyKey] == itemValue; }); if (objFilter != null && objFilter.length > 0) { //设置选中状态 ischecked = "checked"; that.setCheckData(index, true) } } that.syncCheckAll(); } return ischecked } //事件处理 Class.prototype.events = function () { var that = this , options = that.config , _BODY = $('body') , elemobj = (options.mode == 'cardListMode' ? 'li' : 'th') , ELEM_OBJ = (options.mode == 'cardListMode' ? '.card-item' : 'tr') , dict = {} , th = that.layHeader.find(elemobj) , resizing , ELEM_CELL = '.layui-table-cell' , filter = options.elem.attr('lay-filter'); //工具栏操作事件 that.layTool.on('click', '*[lay-event]', function (e) { var othis = $(this) , events = othis.attr('lay-event') , openPanel = function (sets) { var list = $(sets.list) , panel = $(''); panel.html(list); othis.find('.layui-table-tool-panel')[0] || othis.append(panel); that.renderForm(); panel.on('click', function (e) { layui.stope(e); }); sets.done && sets.done(panel, list) }; layui.stope(e); _DOC.trigger('table.tool.panel.remove'); layer.close(that.tipsIndex); switch (events) { case 'LAYTABLE_COLS': //筛选列 openPanel({ list: function () { var lis = []; that.eachCols(function (i, item) { if (item.field && item.type == 'normal') { lis.push('
  • '); } }); return lis.join(''); }() , done: function () { form.on('checkbox(LAY_TABLE_TOOL_COLS)', function (obj) { var othis = $(obj.elem) , checked = this.checked , key = othis.data('key') , parentKey = othis.data('parentkey'); //保存用户私有数据 var upd = []; var sortStr = { field: othis.attr('name'), title: othis.attr('title'), hide: !checked, key: key }; layui.each(options.cols, function (i1, item1) { layui.each(item1, function (i2, item2) { if (i1 + '-' + i2 === key) { var hide = item2.hide; //同步勾选列的 hide 值和隐藏样式 item2.hide = !checked; that.elem.find('*[data-key="' + options.index + '-' + key + '"]') [checked ? 'removeClass' : 'addClass'](HIDE); //根据列的显示隐藏,同步多级表头的父级相关属性值 if (hide != item2.hide) { that.setParentCol(!checked, parentKey); } //适配 that.fullSize(); that.scrollPatch(); that.setColsWidth(); } if (item2.field && item2.type == 'normal') { upd.push({ 'field': item2.field, 'hide': item2.hide }); } }); }); that.saveUserPdata(upd); // 保存显示隐藏的状态 if (options.sortcols[0].length == 1 && options.mode == 'cardListMode') { var sortcolsArr = that.config.sortcols[0]; for (var i = 0; i < sortcolsArr.length; i++) { if (sortcolsArr[i].field == sortStr.field) { sortcolsArr[i] = sortStr; } } var sortcolsArry = []; sortcolsArry.push(sortcolsArr); that.config.sortcols = sortcolsArry; } }); } }); break; case 'LAYTABLE_EXPORT': //导出 if (device.ie) { layer.tips('导出功能不支持 IE,请用 Chrome 等高级浏览器导出', this, { tips: 3 }) } else { openPanel({ list: function () { return [ '
  • 导出到 Csv 文件
  • ' , '
  • 导出到 Excel 文件
  • ' ].join('') }() , done: function (panel, list) { list.on('click', function () { var type = $(this).data('type') table.exportFile(options.id, null, type); }); } }); } break; case 'LAYTABLE_PRINT': //打印 var printWin = window.open('打印窗口', '_blank') , style = [''].join('') , html = $(that.layHeader.html()); html.append(that.layMain.find('table').html()); html.find('th.layui-table-patch').remove(); html.find('.layui-table-col-special').remove(); printWin.document.write(style + html.prop('outerHTML')); printWin.document.close(); printWin.print(); printWin.close(); break; } layui.event.call(this, MOD_NAME, 'toolbar(' + filter + ')', $.extend({ event: events , config: options }, {})); }); //拖拽调整宽度 th.on('mousemove', function (e) { var othis = $(this) , oLeft = othis.offset().left , pLeft = e.clientX - oLeft; if (othis.data('unresize') || dict.resizeStart) { return; } dict.allowResize = othis.width() - pLeft <= 10; //是否处于拖拽允许区域 _BODY.css('cursor', (dict.allowResize ? 'col-resize' : '')); }).on('mouseleave', function () { var othis = $(this); if (dict.resizeStart) return; _BODY.css('cursor', ''); }).on('mousedown', function (e) { var othis = $(this); if (dict.allowResize) { var key = othis.data('key'); e.preventDefault(); dict.resizeStart = true; //开始拖拽 dict.offset = [e.clientX, e.clientY]; //记录初始坐标 that.getCssRule(key, function (item) { var width = item.style.width || othis.outerWidth(); dict.rule = item; dict.ruleWidth = parseFloat(width); dict.minWidth = othis.data('minwidth') || options.cellMinWidth; }); } }).on('mouseup', function (e) { var othis = $(this); var field = othis.data('field'); var key = othis.data('key'); e.preventDefault(); that.getCssRule(key, function (item) { var width = item.style.width || othis.outerWidth(); layui.each(that.config.cols, function (key, value) { layui.each(value, function (index, item) { if (item.field && item.field == field) { item.width = parseFloat(width) } }) }) }); }); //拖拽中 _DOC.on('mousemove', function (e) { if (dict.resizeStart) { e.preventDefault(); if (dict.rule) { var setWidth = dict.ruleWidth + e.clientX - dict.offset[0]; if (setWidth < dict.minWidth) setWidth = dict.minWidth; dict.rule.style.width = setWidth + 'px'; layer.close(that.tipsIndex); } resizing = 1 } }).on('mouseup', function (e) { if (dict.resizeStart) { dict = {}; _BODY.css('cursor', ''); that.scrollPatch(); } if (resizing === 2) { resizing = null; } }); //排序 th.on('click', function (e) { var othis = $(this) , elemSort = othis.find(ELEM_SORT) , nowType = elemSort.attr('lay-sort') , _field = othis.data('field') , type; if (!elemSort[0] || resizing === 1) return resizing = 2; if (nowType === 'asc') { type = 'desc'; } else if (nowType === 'desc') { type = null; } else { type = 'asc'; } // 不请求数据 if (!that.config.sortload) { that.sort(othis, type, null, true); } else { that.loadingnews(); if (options.dataSource) { // 数据源排序 var ds = options.dataSource; // sort数据源请求的参数 var sort = {}; // 设置默认的排序字段,组装已有的数据 that.config.initSort = that.config.initSort || {}; var sortField = that.config.initSort; for (var key in sortField) { sort[key] = sortField[key]; } sort[_field] = (type != null ? type : ''); // 记录当前排序的字段 that.config.initSort[_field] = type ds.reload({ sort: sort }); } else { table.reload(that.config.id, { initSort: { field: _field , type: type }, where: { FIELD: _field, ORDER: type } }); } } }).find(ELEM_SORT + ' .layui-edge ').on('click', function (e) { var othis = $(this) , index = othis.index() , field = othis.parents('th').eq(0).data('field') , type; layui.stope(e); if (index === 0) { type = 'asc' } else { type = 'desc' } if (!that.config.sortload) { that.sort(field, type, null, true); } else { that.loadingnews(); if (options.dataSource) { // 数据源排序 var ds = options.dataSource; // sort数据源请求的参数 var sort = {}; // 设置默认的排序字段 that.config.initSort = that.config.initSort || {}; var sortField = that.config.initSort; for (var key in sortField) { sort[key] = sortField[key]; } sort[field] = type; // 记录当前排序的字段 that.config.initSort[field] = type ds.reload({ sort: sort }); } else { table.reload(that.config.id, { initSort: { field: field , type: type }, where: { FIELD: field, ORDER: type } }); } } }); //数据行中的事件监听返回的公共对象成员 var commonMember = function (sets) { var othis = $(this) , ELEM_CHILD = (options.mode == 'cardListMode' ? 'dic' : 'td') , index = othis.parents(ELEM_OBJ).eq(0).data('index') , tr = that.layBody.find(ELEM_OBJ + '[data-index="' + index + '"]') , data = table.cache[that.key][index]; return $.extend({ tr: tr //行元素 , data: table.clearCacheKey(data) //当前行数据 , del: function () { //删除行数据 table.cache[that.key][index] = []; tr.remove(); that.scrollPatch(); } , update: function (fields) { //修改行数据 fields = fields || {}; layui.each(fields, function (key, value) { if (key in data) { var templet, td = tr.children(ELEM_CHILD + '[data-field="' + key + '"]'); data[key] = value; that.eachCols(function (i, item2) { if (item2.field == key && item2.templet) { templet = item2.templet; } }); td.children(ELEM_CELL).html(function () { return templet ? function () { return typeof templet === 'function' ? templet(data) : laytpl($(templet).html() || value).render(data) }() : value; }()); td.data('content', value); } }); } }, sets); }; //复选框选择 that.elem.on('click', 'input[name="layTableCheckbox"]+', function () { //替代元素的 click 事件 var checkbox = $(this).prev() , childs = that.layBody.find('input[name="layTableCheckbox"]') , index = checkbox.parents(ELEM_OBJ).eq(0).data('index') , checked = checkbox[0].checked , isAll = checkbox.attr('lay-filter') === 'layTableAllChoose'; //全选 if (isAll) { childs.each(function (i, item) { item.checked = checked; that.setCheckData(i, checked); }); that.syncCheckAll(); that.renderForm('checkbox'); } else { that.setCheckData(index, checked); that.syncCheckAll(); } if (that.config.flipCheck) { // 分页记录选择逻辑 start //当前选中数据 var checkRowData = []; //当前取消选中的数据 var cacelCheckedRowData = []; var getOnlyKey = that.config.onlyKey //选中 if (checked) { checkRowData = table.checkStatus(that.key).data; } //取消选中 else { if (isAll) { //当前页数据 var currentPageData = table.cache[that.key]; cacelCheckedRowData = currentPageData; } else { var thisData = table.cache[that.key]; if (!thisData[index]) return; if (thisData[index].constructor === Array) return; cacelCheckedRowData.push(thisData[index]); } } //debugger; //清除数据 $.each(cacelCheckedRowData, function (index, item) { var itemValue = item[that.config.onlyKey]; //debugger; table.checkedMultiList[that.key] = table.checkedMultiList[that.key].filter(function (fItem, fIndex) { return fItem[getOnlyKey] != itemValue; }) }); //添加选中数据 $.each(checkRowData, function (index, item) { //debugger; var itemValue = item[that.config.onlyKey]; var objFilter = table.checkedMultiList[that.key].filter(function (fItem, fIndex) { return fItem[getOnlyKey] == itemValue; }); if (objFilter == null || objFilter.length == 0) { var rowObj = {}; rowObj[getOnlyKey] = itemValue; if (that.config.attachFieldsName.length > 0) { $.each(that.config.attachFieldsName, function (objIndex, objItem) { rowObj[objItem] = item[objItem]; }); } else { rowObj = item; } table.checkedMultiList[that.key].push(rowObj); } }); } // 分页记录选择逻辑 end layui.event.call(checkbox[0], MOD_NAME, 'checkbox(' + filter + ')', commonMember.call(checkbox[0], { checked: checked , type: isAll ? 'all' : 'one' })); that.renderCheckTotal(table.checkStatus(that.key).data); }); //单选框选择 that.elem.on('click', 'input[lay-type="layTableRadio"]+', function () { var radio = $(this).prev() , checked = radio[0].checked , thisData = table.cache[that.key] , index = radio.parents('tr').eq(0).data('index') //重置数据单选属性 layui.each(thisData, function (i, item) { if (index === i) { item.LAY_CHECKED = true; } else { delete item.LAY_CHECKED; } }); that.setThisRowChecked(index); layui.event.call(this, MOD_NAME, 'radio(' + filter + ')', commonMember.call(this, { checked: checked })); }); //行事件 that.layBody.on('mouseenter', ELEM_OBJ, function () { //鼠标移入行 var othis = $(this) , index = othis.index(); that.layBody.find(ELEM_OBJ + ':eq(' + index + ')').addClass(ELEM_HOVER) }).on('mouseleave', ELEM_OBJ, function () { //鼠标移出行 var othis = $(this) , index = othis.index(); that.layBody.find(ELEM_OBJ + ':eq(' + index + ')').removeClass(ELEM_HOVER) }).on('click', ELEM_OBJ, function () { //单击行 setRowEvent.call(this, 'row'); }).on('dblclick', ELEM_OBJ, function () { //双击行 setRowEvent.call(this, 'rowDouble'); }); //创建行单击、双击事件监听 var setRowEvent = function (eventType) { var othis = $(this); var ELEM_CHILD = (options.mode == 'cardListMode' ? 'dic' : 'td') layui.event.call(this, MOD_NAME, eventType + '(' + filter + ')' , commonMember.call(othis.children(ELEM_CHILD)[0]) ); }; //单元格编辑 that.layBody.on('change', '.' + ELEM_EDIT, function () { var othis = $(this) , value = this.value , field = othis.parent().data('field') , index = othis.parents('tr').eq(0).data('index') , data = table.cache[that.key][index]; data[field] = value; //更新缓存中的值 layui.event.call(this, MOD_NAME, 'edit(' + filter + ')', commonMember.call(this, { value: value , field: field })); }).on('blur', '.' + ELEM_EDIT, function () { var templet , othis = $(this) , field = othis.parent().data('field') , index = othis.parents('tr').eq(0).data('index') , data = table.cache[that.key][index]; that.eachCols(function (i, item) { if (item.field == field && item.templet) { templet = item.templet; } }); if (othis.parent().data('edit') == 'select') { othis.siblings(ELEM_CELL).html(othis.find("option:selected").text()); } else { othis.siblings(ELEM_CELL).html(function (value) { return templet ? function () { return typeof templet === 'function' ? templet(data) : laytpl($(templet).html() || this.value).render(data) }() : value; }(this.value)); } othis.parent().data('content', this.value); othis.remove(); }); //单元格双击事件 that.layBody.on('dblclick', 'td', function () { var othis = $(this) , field = othis.data('field') , editType = othis.data('edit') , elemCell = othis.children(ELEM_CELL) , index = othis.parents('tr').eq(0).data('index') , data = table.cache[that.key][index]; if (options.event && options.event.onRowdbClick) { $('tr[data-index="' + index + '"]').addClass('layui-table-click').siblings().removeClass('layui-table-click'); options.event.onRowdbClick(field, data); } }); //单元格单击事件 that.layBody.on('click', 'td', function () { var othis = $(this) , field = othis.data('field') , editType = othis.data('edit') , elemCell = othis.children(ELEM_CELL) , index = othis.parents('tr').eq(0).data('index') , data = table.cache[that.key][index]; if (options.event && options.event.onRowClick) { $('tr[data-index="' + index + '"]').addClass('layui-table-click').siblings().removeClass('layui-table-click'); options.event.onRowClick(field, data); } layer.close(that.tipsIndex); if (othis.data('off')) return; //不触发事件 //显示编辑表单 if (editType == 'text') { var input = $(''); input[0].value = othis.data('content') || elemCell.text(); othis.find('.' + ELEM_EDIT)[0] || othis.append(input); input.focus(); return; } else if (editType == 'select') { var select = $(''; } if (data) { $.each(data, function (k, v) { if (v) { html += ''; } }) } html += ''; $("body").append(html); $("#downloadexcelform").prop('action', url); $("#downloadexcelform").submit(); }; //表格导出 table.exportFileZl = function (id, excelmodel) { var config = thisTable.config[id] || {} if (config.url) { //Ajax请求 var url = config.url; var params = {}; params[config.request.pageName] = 1; params[config.request.limitName] = 1000000; if (url.indexOf("?") > -1) { url = url.substring(0, url.indexOf("?")) + "export" + url.substring(url.indexOf("?"), url.length()); } else { url = url + "export"; } //参数 var data = $.extend(params, config.where); var html = (''; $("body").append(html); $("#downloadexcelform").prop('action', url); $("#downloadexcelform").submit(); }; } //表格导出 table.exportFile = function (id, data, type) { data = data || table.clearCacheKey(table.cache[id]); type = type || 'csv'; var config = thisTable.config[id] || {} , textType = ({ csv: 'text/csv' , xls: 'application/vnd.ms-excel' })[type] , alink = document.createElement("a"); if (device.ie) return hint.error('IE_NOT_SUPPORT_EXPORTS'); alink.href = 'data:' + textType + ';charset=utf-8,\ufeff' + encodeURIComponent(function () { var dataTitle = [], dataMain = []; layui.each(data, function (i1, item1) { var vals = []; if (typeof id === 'object') { //ID直接为表头数据 layui.each(id, function (i, item) { i1 == 0 && dataTitle.push(item || ''); }); layui.each(table.clearCacheKey(item1), function (i2, item2) { vals.push(item2); }); } else { table.eachCols(id, function (i3, item3) { if (item3.field && item3.type == 'normal' && !item3.hide) { i1 == 0 && dataTitle.push(item3.title || ''); vals.push(item1[item3.field]); } }); } dataMain.push(vals.join(',')) }); return dataTitle.join(',') + '\r\n' + dataMain.join('\r\n'); }()); alink.download = (config.title || 'table_' + (config.index || '')) + '.' + type; document.body.appendChild(alink); alink.click(); document.body.removeChild(alink); }; //重置表格尺寸结构 table.resize = function (id) { //如果指定表格唯一 id,则只执行该 id 对应的表格实例 if (id) { var config = getThisTableConfig(id); //获取当前实例配置项 if (!config) return; thisTable.that[id].resize(); } else { //否则重置所有表格实例尺寸 layui.each(thisTable.that, function () { this.resize(); }); } }; //表格重载 table.reload = function (id, options) { var config = thisTable.config[id]; options = options || {}; if (!config) return hint.error('The ID option was not found in the table instance'); if (options.data && options.data.constructor === Array) delete config.data; return table.render($.extend(true, {}, config, options)); }; //核心入口 table.render = function (options) { var inst = new Class(options); return thisTable.call(inst); }; //清除临时Key table.clearCacheKey = function (data) { data = $.extend({}, data); delete data[table.config.checkName]; delete data[table.config.indexName]; return data; }; //删除打勾的行modify by gk table.deleteCheckRows = function (id) { var data = table.cache[id] || []; $.each(data, function (i, item) { if (item.constructor !== Array && item[table.config.checkName]) { var elmobj = (table.config.mode == 'cardListMode' ? '.card-item' : 'table tbody tr'); var check = item[table.config.checkName]; var index = item[table.config.indexName]; var tr = $('#' + id).next().find(elmobj + '[data-index=' + index + ']'); tr.remove(); table.cache[id][index] = []; } }); }; table.formatNumberByPermil = function (num) { var decimalPart = ''; num = num.toString(); if (num.indexOf('.') != -1) { decimalPart = '.' + num.split('.')[1]; num = parseInt(num.split('.')[0]); } var array = num.toString().split(''); var index = -3; while (array.length + index > 0) { array.splice(index, 0, ','); index -= 4; } return array.join('') + decimalPart; }; //获取当前获取的所有集合值 table.getValue = function (id) { return table.checkedMultiList[id]; } // 设置选中的id(一般在编辑时候调用初始化选中值) table.setIds = function (settings) { var param = { gridId: '' //数据集合 , ids: [] }; $.extend(param, settings); table.checkedMultiList[param.gridId] = []; $.each(param.ids, function (index, item) { table.checkedMultiList[param.gridId].push(item); }); } //自动完成渲染 table.init(); exports(MOD_NAME, table); });