layui.define('table', function(exports) {
var $ = layui.$
, table = layui.table
//字符常量
, MOD_NAME = 'transferTable', ELEM = '.layui-transferTable'
//外部接口
, transferTable = {
index: layui.transferTable ? (layui.transferTable.index + 10000) : 0
//设置全局项
, set: function (options) {
var that = this;
that.config = $.extend({}, that.config, options);
return that;
}
, get: function (id) {
if (this.config && this.config[id]) {
return this.config[id].data
} else {
return []
}
}
, reload: function (id, options) {
table.reload(id, options)
}
}
//操作当前实例
, transfer = function () {
var that = this
, options = that.config
, id = options.id || options.index;
transfer.that[id] = that; //记录当前实例对象
transfer.config[id] = options; //记录当前实例配置项
return {
reload: function (options) {
that.reload.call(that, options);
}
, config: options
//获取右侧数据
, getData: function (haskey) {
return that.getData.call(that,haskey);
}
}
}
//构造器
, Class = function (options) {
var that = this;
that.index = ++transferTable.index;
that.left_table_id = "left_table_" + that.index;
that.rigth_table_id = "rigth_table_" + that.index;
//表格重载ID 如果配置里面没有 自动分配一个ID
that.reload_left = options.leftTable['id'] || that.left_table_id;
that.reload_right = options.rightTable['id'] || that.rigth_table_id;
//右侧表格默认值
if (options.defultValue) {
options.defultValueKey = options.defultValueKey || 'id';
}
options.leftTable['elem'] = '#' + that.left_table_id;
options.leftTable['callback'] = options.leftTable['done'];
options.leftTable['firstLoad'] = true;
options.rightTable['elem'] = '#' + that.rigth_table_id;
options.rightTable['callback'] = options.rightTable['done'];
options.rightTable['firstLoad'] = true;
options.rightTable['data'] = options.rightTable['data'] || [];
that.config = $.extend({}, that.config, transferTable.config, options);
that.render();
};
Class.prototype.render = function () {
//ID里面放表格样式
this.tableHtml()
// 配置表格参数
this.loadTable()
// 移动数据
this.transferData()
}
Class.prototype.tableHtml = function () {
var that = this,
options = that.config,
left_table = '
',
rigth_table = '',
html = '' +
'
' + left_table + '
' +
'
' +
'' +
'' +
'
' +
'
' + rigth_table + '
' +
'
';
$(options.elem).append(html)
}
Class.prototype.loadTable = function () {
//传递的参数 table.render 表格
var that = this,
options = that.config;
options.leftTable['done'] = function (res, cur, total) {
//监听表格选中
table.on('checkbox(' + that.left_table_id + ')', function (obj) {
//表格点击触发
/*var checkStatusData = table.checkStatus(that.reload_left).data;
if (checkStatusData.length > 0) {
$('.' + that.left_table_id).removeClass('layui-btn-disabled')
} else {
$('.' + that.left_table_id).addClass('layui-btn-disabled')
}*/
$('.' + that.left_table_id).removeClass('layui-btn-disabled')
});
if (options.leftTable.callback) {
options.leftTable.callback(res, cur, total);
}
var rightData = table.getData(that.reload_right,false)
//初始化时右侧有数据,要将左侧对应数据勾选上
if (rightData.length > 0) {
for (var i = 0; i < rightData.length; i++) {
for (var j = 0; j < res.data.length; j++) {
if (rightData[i]['id'] == res.data[j]['id']) {
table.checkRecord(that.reload_left, res.data[j]);
break;
}
}
}
}
}
options.rightTable['done'] = function (res, cur, total) {
//监听表格选中
table.on('checkbox(' + that.rigth_table_id + ')', function (obj) {
//右侧表格点击触发
/*var checkStatusData = table.checkStatus(that.reload_right).data;
if (checkStatusData.length > 0) {
$('.' + that.rigth_table_id).removeClass('layui-btn-disabled')
} else {
$('.' + that.rigth_table_id).addClass('layui-btn-disabled')
}*/
$('.' + that.rigth_table_id).removeClass('layui-btn-disabled')
});
if (options.rightTable.firstLoad) {
if (options.rightTable.callback) {
options.rightTable.callback(res, cur, total);
}
//右侧表格加载完后再加载左侧,以便将数据在左侧勾选上
table.render(options.leftTable);
}
options.rightTable.firstLoad = false
};
if (options.rightTable.url) {
$webUtil.ajax(options.rightTable.method || 'get', options.rightTable.url, $.extend({limit: -1}, options.rightTable.where, options.rightTable.extraParams), function (result) {
if (result.success) {
options.rightTable['data'] = result.data;
options.rightTable['loadurl'] = options.rightTable['url'];
options.rightTable['url'] = null;
table.render(options.rightTable);
} else {
$webUtil.showErrorMsg(result.msg);
}
}, function (xhr, error) {
$webUtil.showDebugMsg(error);
}, options.rightTable.backPath);
} else {
table.render(options.rightTable);
}
}
Class.prototype.transferData = function () {
//绑定点击事件
var that = this,
idName = that.config.id_name;
$('.' + that.left_table_id).on('click', function () {
if (!$(this).hasClass('layui-btn-disabled')) {
var leftData = table.getData(that.reload_left,false)
var rightData = table.getData(that.reload_right,false)
layui.each(leftData, function (i, item) {
if (item[table.config.checkName]) {
//该数据左侧已选中,须在右侧中添加
var add = true;
for (var j = 0; j < rightData.length; j++) {
if (item['id'] == rightData[j]['id']) {
add = false
break;
}
}
add && rightData.push(JSON.parse(JSON.stringify(item)));
rightData[rightData.length - 1][table.config.checkName] = false
} else {
//该数据左侧未选中,须在右侧中删除
for (var j = 0; j < rightData.length; j++) {
if (item['id'] == rightData[j]['id']) {
rightData.remove(rightData[j])
break;
}
}
}
});
table.reload(that.reload_right, {data: rightData})
}
$(this).addClass('layui-btn-disabled')
})
$('.' + that.rigth_table_id).on('click', function () {
if (!$(this).hasClass('layui-btn-disabled')) {
var checkStatus = table.checkStatus(that.reload_right, true)
, checkStatusData = checkStatus.data;
if (checkStatusData && checkStatusData.length) {
var leftData = table.getData(that.reload_left,false)
for (var i = 0; i < checkStatusData.length; i++) {
//左侧表格去除选中状态
for (var j = 0; j < leftData.length; j++) {
if (checkStatusData[i]['id'] == leftData[j]['id']) {
table.checkRecord(that.reload_left, leftData[j]);
break;
}
}
}
table.removeData(that.reload_right, checkStatusData)
}
}
$(this).addClass('layui-btn-disabled')
})
}
//获得右侧面板数据
Class.prototype.getData = function (haskey) {
var that = this
, options = that.config
, selectedData = [];
var selectedData = table.getData(that.reload_right,!haskey)
return selectedData;
};
//记录所有实例
transfer.that = {}; //记录所有实例对象
transfer.config = {}; //记录所有实例配置项
//获得选中的数据(右侧面板)
transferTable.getData = function (id,haskey) {
var that = transfer.that[id];
return table.getData(that.reload_right,haskey);
};
transferTable.render = function (options) {
var ins = new Class(options);
return transfer.call(ins);
};
exports('transferTable', transferTable);
});