/**
@Name:layui.transfer 穿梭框
@Author:star1029
@License:MIT
*/
layui.define('form', function(exports){
"use strict";
var form = layui.form
,$ = layui.$
//外部接口
,transfer = {
config: {}
,index: layui.transfer ? (layui.transfer.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);
}
}
//操作当前实例
,thisTran = function(){
var that = this
,options = that.config;
return {
getData: function(){
return that.getData();
}
,config: options
}
}
//字符常量
,MOD_NAME = 'transfer', ELEM_VIEW = 'layui-transfer', ELEM_TOP = 'layui-transfer-topTitle',ELEM_SEARCH = 'layui-transfer-search', ELEM_BOX = 'layui-transfer-box', ELEM_DATA = 'layui-transfer-data', TRAN_LEFT = 'layui-transfer-left', TRAN_RIGHT = 'layui-transfer-right', TRAN_LEFT_LIST = 'layui-transfer-dataLeft'
,TRAN_RIGHT_LIST = 'layui-transfer-dataRight' ,TRAN_BTN_LEFT = 'layui-transfer-btnLeft', TRAN_BTN_RIGHT = 'layui-transfer-btnRight', TRAN_BTN_DIS = 'layui-btn-disabled'
//构造器
,Class = function(options){
var that = this;
that.index = ++transfer.index;
that.config = $.extend({}, that.config, transfer.config, options);
that.render();
};
//默认配置
Class.prototype.config = {
title: ['列表一', '列表二']
,width: 200
,height: 340
,data: [] //数据源
,value: [] //选中的数据
,showSearch: false //是否开启搜索
,id: '' //唯一 ID 标识
};
//穿梭框渲染
Class.prototype.render = function(){
var that = this
,options = that.config
,listLeft = '' ,listRight = '' , arr = [];
//格式转化
if(typeof options.parseData == 'function'){
layui.each(options.data, function(index, item){
options.data[index] = options.parseData(item) || item;
});
};
//循环列表
var num = 0 ,li = '',total1 = 0, total2 = 0;
layui.each(options.data, function(index1, item1){
num = 0;
layui.each(options.value, function(index2, item2){
if(item1.value == item2){
num = 1;
return true;
};
});
li = '
';
if(num == 0){
listLeft += li;
total1 += item1.disabled ? 0 : 1;
}else{
listRight += li;
total2 += item1.disabled ? 0 : 1;
arr.push(index1);
}
});
var temp = [''].join('');
//开始插入替代元素
var othis = $(options.elem)
,hasRender = othis.next('.' + ELEM_VIEW);
//生成替代元素
hasRender[0] && hasRender.remove(); //如果已经渲染,则Rerender
that.elem = $(temp);
othis.html(that.elem);
that.layTop = that.elem.find('.'+ ELEM_TOP)
that.layBox = that.elem.find('.'+ ELEM_BOX)
that.laySearch = that.elem.find('.'+ ELEM_SEARCH)
that.layData = that.elem.find('.'+ ELEM_DATA)
//初始化尺寸
that.layBox.css({
width: options.width
,height: options.height
});
that.layData.css({
height: function(){
return options.height - that.layTop.outerHeight() - that.laySearch.outerHeight() - 2
}()
});
that.event();
form.render('checkbox', 'LAY-Transfer-' + that.index);
};
Class.prototype.event = function(){
var that = this
,options = that.config
,elem = that.elem
,listLeft = '', listRight = ''
,checkTopLeft = elem.find('.'+ TRAN_LEFT).find('.'+ ELEM_TOP).find('input[name="layTranLeftCheck"]')
,checkTopRight = elem.find('.'+ TRAN_RIGHT).find('.'+ ELEM_TOP).find('input[name="layTranRightCheck"]')
,totalLeft = elem.find('.' + TRAN_LEFT).data('total')
,totalRight = elem.find('.' + TRAN_RIGHT).data('total');
//左选项
elem.on('click', 'input[name="layTranLeftCheck"]+', function(){
var checkbox = $(this).prev()
,checked = checkbox[0].checked
,childs = elem.find('.'+ TRAN_LEFT_LIST).find('input[name="layTranLeftCheck"]')
,isAll = checkbox.attr('lay-filter') == 'layTranLeftCheckAll';
if(checkbox[0].disabled) return;
//如果是全选/全不选
if(isAll){
listLeft = '';
//如果数据为零,不进行其他操作
if(totalLeft == 0){
checkbox[0].checked = false;
}else{
//同步子选项
childs.each(function(i, item){
if(!item.disabled){
item.checked = checked;
if(checked){
listLeft += ($(childs[i]).data("index")) + ',';
$(childs[i]).parent("li").addClass("selected");
}else{
$(childs[i]).parent("li").removeClass("selected");
}
};
});
//同步按钮状态
if(checked){
elem.find('.' + TRAN_BTN_RIGHT).removeClass(TRAN_BTN_DIS);
}else{
elem.find('.' + TRAN_BTN_RIGHT).addClass(TRAN_BTN_DIS);
};
}
}else{
var num = 1;
//单个勾选
if(checked){
//判断是否全选
childs.each(function(i, item){
if(!item.disabled && !item.checked){
num = 0;
}
});
//如果全选,勾选全选按钮
if(num == 1){
checkTopLeft[0].checked = checked;
};
//加入列表
listLeft += checkbox.data("index") + ',';
checkbox.parent("li").addClass("selected");
elem.find('.' + TRAN_BTN_RIGHT).removeClass(TRAN_BTN_DIS);
}else{
//如果全选状态,更改全选按钮
if(checkTopLeft[0].checked){
checkTopLeft[0].checked = false;
};
//移除
checkbox.parent("li").removeClass("selected");
listLeft = listLeft.replace(checkbox.data('index'),'');
childs.each(function(i, item){
if(item.checked){
num = 0;
}
});
//如果勾选项,更改按钮状态
if(num == 1){
elem.find('.' + TRAN_BTN_RIGHT).addClass(TRAN_BTN_DIS);
};
}
};
form.render('checkbox', 'LAY-Transfer-' + that.index);
});
//右选项
elem.on('click', 'input[name="layTranRightCheck"]+', function(){
var checkbox = $(this).prev()
,checked = checkbox[0].checked
,childs = elem.find('.'+ TRAN_RIGHT_LIST).find('input[name="layTranRightCheck"]')
,isAll = checkbox.attr('lay-filter') === 'layTranRightCheckAll';
if(checkbox[0].disabled) return;
//如果是全选/全不选
if(isAll){
listRight = '';
//如果数据为零,不进行其他操作
if(totalRight == 0){
checkbox[0].checked = false;
}else{
childs.each(function(i, item){
if(!item.disabled){
item.checked = checked;
if(checked){
listRight += ($(childs[i]).data("index")) + ',';
$(childs[i]).parent("li").addClass("selected");
}else{
$(childs[i]).parent("li").removeClass("selected");
}
}
});
if(checked){
elem.find('.' + TRAN_BTN_LEFT).removeClass(TRAN_BTN_DIS);
}else{
elem.find('.' + TRAN_BTN_LEFT).addClass(TRAN_BTN_DIS);
}
};
form.render('checkbox', 'LAY-Transfer-' + that.index);
}else{
var num = 1;
//单个勾选
if(checked){
//判断是否全选
childs.each(function(i, item){
if(!item.disabled && !item.checked){
num = 0;
}
});
//如果全选,勾选全选按钮
if(num == 1){
checkTopRight[0].checked = checked;
};
//加入列表
listRight += checkbox.data("index") + ',';
checkbox.parent("li").addClass("selected");
elem.find('.' + TRAN_BTN_LEFT).removeClass(TRAN_BTN_DIS);
}else{
//如果全选状态,更改全选按钮
if(checkTopRight[0].checked){
checkTopRight[0].checked = false;
};
//移除
checkbox.parent("li").removeClass("selected");
listRight = listRight.replace(checkbox.data('index'),'');
childs.each(function(i, item){
if(item.checked){
num = 0;
}
});
//如果勾选项,更改按钮状态
if(num == 1){
elem.find('.' + TRAN_BTN_LEFT).addClass(TRAN_BTN_DIS);
};
}
};
form.render('checkbox', 'LAY-Transfer-' + that.index);
});
//查找
function searchVal(tran){
var input = elem.find(tran).find('.layui-transfer-search')
,val = input.children('input').val()
,warp = input.next();
warp.children("li").each(function(){
if($(this).data("title").indexOf(val) == -1){
$(this).hide();
}else{
$(this).show();
}
});
};
//添加到右边
elem.on('click', '.'+TRAN_BTN_RIGHT, function(){
var preList = '';
//未选中则不操作
if($(this).hasClass(TRAN_BTN_DIS)){
return ;
};
//选项移除
elem.find("."+ TRAN_LEFT_LIST).find("li").each(function(){
if($(this).hasClass("selected")){
$(this).remove();
}
});
//选项插入
var arr = elem.find('.' + TRAN_RIGHT).data('arr')
,add = 0;
layui.each(listLeft.split(','), function(index, num){
if(!num) return;
var data = options.data[num];
preList += ''
arr += ',' + num;
add++;
});
elem.find("."+ TRAN_RIGHT_LIST).append(preList);
searchVal('.'+TRAN_RIGHT);
//更新状态
checkTopLeft[0].checked = false;
checkTopRight[0].checked = false;
$(this).addClass(TRAN_BTN_DIS);
listLeft = '';
//更改缓存数据
totalRight = totalRight + add;
totalLeft = totalLeft - add;
elem.find('.' + TRAN_RIGHT).data('total', totalRight);
elem.find('.' + TRAN_RIGHT).data('total', totalLeft);
elem.find('.' + TRAN_RIGHT).data('arr', arr);
form.render('checkbox', 'LAY-Transfer-' + that.index);
options.onchange && options.onchange(that.getData());
});
//添加到左边
elem.on('click', '.'+TRAN_BTN_LEFT, function(){
var preList = '';
if($(this).hasClass(TRAN_BTN_DIS)){
return ;
};
//选项移除
elem.find("."+ TRAN_RIGHT_LIST).find("li").each(function(){
if($(this).hasClass("selected")){
$(this).remove();
}
});
//选项插入
var arr = elem.find('.' + TRAN_RIGHT).data('arr')
,add = 0;
layui.each(listRight.split(','), function(index, num){
if(!num) return;
var data = options.data[num];
preList += ''
arr = arr.replace(num, '').replace(/(,)+/g,',');
add++;
});
elem.find("."+ TRAN_LEFT_LIST).append(preList);
searchVal('.'+TRAN_LEFT);
//更新状态
checkTopLeft[0].checked = false;
checkTopRight[0].checked = false;
$(this).addClass(TRAN_BTN_DIS);
listRight = '';
//更改缓存数据
totalRight = totalRight - add;
totalLeft = totalLeft + add;
elem.find('.' + TRAN_RIGHT).data('total', totalRight);
elem.find('.' + TRAN_RIGHT).data('total', totalLeft);
elem.find('.' + TRAN_RIGHT).data('arr', arr);
form.render('checkbox', 'LAY-Transfer-' + that.index);
options.onchange && options.onchange(that.getData());
});
//搜索
elem.find('.layui-transfer-search').on('keyup', 'input', function(){
var outer = $(this).parent("div").parent("div");
searchVal(outer);
});
};
//得到选中值
Class.prototype.getData = function(){
var that = this
,options = that.config
,arr = that.elem.find('.' + TRAN_RIGHT).data('arr')
,data = [];
function sortNum(a,b){ return a - b };
layui.each(arr.split(',').sort(sortNum), function(index, num){
if(!num) return;
data.push(options.data[num]);
});
return data;
};
//核心入口
transfer.render = function(options){
var inst = new Class(options);
return thisTran.call(inst);
};
exports(MOD_NAME, transfer);
})