diff --git a/demo/pc/tree.html b/demo/pc/tree.html index d6c024b..7344940 100644 --- a/demo/pc/tree.html +++ b/demo/pc/tree.html @@ -6,201 +6,231 @@
需要自己写出目录收缩逻辑 -
-
-
- - 读书笔记 - - - - - - -
-
-
-
- - 小说 -
-
+ + +
+
-
-
-
-
-
-
- - 技术笔记 -
-
-
-
- - Mysql -
-
- -
-
-
-
- - PHP -
-
-
-
- - 扩展 -
-
- -
-
-
-
- - 框架 -
-
- -
-
-
-
-

       
     
-
- -
- 基本组件 -
- 最基本的组件,ul-tree-item-icon的按钮会在执行js后进行相应的移除,缩进样式也许需要执行js -
-
-
-
-
- - 读书笔记 -
-
-
-
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
参数说明
elem必填,元素名
onItemClick +

目录点击回调:function(item,e){},

+

item:目录的Dom,可以通过$(item).data()获取原始数据

+

e是点击的原始事件

+
onItemToggle +

目录展开收缩回调:function(item,e){},

+

item:目录的Dom,可以通过$(item).data()获取原始数据

+

e是点击的原始事件

+
options +

每个目录的设置项

+

+ 完整参数: +
+ { + type: 'up', //必填 + className:'layui-icon layui-icon-set', + html:'', + }, +

+

未设置html时会自动根据className和Type自动生成

+

默认支持type:up,down/delete

+

不需要请设置空数组

+
onOptionTrigger +

设置点击回调:function (type, item, e){}

+

+ type:设置的类型 +

+

+ item:目录的Dom,可以通过$(item).data()获取原始数据 +

+

+ e:点击的原始事件 +

+

+ 如果不设置回调,会自动调用上移/下移/删除操作 +

+

+ 如果设置回调,需要自行调用 +

+
list +

目录数据,示例:

+

+ [{ + id: 0, + pid: 0, + title: 0, + options: 同列表设置,如果不需要请设置为空数组 + }] +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + - - -
-
-
-
- - 读书笔记 -
-
-
-
- - 小说 -
-
+
+
方法说明
itemMoveUp(item) +

将目录向上移动,没有返回值

+

参数:

+

item:目录的Dom,onOptionTrigger的第二个参数

+
itemMoveDown(item) +

将目录向下移动,没有返回值

+

参数:

+

item:目录的Dom,onOptionTrigger的第二个参数

+
itemDelete(id) +

将目录向下移动,没有返回值

+

+ 参数: +

+

+ id:目录的id +

+
itemUpdate(data) +

将目录向下移动,没有返回值

+

+ 参数: +

+

+ data:list的其中一个目录数据,必须有id属性 +

+
getList() +

将目录向下移动,没有参数

+

+ 返回示例: +

+

+ [ + { + id: 0,
+ pid: 0,
+ title: 0,
+ options: 同列表设置,如果不需要请设置为空数组,
+ index:0 //多了一个index属性,是这个目录在当前分组中的排序
+ } + ] +

+
-
-
-
-
- - - -

-    
- -
-
-
- - 读书笔记 -
-
- -
-
- -
- -
-
-
- - 读书笔记 -
-
-
-
- - 小说 -
-
- -
-
-
-
- -
+ +
文档目录
diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..49602d2 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,7 @@ +{ + "typeAcquisition": { + "include": [ + "jquery" + ] + } +} \ No newline at end of file diff --git a/public/cdn/js/tree.js b/public/cdn/js/tree.js new file mode 100644 index 0000000..d0c0509 --- /dev/null +++ b/public/cdn/js/tree.js @@ -0,0 +1,279 @@ +function renderUlTree(options) { + var defaults = { + $: window.$, + elem: '', + onItemClick: function () { + console.log('点击目录项'); + }, + onItemToggle: function () { + console.log('点击收缩目录'); + }, + options: [ + { + type: 'up', + }, + { + type: 'down', + }, + { + type: 'set', + }, + { + type: 'delete', + }, + ], + onOptionTrigger: function (type, item, e) { + switch (type) { + case 'up': + tthis.itemMoveUp(item) + break; + case 'down': + tthis.itemMoveDown(item) + break; + case 'delete': + tthis.itemDelete($(item).data('id')) + break; + + default: + break; + } + + }, + list: [] + } + var tthis = this; + var settings = {}; + settings = $.extend({}, defaults, options); + + $ = settings.$; + + var thisDom = $(settings.elem); + + this.appendItem = function (data) { + + var defaults = { + id: 0, + pid: 0, + title: 0, + options: settings.options + }; + + var itemSetting = $.extend({}, defaults, data); + + settings.list.push(itemSetting); + this.initList() + } + + this.initList = function () { + var list = settings.list; + + for (let initTimes = 0; initTimes < list.length; initTimes++) { + list.forEach(item => { + var itemFindKey = '.ul-tree-item.item-id-' + item.id; + + if (thisDom.find(itemFindKey).length > 0) { + return true; + } + + var itemParentFindKey = '.ul-tree-item.item-id-' + item.pid; + + var itemHtml = this.getItemTpl(); + + if (item.pid == 0) { + + var itemDom = $(itemHtml).appendTo(settings.elem); + } else { + var itemDom = $(itemHtml).appendTo($(itemParentFindKey).children('.ul-tree-item-children')) + } + + this.initItem(itemDom, item) + + }); + } + + }; + + this.initItem = function (itemDom, item) { + itemDom.data(item) + + itemDom.addClass('item-id-' + item.id) + itemDom.children('.ul-tree-item-info').find('.ul-tree-item-title').text(item.title) + + + itemDom.children('.ul-tree-item-info').find('.ul-tree-item-options').children().remove() + + item.options.forEach(option => { + + if (typeof option.type == "undefined") { + option.type = 'set'; + } + + if (typeof option.className == 'undefined') { + option.className = 'layui-icon layui-icon-' + option.type; + } + + if (typeof option.html == 'undefined') { + option.html = '' + } + var domOption = $(option.html); + + domOption.addClass('ul-tree-item-options-item'); + domOption.data(option) + itemDom.children('.ul-tree-item-info').find('.ul-tree-item-options').append(domOption); + + }); + } + this.renderList = function () { + thisDom.find('.ul-tree-item').each(function (index, elem) { + + tthis.renderItem(elem) + }) + } + this.renderItem = function (itemTree) { + + if ($(itemTree).data('is-rendered') == 1) { + + return true; + } + $(itemTree).data('is-rendered', 1) + + var parents = $(itemTree).parents('.ul-tree-item') + + var level = parents.length + $(itemTree).find('.ul-tree-item-title').css('margin-left', (level + 1) * 15 + 5 + 'px') + $(itemTree).find('.ul-tree-item-icon').css('left', (level + 1) * 15 - 15 + 'px') + + if ($(itemTree).children('.ul-tree-item-children').children().length == 0) { + $(itemTree).children('.ul-tree-item-info').find('.ul-tree-item-icon').hide() + } else { + $(itemTree).children('.ul-tree-item-info').find('.ul-tree-item-icon').show() + + } + + $(itemTree).children('.ul-tree-item-info').click(function (e) { + + if ($(e.target).hasClass('ul-tree-item-icon')) { + var iconItem = e.target + if ($(iconItem).hasClass('layui-icon-triangle-d')) { + // 收缩 + $(iconItem).removeClass('layui-icon-triangle-d') + $(iconItem).addClass('layui-icon-triangle-r') + + $(itemTree).children('.ul-tree-item-children').hide() + } else { + // 展开 + $(iconItem).addClass('layui-icon-triangle-d') + $(iconItem).removeClass('layui-icon-triangle-r') + + $(itemTree).children('.ul-tree-item-children').show() + } + + settings.onItemToggle(itemTree,e) + + } else { + if ($(e.target).closest('.ul-tree-item-options').length > 0) { + + settings.onOptionTrigger($(e.target).data('type'), itemTree, e) + } else { + settings.onItemClick(itemTree,e) + + } + + } + }) + + + } + + this.itemMoveUp = function (item) { + $(item).prev().insertAfter(item); + } + this.itemMoveDown = function (item) { + $(item).next().insertBefore(item); + } + this.itemDelete = function (id) { + var itemFindKey = '.ul-tree-item.item-id-' + id; + $(itemFindKey).remove(); + + var list = settings.list; + + var newList = []; + + list.forEach(data => { + if (data.id == id || data.pid == id) { + return true; + } + newList.push(data) + }); + settings.list = list; + } + + this.itemUpdate = function (newData) { + + var list = settings.list; + + var newList = []; + + list.forEach(data => { + if (data.id == newData.id) { + data = $.extend({}, data, newData); + + var itemFindKey = '.ul-tree-item.item-id-' + data.id; + var item = $(itemFindKey); + tthis.initItem(item, data) + } + newList.push(data) + }); + settings.list = list; + } + + this.getList = function () { + var list = settings.list; + + list.forEach((data) => { + var itemFindKey = '.ul-tree-item.item-id-' + data.id; + var item = $(itemFindKey); + data.index = item.index(); + }); + + return list; + } + + function itemTpl() { + /* +
+
+ + 读书笔记 + + + +
+
+ +
+
+ */ + } + + this.getItemTpl = function () { + var string = itemTpl.toString(); + + return string.substring(string.indexOf("/*") + 3, string.lastIndexOf("*/")); + } + + if (typeof options.list != 'undefined') { + resetList(options.list); + } + + function resetList(list) { + settings.list = []; + + list.forEach(data => { + tthis.appendItem(data) + }); + } + + this.renderList() + +} \ No newline at end of file diff --git a/public/cdn/layui-ul.css b/public/cdn/layui-ul.css index efb3db7..487ba4f 100644 --- a/public/cdn/layui-ul.css +++ b/public/cdn/layui-ul.css @@ -568,7 +568,12 @@ top : 10px; } -.ul-tree-item-option { +.ul-tree-item-info:hover .ul-tree-item-options-item { + display: block; +} + +.ul-tree-item-options { + position : absolute; right : 15px; top : 0; @@ -576,9 +581,12 @@ display : flex; align-items: center; } -.ul-tree-item-option-item{ + +.ul-tree-item-options-item { margin-left: 10px; + display : none; } + .ul-note-item { display : flex; justify-content: flex-start;