commit
e229fe884f
@ -0,0 +1,159 @@ |
|||||||
|
/** |
||||||
|
* 表单插件,使用方法: |
||||||
|
* var myform = layui.Form('formId'); |
||||||
|
* myform.setData({...}) |
||||||
|
* |
||||||
|
* var data = myform.getData(); |
||||||
|
* |
||||||
|
* var name = myform.getData('name') |
||||||
|
*/ |
||||||
|
layui.define(function (exports) { |
||||||
|
|
||||||
|
/** |
||||||
|
* form = new Form('formId'); |
||||||
|
* @param formId |
||||||
|
* @constructor |
||||||
|
*/ |
||||||
|
var Form = function (formId) { |
||||||
|
this.$form = $('#' + formId); |
||||||
|
this.parseForm(this.$form); |
||||||
|
} |
||||||
|
|
||||||
|
Form.prototype = { |
||||||
|
fire: function (eventName, data) { |
||||||
|
var handler = this['on' + eventName]; |
||||||
|
handler && handler(data); |
||||||
|
} |
||||||
|
, opt: function (attr) { |
||||||
|
return this[attr]; |
||||||
|
} |
||||||
|
/** |
||||||
|
* @private |
||||||
|
*/ |
||||||
|
, parseForm: function ($form) { |
||||||
|
var that = this; |
||||||
|
this.form = $form[0]; |
||||||
|
} |
||||||
|
|
||||||
|
, getEls: function () { |
||||||
|
return this.$form.find('input,select,textarea'); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 同load(data) |
||||||
|
*/ |
||||||
|
, setData: function (data) { |
||||||
|
this.loadData(data); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @private |
||||||
|
*/ |
||||||
|
, loadData: function (data) { |
||||||
|
this.reset(); |
||||||
|
for (var name in data) { |
||||||
|
var val = data[name]; |
||||||
|
var $el = this.$form.find('[name="' + name + '"]'); |
||||||
|
|
||||||
|
$el.each(function () { |
||||||
|
var _$el = $(this); |
||||||
|
if (_$el.is(':radio') || _$el.is(':checkbox')) { |
||||||
|
_$el.prop('checked', false); |
||||||
|
var elVal = _$el.val(); |
||||||
|
|
||||||
|
if ($.isArray(val)) { |
||||||
|
for (var i = 0, len = val.length; i < len; i++) { |
||||||
|
if (elVal == val[i]) { |
||||||
|
_$el.prop('checked', true); |
||||||
|
} |
||||||
|
} |
||||||
|
} else { |
||||||
|
_$el.prop('checked', elVal == val); |
||||||
|
} |
||||||
|
|
||||||
|
} else { |
||||||
|
_$el.val(val); |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
/** |
||||||
|
* 清除表单中的值,清除错误信息 |
||||||
|
*/ |
||||||
|
, clear: function () { |
||||||
|
this.getEls().each(function () { |
||||||
|
var _$el = $(this); |
||||||
|
if (_$el.is(':radio') || _$el.is(':checkbox')) { |
||||||
|
this.checked = false; |
||||||
|
} else { |
||||||
|
this.value = ''; |
||||||
|
} |
||||||
|
|
||||||
|
var msg = _$el.data('msg'); |
||||||
|
if (msg) { |
||||||
|
msg.text(''); |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
} |
||||||
|
/** |
||||||
|
* 重置表单 |
||||||
|
*/ |
||||||
|
, reset: function () { |
||||||
|
var form = this.form; |
||||||
|
if (form && form.reset) { |
||||||
|
form.reset(); |
||||||
|
} else { |
||||||
|
this.clear(); |
||||||
|
} |
||||||
|
} |
||||||
|
/** |
||||||
|
* 获取表单数据,如果有fieldName参数则返回表单对应的值<br> |
||||||
|
* var id = form.getData('id') 等同于 var id = form.getData().id; |
||||||
|
* @param {String} fieldName |
||||||
|
* @return {Object} 返回JSON对象,如果有fieldName参数,则返回对应的值 |
||||||
|
*/ |
||||||
|
, getData: function (fieldName) { |
||||||
|
var that = this; |
||||||
|
var data = {}; |
||||||
|
|
||||||
|
this.getEls().each(function () { |
||||||
|
var value = that._getInputVal($(this)); |
||||||
|
if (value) { |
||||||
|
var name = this.name; |
||||||
|
var dataValue = data[name]; |
||||||
|
if (dataValue) { |
||||||
|
if ($.isArray(dataValue)) { |
||||||
|
dataValue.push(value); |
||||||
|
} else { |
||||||
|
data[name] = [dataValue, value]; |
||||||
|
} |
||||||
|
} else { |
||||||
|
data[name] = value; |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
if (typeof fieldName === 'string') { |
||||||
|
return data[fieldName]; |
||||||
|
} |
||||||
|
|
||||||
|
return data; |
||||||
|
} |
||||||
|
, _getInputVal: function ($input) { |
||||||
|
if ($input.is(":radio") || $input.is(":checkbox")) { |
||||||
|
if ($input.is(':checked')) { |
||||||
|
return $input.val(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
return $input.val(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
exports('Form', function (formId) { |
||||||
|
return new Form(formId); |
||||||
|
}); |
||||||
|
}); |
@ -0,0 +1,18 @@ |
|||||||
|
.treeTable-empty { |
||||||
|
width: 20px; |
||||||
|
display: inline-block; |
||||||
|
} |
||||||
|
|
||||||
|
.treeTable-icon { |
||||||
|
cursor: pointer; |
||||||
|
} |
||||||
|
|
||||||
|
.treeTable-icon .layui-icon-triangle-d:before { |
||||||
|
content: "\e623"; |
||||||
|
} |
||||||
|
|
||||||
|
.treeTable-icon.open .layui-icon-triangle-d:before { |
||||||
|
content: "\e625"; |
||||||
|
background-color: transparent; |
||||||
|
} |
||||||
|
|
@ -0,0 +1,216 @@ |
|||||||
|
layui.define(['layer', 'table'], function (exports) { |
||||||
|
var $ = layui.jquery; |
||||||
|
var layer = layui.layer; |
||||||
|
var table = layui.table; |
||||||
|
|
||||||
|
var treetable = { |
||||||
|
// 渲染树形表格
|
||||||
|
render: function (param) { |
||||||
|
// 检查参数
|
||||||
|
if (!treetable.checkParam(param)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
// 获取数据
|
||||||
|
if (param.data) { |
||||||
|
treetable.init(param, param.data); |
||||||
|
} else { |
||||||
|
// $.getJSON(param.url, param.where, function (res) {
|
||||||
|
// treetable.init(param, res.data);
|
||||||
|
// });
|
||||||
|
$.ajax({ |
||||||
|
url: param.url, |
||||||
|
type: param.method || 'get', |
||||||
|
data: param.where, |
||||||
|
headers: param.headers || {}, |
||||||
|
dataType: "json", |
||||||
|
success: function (res) { |
||||||
|
treetable.init(param, res.data); |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
}, |
||||||
|
// 渲染表格
|
||||||
|
init: function (param, data) { |
||||||
|
var mData = []; |
||||||
|
var doneCallback = param.done; |
||||||
|
var tNodes = data; |
||||||
|
// 补上id和pid字段
|
||||||
|
for (var i = 0; i < tNodes.length; i++) { |
||||||
|
var tt = tNodes[i]; |
||||||
|
if (!tt.id) { |
||||||
|
if (!param.treeIdName) { |
||||||
|
layer.msg('参数treeIdName不能为空', {icon: 5}); |
||||||
|
return; |
||||||
|
} |
||||||
|
tt.id = tt[param.treeIdName]; |
||||||
|
} |
||||||
|
if (!tt.pid) { |
||||||
|
if (!param.treePidName) { |
||||||
|
layer.msg('参数treePidName不能为空', {icon: 5}); |
||||||
|
return; |
||||||
|
} |
||||||
|
tt.pid = tt[param.treePidName]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// 对数据进行排序
|
||||||
|
var sort = function (s_pid, data) { |
||||||
|
for (var i = 0; i < data.length; i++) { |
||||||
|
if (data[i].pid == s_pid) { |
||||||
|
var len = mData.length; |
||||||
|
if (len > 0 && mData[len - 1].id == s_pid) { |
||||||
|
mData[len - 1].isParent = true; |
||||||
|
} |
||||||
|
mData.push(data[i]); |
||||||
|
sort(data[i].id, data); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
sort(param.treeSpid, tNodes); |
||||||
|
|
||||||
|
// 重写参数
|
||||||
|
param.url = undefined; |
||||||
|
param.data = mData; |
||||||
|
param.page = { |
||||||
|
count: param.data.length, |
||||||
|
limit: param.data.length |
||||||
|
}; |
||||||
|
param.cols[0][param.treeColIndex].templet = function (d) { |
||||||
|
var mId = d.id; |
||||||
|
var mPid = d.pid; |
||||||
|
var isDir = d.isParent; |
||||||
|
var emptyNum = treetable.getEmptyNum(mPid, mData); |
||||||
|
var iconHtml = ''; |
||||||
|
for (var i = 0; i < emptyNum; i++) { |
||||||
|
iconHtml += '<span class="treeTable-empty"></span>'; |
||||||
|
} |
||||||
|
if (isDir) { |
||||||
|
iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>'; |
||||||
|
} else { |
||||||
|
iconHtml += '<i class="layui-icon layui-icon-file"></i>'; |
||||||
|
} |
||||||
|
iconHtml += ' '; |
||||||
|
var ttype = isDir ? 'dir' : 'file'; |
||||||
|
var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">'; |
||||||
|
return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>' |
||||||
|
}; |
||||||
|
|
||||||
|
param.done = function (res, curr, count) { |
||||||
|
$(param.elem).next().addClass('treeTable'); |
||||||
|
$('.treeTable .layui-table-page').css('display', 'none'); |
||||||
|
$(param.elem).next().attr('treeLinkage', param.treeLinkage); |
||||||
|
// 绑定事件换成对body绑定
|
||||||
|
/*$('.treeTable .treeTable-icon').click(function () { |
||||||
|
treetable.toggleRows($(this), param.treeLinkage); |
||||||
|
});*/ |
||||||
|
if (param.treeDefaultClose) { |
||||||
|
treetable.foldAll(param.elem); |
||||||
|
} |
||||||
|
if (doneCallback) { |
||||||
|
doneCallback(res, curr, count); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
// 渲染表格
|
||||||
|
table.render(param); |
||||||
|
}, |
||||||
|
// 计算缩进的数量
|
||||||
|
getEmptyNum: function (pid, data) { |
||||||
|
var num = 0; |
||||||
|
if (!pid) { |
||||||
|
return num; |
||||||
|
} |
||||||
|
var tPid; |
||||||
|
for (var i = 0; i < data.length; i++) { |
||||||
|
if (pid == data[i].id) { |
||||||
|
num += 1; |
||||||
|
tPid = data[i].pid; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
return num + treetable.getEmptyNum(tPid, data); |
||||||
|
}, |
||||||
|
// 展开/折叠行
|
||||||
|
toggleRows: function ($dom, linkage) { |
||||||
|
var type = $dom.attr('lay-ttype'); |
||||||
|
if ('file' == type) { |
||||||
|
return; |
||||||
|
} |
||||||
|
var mId = $dom.attr('lay-tid'); |
||||||
|
var isOpen = $dom.hasClass('open'); |
||||||
|
if (isOpen) { |
||||||
|
$dom.removeClass('open'); |
||||||
|
} else { |
||||||
|
$dom.addClass('open'); |
||||||
|
} |
||||||
|
$dom.closest('tbody').find('tr').each(function () { |
||||||
|
var $ti = $(this).find('.treeTable-icon'); |
||||||
|
var pid = $ti.attr('lay-tpid'); |
||||||
|
var ttype = $ti.attr('lay-ttype'); |
||||||
|
var tOpen = $ti.hasClass('open'); |
||||||
|
if (mId == pid) { |
||||||
|
if (isOpen) { |
||||||
|
$(this).hide(); |
||||||
|
if ('dir' == ttype && tOpen == isOpen) { |
||||||
|
$ti.trigger('click'); |
||||||
|
} |
||||||
|
} else { |
||||||
|
$(this).show(); |
||||||
|
if (linkage && 'dir' == ttype && tOpen == isOpen) { |
||||||
|
$ti.trigger('click'); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 检查参数
|
||||||
|
checkParam: function (param) { |
||||||
|
if (!param.treeSpid && param.treeSpid != 0) { |
||||||
|
layer.msg('参数treeSpid不能为空', {icon: 5}); |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
if (!param.treeColIndex && param.treeColIndex != 0) { |
||||||
|
layer.msg('参数treeColIndex不能为空', {icon: 5}); |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
}, |
||||||
|
// 展开所有
|
||||||
|
expandAll: function (dom) { |
||||||
|
$(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () { |
||||||
|
var $ti = $(this).find('.treeTable-icon'); |
||||||
|
var ttype = $ti.attr('lay-ttype'); |
||||||
|
var tOpen = $ti.hasClass('open'); |
||||||
|
if ('dir' == ttype && !tOpen) { |
||||||
|
$ti.trigger('click'); |
||||||
|
} |
||||||
|
}); |
||||||
|
}, |
||||||
|
// 折叠所有
|
||||||
|
foldAll: function (dom) { |
||||||
|
$(dom).next('.treeTable').find('.layui-table-body tbody tr').each(function () { |
||||||
|
var $ti = $(this).find('.treeTable-icon'); |
||||||
|
var ttype = $ti.attr('lay-ttype'); |
||||||
|
var tOpen = $ti.hasClass('open'); |
||||||
|
if ('dir' == ttype && tOpen) { |
||||||
|
$ti.trigger('click'); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
layui.link(layui.cache.base + 'treetable-lay/treetable.css'); |
||||||
|
|
||||||
|
// 给图标列绑定事件
|
||||||
|
$('body').on('click', '.treeTable .treeTable-icon', function () { |
||||||
|
var treeLinkage = $(this).parents('.treeTable').attr('treeLinkage'); |
||||||
|
if ('true' == treeLinkage) { |
||||||
|
treetable.toggleRows($(this), true); |
||||||
|
} else { |
||||||
|
treetable.toggleRows($(this), false); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
exports('treetable', treetable); |
||||||
|
}); |
Loading…
Reference in new issue