398 lines
16 KiB
JavaScript
398 lines
16 KiB
JavaScript
/**
|
||
* Created by 陈熠 on 2017/6/21
|
||
* email : 228112142@qq.com
|
||
*/
|
||
(function ($) {
|
||
var selectPages = [];
|
||
/*分页默认参数*/
|
||
var defaultParam = {
|
||
search: false,
|
||
nd: new Date().getTime(),
|
||
limit: 5,
|
||
page: 1,
|
||
sidx: '',
|
||
order: 'desc',
|
||
init: true,
|
||
_: new Date().getTime()
|
||
};
|
||
/* 入口函数 */
|
||
$.fn.selectPage = function () {
|
||
//参数数据
|
||
var cyProps = $(this).attr("cyProps");
|
||
if (!cyProps) {
|
||
return
|
||
}
|
||
cyProps = cyProps ? cyProps : "";
|
||
//将表格参数转为json
|
||
cyProps = eval("({" + cyProps + "})");
|
||
//创建节点
|
||
createDom($(this), cyProps);
|
||
|
||
};
|
||
|
||
|
||
/**创建相关dom元素 **/
|
||
function createDom(_this, cyProps) {
|
||
var _name = $(_this).attr("name") || "";
|
||
var _value = $(_this).attr("value") || "";
|
||
var showTips = _value === "" ? "cy-show" : "cy-none";
|
||
var _tips = cyProps.tips || "请根据用户id搜索";
|
||
var _checkbox = cyProps.checkbox || "true";
|
||
var ITEM_CLASS = _checkbox==="true"?"":"select-single";
|
||
var _search = cyProps.search === "false" ? "none" : "block";
|
||
var nowTime = (new Date()).getTime();
|
||
var selectId = "multi-select-" + nowTime + $(".multi-select").length;
|
||
var pageId = "page-" + nowTime + $(".dd-page").length;
|
||
/** 渲染结果**/
|
||
var outHtml =
|
||
_this.html([
|
||
'<div class="layui-form-select select-page" select-id="' + selectId + '">',
|
||
'<input type="text" name="' + _name + '" value="' + _value + '" class="form-input cy-none">',
|
||
'<div class="layui-input multi-select">',
|
||
'<input type="text" readonly="true" placeholder="' + _tips + '" class="select-tips ' + showTips + '">',
|
||
'</div>',
|
||
'<i class="layui-edge"></i>',
|
||
'<dl class="layui-anim layui-anim-upbit" style="">',
|
||
'<dd lay-value="dd-search" class="dd-bar dd-search" style="display: ' + _search + '">',
|
||
'<i class="layui-icon select-page-search-btn" ></i>',
|
||
'<input class="layui-input search_condition" placeholder="关键字搜索">',
|
||
'<i class="layui-icon select-page-search-clear">ဆ</i>',
|
||
'</dd>',
|
||
'<div class="dd-content '+ITEM_CLASS+'"></div>',
|
||
'<dd lay-value="dd-page" class="dd-bar dd-page">',
|
||
'<div class="lay-page" id="' + pageId + '"></div>',
|
||
'</dd>',
|
||
'</dl>',
|
||
'</div>'
|
||
].join(""));
|
||
_this.append(outHtml);
|
||
|
||
selectPages.push($(_this));
|
||
//下拉json数据
|
||
var R = getSelectData(cyProps.url);
|
||
var selectData = dataPage(1, 1000000, R.data || []);
|
||
$t.setSessionStorage(selectId, selectData);
|
||
$t.setSessionStorage("curr-"+selectId,selectData);
|
||
//数据回填
|
||
for (var i = 0; i < selectData.length; i++) {
|
||
//默认值回选
|
||
var _values = _value.split(",") || "";
|
||
if (_values.indexOf(selectData[i].code) > -1) {
|
||
var _selected = '<a href="javascript:;"><span class="selected-title" lay-value="' + selectData[i].code + '">' + selectData[i].value + '</span><i>×</i></a>';
|
||
$(_this).find(".multi-select").append(_selected);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
renderPage(_this,pageId,selectId,R.count,_checkbox);
|
||
|
||
}
|
||
|
||
|
||
function renderPage(_this,pageId,selectId,count,_checkbox){
|
||
layui.use(['form', 'laypage'], function () {
|
||
var form = layui.form;
|
||
var laypage = layui.laypage;
|
||
laypage.render({
|
||
elem: pageId
|
||
, count: count || 0
|
||
, first: false
|
||
, last: false
|
||
, limit: defaultParam.limit
|
||
, prev: '<i class="fa fa-angle-double-left"></i>'
|
||
, next: '<i class="fa fa-angle-double-right"></i>'
|
||
, layout: ['prev', 'next', 'skip', 'count']
|
||
, jump: function (obj, first) {
|
||
|
||
var _v=$("#"+obj.elem).parents(".select-page").find(".form-input").val();
|
||
$(_this).find(".dd-content").html("");
|
||
var selectData = dataPage(obj.curr, defaultParam.limit, $t.getSessionStorage("curr-"+selectId) || []);
|
||
//数据渲染
|
||
for (var i = 0; i < selectData.length; i++) {
|
||
var _dd = _checkbox === "true"
|
||
? '<dd class="select-item" lay-value="' + selectData[i].code + '" lay-title="' + selectData[i].value + '"><input type="checkbox" title="' + 'id:' + selectData[i].code + ';用户名:' + selectData[i].value + '" lay-filter="selectPageItem" lay-skin="primary"></dd>'
|
||
: '<dd class="select-item" lay-value="' + selectData[i].code + '" lay-title="' + selectData[i].value + '">' + selectData[i].value + '</dd>';
|
||
//默认值回选
|
||
var _values = _v.split(",") || "";
|
||
if (_values.indexOf(selectData[i].code) > -1) {
|
||
|
||
if (_checkbox === "true") {
|
||
_dd = _dd.replace('<input type="checkbox"', '<input type="checkbox" checked');
|
||
}
|
||
|
||
if (_checkbox === "false") {
|
||
_dd = _dd.replace('<dd class="select-item"', '<dd class="select-item layui-this"');
|
||
}
|
||
|
||
|
||
}
|
||
$(_this).find(".dd-content").append(_dd);
|
||
}
|
||
form.render();
|
||
}
|
||
});
|
||
});
|
||
}
|
||
/**数组分页
|
||
* pageNo 当前第几页
|
||
* pageSize 每页几条
|
||
* array 数据列表
|
||
* **/
|
||
function dataPage(pageNo, pageSize, array) {
|
||
var offset = (pageNo - 1) * pageSize;
|
||
return (offset + pageSize >= array.length) ? array.slice(offset, array.length) : array.slice(offset, offset + pageSize);
|
||
}
|
||
|
||
/**隐藏其他下拉框 **/
|
||
function hideOtherSelect(obj) {
|
||
$.each(selectPages, function () {
|
||
var selectId = $(this).find(".select-page").attr("select-id");
|
||
var oldId = $(obj).parent().attr("select-id");
|
||
if (selectId === oldId)return;
|
||
$("[select-id='" + selectId + "']").removeClass("layui-form-selected");
|
||
});
|
||
}
|
||
|
||
/**获取下拉树数据 **/
|
||
function getSelectData(url) {
|
||
var data = "";
|
||
$.ajax({
|
||
url: url,
|
||
async: false,
|
||
data: defaultParam,
|
||
dataType: "json",
|
||
success: function (R) {
|
||
if (R.code == 0) {
|
||
data = R
|
||
} else {
|
||
alert(R.msg);
|
||
}
|
||
},
|
||
error: function () {
|
||
alert("系统错误");
|
||
}
|
||
});
|
||
return data;
|
||
}
|
||
|
||
/**获取搜索后的数据 **/
|
||
function searchData(selectId, value) {
|
||
var selectData = $t.getSessionStorage(selectId);
|
||
//显示搜索结果菜单
|
||
var k = value;
|
||
// if (k == "") return;
|
||
var arr = [];
|
||
var patt = new RegExp(k);
|
||
for (var i = 0; i < selectData.length; i++) {
|
||
if (patt.test(selectData[i].code)) {
|
||
arr.push({code: selectData[i].code, value: selectData[i].value});
|
||
}
|
||
|
||
}
|
||
|
||
return arr;
|
||
}
|
||
|
||
/**获取插件配置 **/
|
||
function getProps(elem) {
|
||
//参数数据
|
||
var cyProps = $(elem).parents("[cytype='selectPageTool']").attr("cyProps");
|
||
cyProps = cyProps ? cyProps : "";
|
||
//将表格参数转为json
|
||
cyProps = eval("({" + cyProps + "})");
|
||
|
||
return cyProps;
|
||
}
|
||
|
||
/**是否显示tips*/
|
||
function showTips(selectId) {
|
||
var _select = $('[select-id="' + selectId + '"]');
|
||
//不显示
|
||
if (_select.find(".form-input").val()) {
|
||
_select.find(".select-tips").hide();
|
||
}
|
||
//显示
|
||
else {
|
||
_select.find(".select-tips").show();
|
||
}
|
||
}
|
||
/**重置面板位置*/
|
||
function resetPosition(elem) {
|
||
var _height=$(elem).parents(".select-page").height();
|
||
$(elem).parents(".select-page").find(".layui-anim").css("top",_height+2+"px");
|
||
|
||
}
|
||
|
||
function searchSelect(_this){
|
||
var cyProps = getProps($(_this));
|
||
var _selectId = $(_this).parents(".select-page").attr("select-id");
|
||
var data = searchData(_selectId, $(_this).val());
|
||
|
||
var pageId= $(_this).parents(".select-page").find(".lay-page").attr("id");
|
||
$t.setSessionStorage("curr-"+_selectId, data);
|
||
renderPage($(_this).parents(".select-page"),pageId,_selectId,data.length,cyProps.checkbox||"true");
|
||
|
||
if (data.length === 0) {
|
||
$(_this).parents(".select-page").find(".dd-content").html('<dd style="text-align: center">暂无数据</dd>');
|
||
}
|
||
var selectData = dataPage(1, defaultParam.limit, data);
|
||
|
||
$(this).parents(".select-page").find(".select-item").remove();
|
||
var _checkbox = cyProps.checkbox || "true";
|
||
var _value = $(_this).parents(".select-page").find(".form-input").val() || "";
|
||
|
||
//数据渲染
|
||
for (var i = 0; i < selectData.length; i++) {
|
||
var _dd = _checkbox === "true"
|
||
? '<dd class="select-item" lay-value="' + selectData[i].code + '" lay-title="' + selectData[i].value + '"><input type="checkbox" title="' + selectData[i].value + '" lay-filter="selectPageItem" lay-skin="primary"></dd>'
|
||
: '<dd class="select-item" lay-value="' + selectData[i].code + '" lay-title="' + selectData[i].value + '">' + selectData[i].value + '</dd>';
|
||
//默认值回选
|
||
var _values = _value.split(",") || "";
|
||
if (_values.indexOf(selectData[i].code) > -1) {
|
||
if (_checkbox === "true") {
|
||
_dd = _dd.replace('<input type="checkbox"', '<input type="checkbox" checked');
|
||
}
|
||
|
||
if (_checkbox === "false") {
|
||
_dd = _dd.replace('<dd class="select-item"', '<dd class="select-item layui-this"');
|
||
}
|
||
|
||
}
|
||
$(this).parents(".select-page").find(".dd-content").append(_dd);
|
||
}
|
||
layui.use(['form'], function () {
|
||
var form = layui.form;
|
||
form.render();
|
||
});
|
||
}
|
||
|
||
/**搜索监听 **/
|
||
$(document).on("keypress", ".search_condition", function (e) {
|
||
e.stopPropagation();
|
||
//是否为Enter键
|
||
if (/^13$/.test(e.keyCode)) {
|
||
searchSelect(this);
|
||
|
||
}
|
||
|
||
});
|
||
/**监听值删除*/
|
||
$(document).on("click", ".multi-select i", function (e) {
|
||
var mutiElem=$(this).parents(".multi-select");
|
||
var _value = $(this).prev().attr("lay-value");
|
||
var cyProps = getProps(this);
|
||
var _checkbox = cyProps.checkbox || "true";
|
||
//如果是多选
|
||
if (_checkbox === "true") {
|
||
//隐藏域值修改
|
||
var formValue = $(this).parents(".select-page").find(".form-input").val();
|
||
var _values = formValue.split(",");
|
||
var _index = _values.indexOf(_value);
|
||
//从该数组中删除该元素
|
||
_values.splice(_index, 1);
|
||
$(this).parents(".select-page").find(".form-input").val(_values.join(","));
|
||
$(".select-item[lay-value='" + _value + "']").find("input").attr("checked", false);
|
||
}
|
||
//如果是单选
|
||
if (_checkbox === "false") {
|
||
$(this).parents(".select-page").find(".form-input").val("");
|
||
$(".select-item[lay-value='" + _value + "']").removeClass("layui-this");
|
||
}
|
||
layui.use(['form'], function () {
|
||
var form = layui.form;
|
||
form.render();
|
||
});
|
||
//是否显示提示语
|
||
var selectId = $(this).parents(".select-page").attr("select-id");
|
||
showTips(selectId);
|
||
$(this).parents("a").remove();
|
||
//重置面板
|
||
resetPosition(mutiElem);
|
||
e.stopPropagation();
|
||
});
|
||
|
||
/**清空搜索条件**/
|
||
$(document).on("click", ".select-page-search-clear", function (event) {
|
||
$(this).prev().val("");
|
||
searchSelect(this);
|
||
event.stopPropagation();
|
||
});
|
||
|
||
/**打开或隐藏面板**/
|
||
$(document).on("click", "[cyType='selectPageTool'] .multi-select", function (e) {
|
||
var _this = $(this).parent();
|
||
_this.hasClass("layui-form-selected") === true ? _this.removeClass("layui-form-selected") : _this.addClass("layui-form-selected");
|
||
var _height = _this.height();
|
||
_this.find(".layui-anim").css("top", _height + 2 + "px");
|
||
hideOtherSelect(this);
|
||
e.stopPropagation();
|
||
});
|
||
$(document).on("click", "[cyType='selectPageTool'] .layui-anim", function (e) {
|
||
e.stopPropagation();
|
||
});
|
||
|
||
$(document).on("click", "body:not('.select-page')", function () {
|
||
$(".layui-form-selected").removeClass("layui-form-selected");
|
||
});
|
||
/**单选点击监听事件**/
|
||
$(document).on("click", ".select-single .select-item", function () {
|
||
var _value = $(this).attr("lay-value");
|
||
var _title = $(this).attr("lay-title");
|
||
var _selected = '<a href="javascript:;"><span class="selected-title" lay-value="' + _value+ '">' + 'id:' + _value + ';用户名:' +_title + '</span><i>×</i></a>';
|
||
$(this).parents(".select-page").find(".multi-select a").remove();
|
||
$(this).parents(".select-page").find(".multi-select ").append(_selected);
|
||
$(this).parents(".select-page").find(".form-input").val(_value);
|
||
$(this).parent().find(".layui-this").removeClass("layui-this");
|
||
$(this).parent().find("[lay-value='" + _value + "']").addClass("layui-this");
|
||
|
||
//是否显示提示语
|
||
var selectId = $(this).parents(".select-page").attr("select-id");
|
||
showTips(selectId);
|
||
|
||
});
|
||
|
||
/**复选点击监听事件**/
|
||
layui.use(['form'], function () {
|
||
var form = layui.form;
|
||
form.on('checkbox(selectPageItem)', function (data) {
|
||
var formValue = $(data.elem).parents(".select-page").find(".form-input").val();
|
||
var _value=$(data.elem).parents(".select-item").attr("lay-value");
|
||
var _values = formValue.split(",");
|
||
//如果是勾选
|
||
if(data.elem.checked===true){
|
||
|
||
var _title = $(data.elem).parents(".select-item").attr("lay-title");
|
||
// var _selected = '<a href="javascript:;"><span class="selected-title" lay-value="' + _value+ '">' + 'id:' + _value + ';用户名:' +_title +'</span><i>×</i></a>';
|
||
var _selected = '<a href="javascript:;"><span class="selected-title" lay-value="' + _value+ '">' + _title +'</span><i>×</i></a>';
|
||
$(data.elem).parents(".select-page").find(".multi-select").append(_selected);
|
||
//修改隐藏域的值
|
||
formValue+=","+_value;
|
||
$(data.elem).parents(".select-page").find(".form-input").val(formValue);
|
||
}
|
||
else{
|
||
var _index = _values.indexOf(_value);
|
||
//从该数组中删除该元素
|
||
_values.splice(_index, 1);
|
||
//修改隐藏域的值
|
||
$(data.elem).parents(".select-page").find(".form-input").val(_values.join(","));
|
||
$(data.elem).parents(".select-page").find(".selected-title[lay-value='"+_value+"']").parents("a").remove();
|
||
}
|
||
//是否显示提示语
|
||
var selectId =$(data.elem).parents(".select-page").attr("select-id");
|
||
showTips(selectId);
|
||
//重置面板位置
|
||
resetPosition(data.elem);
|
||
return false; //阻止表单跳转。如果需要表单跳转,去掉这段即可。
|
||
});
|
||
});
|
||
})(jQuery);
|
||
|
||
$(document).ready(function () {
|
||
var selectPageTools = $("[cyType='selectPageTool']");
|
||
for (var i = 0; i < selectPageTools.length; i++) {
|
||
$(selectPageTools[i]).selectPage();
|
||
}
|
||
|
||
}); |