1. 程式人生 > 實用技巧 >layui table-transfer 分頁穿梭框

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">&#xe602;</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">&#xe603;</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)
})

來源:https://github.com/9499574/layui-transfer