(function () { var ua = window.UA_ADMIN; var form = window.UA_CORE.form, layer = window.UA_CORE.layer, table = window.UA_CORE.table, laydate = window.UA_CORE.laydate, laytpl = window.UA_CORE.laytpl, util = window.UA_CORE.util; var lastTableWhere = {}; var selectMode, selectConfirmCallback; // reloadData 引擎接线(加载期执行一次):受控表(UA_TABLE_STORE 已注册)的数据 // 重载分流到 store,非受控表透传原引擎调用。原引用只备份一次,防止重复加载时 // 把包装层当原引用再包一层;透传用 arguments 保真,reloadData(id, opts, type) // 三参形态的 type 语义不变。 if (table.__uaOriginalReloadData === undefined) { table.__uaOriginalReloadData = table.reloadData; } var originalTableReloadData = table.__uaOriginalReloadData; table.reloadData = function (tableId, opts) { if (window.UA_TABLE_STORE.has(tableId)) { return window.UA_TABLE_STORE.reload(tableId, opts); } return originalTableReloadData.apply(this, arguments); }; // 受控表渲染接线(加载期执行一次):store 的 fetch/reload 只负责取数与状态、 // 不触发渲染,这里在唯一的数据到达点(store.reload 的成功回调)注入引擎 // 纯渲染——首屏/搜索/排序/switch 回滚/删除刷新全部经 shim 汇入 reload。 // 渲染必须走备份的原引擎引用:走 table.reloadData 会被上方 shim 路由回 // store 造成请求循环。initSort 透传保持表头排序箭头(与引擎 url 模式的 // listenTableSort 行为一致)。受控表分页条由 render() 内的 // syncControlledPager 自管:store 的 pager.jump 在内部直呼 fetch,外部 // 注入不了渲染回调,故 register 时不传 pagerElem 使 store 分页静默跳过, // laypage 的 jump 经 shim(table.reloadData)回 store.reload 形成闭环。 var syncControlledPager = function (tableId) { var state = window.UA_TABLE_STORE.dataProvider.getState(tableId); if (!state) { return; } layui.laypage.render({ elem: 'ua-store-pager-' + tableId, count: state.count, curr: state.page.curr, limit: state.page.limit, limits: state.limits, layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'], jump: function (obj, first) { if (!first) { table.reloadData(tableId, { page: {curr: obj.curr, limit: obj.limit} }); } } }); }; if (window.UA_TABLE_STORE) { var storeReload = window.UA_TABLE_STORE.reload; window.UA_TABLE_STORE.reload = function (tableId, opts) { opts = opts || {}; var userDone = opts.done; opts.done = function (res) { originalTableReloadData.call(table, tableId, { data: res.data, totalRow: res.totalRow, initSort: opts.initSort }); syncControlledPager(tableId); if (typeof userDone === 'function') { userDone(res); } }; return storeReload(tableId, opts); }; } ua.table = { // 受控/非受控分发入口(后续任务直呼改造的定义点):非受控路径走备份的 // 原引擎引用,不经过上方已包装的 table.reloadData,避免递归 reloadData: function (tableId, opts) { if (window.UA_TABLE_STORE.has(tableId)) { return window.UA_TABLE_STORE.reload(tableId, opts); } return originalTableReloadData.apply(this, arguments); }, checkStatus: function (tableId) { if (window.UA_TABLE_STORE.has(tableId)) { return window.UA_TABLE_STORE.checkStatus(tableId); } return table.checkStatus(tableId); }, render: function (options) { options.init = options.init || ua.init; options.modifyReload = ua.parame(options.modifyReload, true); options.elem = options.elem || options.init.tableElem; options.id = options.id || options.init.tableRenderId; options.scrollPos = options.scrollPos || 'fixed'; options.layFilter = options.id + '_LayFilter'; options.url = options.url || ua.url(options.init.indexUrl); options.headers = ua.headers(); options.page = ua.parame(options.page, true); options.search = ua.parame(options.search, true); options.skin = options.skin || 'line'; options.autoSort = options.autoSort || false; options.limit = options.limit || 15; options.limits = options.limits || [10, 15, 20, 25, 50, 100]; options.cols = options.cols || []; options.rowDisableCallback = options.rowDisableCallback || null; var defaultToolbar = ['filter', 'print']; if (options.search) { defaultToolbar.push({ title: '搜索', layEvent: 'TABLE_SEARCH', icon: 'layui-icon-search', extend: 'data-table-id="' + options.id + '"' }); } if (options.defaultToolbar === undefined) { options.defaultToolbar = defaultToolbar; } var optionBefore = function () { }; if (options.before != undefined) { optionBefore = options.before; } options.before = function (tableIns) { optionBefore(tableIns); }; var optionDone = function () { }; if (options.done != undefined) { optionDone = options.done; } options.done = function (res, curr, count) { optionDone(res, curr, count); // 监听表格内的复制组件 ua.api.copyText('[lay-id=' + options.id + ']'); }; /** * 为空时认为自己是普通状态,否则是单选、多选、子页面,此时添加等默认行为走弹框而不是新标签页 */ selectMode = ua.getQueryVariable("select_mode"); selectConfirmCallback = ua.getQueryVariable('select_confirm_callback', 'onTableDataConfirm'); if (selectMode == 'checkbox') { if (options.cols[0][0].type == 'radio') { options.cols[0][0].type = 'checkbox'; } else if (options.cols[0][0].type != 'checkbox') { options.cols[0].unshift({ type: 'checkbox' }); } } else if (selectMode == 'radio') { if (options.cols[0][0].type == 'checkbox') { options.cols[0][0].type = 'radio'; } else if (options.cols[0][0].type != 'radio') { options.cols[0].unshift({ type: 'radio' }); } } else { if(!ua.isParentIndex()){ selectMode = 'childPage' } } // 判断元素对象是否有嵌套的 options.cols = ua.table.formatCols(options.cols, options.init); // 初始化表格lay-filter $(options.elem).attr('lay-filter', options.layFilter); // 初始化表格搜索 if (options.search === true) { options = ua.table.renderSearch(options.cols, options.elem, options.id, options); } // 初始化表格左上方工具栏 options.toolbar = options.toolbar || ['refresh', 'add', 'delete', 'export']; if (selectMode == 'checkbox' || selectMode == 'radio') { options.toolbar.unshift('selectConfirm'); options.height = 'full-85'; } if (options.init.formFullScreen == true) { options.init.formFullScreen = 'true'; } else { options.init.formFullScreen = 'false'; } options.toolbar = ua.table.renderToolbar(options.toolbar, options.elem, options.id, options.init); // 判断是否有操作列表权限 options.cols = ua.table.renderOperat(options.cols, options.elem); // 判断是否有操作列表权限 options.cols = ua.table.renderTrueHide(options.cols, options); var parseData = function (res) { return res; }; if (typeof options.parseData === 'function') { parseData = options.parseData; } if (options.controlled === true) { // 受控灰度模式:数据请求与分页职责移交 UA_TABLE_STORE,引擎只做 // 纯渲染(空数据起步、关闭引擎分页,由 store 的 laypage 自绘)。 // 选择态注入(rowDisableCallback / URL selectedIds / LAY_CHECKED // 跨页回显)由 store.fetch 的 injectSelectionMarks 承接,故不装 // 引擎 parseData。默认关闭——未显式 controlled:true 的页面保持 // 引擎 url 模式,行为与历史版本完全一致。 delete options.url; delete options.parseData; options.data = []; options.page = false; } else { options.parseData = function (res) { // 初始化已经选择的值 if (selectMode == 'checkbox' || selectMode == 'radio') { if (typeof options.rowDisableCallback == 'function') { for (let index = 0; index < res.data.length; index++) { const dataItem = res.data[index]; var rowDisableResult = options.rowDisableCallback(dataItem); if (rowDisableResult === false || rowDisableResult === true) { res.data[index].LAY_DISABLED = rowDisableResult; } } } var selectedIds = ua.getQueryVariable('selectedIds', ''); if (selectedIds.length > 0) { var selectedIdArr = selectedIds.split(','); for (let index = 0; index < res.data.length; index++) { const dataItem = res.data[index]; if (selectedIdArr.indexOf(dataItem.id.toString()) > -1) { res.data[index].LAY_DISABLED = true; } } } } res = parseData(res); return res; }; } // 初始化表格 var newTable = table.render(options); // 监听表格搜索开关显示 ua.table.listenToolbar(options.layFilter, options.id); // 监听表格瓶排序 ua.table.listenTableSort(options); // 监听表格开关切换 ua.table.renderSwitch(options.cols, options.init, options.id, options.modifyReload); // 监听表格开关切换 ua.table.listenEdit(options.init, options.layFilter, options.id, options.modifyReload); // 监听导出事件 ua.table.listenExport(options); // 监听表格选择器 ua.table.listenTableSelectConfirm(options); // 受控模式接线(在共享监听挂载之后):注册 store、自建分页容器、 // 同步勾选事件、首屏取数。搜索/排序/switch/编辑等既有监听的 // table.reloadData 调用经 shim 自动分流到 store.reload(渲染由顶部 // 接线层注入的 done 承接),此处无需逐点改造。 if (options.controlled === true) { // 分页容器挂在引擎视图容器之后(表格容器外),不与引擎分页共存。 // 注意 layui render 后原 table 元素被移出视图(成为 view 的兄弟 // 节点),不能用 closest 向上找 view var pagerId = 'ua-store-pager-' + options.id; $('#' + pagerId).remove(); $(options.elem).siblings('.layui-table-view').first().after( '
' ); window.UA_TABLE_STORE.register(options.id, { indexUrl: options.init.indexUrl, where: options.where, page: {curr: 1, limit: options.limit}, limits: options.limits, selectMode: selectMode, rowDisableCallback: options.rowDisableCallback // 不传 pagerElem:store 的 pager.jump 内部直呼 fetch 无法 // 触发引擎渲染,分页条由接线层 syncControlledPager 自管 }); // 引擎勾选事件 → store 选中集合:跨页勾选回显(LAY_CHECKED 注入) // 的数据源。layui 2.10 事件回调 obj.data 是当次操作的单行对象 // (type=all 时不含可用行数据),全选场景以 store 的当页数据为准 //(selection.checkAll 缺省即当页数据,禁用行由其内部跳过) table.on('checkbox(' + options.layFilter + ')', function (obj) { if (obj.type === 'all') { window.UA_TABLE_STORE.selection.checkAll(options.id, undefined, obj.checked); } else { window.UA_TABLE_STORE.selection.set(options.id, obj.data); } }); table.on('radio(' + options.layFilter + ')', function (obj) { window.UA_TABLE_STORE.selection.set(options.id, obj.data); }); // 首屏取数:经接线后的 store.reload 触发 fetch + 引擎纯渲染 window.UA_TABLE_STORE.reload(options.id); } return newTable; }, renderToolbar: function (data, elem, tableId, init) { data = data || []; var toolbarHtml = ''; $.each(data, function (i, v) { if (v === 'refresh') { toolbarHtml += ' \n'; } else if (v === 'add') { if (ua.checkAuth('add', elem)) { if(selectMode){ toolbarHtml += '\n'; }else{ toolbarHtml += '\n'; } } } else if (v === 'delete') { if (ua.checkAuth('delete', elem)) { toolbarHtml += '\n'; } } else if (v === 'export') { if (ua.checkAuth('export', elem)) { toolbarHtml += '\n'; } } else if (v === 'selectConfirm') { toolbarHtml += '\n'; } else if (typeof v === "object") { $.each(v, function (ii, vv) { vv.class = vv.class || ''; vv.icon = vv.icon || ''; vv.auth = vv.auth || 'add'; vv.url = vv.url || ''; vv.method = vv.method || 'open'; vv.title = vv.title || vv.text; vv.text = vv.text || vv.title; vv.extend = vv.extend || ''; vv.checkbox = vv.checkbox || false; if (ua.checkAuth(vv.auth, elem)) { toolbarHtml += ua.table.buildToolbarHtml(vv, tableId); } }); } }); return '
' + toolbarHtml + '
'; }, renderSearch: function (cols, elem, tableId, options) { // TODO 只初始化第一个table搜索字段,如果存在多个(绝少数需求),得自己去扩展 cols = cols[0] || {}; var newCols = []; var formHtml = ''; var tabSetting = {}; var formatFilter = {}, formatOp = {}; $.each(cols, function (i, d) { d.field = d.field || false; d.fieldAlias = ua.parame(d.fieldAlias, d.field); d.title = d.title || d.field || ''; d.selectList = d.selectList || {}; d.search = ua.parame(d.search, true); d.searchTip = d.searchTip || '请输入' + d.title || ''; d.searchValue = d.searchValue || undefined; d.searchHide = d.searchHide || ''; d.defaultSearchValue = d.defaultSearchValue; d.searchOp = d.searchOp || '%*%'; d.timeType = d.timeType || 'datetime'; d.elemIdName = d.fieldAlias; var a = ''; var b = ''; if (typeof d.fieldAlias == 'string') { if (d.fieldAlias.indexOf('[') == 0) { var fieldPlusArr = d.fieldAlias.replace('[').split(']'); d.elemIdName = fieldPlusArr.join('-'); } d.elemIdName = d.elemIdName.replace('.', '-'); } if (d.defaultSearchValue !== undefined) { if (!d.searchValue || d.searchValue.length == 0) { d.searchValue = d.defaultSearchValue; } } else { if (d.field) { d.defaultSearchValue = ua.getQueryVariable(d.field); if (d.defaultSearchValue != undefined) { d.searchValue = d.defaultSearchValue; } } } if (d.searchValue !== undefined) { if (d.search == 'number_limit') { var paramsArr = d.searchValue.split(','); a = paramsArr[0]; b = paramsArr[1]; if (a) { formatFilter['[' + d.field + ']min'] = a; formatOp['[' + d.field + ']min'] = 'min'; } if (b) { formatFilter['[' + d.field + ']max'] = b; formatOp['[' + d.field + ']max'] = 'max'; } } else if (d.search == 'time_limit') { var paramsArr = d.searchValue.split(','); a = paramsArr[0]; b = paramsArr[1]; if (a) { formatFilter['[' + d.field + ']min_date'] = a; formatOp['[' + d.field + ']min_date'] = 'min_date'; } if (b) { formatFilter['[' + d.field + ']max_date'] = b; formatOp['[' + d.field + ']max_date'] = 'max_date'; } } else { formatFilter[d.field] = d.searchValue; formatOp[d.field] = d.searchOp; } } var formSearchHideClass = ''; if (d.searchHide) { formSearchHideClass = ' search-hide-item'; } if (d.searchValue === undefined) { d.searchValue = ''; } if (d.field !== false) { if (d.search !== false) { switch (d.search) { case true: formHtml += '\t
\n' + '\n' + '
\n' + '\n' + '
\n' + '
'; break; case 'select': d.searchOp = '='; var selectHtml = ''; if (d.tab) { tabSetting.field = d.field; tabSetting.elemIdName = d.elemIdName; tabSetting.list = d.selectList; tabSetting.index = -1; } var selectListIndex = 0; $.each(d.selectList, function (sI, sV) { var selected = ''; if (sI === d.searchValue) { selected = 'selected=""'; if (d.tab) { tabSetting.index = selectListIndex; } } selectHtml += '/n'; selectListIndex++; }); if (d.tab) { formHtml += ''; break; } formHtml += '\t
\n' + '\n' + '
\n' + '\n' + '
\n' + '
'; break; case 'range': d.searchOp = 'range'; formHtml += '\t
\n' + '\n' + '
\n' + '\n' + '
\n' + '
'; break; case 'time': d.searchOp = '='; formHtml += '\t
\n' + '\n' + '
\n' + '\n' + '
\n' + '
'; break; case 'time_limit': d.searchOp = '='; formHtml += '\t
\n' + '\n' + '
\n' + '\n' + '\n' + '
\n' + '
'; break; case 'number_limit': d.searchOp = '='; formHtml += '\t
\n' + '\n' + '
\n' + '\n' + '\n' + '
\n' + '
'; break; } newCols.push(d); } else { // TODO:支持更多种类型的初始化,比如number_limit、time_limit formHtml += ''; } } }); if (tabSetting.field) { var tabId = 'tabFieldset_' + tableId; $(elem).before('
'); var header = [ { title: '全部', key: '', } ]; for (const tabSettingListKey in tabSetting.list) { if (Object.prototype.hasOwnProperty.call(tabSetting.list, tabSettingListKey)) { const tabItem = tabSetting.list[tabSettingListKey]; header.push({ title: tabItem, key: tabSettingListKey, }); } } layui.tabs.render({ elem: '#' + tabId, header: header, index: tabSetting.index + 1, }); layui.tabs.on('afterChange(' + tabId + ')', function (data) { var value = $(data.thisHeaderItem).attr('lay-key'); $('#c-' + tabSetting.elemIdName).val(value); $('[lay-filter="' + tableId + '_filter"]').trigger('click'); }); } if (formHtml !== '') { $(elem).before('
\n' + '条件搜索\n' + '' + '
'); ua.table.listenTableSearch(tableId); // 初始化form表单 form.render(); $.each(newCols, function (ncI, ncV) { if (ncV.search === 'range') { laydate.render({ range: true, type: ncV.timeType, elem: '[name="' + ncV.fieldAlias + '"]' }); } if (ncV.search === 'time') { laydate.render({ type: ncV.timeType, elem: '[name="' + ncV.fieldAlias + '"]' }); } if (ncV.search === 'time_limit') { laydate.render({ type: ncV.timeType, elem: '[name="[' + ncV.fieldAlias + ']min_date"]' }); laydate.render({ type: ncV.timeType, elem: '[name="[' + ncV.fieldAlias + ']max_date"]' }); } }); } options.where = { filter: JSON.stringify(formatFilter), op: JSON.stringify(formatOp) }; lastTableWhere[tableId] = options.where; return options; }, renderSwitch: function (cols, tableInit, tableId, modifyReload) { tableInit.modifyUrl = tableInit.modifyUrl || false; cols = cols[0] || {}; tableId = tableId || ua.init.tableRenderId; if (cols.length > 0) { $.each(cols, function (i, v) { v.filter = v.filter || false; if (v.filter !== false && tableInit.modifyUrl !== false) { ua.table.listenSwitch({ filter: v.filter, url: tableInit.modifyUrl, tableId: tableId, modifyReload: modifyReload }); } }); } }, renderOperat(data, elem) { for (dk in data) { var col = data[dk]; var operat = col[col.length - 1].operat; if (operat !== undefined) { var check = false; for (key in operat) { var item = operat[key]; if (typeof item === 'string') { if (ua.checkAuth(item, elem)) { check = true; break; } } else { for (k in item) { var v = item[k]; if (v.auth == undefined) { v.auth = 'add'; } if (ua.checkAuth(v.auth, elem)) { check = true; break; } } } } if (!check) { data[dk].pop(); } } } return data; }, renderTrueHide(data, options) { var newData = []; for (dk in data) { var newCol = []; var col = data[dk]; col.forEach(colItem => { var trueHide = false; if (typeof colItem.trueHide == 'function') { trueHide = colItem.trueHide(colItem, col, options); } else if (typeof colItem.trueHide == 'string') { trueHide = !ua.checkAuth(colItem.trueHide, options.elem); } else { trueHide = colItem.trueHide; } if (!trueHide) { newCol.push(colItem); } }); newData.push(newCol); } return newData; }, buildToolbarHtml: function (toolbar, tableId) { var html = ''; toolbar.class = toolbar.class || ''; toolbar.icon = toolbar.icon || ''; toolbar.auth = toolbar.auth || 'add'; toolbar.url = toolbar.url || ''; toolbar.extend = toolbar.extend || ''; toolbar.method = toolbar.method || 'open'; toolbar.field = toolbar.field || 'id'; toolbar.title = toolbar.title || toolbar.text; toolbar.text = toolbar.text || toolbar.title; toolbar.checkbox = toolbar.checkbox || false; var formatToolbar = toolbar; formatToolbar.icon = formatToolbar.icon !== '' ? ' ' : ''; formatToolbar.class = formatToolbar.class !== '' ? 'class="' + formatToolbar.class + '" ' : ''; if (toolbar.method === 'open') { formatToolbar.method = formatToolbar.method !== '' ? 'data-open="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '" ' : ''; } else if (toolbar.method === 'none') { // 常用于与extend配合,自定义监听按钮 formatToolbar.method = ''; } else if (toolbar.method === 'blank') { formatToolbar.method = ' href="' + formatToolbar.url + '" target="_blank" '; } else if (operat.method === 'tab') { formatToolbar.method = ' layuimini-content-href="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '"'; } else { formatToolbar.method = formatToolbar.method !== '' ? 'data-request="' + formatToolbar.url + '" data-title="' + formatToolbar.title + '" ' : ''; } formatToolbar.checkbox = toolbar.checkbox ? ' data-checkbox="true" ' : ''; formatToolbar.tableId = tableId !== undefined ? ' data-table="' + tableId + '" ' : ''; html = ''; return html; }, buildOperatHtml: function (operat, data) { var html = ''; operat.class = operat.class || ''; operat.icon = operat.icon || ''; operat.auth = operat.auth || 'add'; operat.url = operat.url || ''; operat.extend = operat.extend || ''; operat.method = operat.method || 'open'; operat.field = operat.field || 'id'; operat.data = operat.data || ['id']; operat.titleField = operat.titleField || 'title'; operat.title = operat.title || operat.text; operat.text = operat.text || operat.title; var titleEndfix = ''; if (typeof operat.titleField == 'function') { titleEndfix = operat.titleField(data, operat); } else if (data[operat.titleField]) { titleEndfix = '-' + data[operat.titleField]; } if (typeof operat.text == 'function') { operat.text = operat.text(data, operat); } if (typeof operat.title == 'function') { operat.title = operat.title(data, operat); } var formatOperat = operat; formatOperat.icon = formatOperat.icon !== '' ? ' ' : ''; formatOperat.class = formatOperat.class !== '' ? 'class="' + formatOperat.class + '" ' : ''; if (operat.method === 'open') { formatOperat.method = formatOperat.method !== '' ? 'data-open="' + formatOperat.url + '" data-title="' + formatOperat.title + titleEndfix + '" ' : ''; } else if (operat.method === 'none') { // 常用于与extend配合,自定义监听按钮 formatOperat.method = ''; } else if (operat.method === 'blank') { formatOperat.method = ' href="' + formatOperat.url + '" target="_blank" '; } else if (operat.method === 'tab') { formatOperat.method = ' layuimini-content-href="' + formatOperat.url + '" data-title="' + formatOperat.title + titleEndfix + '"'; } else { formatOperat.method = formatOperat.method !== '' ? 'data-request="' + formatOperat.url + '" data-title="' + formatOperat.title + titleEndfix + '" ' : ''; } formatOperat.dataBind = ' '; operat.data.forEach((item, index) => { formatOperat.dataBind += 'data-' + item + '="' + data[item] + '" '; }); html = '' + formatOperat.icon + formatOperat.text + ''; return html; }, toolSpliceUrl(url, field, data) { url = url.indexOf("?") !== -1 ? url + '&' + field + '=' + data[field] : url + '?' + field + '=' + data[field]; return url; }, formatCols: function (cols, init) { for (i in cols) { var col = cols[i]; for (index in col) { var val = col[index]; if (typeof val.hide == 'function') { cols[i][index]['hide'] = val.hide(val, cols, init); } if (val['width'] == undefined && val['minWidth'] == undefined) { var width = null; if (val.title) { width = val.title.length * 15 + 55; } if (width != null) { cols[i][index]['minWidth'] = width; } } // if str end with _time if (val.field && val.field.indexOf('_time') !== -1) { cols[i][index]['minWidth'] = 160; } if (val.sort === undefined) { cols[i][index]['sort'] = true; } if (val.defaultValue === undefined) { cols[i][index]['defaultValue'] = ''; } // 判断是否包含初始化数据 if (val.init === undefined) { cols[i][index]['init'] = init; } // 格式化列操作栏 if (val.templet === ua.table.tool && val.operat === undefined) { cols[i][index]['operat'] = ['edit', 'delete']; } // 格式化列操作栏 if (val.templet === ua.table.tool) { cols[i][index]['sort'] = false; } // 判断是否包含开关组件 if (val.templet === ua.table.switch && val.filter === undefined) { cols[i][index]['filter'] = val.field; } // 判断是否含有搜索下拉列表 if (val.selectList !== undefined && val.search === undefined) { cols[i][index]['search'] = 'select'; } // 判断是否初始化对齐方式 if (val.align === undefined) { cols[i][index]['align'] = 'left'; } // 部分字段开启排序 var sortDefaultFields = ['id', 'sort']; if (val.sort === undefined && sortDefaultFields.indexOf(val.field) >= 0) { cols[i][index]['sort'] = true; } // 初始化图片高度 if (val.templet === ua.table.image && val.imageHeight === undefined) { cols[i][index]['imageHeight'] = 26; cols[i][index]['sort'] = false; } // 图片默认不搜索 if (val.templet === ua.table.image && val.search === undefined) { cols[i][index]['search'] = false; } // 判断是否列表数据转换 if (val.selectList !== undefined && val.templet === undefined) { cols[i][index]['templet'] = ua.table.list; } // 判断是否多层对象 if (val.field !== undefined && val.field.split(".").length > 1) { if (val.templet === undefined) { cols[i][index]['templet'] = ua.table.value; } } // 如果未定义则默认使用value if (cols[i][index]['templet'] === undefined) { cols[i][index]['templet'] = ua.table.value; } else { // 针对特定的模板做数据调整 if (cols[i][index]['templet'] == ua.table.list) { if (val.selectValue) { var newSelectList = {}; val.selectList.map(item => { newSelectList[item[val.selectValue]] = item[val.selectLabel]; }); cols[i][index]['selectList'] = newSelectList; } } } if (val.fieldFormat == undefined) { switch (val.templet) { case ua.table.image: val.fieldFormat = 'image'; break; case ua.table.date: val.fieldFormat = 'date'; break; default: val.fieldFormat = 'text'; if (val.selectList !== undefined) { val.fieldFormat = 'select'; } break; } } } } return cols; }, tool: function (data) { var option = data.LAY_COL; option.operat = option.operat || ['edit', 'delete']; var elem = option.init.tableElem || ua.init.tableElem; var html = ''; $.each(option.operat, function (i, item) { if (typeof item === 'string') { switch (item) { case 'edit': var editMethod = 'tab'; if(selectMode){ editMethod = 'open'; } var operat = { class: 'layui-btn layui-btn-success layui-btn-xs', method: editMethod, field: 'id', icon: '', text: '编辑', title: '编辑信息', auth: 'edit', url: option.init.editUrl, extend: option.init.formFullScreen == 'true' ? ' data-full="true"' : '' }; operat.url = ua.table.toolSpliceUrl(operat.url, operat.field, data); if (ua.checkAuth(operat.auth, elem)) { html += ua.table.buildOperatHtml(operat, data); } break; case 'delete': var operat = { class: 'layui-btn layui-btn-danger layui-btn-xs', method: 'get', field: 'id', icon: '', text: '删除', title: '确定删除?', auth: 'delete', url: option.init.deleteUrl, extend: "" }; operat.url = ua.table.toolSpliceUrl(operat.url, operat.field, data); if (ua.checkAuth(operat.auth, elem)) { html += ua.table.buildOperatHtml(operat, data); } break; } } else if (typeof item === 'object') { $.each(item, function (i, operat) { operat.class = operat.class || ''; operat.icon = operat.icon || ''; operat.auth = operat.auth || 'add'; operat.url = operat.url || ''; operat.method = operat.method || 'open'; operat.field = operat.field || 'id'; operat.title = operat.title || operat.text; operat.text = operat.text || operat.title; operat.extend = operat.extend || ''; operat._if = operat._if || function () { return true; }; if (typeof operat._if == 'function') { if (operat._if(data, operat) !== true) { return ''; } } else if (typeof operat._if == 'string') { var ifValue = ua.table.returnColumnValue(data, operat._if, false); if (!ifValue) { return ''; } } // 自定义表格opreat按钮的弹窗标题风格,extra是表格里的欲加入标题中的字段 operat.extra = operat.extra || ''; if (data[operat.extra] !== undefined) { operat.title = data[operat.extra] + ' - ' + operat.title; } if (typeof operat.url == 'function') { operat.url = operat.url(data, operat); } if (typeof operat.field != 'function') { if (!ua.empty(operat.field)) { operat.url = ua.table.toolSpliceUrl(operat.url, operat.field, data); } } else { var fieldParam = operat.field(data, operat); if (typeof fieldParam == 'string') { operat.url = fieldParam; } else { var querys = ''; if (operat.url.indexOf("?") !== -1) { if (operat.url.indexOf("?") !== operat.url.length - 1) { querys = '&'; } } else { querys = '?'; } operat.url += querys + $.param(fieldParam); } } if (ua.checkAuth(operat.auth, elem)) { html += ua.table.buildOperatHtml(operat, data); } }); } }); return html; }, list: function (data) { var option = data.LAY_COL; option.selectList = option.selectList || {}; var value = ua.table.returnColumnValue(data); if (option.selectList[value] === undefined || option.selectList[value] === '' || option.selectList[value] === null) { return value; } else { return option.selectList[value]; } }, filePreview: function (data) { var mimeName = data.mime_type.split('/')[0]; if (mimeName == 'image') { return ua.table.image(data); } else { var value = ua.table.returnColumnValue(data); var groupName = ua.getExtGroupName(data.file_ext); return ''; } }, image: function (data) { var option = data.LAY_COL; option.imageWidth = option.imageWidth || 200; option.imageHeight = option.imageHeight || 26; option.imageSplit = option.imageSplit || '|'; option.imageJoin = option.imageJoin || '
'; option.title = option.title || option.field; var title = data[option.title]; var value = ua.table.returnColumnValue(data); if (value === undefined || value === null) { return ''; } else { var values = value.split(option.imageSplit), valuesHtml = []; values.forEach((value, index) => { valuesHtml.push(''); }); return valuesHtml.join(option.imageJoin); } }, url: function (data) { var option = data.LAY_COL; var urlNameField = option.urlNameField || ''; var value = ua.table.returnColumnValue(data); if (ua.empty(value)) { return ''; } var urlName = value; if (urlNameField != '') { try { var urlNameFieldType = typeof urlNameField; if (urlNameFieldType == 'string') { urlName = data[urlNameField]; } else if (urlNameFieldType == 'function') { urlName = urlNameField(data); } } catch (e) { } } return '' + urlName + ''; }, switch: function (data) { var option = data.LAY_COL; if (!ua.checkAuth('modify', option.init.tableElem)) { return ua.table.list(data); } option.filter = option.filter || option.field || null; option.checked = option.checked || 1; var value = ua.table.returnColumnValue(data); var checked = value === option.checked ? 'checked' : ''; return laytpl('').render(data); }, price: function (data) { var value = ua.table.returnColumnValue(data); return '¥' + value + ''; }, percent: function (data) { var value = ua.table.returnColumnValue(data); return '' + value + '%'; }, icon: function (data) { var value = ua.table.returnColumnValue(data); return ''; }, text: function (data) { var value = ua.table.returnColumnValue(data); return '' + value + ''; }, value: function (data) { var value = ua.table.returnColumnValue(data); return '' + value + ''; }, //时间戳转日期 date: function (data) { var option = data.LAY_COL; value = ua.table.returnColumnValue(data); if (!ua.empty(value)) { value = util.toDateString(value * 1000, option.format || 'yyyy-MM-dd HH:mm:ss'); } return '' + value + ''; }, bytes: (data) => { var size = ua.table.returnColumnValue(data); sizeReadable = ua.bytes(size); return sizeReadable; }, copyText(data) { var option = data.LAY_COL; var value = ua.table.returnColumnValue(data); var copyValue = value; var copyText = option.copyText; if (typeof copyText === 'function') { copyValue = copyText(value, data); } return ' ' + value + ''; }, // 统一列返回数据处理 returnColumnValue(data, field, defaultValue) { if (!data.LAY_COL) { return ''; } var option = data.LAY_COL; field = field || option.field; defaultValue = defaultValue || option.defaultValue; var valueParser = option.valueParser; var value = undefined; try { value = eval("data." + field); } catch (e) { } if (typeof valueParser == 'function') { value = valueParser(value, data); } if (value === null || value === undefined) { value = defaultValue; } return value; }, listenTableSearch: function (tableId) { form.on('submit(' + tableId + '_filter)', function (data) { var dataField = data.field; var formatFilter = {}, formatOp = {}; $.each(dataField, function (key, val) { if (val !== '') { formatFilter[key] = val; var elemId = ua.table.renderSearchFormItemElementId(key); var op = $('#c-' + elemId).attr('data-search-op'); op = op || '%*%'; formatOp[key] = op; } }); var where = { filter: JSON.stringify(formatFilter), op: JSON.stringify(formatOp) }; lastTableWhere[tableId] = where; table.reloadData(tableId, { page: { curr: 1 } , where: where }, 'data'); return false; }); }, listenSwitch: function (option, ok) { option.filter = option.filter || ''; option.url = option.url || ''; option.field = option.field || option.filter || ''; option.tableId = option.tableId || ua.init.tableRenderId; option.modifyReload = option.modifyReload || false; form.on('switch(' + option.filter + ')', function (obj) { var checked = obj.elem.checked ? 1 : 0; if (typeof ok === 'function') { return ok({ id: obj.value, checked: checked, }); } else { var data = { id: obj.value, field: option.field, value: checked, }; ua.request.post({ url: option.url, prefix: true, data: data, }, function (res) { if (option.modifyReload) { table.reloadData(option.tableId); } }, function (res) { ua.msg.error(res.msg, function () { table.reloadData(option.tableId); }); }, function () { table.reloadData(option.tableId); }); } }); }, listenTableSort(option) { //触发排序事件 table.on('sort(' + option.layFilter + ')', function (obj) { //注:sort 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值" var lastWhere = lastTableWhere[option.id] ? lastTableWhere[option.id] : {}; lastWhere.sort = {}; lastWhere.sort[obj.field] = obj.type; table.reloadData(option.id, { initSort: obj //记录初始排序,如果不设的话,将无法标记表头的排序状态。 , where: lastWhere }); }); }, listenToolbar: function (layFilter, tableId) { table.on('toolbar(' + layFilter + ')', function (obj) { var options = obj.config; var tableId = obj.config.id; // 搜索表单的显示 switch (obj.event) { case 'TABLE_SEARCH': var searchFieldsetId = 'searchFieldset_' + tableId; var _that = $("#" + searchFieldsetId); if (_that.hasClass("layui-hide")) { _that.removeClass('layui-hide'); } else { _that.addClass('layui-hide'); } break; } }); }, listenEdit: function (tableInit, layFilter, tableId, modifyReload) { tableInit.modifyUrl = tableInit.modifyUrl || false; tableId = tableId || ua.init.tableRenderId; if (tableInit.modifyUrl !== false) { table.on('edit(' + layFilter + ')', function (obj) { var value = obj.value, data = obj.data, id = data.id, field = obj.field; var _data = { id: id, field: field, value: value, }; ua.request.post({ url: tableInit.modifyUrl, prefix: true, data: _data, }, function (res) { if (modifyReload) { table.reloadData(tableId); } }, function (res) { ua.msg.error(res.msg, function () { table.reloadData(tableId); }); }, function () { table.reloadData(tableId); }); }); } }, listenTableSelectConfirm(options) { $('.select-confirm').click(function () { var checkStatus = ua.table.checkStatus(options.id); if (checkStatus.data.length == 0) { layer.msg('请选择数据'); return false; } parent.window[selectConfirmCallback](checkStatus.data); }); }, listenExport: function (options) { var exportFields = {}; var imageFields = []; var selectFields = {}; var dateFields = []; options.cols[0].forEach(col => { if (col.field) { exportFields[col.field] = col.title; options.cols[0].forEach(col => { if (col.field) { exportFields[col.field] = col.title; switch (col.fieldFormat) { case 'image': imageFields.push(col.field); break; case 'select': if (Object.keys(col.selectList).length > 0) { selectFields[col.field] = col.selectList; } break; case 'date': dateFields.push(col.field); break; default: break; } } }); } }); // excel导出 $('body').on('click', '[data-table-export]', function () { var tableId = $(this).attr('data-table-export'), url = $(this).attr('data-url'); var searchVals = form.val(tableId + '_filter_form'); var dataField = searchVals; var formatFilter = {}, formatOp = {}; $.each(dataField, function (key, val) { if (val !== '') { formatFilter[key] = val; var elemId = ua.table.renderSearchFormItemElementId(key); var op = $('#c-' + elemId).attr('data-search-op'); op = op || '%*%'; formatOp[key] = op; } }); var searchQuery = { filter: JSON.stringify(formatFilter), op: JSON.stringify(formatOp), fields: JSON.stringify(exportFields), image_fields: JSON.stringify(imageFields), select_fields: JSON.stringify(selectFields), date_fields: JSON.stringify(dateFields), }; var query = $.param(searchQuery); var index = ua.msg.confirm('根据查询进行导出,确定导出?', function () { toUrl = ua.url(url); if (toUrl.indexOf('?') < 0) { toUrl += '?'; } else { toUrl += '&'; } toUrl += query; window.open(toUrl); layer.close(index); }); }); }, renderSearchFormItemElementId(key) { var elemId = key; if (key.indexOf('[') == 0) { var keyArr = key.replace('[', '').split(']'); elemId = keyArr[0] + '-' + keyArr[1]; } elemId = elemId.replace('.', '-'); return elemId; } }; })();