layui table-transfer 分页穿梭框
效果:
代码:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Transfer Table穿梭框组件-基于layui</title> <link rel="stylesheet" href="layui/layui/css/layui.css"> </head> <body> <div class="layui-container" style="margin-top: 15px;"> <div class="layui-btn-group"> <button class="layui-btn all">获取全部数据</button> <button class="layui-btn left">获取左边数据</button> <button class="layui-btn right">获取右边数据</button> </div> <div id="root"></div> </div> </body> <script type="text/javascript" src="layui/layui/layui.js"></script> <script> layui.config({ base: 'layui_exts/transfer/' }).use(['transfer'], function () { var transfer = layui.transfer, $ = layui.$; //数据源 var data1 = [ { id:'1', planName:'张三', sex:0 }, { id:'2', planName:'李四', sex:0 }, { id:'3', planName:'王五', sex:0 }, { id:'4', planName:'小赵', sex:0 }, { id:'5', planName:'小赵', sex:0 }, { id:'6', planName:'小赵', sex:0 }, { id:'7', planName:'小赵', sex:0 }, { id:'8', planName:'小赵', sex:0 }, { id:'9', planName:'小赵', sex:0 }, { id:'10', planName:'小赵', sex:0 }, { id:'11', planName:'小赵', sex:0 }, ]; var data2 = []; //表格列 var cols = [ {type: 'checkbox', fixed: 'left'}, {field: 'id', title: 'ID', width: 80, sort: true}, {field: 'name', title: '用户名'}, {field: 'sex', title: '性别'}] //表格配置文件 var tabConfig = {'page': true, 'limits': [10, 50, 100], 'height': 420} var tb1 = transfer.render({ elem: "#root", //指定元素 cols: cols, //表格列 支持layui数据表格所有配置 data: [data1, data2], //[左表数据,右表数据[非必填]] tabConfig: tabConfig //表格配置项 支持layui数据表格所有配置 }) //transfer.get(参数1:初始化返回值,参数2:获取数据[all,left,right,l,r],参数:指定数据字段) //获取数据 $('.all').on('click', function () { var data = transfer.get(tb1, 'all'); layer.msg(JSON.stringify(data)) }); $('.left').on('click', function () { var data = transfer.get(tb1, 'left', 'id'); layer.msg(JSON.stringify(data)) }); $('.right').on('click', function () { var data = transfer.get(tb1, 'r',''); layer.msg(JSON.stringify(data)) }); }) </script> </html>
插件transfer.js源码:
layui.define('table',function (exports) { "use strict"; var $ = layui.$ ,table = layui.table ,MOD_NAME = 'transfer',LEFT_TABLE = 'left-table-',RIGHT_TABLE = 'right-table-',LEFT_BTN = 'left-btn-',RIGHT_BTN = 'right-btn-',FILTER= 'test' ,DISABLED = 'layui-btn-disabled',BTN = 'button',BTN_STLY='btn',MD5='layui-col-md5',MD2='layui-col-md2' ,transfer = { index:layui.transfer?(layui.transfer+1000):0 ,idData:[] //ID池 ,data:[] //原始数据 ,options:[] ,update:function (data,filed) { if(filed=='' && data && data.length > 0){ var d = []; $.each(data,function (k,v) { v.LAY_TABLE_INDEX && delete v.LAY_TABLE_INDEX v.LAY_CHECKED && delete v.LAY_CHECKED d.push(v) }) return d }else if(filed && data && data.length > 0){ d = ''; $.each(data,function (k,v) { if( k === 0 ){ d += v[filed] }else{ d += ','+ v[filed] } }) return d }else{ return []; } } ,get:function (option,type,field) { var index = option.index var data = transfer.data; if(!index){ return []; } if(type==='all'){ var d = [],d1=[],d2=[]; for (var i = data.length - 1; i >= 0; i--) { if(data[i].id==LEFT_TABLE+index){ d1= data[i].data; }else if(data[i].id==RIGHT_TABLE+index){ d2 = data[i].data; } } d.push({left:d1}) d.push({right:d2}) return d }else if(type==='left' || type==='l'){ for (var i = data.length - 1; i >= 0; i--) { if(data[i].id==LEFT_TABLE+index){ return this.update(data[i].data,field); } } }else if(type === 'right' || type==='r'){ for (var i = data.length - 1; i >= 0; i--) { if(data[i].id==RIGHT_TABLE+index){ return this.update(data[i].data,field); } } } } } ,thisRate = function () { var that = this return { index:that.index } } ,Class = function (options) { var that = this that.index = transfer.index?transfer.index:++transfer.index that.config = options transfer.options = options that.createHTMLDocument() that.render() }; Class.prototype.createHTMLDocument = function () { var that = this ,elem = that.config.elem ,index= that.index; //创建页面元素 var html = '<div class="layui-container">\ <div class="layui-row">\ <div class="'+MD5+'">\ <table class="layui-hide" id="'+LEFT_TABLE+index+'" lay-filter="'+FILTER+'"></table>\ </div>\ <div class="'+MD2+'" style="text-align: center;">\ <div id="'+LEFT_BTN+index+'" style="margin-bottom: 10px;"><button data-type="0" data-index="'+index+'" class="layui-btn '+DISABLED+' '+BTN_STLY+'"> <i class="layui-icon"></i></button></div>\ <div id="'+RIGHT_BTN+index+'" ><button data-type="1" data-index="'+index+'" class="layui-btn '+DISABLED+' '+BTN_STLY+'"> <i class="layui-icon"></i></button></div>\ </div>\ <div class="'+MD5+'">\ <table class="layui-hide" id="'+RIGHT_TABLE+index+'" lay-filter="'+FILTER+'"></table>\ </div>\ </div>\ </div>'; $(elem).html(html) } //初始化表格 Class.prototype.render = function () { var that = this,options = that.config; var d1_c = { elem: '#'+LEFT_TABLE+that.index ,cols: [options.cols] ,data: (options.data[0]?options.data[0]:[]) ,id:LEFT_TABLE+that.index } var d2_c = { elem: '#'+RIGHT_TABLE+that.index ,cols: [options.cols] ,data: (options.data[1]?options.data[1]:[]) ,id:RIGHT_TABLE+that.index } if(options.tabConfig){ d1_c = $.extend(d1_c,options.tabConfig) d2_c = $.extend(d2_c,options.tabConfig) } transfer.idData.push(that.index) transfer.data = []; transfer.data.push({id:LEFT_TABLE+that.index,data:(options.data[0]?options.data[0]:[])}) transfer.data.push({id:RIGHT_TABLE+that.index,data:(options.data[1]?options.data[1]:[])}) table.render(d1_c) table.render(d2_c) that.move() }; //左右移动按钮根据左表格居中 Class.prototype.move = function () { var that = this ,elem = $('#'+LEFT_TABLE+that.index) ,h = elem.parent().height(); h = h / 2 - 44; elem.parents('.layui-row').find('.'+MD2).css('padding-top',h+'px') } //点击事件 $(document).on('click','.'+BTN_STLY,function () { if(!$(this).hasClass(DISABLED)){ var othis = $(this),type = othis.data('type'); datas(type) } }) //数据处理 //data 选中数据 //type 类型 0 左 1 右 function datas (type) { var d = transfer.data; var d1 = d[0].data; var d2 = d[1].data; var _d = []; if(d1.length > 0 && type==0){ //左边的数据移动到右表 var n_d1 = []; d1.reverse() for (var i = 0; i < d1.length; i++) { if(d1[i].LAY_CHECKED===true){ delete d1[i].LAY_CHECKED delete d1[i].LAY_TABLE_INDEX d2.unshift(d1[i]) }else{ delete d1[i].LAY_TABLE_INDEX n_d1.push(d1[i]) } } _d.push(n_d1,d2) }else if(d2.length > 0 && type==1){ //左边的数据移动到右表 var n_d2 = []; for (var i = 0; i < d2.length; i++) { if(d2[i].LAY_CHECKED && d2[i].LAY_CHECKED===true){ delete d2[i].LAY_CHECKED d2[i].LAY_TABLE_INDEX && delete d2[i].LAY_TABLE_INDEX d1.push(d2[i]) }else{ delete d2[i].LAY_TABLE_INDEX n_d2.push(d2[i]) } } _d.push(d1,n_d2) } var options = transfer.options options.data =datasChecked(_d); transfer.render(options) } function datasChecked(data){ var d1= []; var d2 = []; if(data[0] && data[0].length){ $.each(data[0],function(k,v){ v.LAY_CHECKED===true && delete v.LAY_CHECKED d1.push(v) }); } if(data[1] && data[1].length){ $.each(data[1],function(k,v){ v.LAY_CHECKED===true && delete v.LAY_CHECKED d2.push(v) }); } return [d1,d2]; } //选中状态 table.on('checkbox('+FILTER+')', function(obj){ var idData = transfer.idData,lenght = idData.length; if(lenght > 0){ for (var i=0;i<=lenght-1;i++){ var checkStatus1 = table.checkStatus(LEFT_TABLE+idData[i]) ,data_1 = checkStatus1.data ,checkStatus2 = table.checkStatus(RIGHT_TABLE+idData[i]) ,data_2 = checkStatus2.data; if(data_1.length >0){ $('#'+LEFT_BTN+idData[i]).children(BTN).removeClass(DISABLED); }else{ $('#'+LEFT_BTN+idData[i]).children(BTN).addClass(DISABLED); } if(data_2.length >0){ $('#'+RIGHT_BTN+idData[i]).children(BTN).removeClass(DISABLED); }else{ $('#'+RIGHT_BTN+idData[i]).children(BTN).addClass(DISABLED); } } } }); transfer.render = function (options) { var inst = new Class(options) return thisRate.call(inst) } exports(MOD_NAME,transfer) })