From ea24b7635db3822fa586cae819e5369f8209dae9 Mon Sep 17 00:00:00 2001
From: smallwei <1634566606@qq.com>
Date: Thu, 19 Jul 2018 20:53:05 +0800
Subject: [PATCH] fix(atree): 2.0.0-beta
---
examples/atree.html | 2 +
src/lay/modules/atree.js | 745 ++++++++++++++++++++-------------------
src/layui.js | 4 +-
3 files changed, 389 insertions(+), 362 deletions(-)
diff --git a/examples/atree.html b/examples/atree.html
index 5b2eed6..817c46c 100644
--- a/examples/atree.html
+++ b/examples/atree.html
@@ -33,6 +33,8 @@
// drag: true,
spreadAll:true,
props:{
+ addBtnLabel:'新增',
+ deleteBtnLabel:'删除',
name: 'name',
id: 'id',
children:'children',
diff --git a/src/lay/modules/atree.js b/src/lay/modules/atree.js
index 4c80a19..a9ef3b4 100644
--- a/src/lay/modules/atree.js
+++ b/src/lay/modules/atree.js
@@ -7,389 +7,414 @@
*/
layui.define('jquery', function(exports) {
- "use strict";
+ "use strict";
- var $ = layui.$,
- hint = layui.hint();
- //勾选集合
- var changeList = [];
- //变量别名
- var props ={
- name: 'name',
- id: 'id',
- children:'children',
- checkbox:'checkbox',
- spread:'spread'
- };
-
- var enterSkin = 'layui-tree-enter',
- Tree = function(options) {
- this.options = options;
- this.nodes = options.nodes || [];
- this.props = this.options.props || props;
- this.nameKey = this.props.name || props.name;
- this.idKey = this.props.id || props.id;
- this.childrenKey = this.props.children || props.children;
- this.checkboxKey = this.props.checkbox || props.checkbox;
- this.spreadKey = this.props.spread || props.spread;
- };
- //图标
- var icon = {
- arrow: ['', ''] //箭头
- ,
- checkbox: ['', ''] //复选框
- ,
- leaf: '' //叶节点
- };
+ var $ = layui.$,
+ hint = layui.hint();
+ //勾选集合
+ var changeList = [];
+ //变量别名
+ var props = {
+ name: 'name',
+ id: 'id',
+ children: 'children',
+ checkbox: 'checkbox',
+ spread: 'spread',
+ deleteBtnLabelKey: 'delete',
+ addBtnLabelKey: 'add',
+ };
- //初始化
- Tree.prototype.init = function(elem) {
- var that = this;
- elem.addClass('layui-box layui-tree'); //添加tree样式
- if(that.options.skin) {
- elem.addClass('layui-tree-skin-' + that.options.skin);
- }
- that.tree(elem);
- that.on(elem);
- };
+ var enterSkin = 'layui-tree-enter',
+ Tree = function(options) {
+ this.options = options;
+ this.nodes = options.nodes || [];
+ this.props = this.options.props || props;
+ this.nameKey = this.props.name || props.name;
+ this.idKey = this.props.id || props.id;
+ this.childrenKey = this.props.children || props.children;
+ this.checkboxKey = this.props.checkbox || props.checkbox;
+ this.spreadKey = this.props.spread || props.spread;
+ this.addBtnLabelKey = this.props.addBtnLabel || props.addBtnLabel;
+ this.deleteBtnLabelKey = this.props.deleteBtnLabel || props.deleteBtnLabel;
+ };
+ //图标
+ var icon = {
+ arrow: ['', ''] //箭头
+ ,
+ checkbox: ['', ''] //复选框
+ ,
+ leaf: '' //叶节点
+ };
- //树节点解析
- Tree.prototype.tree = function(elem, children) {
- var that = this,
- options = that.options
- var nodes = children || options.nodes;
- layui.each(nodes, function(index, item) {
- var hasChild = item[that.childrenKey] && item[that.childrenKey].length > 0;
- var dom = that.getDom(item);
- var ul = $(dom.ul(item));
- var li = $(that.getNode(item));
-
- //如果被选中加入checkbox集合里
- if(item[that.checkboxKey]){
- changeList.push(item);
- }
-
- //如果有子节点,则递归继续生成树
- if(hasChild) {
- li.append(ul);
- that.tree(ul, item[that.childrenKey]);
- }
- //伸展节点
- that.spread(li, item);
- that.bindUlEvent(li, item);
- elem.append(li);
+ //初始化
+ Tree.prototype.init = function(elem) {
+ var that = this;
+ elem.addClass('layui-box layui-tree'); //添加tree样式
+ if(that.options.skin) {
+ elem.addClass('layui-tree-skin-' + that.options.skin);
+ }
+ that.tree(elem);
+ that.on(elem);
+ };
- });
- };
+ //树节点解析
+ Tree.prototype.tree = function(elem, children) {
+ var that = this,
+ options = that.options
+ var nodes = children || options.nodes;
+ layui.each(nodes, function(index, item) {
+ var hasChild = item[that.childrenKey] && item[that.childrenKey].length > 0;
+ var dom = that.getDom(item);
+ var ul = $(dom.ul(item));
+ var li = $(that.getNode(item));
-//节点dom拼接
- Tree.prototype.getDom = function(item) {
- var that = this,
- options = that.options,
- item = item,
- hasChild = item[that.childrenKey] && item[that.childrenKey].length > 0;
- return {
- spread: function() {
- return hasChild ? '' + (
- item[that.spreadKey] || options.spreadAll ? icon.arrow[1] : icon.arrow[0]
- ) + '' : '';
- },
- checkbox: function() {
- return options.check ? (
- '' + (
- item[that.checkboxKey]? icon.checkbox[1] : icon.checkbox[0]
- ) + ''
- ) : '';
- },
- ul:function(){
- return '
'
- },
- node: function() {
- return '' +
- ('' + (item[that.nameKey] || '未命名') + '')
- },
- menu: function() {
- return ''
- }
- }
+ //如果被选中加入checkbox集合里
+ if(item[that.checkboxKey]) {
+ changeList.push(item);
+ }
- }
- //获取树节点
- Tree.prototype.getNode = function(item) {
- var that = this,
- options = that.options
- var dom = that.getDom(item);
- var li = [''
- //展开箭头
- ,
- dom.spread()
+ //如果有子节点,则递归继续生成树
+ if(hasChild) {
+ li.append(ul);
+ that.tree(ul, item[that.childrenKey]);
+ }
+ //伸展节点
+ that.spread(li, item);
+ that.bindUlEvent(li, item);
+ elem.append(li);
- //复选框
- ,
- dom.checkbox()
+ });
+ };
- //节点
- ,
- dom.node()
- //菜单
- ,
- dom.menu()
- ,
- '
'
- ].join('');
- return li;
- }
+ //节点dom拼接
+ Tree.prototype.getDom = function(item) {
+ var that = this,
+ options = that.options,
+ item = item,
+ hasChild = item[that.childrenKey] && item[that.childrenKey].length > 0;
+ return {
+ spread: function() {
+ return hasChild ? '' + (
+ item[that.spreadKey] || options.spreadAll ? icon.arrow[1] : icon.arrow[0]
+ ) + '' : '';
+ },
+ checkbox: function() {
+ return options.check ? (
+ '' + (
+ item[that.checkboxKey] ? icon.checkbox[1] : icon.checkbox[0]
+ ) + ''
+ ) : '';
+ },
+ ul: function() {
+ return ''
+ },
+ node: function() {
+ return '' +
+ ('' + (item[that.nameKey] || '未命名') + '')
+ },
+ menu: function() {
+ return ''
+ }
+ }
- //父绑定事件
- Tree.prototype.bindUlEvent = function(li, item) {
- var that = this,
- options = that.options
- //触发点击节点回调
- typeof options.click === 'function' && that.click(li, item);
+ }
+ //获取树节点
+ Tree.prototype.getNode = function(item) {
+ var that = this,
+ options = that.options
+ var dom = that.getDom(item);
+ var li = [''
+ //展开箭头
+ ,
+ dom.spread()
- //节点选择
- typeof options.change === 'function' && options.check === 'checkbox' && that.checkbox(li, item);
+ //复选框
+ ,
+ dom.checkbox()
- //新增方法
- typeof options.addClick === 'function' && that.add(li, item);
+ //节点
+ ,
+ dom.node()
+ //菜单
+ ,
+ dom.menu(),
+ '
'
+ ].join('');
+ return li;
+ }
- //删除方法
- typeof options.deleteClick === 'function' && that.delete(li, item);
+ //父绑定事件
+ Tree.prototype.bindUlEvent = function(li, item) {
+ var that = this,
+ options = that.options
+ //触发点击节点回调
+ typeof options.click === 'function' && that.click(li, item);
- //拖拽节点
- options.drag && that.drag(li, item);
- }
+ //节点选择
+ typeof options.change === 'function' && options.check === 'checkbox' && that.checkbox(li, item);
- //选中回调函数
- Tree.prototype.change = function() {
- var that = this,
- options = that.options;
- options.change(changeList);
- },
+ //新增方法
+ typeof options.addClick === 'function' && that.add(li, item);
- //新增方法回调
- Tree.prototype.add = function(elem, item) {
- var that = this,
- options = that.options;
- var node =elem.children('.layui-tree-node');
- var addBtn = node.children('.layui-tree-menu').children('.layui-tree-add')
- var arrow = node.children('.layui-tree-spread')
- var ul = elem.children('ul'),
- a = node.children('a');
- var addEvent = function(e) {
- layui.stope(e);
- var _addEvent = {
- add: function(itemAddObj) {
- if(!item[that.childrenKey]){
- item[that.childrenKey] = [];
- }
- item[that.childrenKey].push(itemAddObj);
- var dom = that.getDom(item);
- if(!ul[0]) {
- ul = $(dom.ul())
- elem.append(ul);
- }
- if(!arrow[0]) {
- arrow = $(dom.spread());
- elem.prepend(arrow);
- that.spread(elem, item);
- }
- if(!elem.data('spread')) {
- that.open(elem, ul, arrow)
- }
- var li = $(that.getNode(itemAddObj));
- that.bindUlEvent(li, itemAddObj);
- ul.append(li);
- }
- }
- options.addClick(item, elem, _addEvent.add)
- }
- addBtn.on('click', addEvent);
- }
+ //删除方法
+ typeof options.deleteClick === 'function' && that.delete(li, item);
- //删除方法回调
- Tree.prototype.delete = function(elem, item) {
- var that = this,
- options = that.options;
- var node =elem.children('.layui-tree-node');
- var deleteBtn = node.children('.layui-tree-menu').children('.layui-tree-delete')
- var ul = elem.children('ul'),
- a = elem.children('a');
- var deleteEvent = function(e) {
- layui.stope(e);
- var _deleteEvent = {
- done: function() {
- var parent =elem.parent();
- var arrow = parent.parent().children('.layui-tree-spread')
- if(parent.children('li').length===1){
- arrow.remove();
- }
- elem.remove();
- }
- }
- options.deleteClick(item, elem, _deleteEvent.done)
- }
- deleteBtn.on('click', deleteEvent);
- }
+ //拖拽节点
+ options.drag && that.drag(li, item);
+ }
- //点击节点回调
- Tree.prototype.click = function(elem, item) {
- var that = this,
- options = that.options;
- var node =elem.children('.layui-tree-node');
- node.children('a').on('click', function(e) {
- layui.stope(e);
- options.click(item)
- });
- };
+ //选中回调函数
+ Tree.prototype.change = function() {
+ var that = this,
+ options = that.options;
+ options.change(changeList);
+ },
- //节点选择
- Tree.prototype.checkbox = function(elem, item) {
- var that = this,
- options = that.options;
- var node =elem.children('.layui-tree-node');
- var checkbox = node.children('.layui-tree-check')
- var ul = elem.children('ul'),
- a = node.children('a');
- var check = function() {
- var index = layui.findObj(changeList, item);
- if(elem.data('check')) {
- elem.data('check', null)
- checkbox.removeClass(' is-checked');
- checkbox.html(icon.checkbox[0]);
- } else {
- elem.data('check', true);
- checkbox.addClass(' is-checked');
- checkbox.html(icon.checkbox[1]);
- }
- if(index === -1) {
- changeList.push(item);
- } else {
- changeList.splice(index, 1);
- }
- that.change();
- }
- checkbox.on('click', check);
+ //新增方法回调
+ Tree.prototype.add = function(elem, item) {
+ var that = this,
+ options = that.options;
+ var node = elem.children('.layui-tree-node');
+ var addBtn = node.children('.layui-tree-menu').children('.layui-tree-add')
+ var arrow = node.children('.layui-tree-spread')
+ var ul = elem.children('ul'),
+ a = node.children('a');
+ var addEvent = function(e) {
+ layui.stope(e);
+ var _addEvent = {
+ add: function(itemAddObj) {
+ if(!item[that.childrenKey]) {
+ item[that.childrenKey] = [];
+ }
+ item[that.childrenKey].push(itemAddObj);
+ var dom = that.getDom(item);
+ if(!ul[0]) {
+ ul = $(dom.ul())
+ elem.append(ul);
+ }
+ if(!arrow[0]) {
+ arrow = $(dom.spread());
+ node.prepend(arrow);
+ that.spread(elem, item);
+ }
+ if(!elem.data('spread')) {
+ that.open(elem, ul, arrow)
+ }
+ var li = $(that.getNode(itemAddObj));
+ that.bindUlEvent(li, itemAddObj);
+ ul.append(li);
+ }
+ }
+ options.addClick(item, elem, _addEvent.add)
+ }
+ addBtn.on('click', addEvent);
+ }
- };
+ //删除方法回调
+ Tree.prototype.delete = function(elem, item) {
+ var that = this,
+ options = that.options;
+ var node = elem.children('.layui-tree-node');
+ var deleteBtn = node.children('.layui-tree-menu').children('.layui-tree-delete')
+ var ul = elem.children('ul'),
+ a = elem.children('a');
+ var deleteEvent = function(e) {
+ layui.stope(e);
+ var _deleteEvent = {
+ done: function() {
+ var parent = elem.parent();
+ var arrow = parent.parent().children('.layui-tree-spread')
+ if(parent.children('li').length === 1) {
+ arrow.remove();
+ }
+ elem.remove();
+ }
+ }
+ options.deleteClick(item, elem, _deleteEvent.done)
+ }
+ deleteBtn.on('click', deleteEvent);
+ }
- //伸展节点
- Tree.prototype.spread = function(elem, item) {
- var that = this,
- options = that.options;
- var node =elem.children('.layui-tree-node');
- var arrow = node.children('.layui-tree-spread')
- var ul = elem.children('ul'),
- a = node.children('a');
- //如果没有子节点,则不执行
- if(!ul[0]) return;
- arrow.on('click', function() {
- that.open(elem, ul, arrow)
- });
- }
+ //点击节点回调
+ Tree.prototype.click = function(elem, item) {
+ var that = this,
+ options = that.options;
+ var node = elem.children('.layui-tree-node');
+ node.children('a').on('click', function(e) {
+ layui.stope(e);
+ options.click(item)
+ });
+ };
- //打开节点
- Tree.prototype.open = function(elem, ul, arrow) {
- if(elem.data('spread')) {
- elem.data('spread', null)
- ul.removeClass('layui-show');
- arrow.html(icon.arrow[0]);
- } else {
- elem.data('spread', true);
- ul.addClass('layui-show');
- arrow.html(icon.arrow[1]);
- }
- };
- //通用事件
- Tree.prototype.on = function(elem) {
- var that = this,
- options = that.options;
- var dragStr = 'layui-tree-drag';
+ //节点选择
+ Tree.prototype.checkbox = function(elem, item) {
+ var that = this,
+ options = that.options;
+ var node = elem.children('.layui-tree-node');
+ var checkbox = node.children('.layui-tree-check')
+ var ul = elem.children('ul'),
+ a = node.children('a');
+ var whileAllCheck = function(dom, item, type) {
+ var list = dom.children('.layui-show').find('li');
+ var children = item ? item.children || [] : [];
+ for(var i = 0; i < list.length; i++) {
+ var li = $(list[i]);
+ setCheck(li, children[i], type);
+ whileAllCheck(li, children[i], type);
+ }
+ }
+ var setCheck = function(elem, item, type) {
+ var checkbox = elem.children('.layui-tree-node').find('.layui-tree-check');
+ if(type) {
+ elem.data('check', true)
+ checkbox.html(icon.checkbox[1])
+ checkbox.addClass(' is-checked');
+ } else {
+ elem.data('check', null);
+ checkbox.removeClass(' is-checked');
+ checkbox.html(icon.checkbox[0])
+ }
+ if(item) {
+ var index = layui.findObj(changeList, item[that.idKey], that.idKey);
+ if(index === -1 && type === true) {
+ changeList.push(item);
+ } else if(type === false) {
+ changeList.splice(index, 1);
+ }
+ }
+ }
+ var check = function() {
+ var checkFlag;
+ if(elem.data('check')) {
+ checkFlag = false;
+ } else {
+ checkFlag = true;
+ }
+ setCheck(elem, item, checkFlag)
+ whileAllCheck(elem, item, checkFlag);
+ that.change();
+ }
+ checkbox.on('click', check);
- //屏蔽选中文字
- elem.find('i').on('selectstart', function(e) {
- return false
- });
+ };
- //拖拽
- if(options.drag) {
- $(document).on('mousemove', function(e) {
- var move = that.move;
- if(move.from) {
- var to = move.to,
- treeMove = $('');
- e.preventDefault();
- $('.' + dragStr)[0] || $('body').append(treeMove);
- var dragElem = $('.' + dragStr)[0] ? $('.' + dragStr) : treeMove;
- (dragElem).addClass('layui-show').html(move.from.elem.children('a').html());
- dragElem.css({
- left: e.pageX + 10,
- top: e.pageY + 10
- })
- }
- }).on('mouseup', function() {
- var move = that.move;
- if(move.from) {
- move.from.elem.children('a').removeClass(enterSkin);
- move.to && move.to.elem.children('a').removeClass(enterSkin);
- that.move = {};
- $('.' + dragStr).remove();
- }
- });
- }
- };
+ //伸展节点
+ Tree.prototype.spread = function(elem, item) {
+ var that = this,
+ options = that.options;
+ var node = elem.children('.layui-tree-node');
+ var arrow = node.children('.layui-tree-spread')
+ var ul = elem.children('ul'),
+ a = node.children('a');
+ //如果没有子节点,则不执行
+ if(!ul[0]) return;
+ arrow.on('click', function() {
+ that.open(elem, ul, arrow)
+ });
+ }
- //拖拽节点
- Tree.prototype.move = {};
- Tree.prototype.drag = function(elem, item) {
- var that = this,
- options = that.options;
- var a = elem.children('a'),
- mouseenter = function() {
- var othis = $(this),
- move = that.move;
- if(move.from) {
- move.to = {
- item: item,
- elem: elem
- };
- othis.addClass(enterSkin);
- }
- };
- a.on('mousedown', function() {
- var move = that.move
- move.from = {
- item: item,
- elem: elem
- };
- });
- a.on('mouseenter', mouseenter).on('mousemove', mouseenter)
- .on('mouseleave', function() {
- var othis = $(this),
- move = that.move;
- if(move.from) {
- delete move.to;
- othis.removeClass(enterSkin);
- }
- });
- };
+ //打开节点
+ Tree.prototype.open = function(elem, ul, arrow) {
+ if(elem.data('spread')) {
+ elem.data('spread', null)
+ ul.removeClass('layui-show');
+ arrow.html(icon.arrow[0]);
+ } else {
+ elem.data('spread', true);
+ ul.addClass('layui-show');
+ arrow.html(icon.arrow[1]);
+ }
+ };
+ //通用事件
+ Tree.prototype.on = function(elem) {
+ var that = this,
+ options = that.options;
+ var dragStr = 'layui-tree-drag';
- //暴露接口
- exports('atree', function(options) {
- var tree = new Tree(options = options || {});
- var elem = $(options.elem);
- if(!elem[0]) {
- return hint.error('layui.tree 没有找到' + options.elem + '元素');
- }
- tree.init(elem);
- });
+ //屏蔽选中文字
+ elem.find('i').on('selectstart', function(e) {
+ return false
+ });
+
+ //拖拽
+ if(options.drag) {
+ $(document).on('mousemove', function(e) {
+ var move = that.move;
+ if(move.from) {
+ var to = move.to,
+ treeMove = $('');
+ e.preventDefault();
+ $('.' + dragStr)[0] || $('body').append(treeMove);
+ var dragElem = $('.' + dragStr)[0] ? $('.' + dragStr) : treeMove;
+ (dragElem).addClass('layui-show').html(move.from.elem.children('a').html());
+ dragElem.css({
+ left: e.pageX + 10,
+ top: e.pageY + 10
+ })
+ }
+ }).on('mouseup', function() {
+ var move = that.move;
+ if(move.from) {
+ move.from.elem.children('a').removeClass(enterSkin);
+ move.to && move.to.elem.children('a').removeClass(enterSkin);
+ that.move = {};
+ $('.' + dragStr).remove();
+ }
+ });
+ }
+ };
+
+ //拖拽节点
+ Tree.prototype.move = {};
+ Tree.prototype.drag = function(elem, item) {
+ var that = this,
+ options = that.options;
+ var a = elem.children('a'),
+ mouseenter = function() {
+ var othis = $(this),
+ move = that.move;
+ if(move.from) {
+ move.to = {
+ item: item,
+ elem: elem
+ };
+ othis.addClass(enterSkin);
+ }
+ };
+ a.on('mousedown', function() {
+ var move = that.move
+ move.from = {
+ item: item,
+ elem: elem
+ };
+ });
+ a.on('mouseenter', mouseenter).on('mousemove', mouseenter)
+ .on('mouseleave', function() {
+ var othis = $(this),
+ move = that.move;
+ if(move.from) {
+ delete move.to;
+ othis.removeClass(enterSkin);
+ }
+ });
+ };
+
+ //暴露接口
+ exports('atree', function(options) {
+ var tree = new Tree(options = options || {});
+ var elem = $(options.elem);
+ if(!elem[0]) {
+ return hint.error('layui.tree 没有找到' + options.elem + '元素');
+ }
+ tree.init(elem);
+ });
});
\ No newline at end of file
diff --git a/src/layui.js b/src/layui.js
index aa1aa1d..90e0d18 100644
--- a/src/layui.js
+++ b/src/layui.js
@@ -437,11 +437,11 @@
}
//寻找对象是否存在数组中
- Layui.prototype.findObj = function(list,obj) {
+ Layui.prototype.findObj = function(list,value,key) {
var that = this,
result = -1;
that.each(list, function(index, item) {
- if(that.isEqualObj(obj,item))result = index;
+ if(item[key] == value)result = index;
})
return result;
}