layui.define(["jquery", "tools"], function (exports) { "use strict"; /** * @since Pear Admin 4.0 * * Button component * */ var MOD_NAME = "menuSearch", tools = layui.tools, $ = layui.jquery; var menuSearch = function (opt) { this.option = opt; }; /** * @since Pear Admin 4.0 * * Button start loading * */ menuSearch.prototype.render = function (opt) { var options = { select: opt.select, elem: opt.elem, dataProvider: opt.dataProvider, }; $("body").on("click", options.elem, function () { var _html = [ ``, ].join(""); layer.open({ type: 1, offset: "10%", area: ["600px"], title: false, closeBtn: 0, shadeClose: true, anim: 0, move: false, content: _html, success: function (layero, layeridx) { var $layer = layero; var $content = $(layero).children(".layui-layer-content"); var $input = $(".menu-search-input-wrapper input"); var $noData = $(".menu-search-no-data"); var $list = $(".menu-search-list"); var menuData = options.dataProvider(); $layer.css("border-radius", "6px"); $input.off("focus").focus(); // 搜索输入事件 $input.off("input").on( "input", tools.debounce(function () { var keywords = $input.val().trim(); var filteredMenus = filterHandle(menuData, keywords); if (filteredMenus.length) { var tiledMenus = tiledHandle(filteredMenus); var listHtml = createList(tiledMenus); $noData.css("display", "none"); $list .html("") .append(listHtml) .children(":first") .addClass("this"); } else { $list.html(""); $noData.css("display", "flex"); } var currentHeight = $(".menu-search-content").outerHeight(); $layer.css("height", currentHeight); $content.css("height", currentHeight); }, 500), ); // 列表点击事件 $list.off("click").on("click", "li", function () { var id = $(this).attr("smenu-id"); var title = $(this).attr("smenu-title"); var url = $(this).attr("smenu-url"); var type = $(this).attr("smenu-type"); var openType = $(this).attr("smenu-open-type"); options.select({ id, title, url, type, openType }); layer.close(layeridx); }); $list .off("mouseenter") .on("mouseenter", "li", function () { $(".menu-search-list li.this").removeClass("this"); $(this).addClass("this"); }) .off("mouseleave") .on("mouseleave", "li", function () { $(this).removeClass("this"); }); // 监听键盘事件 $(".menu-search-content") .off("keydown") .keydown(function (e) { if (e.keyCode === 13 || e.keyCode === 32) { e.preventDefault(); var that = $(".menu-search-list li.this"); var id = that.attr("smenu-id"); var title = that.attr("smenu-title"); var url = that.attr("smenu-url"); var type = that.attr("smenu-type"); var openType = that.attr("smenu-open-type"); options.select({ id, title, url, type, openType }); layer.close(layeridx); } else if (e.keyCode === 38) { e.preventDefault(); var prevEl = $(".menu-search-list li.this").prev(); $(".menu-search-list li.this").removeClass("this"); if (prevEl.length !== 0) { prevEl.addClass("this"); } else { $list.children().last().addClass("this"); } } else if (e.keyCode === 40) { e.preventDefault(); var nextEl = $(".menu-search-list li.this").next(); $(".menu-search-list li.this").removeClass("this"); if (nextEl.length !== 0) { nextEl.addClass("this"); } else { $list.children().first().addClass("this"); } } else if (e.keyCode === 27) { e.preventDefault(); layer.close(layeridx); } }); }, }); }); return new menuSearch(options); }; /** * @since Pear Admin 4.0 * * 创建结果列表 */ var createList = function (data) { var listHtml = ""; $.each(data, function (index, item) { listHtml += `
  • ${item.path}
  • `; }); return listHtml; }; /** * @since Pear Admin 4.0 * * Tree 转 path 列表 */ var tiledHandle = function (data) { var tiledMenus = []; var treeTiled = function (data, content) { var path = ""; var separator = " / "; if (!content) content = ""; $.each(data, function (index, item) { if (item.children && item.children.length) { path += content + item.title + separator; var childPath = treeTiled(item.children, path); path += childPath; if (!childPath) path = ""; // 重置路径 } else { path += content + item.title; tiledMenus.push({ path: path, info: item }); path = ""; //重置路径 } }); return path; }; treeTiled(data); return tiledMenus; }; /** * @since Pear Admin 4.0 * * 查询匹配算法 */ var filterHandle = function (filterData, val) { if (!val) return []; var filteredMenus = []; filterData = $.extend(true, {}, filterData); $.each(filterData, function (index, item) { if (item.children && item.children.length) { var children = filterHandle(item.children, val); var obj = $.extend({}, item, { children: children }); if (children && children.length) { filteredMenus.push(obj); } else if (item.title.indexOf(val) >= 0) { item.children = []; // 父级匹配但子级不匹配,就去除子级 filteredMenus.push($.extend({}, item)); } } else if (item.title.indexOf(val) >= 0) { filteredMenus.push(item); } }); return filteredMenus; }; exports(MOD_NAME, new menuSearch()); });