From 8eb69f05dc9c52d714764e14e569c33324af9637 Mon Sep 17 00:00:00 2001 From: smallwei <1634566606@qq.com> Date: Sun, 15 Jul 2018 17:23:03 +0800 Subject: [PATCH 1/8] style(global): change iconfont --- src/css/layui.css | 2 ++ src/font/iconfont.eot | Bin 39620 -> 40436 bytes src/font/iconfont.svg | 44 ++++++++++++++++++++++++++--------------- src/font/iconfont.ttf | Bin 39444 -> 40268 bytes src/font/iconfont.woff | Bin 25996 -> 26448 bytes 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/css/layui.css b/src/css/layui.css index e2a1af5..aa726a7 100644 --- a/src/css/layui.css +++ b/src/css/layui.css @@ -205,6 +205,8 @@ a cite{font-style: normal; *cursor:pointer;} .layui-icon-template-1:before{content:"\e656"} .layui-icon-vercode:before{content:"\e679"} .layui-icon-cellphone:before{content:"\e678"} +.layui-icon-checkbox:before{content:"\e624"} +.layui-icon-uncheckbox:before{content:"\e68c"} diff --git a/src/font/iconfont.eot b/src/font/iconfont.eot index 961c05143989c4a94f9d8a01e2c5645a9532e56d..1524ef0cc072aaabc3fbf7e9b0eb8390aa09e62a 100644 GIT binary patch delta 3053 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 delta 2234 zcmZveYfw~W7{~u-Z@?0;8u!3f7mPqy7P$!sh>|vGiWwSSV1WgeU?DCBrfuGmyd@nc zi=j_`uxX4LWt^I+9H%j-%xRjY(Q&2^P9Gj@8fThD`_KpM|MG5G6MN=&_Bro)FVA_N z|MQ-6|1-{`X5n5BwO#FoMV@ZRkU2yv>_5|BbUH;RS6W zA7D!boVlGnqa6)T*Ny-QUBH3ju7JON;e~>mT;>ib?P5bro&6H+&q-ES@6bs7uMZyp z#*ctyO;2B&fA{$5EFgXj+p>E7BmKsV^)_wJ4|mAl8@PBRX9F-k$^M7?`v&8N8v4Ju z1*k#xduF@g$sUKn&g90qskG*Vst1U*u>rW1GTig`zj@wBGsdT{8D$o;#9Crj+YXu6 zY?(DpbAw^o0_&W$jQ>u++60>=hl8u(h7F4_;);?4Ns<&Y!*~t2lx&^kWcV zoWk2!ixb#VgaN#QUZfxuX&6E}j^Y@eLL;^!fLts`E9xoL5MIMRR51t+b3AH~c{J)| z*zrAsqJF0c#W)A`;IeBNF1Q>T1`e($jY_nzyMn=laEyXsg;+EUFvO~1s3DY=ftn-DmZeG=Em`aFRfuPOoj`bQH<^<0z z=JnXh@F?$W(J-x$7d1>Uq*23EL$+#|bjUUh(+^Q&2!#M?(ohnR?HY;$qWmM22}F%2 z6byuf)rs1HG;63LNQ;Jgg7`I57Nk`}jX~NpR2!sSL)}3F8l?m2&`^tzP7PHF;fAH4 zJ}V(XUJyzZqT)sNrnWO*^2WxFLfY${aGJq2M7Zo`lke zD3=L~0HVeamIFk&tRze+i^>aOi9l3535x~tnucWqVQh2N2`YigO~O)ws09g&3Zjxn z&}$~gd$W~G7d0$1$X6N`9ORk?$IR|{uMsdO;yp&Ic{x5M+YijpaRrMIGgBItBkocd z3hXl-3Eu=ea_{7o=6$!!ou5_klQ-GB)H~+=q0m;i*Jtx(_}2NZ_-2d7ioRa{-tymy z-zlCgX)iflnqJyp`g7TivWfDe<=0m%TCu(&qasxCWo2#U`O5oM+p0cX*|PFV^{(oh zHJfUV*L+%ATYGs``gE;p@s{aJfo0C=4gKdW(-#J}rB3fVJ{ui&vTO}H#FqxQx+f#H z+S!*zY#Z&uh;8R4SP`)uY_E^lPVSc*BX%rz&pqlLVdDnE{pdu*Hjs!}2JQ+mRbK+V>*19m$3fu^mV>QX;k!jYeL?j>S@AzjO6Kz&{jdcejqZgKd4Gj=s>4 zv&TO=9L!gjn**K0J^q154UeqG#K6E{urK8H6%;;dH4ncV4A1knXGsRQD-X|o2@K5l zJuq)uBS#HTzCrcH05^B`0tR%x`PZ^%Xs);4+m0Lz8av O<0~2#`Z72h4+R4 diff --git a/src/font/iconfont.svg b/src/font/iconfont.svg index 401e773..88235df 100644 --- a/src/font/iconfont.svg +++ b/src/font/iconfont.svg @@ -9,9 +9,9 @@ Created by iconfont - + - + - + - + @@ -75,7 +75,7 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + @@ -84,10 +84,10 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + - + @@ -111,7 +111,7 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + @@ -156,7 +156,7 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + @@ -171,7 +171,7 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + @@ -195,7 +195,7 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + @@ -204,13 +204,13 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + - + @@ -222,7 +222,7 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + @@ -231,7 +231,7 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- - + @@ -297,6 +297,9 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- + + + @@ -324,6 +327,9 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- + + + @@ -336,6 +342,9 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- + + + @@ -426,6 +435,9 @@ t9.5 -10.5t21.5 -4h37h67h81h80h64h36q23 0 34 12t2 38q-5 13 -9.5 30.5t-9.5 34.5q- + + + diff --git a/src/font/iconfont.ttf b/src/font/iconfont.ttf index 46a1267b8d4b5390cb6c4ea0d309f7f9cfff4a3e..f6c86825302a8f5ed0fcd8be937a5904e26bc06d 100644 GIT binary patch delta 2999 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%0D!_dbF40FD2l@AIdIT9%_mo!P55)> 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 SW+rPXhNqP7_5K4Ix99{6liB+K delta 25729 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 E{d(5!+W-In From 8dae2c5feb1aee0c666a7176fa23c95ad9f59acc Mon Sep 17 00:00:00 2001 From: smallwei <1634566606@qq.com> Date: Mon, 16 Jul 2018 00:41:04 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat(tree):=20=E5=8A=A0=E5=85=A5props=20?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E9=80=82=E9=85=8D=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/tree.html | 7 ++++++- src/lay/modules/tree.js | 24 ++++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/examples/tree.html b/examples/tree.html index ed23627..ea5f801 100644 --- a/examples/tree.html +++ b/examples/tree.html @@ -33,6 +33,11 @@ //,target: '_blank' //是否新选项卡打开(比如节点返回href才有效) , drag: true, + props:{ + name: 'name', + id: 'id', + children:'children' + }, change:function(val){ console.group('change event') console.log('Array') @@ -53,7 +58,7 @@ console.log(elem); console.log('dom add event') var item ={ - name: '测试节点', + name: '测试节点'+new Date().getTime(), id:-1 } add(item) diff --git a/src/lay/modules/tree.js b/src/lay/modules/tree.js index 95e8540..12204fd 100644 --- a/src/lay/modules/tree.js +++ b/src/lay/modules/tree.js @@ -11,12 +11,23 @@ layui.define('jquery', function(exports) { var $ = layui.$, hint = layui.hint(); + //勾选集合 + var changeList = []; + //变量别名 + var props ={ + name: 'name', + id: 'id', + children:'children' + }; + var enterSkin = 'layui-tree-enter', Tree = function(options) { this.options = options; + 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; }; - //勾选集合 - var changeList = []; //图标 var icon = { arrow: ['', ''] //箭头 @@ -44,13 +55,13 @@ layui.define('jquery', function(exports) { var nodes = children || options.nodes; layui.each(nodes, function(index, item) { - var hasChild = item.children && item.children.length > 0; + var hasChild = item[that.childrenKey] && item[that.childrenKey].length > 0; var ul = $('
    '); var li = that.getNode(item, hasChild); //如果有子节点,则递归继续生成树 if(hasChild) { li.append(ul); - that.tree(ul, item.children); + that.tree(ul, item[that.childrenKey]); } //伸展节点 that.spread(li, item); @@ -60,6 +71,7 @@ layui.define('jquery', function(exports) { }); }; +//节点dom拼接 Tree.prototype.getDom = function() { var that = this, options = that.options @@ -82,7 +94,7 @@ layui.define('jquery', function(exports) { return '
    ' + - ('' + (item.name || '未命名') + '') + ('' + (item[that.nameKey] || '未命名') + '') }, menu: function(item) { return '
    ' + @@ -98,7 +110,7 @@ layui.define('jquery', function(exports) { var that = this, options = that.options var dom = that.getDom(); - var li = $(['
  • ' + var li = $(['
  • ' //展开箭头 , dom.spread(item, hasChild) From 1b541568a014264e88405f082529872cc4151c87 Mon Sep 17 00:00:00 2001 From: smallwei <1634566606@qq.com> Date: Mon, 16 Jul 2018 22:15:18 +0800 Subject: [PATCH 3/8] =?UTF-8?q?feat(atree):=20=E6=96=B0=E5=A2=9Eatree?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HARD | 0 examples/atree.html | 144 ++++++++++ examples/tree.html | 299 +++++++++------------ src/lay/modules/atree.js | 360 +++++++++++++++++++++++++ src/lay/modules/tree.js | 565 +++++++++++++++------------------------ src/layui.js | 1 + 6 files changed, 847 insertions(+), 522 deletions(-) create mode 100644 HARD create mode 100644 examples/atree.html create mode 100644 src/lay/modules/atree.js diff --git a/HARD b/HARD new file mode 100644 index 0000000..e69de29 diff --git a/examples/atree.html b/examples/atree.html new file mode 100644 index 0000000..b8b27f5 --- /dev/null +++ b/examples/atree.html @@ -0,0 +1,144 @@ + + + + + + + 树模块 - layui + + + + + + + + +
      + + + + + + + \ No newline at end of file diff --git a/examples/tree.html b/examples/tree.html index ea5f801..49449c3 100644 --- a/examples/tree.html +++ b/examples/tree.html @@ -1,182 +1,147 @@ - - - - 树模块 - layui + + +树模块 - layui - + - + - -
        +
          -
            +
              - - + + } + return arr; + }(); + start = start || 1; + layui.each(node, function(index, item){ + if(start < 10 && index < 9){ + var child = [ + { + name: (1 + index + start).toString().replace(/(\d)/, '$1$1$1$1$1$1$1$1$1') + } + ]; + node[index].children = child; + createTree(child, index + start + 1); + } + }); + return node; + }; - + layui.tree({ + elem: '#demo1' //指定元素 + ,nodes: createTree() + }); + +}); + + +
              +# layui.tree-v2 备忘
              +* check参数 - checkbox、radio的支持
              +* 拖拽的支持
              +
              - - \ No newline at end of file + diff --git a/src/lay/modules/atree.js b/src/lay/modules/atree.js new file mode 100644 index 0000000..cfbd22d --- /dev/null +++ b/src/lay/modules/atree.js @@ -0,0 +1,360 @@ +/** + + @Name:layui.atree2.0 树组件 + @Author:smallwei + @License:MIT + + */ + +layui.define('jquery', function(exports) { + "use strict"; + + var $ = layui.$, + hint = layui.hint(); + //勾选集合 + var changeList = []; + //变量别名 + var props ={ + name: 'name', + id: 'id', + children:'children' + }; + + var enterSkin = 'layui-tree-enter', + Tree = function(options) { + this.options = options; + 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; + }; + //图标 + var icon = { + arrow: ['', ''] //箭头 + , + checkbox: ['', ''] //复选框 + , + leaf: '' //叶节点 + }; + + //初始化 + 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 ul = $('
                '); + var li = that.getNode(item, hasChild); + //如果有子节点,则递归继续生成树 + if(hasChild) { + li.append(ul); + that.tree(ul, item[that.childrenKey]); + } + //伸展节点 + that.spread(li, item); + that.bindUlEvent(li, item); + elem.append(li); + + }); + }; + +//节点dom拼接 + Tree.prototype.getDom = function() { + var that = this, + options = that.options + return { + spread: function(item, hasChild) { + return hasChild ? '' + ( + item.spread ? icon.arrow[1] : icon.arrow[0] + ) + '' : ''; + }, + checkbox: function(item) { + return options.check ? ( + '' + ( + options.check === 'checkbox' ? icon.checkbox[0] : ( + options.check === 'radio' ? icon.radio[0] : '' + ) + ) + '' + ) : ''; + }, + node: function(item) { + return '' + + ('' + (item[that.nameKey] || '未命名') + '') + }, + menu: function(item) { + return '
                ' + + 'Add' + + 'Delete' + + '
                ' + } + } + + } + //获取树节点 + Tree.prototype.getNode = function(item, hasChild) { + var that = this, + options = that.options + var dom = that.getDom(); + var li = $(['
              • ' + //展开箭头 + , + dom.spread(item, hasChild) + + //复选框/单选框 + , + dom.checkbox(item) + + //节点 + , + dom.node(item) + //菜单 + , + dom.menu() + , + '
              • ' + ].join('')); + return li; + } + + //父绑定事件 + Tree.prototype.bindUlEvent = function(li, item) { + var that = this, + options = that.options + //触发点击节点回调 + typeof options.click === 'function' && that.click(li, item); + + //节点选择 + typeof options.change === 'function' && options.check === 'checkbox' && that.checkbox(li, item); + + //新增方法 + typeof options.addClick === 'function' && that.add(li, item); + + //删除方法 + typeof options.deleteClick === 'function' && that.delete(li, item); + + //拖拽节点 + options.drag && that.drag(li, item); + } + + //选中回调函数 + Tree.prototype.change = function() { + var that = this, + options = that.options; + options.change(changeList); + }, + + //新增方法回调 + Tree.prototype.add = function(elem, item) { + var that = this, + options = that.options; + var addBtn = elem.children('.layui-tree-menu').children('.layui-tree-add') + var arrow = elem.children('.layui-tree-spread') + var ul = elem.children('ul'), + a = elem.children('a'); + var addEvent = function(e) { + layui.stope(e); + var _addEvent = { + add: function(itemAddObj) { + if(!ul[0]) { + ul = $('
                  '); + elem.append(ul); + } + if(!arrow[0]) { + arrow = $('' + icon.arrow[1] + ''); + elem.prepend(arrow); + that.spread(elem, item); + } + if(!elem.data('spread')) { + that.open(elem, ul, arrow) + } + var li = that.getNode(itemAddObj, false); + 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 deleteBtn = elem.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() { + elem.html(''); + } + } + options.deleteClick(item, elem, _deleteEvent.done) + } + deleteBtn.on('click', deleteEvent); + } + + //点击节点回调 + Tree.prototype.click = function(elem, item) { + var that = this, + options = that.options; + elem.children('a').on('click', function(e) { + layui.stope(e); + options.click(item) + }); + }; + + //节点选择 + Tree.prototype.checkbox = function(elem, item) { + var that = this, + options = that.options; + var checkbox = elem.children('.layui-tree-check') + var ul = elem.children('ul'), + a = elem.children('a'); + var check = function() { + var index = layui.findObj(changeList, item); + if(elem.data('check')) { + elem.data('check', null) + checkbox.html(icon.checkbox[0]); + } else { + elem.data('check', true); + checkbox.html(icon.checkbox[1]); + } + if(index === -1) { + changeList.push(item); + } else { + changeList.splice(index, 1); + } + that.change(); + } + checkbox.on('click', check); + + }; + + //伸展节点 + Tree.prototype.spread = function(elem, item) { + var that = this, + options = that.options; + var arrow = elem.children('.layui-tree-spread') + var ul = elem.children('ul'), + a = elem.children('a'); + //如果没有子节点,则不执行 + if(!ul[0]) return; + arrow.on('click', function() { + that.open(elem, ul, arrow) + }); + } + + //打开节点 + 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'; + + //屏蔽选中文字 + 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/lay/modules/tree.js b/src/lay/modules/tree.js index 12204fd..1aef5a8 100644 --- a/src/lay/modules/tree.js +++ b/src/lay/modules/tree.js @@ -1,360 +1,215 @@ /** - @Name:layui.tree2.0 树组件 - @Author:smallwei + @Name:layui.tree 树组件 + @Author:贤心 @License:MIT */ - -layui.define('jquery', function(exports) { - "use strict"; - - var $ = layui.$, - hint = layui.hint(); - //勾选集合 - var changeList = []; - //变量别名 - var props ={ - name: 'name', - id: 'id', - children:'children' - }; - - var enterSkin = 'layui-tree-enter', - Tree = function(options) { - this.options = options; - 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; - }; - //图标 - var icon = { - arrow: ['', ''] //箭头 - , - checkbox: ['', ''] //复选框 - , - leaf: '' //叶节点 - }; - - //初始化 - 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 ul = $('
                    '); - var li = that.getNode(item, hasChild); - //如果有子节点,则递归继续生成树 - if(hasChild) { - li.append(ul); - that.tree(ul, item[that.childrenKey]); - } - //伸展节点 - that.spread(li, item); - that.bindUlEvent(li, item); - elem.append(li); - - }); - }; - -//节点dom拼接 - Tree.prototype.getDom = function() { - var that = this, - options = that.options - return { - spread: function(item, hasChild) { - return hasChild ? '' + ( - item.spread ? icon.arrow[1] : icon.arrow[0] - ) + '' : ''; - }, - checkbox: function(item) { - return options.check ? ( - '' + ( - options.check === 'checkbox' ? icon.checkbox[0] : ( - options.check === 'radio' ? icon.radio[0] : '' - ) - ) + '' - ) : ''; - }, - node: function(item) { - return '' + - ('' + (item[that.nameKey] || '未命名') + '') - }, - menu: function(item) { - return '
                    ' + - 'Add' + - 'Delete' + - '
                    ' - } - } - - } - //获取树节点 - Tree.prototype.getNode = function(item, hasChild) { - var that = this, - options = that.options - var dom = that.getDom(); - var li = $(['
                  • ' - //展开箭头 - , - dom.spread(item, hasChild) - - //复选框/单选框 - , - dom.checkbox(item) - - //节点 - , - dom.node(item) - //菜单 - , - dom.menu() - , - '
                  • ' - ].join('')); - return li; - } - - //父绑定事件 - Tree.prototype.bindUlEvent = function(li, item) { - var that = this, - options = that.options - //触发点击节点回调 - typeof options.click === 'function' && that.click(li, item); - - //节点选择 - typeof options.change === 'function' && options.check === 'checkbox' && that.checkbox(li, item); - - //新增方法 - typeof options.addClick === 'function' && that.add(li, item); - - //删除方法 - typeof options.deleteClick === 'function' && that.delete(li, item); - - //拖拽节点 - options.drag && that.drag(li, item); - } - - //选中回调函数 - Tree.prototype.change = function() { - var that = this, - options = that.options; - options.change(changeList); - }, - - //新增方法回调 - Tree.prototype.add = function(elem, item) { - var that = this, - options = that.options; - var addBtn = elem.children('.layui-tree-menu').children('.layui-tree-add') - var arrow = elem.children('.layui-tree-spread') - var ul = elem.children('ul'), - a = elem.children('a'); - var addEvent = function(e) { - layui.stope(e); - var _addEvent = { - add: function(itemAddObj) { - if(!ul[0]) { - ul = $('
                      '); - elem.append(ul); - } - if(!arrow[0]) { - arrow = $('' + icon.arrow[1] + ''); - elem.prepend(arrow); - that.spread(elem, item); - } - if(!elem.data('spread')) { - that.open(elem, ul, arrow) - } - var li = that.getNode(itemAddObj, false); - 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 deleteBtn = elem.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() { - elem.html(''); - } - } - options.deleteClick(item, elem, _deleteEvent.done) - } - deleteBtn.on('click', deleteEvent); - } - - //点击节点回调 - Tree.prototype.click = function(elem, item) { - var that = this, - options = that.options; - elem.children('a').on('click', function(e) { - layui.stope(e); - options.click(item) - }); - }; - - //节点选择 - Tree.prototype.checkbox = function(elem, item) { - var that = this, - options = that.options; - var checkbox = elem.children('.layui-tree-check') - var ul = elem.children('ul'), - a = elem.children('a'); - var check = function() { - var index = layui.findObj(changeList, item); - if(elem.data('check')) { - elem.data('check', null) - checkbox.html(icon.checkbox[0]); - } else { - elem.data('check', true); - checkbox.html(icon.checkbox[1]); - } - if(index === -1) { - changeList.push(item); - } else { - changeList.splice(index, 1); - } - that.change(); - } - checkbox.on('click', check); - - }; - - //伸展节点 - Tree.prototype.spread = function(elem, item) { - var that = this, - options = that.options; - var arrow = elem.children('.layui-tree-spread') - var ul = elem.children('ul'), - a = elem.children('a'); - //如果没有子节点,则不执行 - if(!ul[0]) return; - arrow.on('click', function() { - that.open(elem, ul, arrow) - }); - } - - //打开节点 - 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'; - - //屏蔽选中文字 - 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('tree', 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 + + +layui.define('jquery', function(exports){ + "use strict"; + + var $ = layui.$ + ,hint = layui.hint(); + + var enterSkin = 'layui-tree-enter', Tree = function(options){ + this.options = options; + }; + + //图标 + var icon = { + arrow: ['', ''] //箭头 + ,checkbox: ['', ''] //复选框 + ,radio: ['', ''] //单选框 + ,branch: ['', ''] //父节点 + ,leaf: '' //叶节点 + }; + + //初始化 + 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.children && item.children.length > 0; + var ul = $('
                        '); + var li = $(['
                      • ' + //展开箭头 + ,function(){ + return hasChild ? ''+ ( + item.spread ? icon.arrow[1] : icon.arrow[0] + ) +'' : ''; + }() + + //复选框/单选框 + ,function(){ + return options.check ? ( + ''+ ( + options.check === 'checkbox' ? icon.checkbox[0] : ( + options.check === 'radio' ? icon.radio[0] : '' + ) + ) +'' + ) : ''; + }() + + //节点 + ,function(){ + return '' + + (''+ ( + hasChild ? ( + item.spread ? icon.branch[1] : icon.branch[0] + ) : icon.leaf + ) +'') //节点图标 + + (''+ (item.name||'未命名') +''); + }() + + ,'
                      • '].join('')); + + //如果有子节点,则递归继续生成树 + if(hasChild){ + li.append(ul); + that.tree(ul, item.children); + } + + elem.append(li); + + //触发点击节点回调 + typeof options.click === 'function' && that.click(li, item); + + //伸展节点 + that.spread(li, item); + + //拖拽节点 + options.drag && that.drag(li, item); + }); + }; + + //点击节点回调 + Tree.prototype.click = function(elem, item){ + var that = this, options = that.options; + elem.children('a').on('click', function(e){ + layui.stope(e); + options.click(item) + }); + }; + + //伸展节点 + Tree.prototype.spread = function(elem, item){ + var that = this, options = that.options; + var arrow = elem.children('.layui-tree-spread') + var ul = elem.children('ul'), a = elem.children('a'); + + //执行伸展 + var open = function(){ + if(elem.data('spread')){ + elem.data('spread', null) + ul.removeClass('layui-show'); + arrow.html(icon.arrow[0]); + a.find('.layui-icon').html(icon.branch[0]); + } else { + elem.data('spread', true); + ul.addClass('layui-show'); + arrow.html(icon.arrow[1]); + a.find('.layui-icon').html(icon.branch[1]); + } + }; + + //如果没有子节点,则不执行 + if(!ul[0]) return; + + arrow.on('click', open); + a.on('dblclick', open); + } + + //通用事件 + Tree.prototype.on = function(elem){ + var that = this, options = that.options; + var dragStr = 'layui-tree-drag'; + + //屏蔽选中文字 + 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('tree', 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); + }); +}); diff --git a/src/layui.js b/src/layui.js index f1ff6e0..aa1aa1d 100644 --- a/src/layui.js +++ b/src/layui.js @@ -56,6 +56,7 @@ ,layedit: 'modules/layedit' //富文本编辑器 ,form: 'modules/form' //表单集 ,upload: 'modules/upload' //上传 + ,atree: 'modules/atree' //新树结构 ,tree: 'modules/tree' //树结构 ,table: 'modules/table' //表格 ,element: 'modules/element' //常用元素操作 From a34c39a1ddfddac5f03978c65ec4c5e005ea02db Mon Sep 17 00:00:00 2001 From: smallwei <1634566606@qq.com> Date: Tue, 17 Jul 2018 00:24:18 +0800 Subject: [PATCH 4/8] =?UTF-8?q?fix(atree):=20=E4=BC=98=E5=8C=96atree?= =?UTF-8?q?=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/atree.html | 9 +++- src/css/layui.css | 16 +++--- src/lay/modules/atree.js | 109 ++++++++++++++++++++++++++------------- 3 files changed, 89 insertions(+), 45 deletions(-) diff --git a/examples/atree.html b/examples/atree.html index b8b27f5..5b2eed6 100644 --- a/examples/atree.html +++ b/examples/atree.html @@ -30,11 +30,14 @@ skin: 'as' //设定皮肤 //,target: '_blank' //是否新选项卡打开(比如节点返回href才有效) , - drag: true, +// drag: true, + spreadAll:true, props:{ name: 'name', id: 'id', - children:'children' + children:'children', + checkbox:'checkbox', + spread:'spread' }, change:function(val){ console.group('change event') @@ -101,8 +104,10 @@ children: [{ name: '收件箱', id: 211, + spread: true, children: [{ name: '所有未读', + checkbox:true, id: 2111 }, { name: '置顶邮件', diff --git a/src/css/layui.css b/src/css/layui.css index 6289fb1..8c8a489 100644 --- a/src/css/layui.css +++ b/src/css/layui.css @@ -902,19 +902,23 @@ body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-sh .layui-tree{line-height: 26px;} .layui-tree li{position:relative;text-overflow: ellipsis; overflow:hidden; white-space: nowrap;} .layui-tree li a, -.layui-tree li .layui-tree-spread{display: inline-block; vertical-align: top; height: 26px; *display: inline; *zoom:1; cursor: pointer;} +.layui-tree li .layui-tree-spread{display: inline-block; vertical-align: top;font-size: 12px; height: 26px; *display: inline; *zoom:1; cursor: pointer;color: #c0c4cc} .layui-tree li a{font-size: 0;} .layui-tree li a i{font-size: 16px;} -.layui-tree li a cite{padding: 0 6px; font-size: 14px; font-style: normal;} -.layui-tree li i{padding-left: 6px; color: #333; -moz-user-select: none;} -.layui-tree li .layui-tree-check{font-size: 13px;} -.layui-tree li .layui-tree-check:hover{color: #009E94;} -.layui-tree li ul{display: none; margin-left: 40px;} +.layui-tree li a cite{padding: 0 6px; font-size: 14px; font-style: normal;color: #606266;} +.layui-tree li i{padding-left: 6px; -moz-user-select: none;} +.layui-tree li .layui-tree-check{font-size: 16px;color: #dcdfe6} +.layui-tree li .layui-tree-check:hover{color: #409eff;} +.layui-tree li .layui-tree-check.is-checked{color: #409eff;} +.layui-tree li ul{ display:none;margin-left: 40px;} .layui-tree li .layui-tree-enter{line-height: 24px; border: 1px dotted #000;} .layui-tree-drag{display: none; position: absolute; left: -666px; top: -666px; background-color: #f2f2f2; padding: 5px 10px; border: 1px dotted #000; white-space: nowrap} .layui-tree-drag i{padding-right: 5px;} +.layui-tree-node{position: relative;} +.layui-tree-node:hover { background-color:#eee;} .layui-tree-menu{position: absolute;top:0;right: 0;z-index:1024;} .layui-tree-menu span{margin-left: 10px;} + /** 导航菜单 **/ .layui-nav{position: relative; padding: 0 20px; background-color: #393D49; color: #fff; border-radius: 2px; font-size: 0; box-sizing: border-box;} .layui-nav *{font-size: 14px;} diff --git a/src/lay/modules/atree.js b/src/lay/modules/atree.js index cfbd22d..4c80a19 100644 --- a/src/lay/modules/atree.js +++ b/src/lay/modules/atree.js @@ -17,16 +17,21 @@ layui.define('jquery', function(exports) { var props ={ name: 'name', id: 'id', - children:'children' + 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 = { @@ -53,11 +58,17 @@ layui.define('jquery', function(exports) { 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 ul = $('
                          '); - var li = that.getNode(item, hasChild); + 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); @@ -72,31 +83,34 @@ layui.define('jquery', function(exports) { }; //节点dom拼接 - Tree.prototype.getDom = function() { + Tree.prototype.getDom = function(item) { var that = this, - options = that.options + options = that.options, + item = item, + hasChild = item[that.childrenKey] && item[that.childrenKey].length > 0; return { - spread: function(item, hasChild) { + spread: function() { return hasChild ? '' + ( - item.spread ? icon.arrow[1] : icon.arrow[0] + item[that.spreadKey] || options.spreadAll ? icon.arrow[1] : icon.arrow[0] ) + '' : ''; }, - checkbox: function(item) { + checkbox: function() { return options.check ? ( - '' + ( - options.check === 'checkbox' ? icon.checkbox[0] : ( - options.check === 'radio' ? icon.radio[0] : '' - ) + '' + ( + item[that.checkboxKey]? icon.checkbox[1] : icon.checkbox[0] ) + '' ) : ''; }, - node: function(item) { + ul:function(){ + return '
                            ' + }, + node: function() { return '' + ('' + (item[that.nameKey] || '未命名') + '') }, - menu: function(item) { + menu: function() { return '
                            ' + 'Add' + 'Delete' + @@ -106,28 +120,32 @@ layui.define('jquery', function(exports) { } //获取树节点 - Tree.prototype.getNode = function(item, hasChild) { + Tree.prototype.getNode = function(item) { var that = this, options = that.options - var dom = that.getDom(); - var li = $(['
                          • ' + var dom = that.getDom(item); + var li = ['
                          • ' //展开箭头 , - dom.spread(item, hasChild) + dom.spread() - //复选框/单选框 + //复选框 , - dom.checkbox(item) + dom.checkbox() //节点 , - dom.node(item) + dom.node() //菜单 , dom.menu() , - '
                          • ' - ].join('')); + '
                            ' + ].join(''); return li; } @@ -162,27 +180,33 @@ layui.define('jquery', function(exports) { Tree.prototype.add = function(elem, item) { var that = this, options = that.options; - var addBtn = elem.children('.layui-tree-menu').children('.layui-tree-add') - var arrow = elem.children('.layui-tree-spread') + 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 = elem.children('a'); + 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 = $('
                              '); + ul = $(dom.ul()) elem.append(ul); } if(!arrow[0]) { - arrow = $('' + icon.arrow[1] + ''); + arrow = $(dom.spread()); elem.prepend(arrow); that.spread(elem, item); } if(!elem.data('spread')) { that.open(elem, ul, arrow) } - var li = that.getNode(itemAddObj, false); + var li = $(that.getNode(itemAddObj)); that.bindUlEvent(li, itemAddObj); ul.append(li); } @@ -196,14 +220,20 @@ layui.define('jquery', function(exports) { Tree.prototype.delete = function(elem, item) { var that = this, options = that.options; - var deleteBtn = elem.children('.layui-tree-menu').children('.layui-tree-delete') + 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() { - elem.html(''); + 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) @@ -215,7 +245,8 @@ layui.define('jquery', function(exports) { Tree.prototype.click = function(elem, item) { var that = this, options = that.options; - elem.children('a').on('click', function(e) { + var node =elem.children('.layui-tree-node'); + node.children('a').on('click', function(e) { layui.stope(e); options.click(item) }); @@ -225,16 +256,19 @@ layui.define('jquery', function(exports) { Tree.prototype.checkbox = function(elem, item) { var that = this, options = that.options; - var checkbox = elem.children('.layui-tree-check') + var node =elem.children('.layui-tree-node'); + var checkbox = node.children('.layui-tree-check') var ul = elem.children('ul'), - a = elem.children('a'); + 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) { @@ -252,9 +286,10 @@ layui.define('jquery', function(exports) { Tree.prototype.spread = function(elem, item) { var that = this, options = that.options; - var arrow = elem.children('.layui-tree-spread') + var node =elem.children('.layui-tree-node'); + var arrow = node.children('.layui-tree-spread') var ul = elem.children('ul'), - a = elem.children('a'); + a = node.children('a'); //如果没有子节点,则不执行 if(!ul[0]) return; arrow.on('click', function() { 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 5/8] 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 '
                                ' + - 'Add' + - 'Delete' + - '
                                ' - } - } + //如果被选中加入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 '
                                  ' + + '' + that.addBtnLabelKey + '' + + '' + that.deleteBtnLabelKey + '' + + '
                                  ' + } + } - //父绑定事件 - 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; } From e84d5c32faa1c5d7b648be395b120813702513e4 Mon Sep 17 00:00:00 2001 From: smallwei <1634566606@qq.com> Date: Thu, 19 Jul 2018 21:03:04 +0800 Subject: [PATCH 6/8] doc(atree): update 2.0.0-beta --- doc/atree.md | 24 ++++++++++++++++++++++++ examples/atree.html | 2 +- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 doc/atree.md diff --git a/doc/atree.md b/doc/atree.md new file mode 100644 index 0000000..00d2304 --- /dev/null +++ b/doc/atree.md @@ -0,0 +1,24 @@ +# atree2.0.0属性含义 +* spreadAll 设置checkbox全部选中 +* check勾选风格,不写没有勾选框 +* props 设置key属性别名 + - addBtnLabel:新增按钮标题 + - deleteBtnLabel:删除按钮标题 + - name:树显示的标题 + - id:主键对应的字段名 + - children:子类对应的字段名 + - checkbox:选中对应的字段名 + - spread:是否展开对应的字段名 +* change选中回调函数 + - val:选中的对象数组 +* click点击标题回调函数 + - item:当前点击的对象 +* addClick:新增回调函数 + - item:当前父节点的对象 + - elem:当前节点的dom对象 + - done:添加到dom节点的方法 +* deleteClick:删除回调函数 + - item:当前父节点的对象 + - elem:当前节点的dom对象 + - done:删除dom节点的方法 + \ No newline at end of file diff --git a/examples/atree.html b/examples/atree.html index 817c46c..85d8a54 100644 --- a/examples/atree.html +++ b/examples/atree.html @@ -68,7 +68,7 @@ console.groupEnd() }, deleteClick:function(item,elem,done){ - console.group('delete event') + console.group('delete event') console.log('Object') console.log(item); console.log('dom') From ae1a15259eb9123209841ce98b5cd9d46d0f80d0 Mon Sep 17 00:00:00 2001 From: smallwei <1634566606@qq.com> Date: Tue, 24 Jul 2018 14:14:10 +0800 Subject: [PATCH 7/8] fix(atree): tree change atree --- src/css/layui.css | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/css/layui.css b/src/css/layui.css index 8c8a489..bca21b9 100644 --- a/src/css/layui.css +++ b/src/css/layui.css @@ -207,8 +207,6 @@ a cite{font-style: normal; *cursor:pointer;} .layui-icon-cellphone:before{content:"\e678"} .layui-icon-screen-full:before{content:"\e622";} .layui-icon-screen-restore:before{content:"\e758";} -.layui-icon-checkbox:before{content:"\e624"} -.layui-icon-uncheckbox:before{content:"\e68c"} /* 基本布局 */ @@ -900,24 +898,40 @@ body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-sh /** 树组件(重写中) **/ .layui-tree{line-height: 26px;} -.layui-tree li{position:relative;text-overflow: ellipsis; overflow:hidden; white-space: nowrap;} +.layui-tree li{text-overflow: ellipsis; overflow:hidden; white-space: nowrap;} .layui-tree li a, -.layui-tree li .layui-tree-spread{display: inline-block; vertical-align: top;font-size: 12px; height: 26px; *display: inline; *zoom:1; cursor: pointer;color: #c0c4cc} +.layui-tree li .layui-tree-spread{display: inline-block; vertical-align: top; height: 26px; *display: inline; *zoom:1; cursor: pointer;} .layui-tree li a{font-size: 0;} .layui-tree li a i{font-size: 16px;} -.layui-tree li a cite{padding: 0 6px; font-size: 14px; font-style: normal;color: #606266;} -.layui-tree li i{padding-left: 6px; -moz-user-select: none;} -.layui-tree li .layui-tree-check{font-size: 16px;color: #dcdfe6} -.layui-tree li .layui-tree-check:hover{color: #409eff;} -.layui-tree li .layui-tree-check.is-checked{color: #409eff;} -.layui-tree li ul{ display:none;margin-left: 40px;} +.layui-tree li a cite{padding: 0 6px; font-size: 14px; font-style: normal;} +.layui-tree li i{padding-left: 6px; color: #333; -moz-user-select: none;} +.layui-tree li .layui-tree-check{font-size: 13px;} +.layui-tree li .layui-tree-check:hover{color: #009E94;} +.layui-tree li ul{display: none; margin-left: 20px;} .layui-tree li .layui-tree-enter{line-height: 24px; border: 1px dotted #000;} .layui-tree-drag{display: none; position: absolute; left: -666px; top: -666px; background-color: #f2f2f2; padding: 5px 10px; border: 1px dotted #000; white-space: nowrap} .layui-tree-drag i{padding-right: 5px;} -.layui-tree-node{position: relative;} -.layui-tree-node:hover { background-color:#eee;} -.layui-tree-menu{position: absolute;top:0;right: 0;z-index:1024;} -.layui-tree-menu span{margin-left: 10px;} + +/** atree **/ +.layui-atree{line-height: 26px;} +.layui-atree li{position:relative;text-overflow: ellipsis; overflow:hidden; white-space: nowrap;} +.layui-atree li a, +.layui-atree li .layui-atree-spread{display: inline-block; vertical-align: top;font-size: 12px; height: 26px; *display: inline; *zoom:1; cursor: pointer;color: #c0c4cc} +.layui-atree li a{font-size: 0;} +.layui-atree li a i{font-size: 16px;} +.layui-atree li a cite{padding: 0 6px; font-size: 14px; font-style: normal;color: #606266;} +.layui-atree li i{padding-left: 6px; -moz-user-select: none;} +.layui-atree li .layui-atree-check{font-size: 16px;color: #dcdfe6} +.layui-atree li .layui-atree-check:hover{color: #409eff;} +.layui-atree li .layui-atree-check.is-checked{color: #409eff;} +.layui-atree li ul{ display:none;margin-left: 40px;} +.layui-atree li .layui-atree-enter{line-height: 24px; border: 1px dotted #000;} +.layui-atree-drag{display: none; position: absolute; left: -666px; top: -666px; background-color: #f2f2f2; padding: 5px 10px; border: 1px dotted #000; white-space: nowrap} +.layui-atree-drag i{padding-right: 5px;} +.layui-atree-node{position: relative;} +.layui-atree-node:hover { background-color:#eee;} +.layui-atree-menu{position: absolute;top:0;right: 0;z-index:1024;} +.layui-atree-menu span{margin-left: 10px;} /** 导航菜单 **/ .layui-nav{position: relative; padding: 0 20px; background-color: #393D49; color: #fff; border-radius: 2px; font-size: 0; box-sizing: border-box;} From e67073c6aabe5fb75f32b78a79912e6e578539fb Mon Sep 17 00:00:00 2001 From: smallwei <1634566606@qq.com> Date: Tue, 24 Jul 2018 14:24:33 +0800 Subject: [PATCH 8/8] fix(atree): tree change atree --- src/lay/modules/atree.js | 82 ++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/src/lay/modules/atree.js b/src/lay/modules/atree.js index a9ef3b4..9867117 100644 --- a/src/lay/modules/atree.js +++ b/src/lay/modules/atree.js @@ -24,8 +24,8 @@ layui.define('jquery', function(exports) { addBtnLabelKey: 'add', }; - var enterSkin = 'layui-tree-enter', - Tree = function(options) { + var enterSkin = 'layui-atree-enter', + Atree = function(options) { this.options = options; this.nodes = options.nodes || []; this.props = this.options.props || props; @@ -47,18 +47,18 @@ layui.define('jquery', function(exports) { }; //初始化 - Tree.prototype.init = function(elem) { + Atree.prototype.init = function(elem) { var that = this; - elem.addClass('layui-box layui-tree'); //添加tree样式 + elem.addClass('layui-box layui-atree'); //添加tree样式 if(that.options.skin) { - elem.addClass('layui-tree-skin-' + that.options.skin); + elem.addClass('layui-atree-skin-' + that.options.skin); } that.tree(elem); that.on(elem); }; //树节点解析 - Tree.prototype.tree = function(elem, children) { + Atree.prototype.tree = function(elem, children) { var that = this, options = that.options var nodes = children || options.nodes; @@ -87,20 +87,20 @@ layui.define('jquery', function(exports) { }; //节点dom拼接 - Tree.prototype.getDom = function(item) { + Atree.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 ? '' + ( + 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] ) + '' ) : ''; @@ -115,16 +115,16 @@ layui.define('jquery', function(exports) { ('' + (item[that.nameKey] || '未命名') + '') }, menu: function() { - return '
                                  ' + - '' + that.addBtnLabelKey + '' + - '' + that.deleteBtnLabelKey + '' + + return '
                                  ' + + '' + that.addBtnLabelKey + '' + + '' + that.deleteBtnLabelKey + '' + '
                                  ' } } } //获取树节点 - Tree.prototype.getNode = function(item) { + Atree.prototype.getNode = function(item) { var that = this, options = that.options var dom = that.getDom(item); @@ -132,7 +132,7 @@ layui.define('jquery', function(exports) { (item[that.spreadKey] || options.spreadAll ? 'data-spread="' + (item[that.spreadKey] || true) + '"' : '') + (item[that.checkboxKey] ? 'data-check="' + item[that.checkboxKey] + '"' : '') + ('data-id=' + item[that.idKey]) + - '>
                                  ' + '>
                                  ' //展开箭头 , dom.spread() @@ -153,7 +153,7 @@ layui.define('jquery', function(exports) { } //父绑定事件 - Tree.prototype.bindUlEvent = function(li, item) { + Atree.prototype.bindUlEvent = function(li, item) { var that = this, options = that.options //触发点击节点回调 @@ -173,19 +173,19 @@ layui.define('jquery', function(exports) { } //选中回调函数 - Tree.prototype.change = function() { + Atree.prototype.change = function() { var that = this, options = that.options; options.change(changeList); }, //新增方法回调 - Tree.prototype.add = function(elem, item) { + Atree.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 node = elem.children('.layui-atree-node'); + var addBtn = node.children('.layui-atree-menu').children('.layui-atree-add') + var arrow = node.children('.layui-atree-spread') var ul = elem.children('ul'), a = node.children('a'); var addEvent = function(e) { @@ -220,11 +220,11 @@ layui.define('jquery', function(exports) { } //删除方法回调 - Tree.prototype.delete = function(elem, item) { + Atree.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 node = elem.children('.layui-atree-node'); + var deleteBtn = node.children('.layui-atree-menu').children('.layui-atree-delete') var ul = elem.children('ul'), a = elem.children('a'); var deleteEvent = function(e) { @@ -232,7 +232,7 @@ layui.define('jquery', function(exports) { var _deleteEvent = { done: function() { var parent = elem.parent(); - var arrow = parent.parent().children('.layui-tree-spread') + var arrow = parent.parent().children('.layui-atree-spread') if(parent.children('li').length === 1) { arrow.remove(); } @@ -245,10 +245,10 @@ layui.define('jquery', function(exports) { } //点击节点回调 - Tree.prototype.click = function(elem, item) { + Atree.prototype.click = function(elem, item) { var that = this, options = that.options; - var node = elem.children('.layui-tree-node'); + var node = elem.children('.layui-atree-node'); node.children('a').on('click', function(e) { layui.stope(e); options.click(item) @@ -256,11 +256,11 @@ layui.define('jquery', function(exports) { }; //节点选择 - Tree.prototype.checkbox = function(elem, item) { + Atree.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 node = elem.children('.layui-atree-node'); + var checkbox = node.children('.layui-atree-check') var ul = elem.children('ul'), a = node.children('a'); var whileAllCheck = function(dom, item, type) { @@ -273,7 +273,7 @@ layui.define('jquery', function(exports) { } } var setCheck = function(elem, item, type) { - var checkbox = elem.children('.layui-tree-node').find('.layui-tree-check'); + var checkbox = elem.children('.layui-atree-node').find('.layui-atree-check'); if(type) { elem.data('check', true) checkbox.html(icon.checkbox[1]) @@ -308,11 +308,11 @@ layui.define('jquery', function(exports) { }; //伸展节点 - Tree.prototype.spread = function(elem, item) { + Atree.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 node = elem.children('.layui-atree-node'); + var arrow = node.children('.layui-atree-spread') var ul = elem.children('ul'), a = node.children('a'); //如果没有子节点,则不执行 @@ -323,7 +323,7 @@ layui.define('jquery', function(exports) { } //打开节点 - Tree.prototype.open = function(elem, ul, arrow) { + Atree.prototype.open = function(elem, ul, arrow) { if(elem.data('spread')) { elem.data('spread', null) ul.removeClass('layui-show'); @@ -335,10 +335,10 @@ layui.define('jquery', function(exports) { } }; //通用事件 - Tree.prototype.on = function(elem) { + Atree.prototype.on = function(elem) { var that = this, options = that.options; - var dragStr = 'layui-tree-drag'; + var dragStr = 'layui-atree-drag'; //屏蔽选中文字 elem.find('i').on('selectstart', function(e) { @@ -374,8 +374,8 @@ layui.define('jquery', function(exports) { }; //拖拽节点 - Tree.prototype.move = {}; - Tree.prototype.drag = function(elem, item) { + Atree.prototype.move = {}; + Atree.prototype.drag = function(elem, item) { var that = this, options = that.options; var a = elem.children('a'), @@ -410,11 +410,11 @@ layui.define('jquery', function(exports) { //暴露接口 exports('atree', function(options) { - var tree = new Tree(options = options || {}); + var atree = new Atree(options = options || {}); var elem = $(options.elem); if(!elem[0]) { - return hint.error('layui.tree 没有找到' + options.elem + '元素'); + return hint.error('layui.atree 没有找到' + options.elem + '元素'); } - tree.init(elem); + atree.init(elem); }); }); \ No newline at end of file