miniMenu.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /**
  2. * date:2020/02/27
  3. * author:Mr.Chung
  4. * version:2.0
  5. * description:layuimini 菜单框架扩展
  6. */
  7. layui.define(["element","laytpl" ,"jquery"], function (exports) {
  8. var element = layui.element,
  9. $ = layui.$,
  10. laytpl = layui.laytpl,
  11. layer = layui.layer;
  12. var miniMenu = {
  13. /**
  14. * 菜单初始化
  15. * @param options.menuList 菜单数据信息
  16. * @param options.multiModule 是否开启多模块
  17. * @param options.menuChildOpen 是否展开子菜单
  18. */
  19. render: function (options) {
  20. options.menuList = options.menuList || [];
  21. options.multiModule = options.multiModule || false;
  22. options.menuChildOpen = options.menuChildOpen || false;
  23. if (options.multiModule) {
  24. miniMenu.renderMultiModule(options.menuList, options.menuChildOpen);
  25. } else {
  26. miniMenu.renderSingleModule(options.menuList, options.menuChildOpen);
  27. }
  28. miniMenu.listen();
  29. },
  30. /**
  31. * 单模块
  32. * @param menuList 菜单数据
  33. * @param menuChildOpen 是否默认展开
  34. */
  35. renderSingleModule: function (menuList, menuChildOpen) {
  36. menuList = menuList || [];
  37. var leftMenuHtml = '',
  38. childOpenClass = '',
  39. leftMenuCheckDefault = 'layui-this';
  40. var me = this ;
  41. if (menuChildOpen) childOpenClass = ' layui-nav-itemed';
  42. leftMenuHtml = this.renderLeftMenu(menuList,{ childOpenClass:childOpenClass }) ;
  43. $('.layui-layout-body').addClass('layuimini-single-module'); //单模块标识
  44. $('.layuimini-header-menu').remove();
  45. $('.layuimini-menu-left').html(leftMenuHtml);
  46. element.init();
  47. },
  48. /**
  49. * 渲染一级菜单
  50. */
  51. compileMenu: function(menu,isSub){
  52. var menuHtml = '<li {{#if( d.menu){ }} data-menu="{{d.menu}}" {{#}}} class="layui-nav-item menu-li {{d.childOpenClass}} {{d.className}}" {{#if( d.id){ }} id="{{d.id}}" {{#}}}> <a {{#if( d.href){ }} layuimini-href="{{d.href}}" {{#}}} {{#if( d.target){ }} target="{{d.target}}" {{#}}} href="javascript:;">{{#if( d.icon){ }} <i class="{{d.icon}}"></i> {{#}}} <span class="layui-left-nav">{{d.title}}</span></a> {{# if(d.children){}} {{d.children}} {{#}}} </li>' ;
  53. if(isSub){
  54. menuHtml = '<dd class="menu-dd {{d.childOpenClass}} {{ d.className }}"> <a href="javascript:;" {{#if( d.menu){ }} data-menu="{{d.menu}}" {{#}}} {{#if( d.id){ }} id="{{d.id}}" {{#}}} {{#if(( !d.child || !d.child.length ) && d.href){ }} layuimini-href="{{d.href}}" {{#}}} {{#if( d.target){ }} target="{{d.target}}" {{#}}}> {{#if( d.icon){ }} <i class="{{d.icon}}"></i> {{#}}} <span class="layui-left-nav"> {{d.title}}</span></a> {{# if(d.children){}} {{d.children}} {{#}}}</dd>'
  55. }
  56. return laytpl(menuHtml).render(menu);
  57. },
  58. compileMenuContainer :function(menu,isSub){
  59. var wrapperHtml = '<ul class="layui-nav layui-nav-tree layui-left-nav-tree {{d.className}}" id="{{d.id}}">{{d.children}}</ul>' ;
  60. if(isSub){
  61. wrapperHtml = '<dl class="layui-nav-child ">{{d.children}}</dl>' ;
  62. }
  63. if(!menu.children){
  64. return "";
  65. }
  66. return laytpl(wrapperHtml).render(menu);
  67. },
  68. each:function(list,callback){
  69. var _list = [];
  70. for(var i = 0 ,length = list.length ; i<length ;i++ ){
  71. _list[i] = callback(i,list[i]) ;
  72. }
  73. return _list ;
  74. },
  75. renderChildrenMenu:function(menuList,options){
  76. var me = this ;
  77. menuList = menuList || [] ;
  78. var html = this.each(menuList,function (idx,menu) {
  79. if(menu.child && menu.child.length){
  80. menu.children = me.renderChildrenMenu(menu.child,{ childOpenClass: options.childOpenClass || '' });
  81. }
  82. menu.className = "" ;
  83. menu.childOpenClass = options.childOpenClass || ''
  84. return me.compileMenu(menu,true)
  85. }).join("");
  86. return me.compileMenuContainer({ children:html },true)
  87. },
  88. renderLeftMenu :function(leftMenus,options){
  89. options = options || {};
  90. var me = this ;
  91. var leftMenusHtml = me.each(leftMenus || [],function (idx,leftMenu) { // 左侧菜单遍历
  92. var children = me.renderChildrenMenu(leftMenu.child, { childOpenClass:options.childOpenClass });
  93. var leftMenuHtml = me.compileMenu({
  94. href: leftMenu.href,
  95. target: leftMenu.target,
  96. childOpenClass: options.childOpenClass,
  97. icon: leftMenu.icon,
  98. title: leftMenu.title,
  99. children: children,
  100. className: '',
  101. });
  102. return leftMenuHtml ;
  103. }).join("");
  104. leftMenusHtml = me.compileMenuContainer({ id:options.parentMenuId,className:options.leftMenuCheckDefault,children:leftMenusHtml }) ;
  105. return leftMenusHtml ;
  106. },
  107. /**
  108. * 多模块
  109. * @param menuList 菜单数据
  110. * @param menuChildOpen 是否默认展开
  111. */
  112. renderMultiModule: function (menuList, menuChildOpen) {
  113. menuList = menuList || [];
  114. var me = this ;
  115. var headerMenuHtml = '',
  116. headerMobileMenuHtml = '',
  117. leftMenuHtml = '',
  118. leftMenuCheckDefault = 'layui-this',
  119. childOpenClass = '',
  120. headerMenuCheckDefault = 'layui-this';
  121. if (menuChildOpen) childOpenClass = ' layui-nav-itemed';
  122. var headerMenuHtml = this.each(menuList, function (index, val) { //顶部菜单渲染
  123. var menu = 'multi_module_' + index ;
  124. var id = menu+"HeaderId";
  125. var topMenuItemHtml = "" ;
  126. topMenuItemHtml = me.compileMenu({
  127. className:headerMenuCheckDefault,
  128. menu:menu,
  129. id:id,
  130. title:val.title,
  131. href:"",
  132. target:"",
  133. children:""
  134. });
  135. leftMenuHtml+=me.renderLeftMenu(val.child,{
  136. parentMenuId:menu,
  137. childOpenClass:childOpenClass,
  138. leftMenuCheckDefault:leftMenuCheckDefault
  139. });
  140. headerMobileMenuHtml +=me.compileMenu({ id:id,menu:menu,id:id,icon:val.icon, title:val.title, },true);
  141. headerMenuCheckDefault = "";
  142. leftMenuCheckDefault = "layui-hide" ;
  143. return topMenuItemHtml ;
  144. }).join("");
  145. $('.layui-layout-body').addClass('layuimini-multi-module'); //多模块标识
  146. $('.layuimini-menu-header-pc').html(headerMenuHtml); //电脑
  147. $('.layuimini-menu-left').html(leftMenuHtml);
  148. $('.layuimini-menu-header-mobile').html(headerMobileMenuHtml); //手机
  149. element.init();
  150. },
  151. /**
  152. * 监听
  153. */
  154. listen: function () {
  155. /**
  156. * 菜单模块切换
  157. */
  158. $('body').on('click', '[data-menu]', function () {
  159. var loading = layer.load(0, {shade: false, time: 2 * 1000});
  160. var menuId = $(this).attr('data-menu');
  161. // header
  162. $(".layuimini-header-menu .layui-nav-item.layui-this").removeClass('layui-this');
  163. $(this).addClass('layui-this');
  164. // left
  165. $(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this").addClass('layui-hide');
  166. $(".layuimini-menu-left .layui-nav.layui-nav-tree.layui-this.layui-hide").removeClass('layui-this');
  167. $("#" + menuId).removeClass('layui-hide');
  168. $("#" + menuId).addClass('layui-this');
  169. layer.close(loading);
  170. });
  171. /**
  172. * 菜单缩放
  173. */
  174. $('body').on('click', '.layuimini-site-mobile', function () {
  175. var loading = layer.load(0, {shade: false, time: 2 * 1000});
  176. var isShow = $('.layuimini-tool [data-side-fold]').attr('data-side-fold');
  177. if (isShow == 1) { // 缩放
  178. $('.layuimini-tool [data-side-fold]').attr('data-side-fold', 0);
  179. $('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-indent');
  180. $('.layui-layout-body').removeClass('layuimini-all');
  181. $('.layui-layout-body').addClass('layuimini-mini');
  182. } else { // 正常
  183. $('.layuimini-tool [data-side-fold]').attr('data-side-fold', 1);
  184. $('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-outdent');
  185. $('.layui-layout-body').removeClass('layuimini-mini');
  186. $('.layui-layout-body').addClass('layuimini-all');
  187. layer.close(window.openTips);
  188. }
  189. element.init();
  190. layer.close(loading);
  191. });
  192. /**
  193. * 菜单缩放
  194. */
  195. $('body').on('click', '[data-side-fold]', function () {
  196. var loading = layer.load(0, {shade: false, time: 2 * 1000});
  197. var isShow = $('.layuimini-tool [data-side-fold]').attr('data-side-fold');
  198. if (isShow == 1) { // 缩放
  199. $('.layuimini-tool [data-side-fold]').attr('data-side-fold', 0);
  200. $('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-indent');
  201. $('.layui-layout-body').removeClass('layuimini-all');
  202. $('.layui-layout-body').addClass('layuimini-mini');
  203. // $(".menu-li").each(function (idx,el) {
  204. // $(el).addClass("hidden-sub-menu");
  205. // });
  206. } else { // 正常
  207. $('.layuimini-tool [data-side-fold]').attr('data-side-fold', 1);
  208. $('.layuimini-tool [data-side-fold]').attr('class', 'fa fa-outdent');
  209. $('.layui-layout-body').removeClass('layuimini-mini');
  210. $('.layui-layout-body').addClass('layuimini-all');
  211. // $(".menu-li").each(function (idx,el) {
  212. // $(el).removeClass("hidden-sub-menu");
  213. // });
  214. layer.close(window.openTips);
  215. }
  216. element.init();
  217. layer.close(loading);
  218. });
  219. /**
  220. * 手机端点开模块
  221. */
  222. $('body').on('click', '.layuimini-header-menu.layuimini-mobile-show dd', function () {
  223. var loading = layer.load(0, {shade: false, time: 2 * 1000});
  224. var check = $('.layuimini-tool [data-side-fold]').attr('data-side-fold');
  225. if(check === "1"){
  226. $('.layuimini-site-mobile').trigger("click");
  227. element.init();
  228. }
  229. layer.close(loading);
  230. });
  231. },
  232. };
  233. exports("miniMenu", miniMenu);
  234. });