/**
* layui扩展组件
* 输入框的下拉表格选择(分页)
* */
layui.define(['table', 'jquery', 'form'], function (exports) {
"use strict";
var MOD_NAME = 'tableSelect',
$ = layui.jquery,
table = layui.table,
form = layui.form;
var tableSelect = function () {
this.v = '1.4.0';
};
/**
* 初始化表格选择器
*/
tableSelect.prototype.render = function (opt) {
var elem = $(opt.elem);
//默认设置
opt.searchKey = opt.searchKey || 'keyword';//可多个用,分割
opt.table.page = opt.table.page || false;
opt.table.height = opt.table.height || 290;
elem.off('keyup').on('keyup', function(e) {
e.stopPropagation();
//输入字符小于二或者特殊按钮不显示
if ($('div.tableSelect').length >= 1 || elem.val().length <= 2 || event.key == "F7" || event.key == "F8" || event.key == "F6") {
return false;
}
var t = elem.offset().top + elem.outerHeight()+"px";
var l = elem.offset().left +"px";
var tableName = "tableSelect_table_" + new Date().getTime();
var tableBox = '
';
tableBox += '
';
tableBox += '';
tableBox += '
';
tableBox += '
';
tableBox += '
';
tableBox = $(tableBox);
$('body').append(tableBox);
//渲染TABLE
opt.table.elem = "#"+tableName;
opt.table.id = tableName;
//若没有url表示为前端分页
//if (opt.table.url != undefined) {
// opt.table.where['sWhere'] = opt.sWhere
//} else {
// opt.table.data = opt.ajaxSelect(opt.sWhere);
//}
//让一次加载显示数据
//当字符长度等于3时第一次加载
if (elem.val().length == 3) {
searchFirst()
}
opt.table.request={//设置页参数
pageName: 'page', // 页码的参数名称,默认:page
limitName: 'size' // 每页数据条数的参数名,默认:limit
};
opt.table.parseData=function(res){
return {
"code": 0, // 解析接口状态
"msg": res.Message, // 解析提示文本
"count": res.count, // 解析数据长度
"data": res.data // 解析数据列表
};
}
var tableSelect_table = table.render(opt.table);
//FIX位置如何下面放不下放上面
var overHeight = (elem.offset().top + elem.outerHeight() + tableBox.outerHeight() - $(window).scrollTop()) > $(window).height();
var overWidth = (elem.offset().left + tableBox.outerWidth()) > $(window).width();
overHeight && tableBox.css({ 'top': elem.offset().top - tableBox.outerHeight()+'px','bottom':'auto'});
overWidth && tableBox.css({'left':'auto','right':'5px'})
//输入框上下回车动作
elem.off('keydown').on('keydown', function (e) {
var tableElem = $(opt.table.elem).next().find('tbody');
//单选框上下键动作
if (opt.table.cols[0][0]["type"] == "radio") {
// 获取表格的选中的行
var tr = tableElem.find('tr.layui-table-click');
switch (event.key) {
case "ArrowUp"://上键
if (tr.length == 0) {
tableElem.find('tr:first').children('td').eq(0).click();
} else {
tr['prev']().children('td').click();
}
break;
case "ArrowDown"://下键
if (tr.length == 0) {
tableElem.find('tr:first').children('td').eq(0).click();
} else {
tr['next']().children('td').click();
}
break;
case "Enter"://回车
tableBox.find('.tableSelect_btn_select').click();
break;
}
} else {
//多选框
var checkbox = tableElem.find('input[type="checkbox"]:checked');
var tr = checkbox.closest('tr');
switch (event.key) {
case "ArrowUp"://上键
if (tr.length == 0) {
tableElem.find('tr:first').children('td').eq(0).click();
} else {
tr.children('td').eq(0).click();
tr['prev']().children('td').eq(0).click();
}
break;
case "ArrowDown"://下键
if (tr.length == 0) {
tableElem.find('tr:first').children('td').eq(0).click();
} else {
tr.children('td').eq(0).click();
tr['next']().children('td').eq(0).click();
}
break;
case "Enter"://回车
tableBox.find('.tableSelect_btn_select').click();
break;
}
}
})
// 防抖函数
function debounce(func, wait) {
let timeout;
return function () {
const context = this, args = arguments;
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(context, args), wait);
};
}
//搜索函数第一次加载
function searchFirst() {
var searchKeyList = opt.searchKey.split(',');//获取查找的关键字搜索框
//拼接sql字符串
var sWhereStr = " and ("
searchKeyList.forEach(function (value, index) {
if (index == 0) {
sWhereStr += (value + " like '%" + elem.val() + "%' ")
} else {
sWhereStr += ("or " + value + " like '%" + elem.val() + "%' ")
}
})
sWhereStr += ")"
//后端分页搜索
if (opt.table.where != undefined) {
opt.table.where['sWhere'] = opt.sWhere + sWhereStr;
} else {
var sWhere = opt.sWhere + sWhereStr;
opt.table.data = opt.ajaxSelect(sWhere);
}
}
//输入框输入执行
elem.off('input').on('input', debounce(
function (e) {
// 阻止表单提交(如果输入框在表单内)
e.preventDefault();
var searchKeyList = opt.searchKey.split(',');//获取查找的关键字搜索框
//拼接sql字符串
var sWhereStr = " and ("
searchKeyList.forEach(function (value, index) {
if (index == 0) {
sWhereStr += (value + " like '%" + elem.val() + "%' ")
} else {
sWhereStr += ("or " + value + " like '%" + elem.val() + "%' ")
}
})
sWhereStr +=")"
//后端分页搜索
if (opt.table.where != undefined) {
opt.table.where['sWhere'] = opt.sWhere + sWhereStr;
tableSelect_table.reload({
where: opt.table.where,
page: {
curr: 1
}
});
} else {
var sWhere = opt.sWhere + sWhereStr;
tableSelect_table.reload({
data: opt.ajaxSelect(sWhere)
});
}
},500))
//双击行选中
table.on('rowDouble('+tableName+')', function(obj){
var checkStatus = {data:[obj.data]};
selectDone(checkStatus);
})
//单击选中行
table.on('row('+tableName+')', function (obj) {
//判断是否已经被选中是否是单选框
if (obj.tr.find('.layui-form-radioed').length == 0 && opt.table.cols[0][0]["type"] == "radio") {
//触发单选框选中事件
obj.tr.find('i[class="layui-anim layui-icon"]').trigger("click");
} else if(opt.table.cols[0][0]["type"] == "checkbox") { //复选框选中
//选中行改变颜色
var flag = !obj.tr.find(':checkbox:first').prop('checked');
obj.tr.find(':checkbox').prop('checked', flag);
if (flag) {
obj.tr.find('.layui-form-checkbox').addClass('layui-form-checked'); //设置复选框选中样式
$(obj.tr).attr({ "style": "background:#ceedfa;color:black" });//改变当前tr背景颜色和字体颜色
} else {
obj.tr.find('.layui-form-checkbox').removeClass('layui-form-checked');//取消复选框选中样式
$(obj.tr).attr({ "style": "background:" });//取消当前tr颜色
}
//mainTable 为表格ID 注意此处如果ID不正确将导致你在监听复选框时获取不到你选择的数据,前面的只是添加或删除选中未选中样式以及设置背景色,字体颜色
layui.each(table.cache[tableName], function (i, l) {
if (obj.tr.index() == l.LAY_TABLE_INDEX) {
l.LAY_CHECKED = flag;
}
});
//更新按钮(无用删除)
//updataButton(table.checkStatus(tableName).data.length)
}
})
//按钮选中
tableBox.find('.tableSelect_btn_select').on('click', function() {
var checkStatus = table.checkStatus(tableName);
if (checkStatus.data.length > 0) {
selectDone(checkStatus);
} else {
tableBox.remove();
delete table.cache[tableName];
}
})
//写值回调和关闭
function selectDone (checkStatus){
opt.done(elem, checkStatus);
tableBox.remove();
delete table.cache[tableName];
$(opt.elem).blur();
}
//点击其他区域关闭
$(document).mouseup(function(e){
var userSet_con = $(''+opt.elem+',.tableSelect');
if(!userSet_con.is(e.target) && userSet_con.has(e.target).length === 0){
tableBox.remove();
delete table.cache[tableName];
}
});
})
}
/**
* 隐藏选择器
*/
tableSelect.prototype.hide = function (opt) {
$('.tableSelect').remove();
}
//自动完成渲染
var tableSelect = new tableSelect();
//FIX 滚动时错位
if(window.top == window.self){
$(window).scroll(function () {
tableSelect.hide();
});
}
exports(MOD_NAME, tableSelect);
})