/*========================================================================================= File Name: app-menu.js Description: Menu navigation, custom scrollbar, hover scroll bar, multilevel menu initialization and manipulations ---------------------------------------------------------------------------------------- Item Name: Modern Admin - Clean Bootstrap 4 Dashboard HTML Template Author: Pixinvent Author URL: hhttp://www.themeforest.net/user/pixinvent ==========================================================================================*/ (function (window, document, $) { "use strict"; $.app = $.app || {}; var $body = $("body"); var $window = $(window); var menuWrapper_el = $('div[data-menu="menu-wrapper"]').html(); var menuWrapperClasses = $('div[data-menu="menu-wrapper"]').attr("class"); // Main menu $.app.menu = { expanded: null, collapsed: null, hidden: null, container: null, horizontalMenu: false, is_touch_device: function () { var prefixes = ' -webkit- -moz- -o- -ms- '.split(' '); var mq = function (query) { return window.matchMedia(query).matches; } if (('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) { return true; } // include the 'heartz' as a way to have a non matching MQ to help terminate the join // https://git.io/vznFH var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join(''); return mq(query); }, manualScroller: { obj: null, init: function () { // console.log($.app.menu.is_touch_device()) if (!$.app.menu.is_touch_device()) { this.obj = new PerfectScrollbar(".main-menu-content", { suppressScrollX: true, wheelPropagation: false }); } else { $(".main-menu").addClass("menu-native-scroll") } }, update: function () { if (this.obj) { // Scroll to currently active menu on page load if data-scroll-to-active is true if ($(".main-menu").data("scroll-to-active") === true) { var activeEl, menu, activeElHeight; activeEl = document.querySelector(".main-menu-content li.active"); menu = document.querySelector(".main-menu-content"); if ($body.hasClass("menu-collapsed")) { if ($(".main-menu-content li.menu-collapsed-open").length) { activeEl = document.querySelector( ".main-menu-content li.menu-collapsed-open" ); } } if (activeEl) { activeElHeight = activeEl.getBoundingClientRect().top + menu.scrollTop; } // If active element's top position is less than 2/3 (66%) of menu height than do not scroll if (activeElHeight > parseInt((menu.clientHeight * 2) / 3)) { var start = menu.scrollTop, change = activeElHeight - start - parseInt(menu.clientHeight / 2); } setTimeout(function () { $.app.menu.container.stop().animate( { scrollTop: change }, 300 ); $(".main-menu").data("scroll-to-active", "false"); }, 300); } this.obj.update(); } }, enable: function () { if (!$(".main-menu-content").hasClass("ps")) { this.init(); } }, disable: function () { if (this.obj) { this.obj.destroy(); } }, updateHeight: function () { if ( ($body.data("menu") == "vertical-menu" || $body.data("menu") == "vertical-menu-modern" || $body.data("menu") == "vertical-overlay-menu") && $(".main-menu").hasClass("menu-fixed") ) { $(".main-menu-content").css( "height", $(window).height() - $(".header-navbar").height() - $(".main-menu-header").outerHeight() ); this.update(); } } }, init: function (compactMenu) { if ($(".main-menu-content").length > 0) { this.container = $(".main-menu-content"); var menuObj = this; var defMenu = ""; if (compactMenu === true) { defMenu = "collapsed"; } this.change(defMenu); } if (defMenu === "collapsed") { this.collapse(); } }, change: function (defMenu) { var currentBreakpoint = Unison.fetch.now(); // Current Breakpoint this.reset(); var menuType = $body.data("menu"); if (currentBreakpoint) { switch (currentBreakpoint.name) { case "xl": if (menuType === "vertical-overlay-menu") { this.hide(); } else if (menuType === "vertical-compact-menu") { this.open(); } else { if (defMenu === "collapsed") this.collapse(defMenu); else this.expand(); } break; case "lg": if (menuType === "vertical-overlay-menu") { this.hide(); } else if (menuType === "vertical-compact-menu") { this.open(); } else if (menuType === "horizontal-menu") { this.hide(); } else { if (defMenu === "collapsed") this.collapse(defMenu); else this.expand(); } break; case "md": if ( menuType === "vertical-overlay-menu" || menuType === "vertical-menu-modern" ) { this.hide(); } else if (menuType === "vertical-compact-menu") { this.open(); } else if (menuType === "horizontal-menu") { this.hide(); } else { this.collapse(); } break; case "sm": this.hide(); break; case "xs": this.hide(); break; } } // On the small and extra small screen make them overlay menu if ( menuType === "vertical-menu" || menuType === "vertical-compact-menu" || menuType === "vertical-content-menu" || menuType === "vertical-menu-modern" ) { this.toOverlayMenu(currentBreakpoint.name, menuType); } if ( $body.is(".horizontal-layout") && !$body.hasClass(".horizontal-menu-demo") ) { this.changeMenu(currentBreakpoint.name); $(".menu-toggle").removeClass("is-active"); } // Dropdown submenu on large screen on hover For Large screen only // --------------------------------------------------------------- if (currentBreakpoint.name == "xl") { $('body[data-open="hover"] .dropdown') .off("mouseenter") .on("mouseenter", function (e) { if (!$(this).hasClass("show")) { $(this).addClass("show"); } else { $(this).removeClass("show"); } }) .off("mouseleave") .on("mouseleave", function (event) { $(this).removeClass("show"); }); } // Added data attribute brand-center for navbar-brand-center // TODO:AJ: Shift this feature in PUG. if ($(".header-navbar").hasClass("navbar-brand-center")) { $(".header-navbar").attr("data-nav", "brand-center"); } if (currentBreakpoint.name == "sm" || currentBreakpoint.name == "xs") { $(".header-navbar[data-nav=brand-center]").removeClass( "navbar-brand-center" ); } else { $(".header-navbar[data-nav=brand-center]").addClass( "navbar-brand-center" ); } // Dropdown submenu on small screen on click // -------------------------------------------------- $("ul.dropdown-menu [data-toggle=dropdown]").on("click", function (event) { if ($(this).siblings("ul.dropdown-menu").length > 0) { event.preventDefault(); } event.stopPropagation(); $(this) .parent() .siblings() .removeClass("show"); $(this) .parent() .toggleClass("show"); }); // Horizontal layout submenu open left based on available space (click event) if (menuType == 'horizontal-menu') { $('li.dropdown-submenu .dropdown-item').on('click', function () { var dd = $(this).parent().find('.dropdown-menu'); if (dd.length) { var pageHeight = $(window).height(), ddTop = dd.offset().top, ddLeft = dd.offset().left, ddWidth = dd.width(), ddHeight = dd.height(); if (((pageHeight - ddTop) - ddHeight - 28) < 1) { var maxHeight = (pageHeight - ddTop - 25); if ($("body").data("open") === "click") { $(this).parent().find('.dropdown-menu').css({ 'max-height': maxHeight + 'px', 'overflow-y': 'auto', 'overflow-x': 'hidden' }); var menu_content = new PerfectScrollbar('li.dropdown-submenu.show .dropdown-menu', { wheelPropagation: false }); } } // Add class to open left in horizontal sub menu if screen width is small in LTR if ($("html").data("textdirection") === "ltr" && ddLeft + ddWidth - (window.innerWidth - 16) >= 0) { $(this).parent().find('.dropdown-menu').addClass('open-left'); } // Add class to open right in horizontal sub menu if screen width is small in RTL else if ($("html").data("textdirection") === "rtl" && ddLeft + ddWidth - (window.innerWidth - 1000) <= 0) { $(this).parent().find('.dropdown-menu').addClass('open-left'); } } }); // Horizontal layout submenu open left based on available space (hover event) $('li.dropdown-submenu').on('mouseenter', function () { var dd = $(this).find('.dropdown-menu'); if (dd.length) { var pageHeight = $(window).height(), ddTop = dd.offset().top, ddLeft = dd.offset().left, ddWidth = dd.width(), ddHeight = dd.height(); if (((pageHeight - ddTop) - ddHeight - 28) < 1) { var maxHeight = (pageHeight - ddTop - 25); if ($("body").data("open") === "hover") { $(this).find('.dropdown-menu').css({ 'max-height': maxHeight + 'px', 'overflow-y': 'auto', 'overflow-x': 'hidden' }); var mouseEnterPS = new PerfectScrollbar('li.dropdown-submenu.show .dropdown-menu', { wheelPropagation: false }); } } // Add class to open left in horizontal sub menu if screen width is small in LTR if ($("html").data("textdirection") === "ltr" && ddLeft + ddWidth - (window.innerWidth - 16) >= 0) { $(this).parent().find('.dropdown-menu').addClass('open-left'); } // Add class to open right in horizontal sub menu if screen width is small in RTL else if ($("html").data("textdirection") === "rtl" && ddLeft + ddWidth - (window.innerWidth - 1000) <= 0) { $(this).parent().find('.dropdown-menu').addClass('open-left'); } } }); } // Horizontal Fixed Nav Sticky hight issue on small screens if (menuType == "horizontal-menu") { if (currentBreakpoint.name == "xl") { if ($(".navbar-fixed").length) { $(".navbar-fixed").sticky(); } } else { if ($(".menu-fixed").length) { $(".menu-fixed").unstick(); } } } }, transit: function (callback1, callback2) { var menuObj = this; $body.addClass("changing-menu"); callback1.call(menuObj); if ($body.hasClass("vertical-layout")) { if ($body.hasClass("menu-open") || $body.hasClass("menu-expanded")) { $(".menu-toggle").addClass("is-active"); // Show menu header search when menu is normally visible if ( $body.data("menu") === "vertical-menu" || $body.data("menu") === "vertical-content-menu" ) { if ($(".main-menu-header")) { $(".main-menu-header").show(); } } } else { $(".menu-toggle").removeClass("is-active"); // Hide menu header search when only menu icons are visible if ( $body.data("menu") === "vertical-menu" || $body.data("menu") === "vertical-content-menu" ) { if ($(".main-menu-header")) { $(".main-menu-header").hide(); } } } } setTimeout(function () { callback2.call(menuObj); $body.removeClass("changing-menu"); menuObj.update(); }, 500); }, open: function () { this.transit( function () { $body.removeClass("menu-hide menu-collapsed").addClass("menu-open"); this.hidden = false; this.expanded = true; if ($body.hasClass("vertical-overlay-menu")) { $(".sidenav-overlay") .removeClass("d-none") .addClass("d-block"); $body.css("overflow", "hidden"); } }, function () { if ( !$(".main-menu").hasClass("menu-native-scroll") && $(".main-menu").hasClass("menu-fixed") ) { this.manualScroller.enable(); $(".main-menu-content").css( "height", $(window).height() - $(".header-navbar").height() - $(".main-menu-header").outerHeight() ); // this.manualScroller.update(); } if ( $body.data("menu") == "vertical-compact-menu" && !$body.hasClass("vertical-overlay-menu") ) { $(".sidenav-overlay").removeClass("d-block d-none"); $("body").css("overflow", "auto"); } } ); }, hide: function () { this.transit( function () { $body.removeClass("menu-open menu-expanded").addClass("menu-hide"); this.hidden = true; this.expanded = false; if ($body.hasClass("vertical-overlay-menu")) { $(".sidenav-overlay") .removeClass("d-block") .addClass("d-none"); $("body").css("overflow", "auto"); } }, function () { if ( !$(".main-menu").hasClass("menu-native-scroll") && $(".main-menu").hasClass("menu-fixed") ) { this.manualScroller.enable(); } if ( $body.data("menu") == "vertical-compact-menu" && !$body.hasClass("vertical-overlay-menu") ) { $(".sidenav-overlay").removeClass("d-block d-none"); $("body").css("overflow", "auto"); } } ); }, expand: function () { if (this.expanded === false) { if ($body.data("menu") == "vertical-menu-modern") { $(".modern-nav-toggle") .find(".toggle-icon") .removeClass("ft-toggle-left") .addClass("ft-toggle-right"); } this.transit( function () { $body.removeClass("menu-collapsed").addClass("menu-expanded"); this.collapsed = false; this.expanded = true; $(".sidenav-overlay").removeClass("d-block d-none"); }, function () { if ( $(".main-menu").hasClass("menu-native-scroll") || $body.data("menu") == "horizontal-menu" ) { this.manualScroller.disable(); } else { if ($(".main-menu").hasClass("menu-fixed")) this.manualScroller.enable(); } if ( ($body.data("menu") == "vertical-menu" || $body.data("menu") == "vertical-menu-modern") && $(".main-menu").hasClass("menu-fixed") ) { $(".main-menu-content").css( "height", $(window).height() - $(".header-navbar").height() - $(".main-menu-header").outerHeight() ); } } ); } }, collapse: function (defMenu) { if (this.collapsed === false) { if ($body.data("menu") == "vertical-menu-modern") { $(".modern-nav-toggle") .find(".toggle-icon") .removeClass("ft-toggle-right") .addClass("ft-toggle-left"); } this.transit( function () { $body.removeClass("menu-expanded").addClass("menu-collapsed"); this.collapsed = true; this.expanded = false; $(".content-overlay").removeClass("d-block d-none"); }, function () { if ($body.data("menu") == "vertical-content-menu") { this.manualScroller.disable(); } if ( $body.data("menu") == "horizontal-menu" && $body.hasClass("vertical-overlay-menu") ) { if ($(".main-menu").hasClass("menu-fixed")) this.manualScroller.enable(); } if ( ($body.data("menu") == "vertical-menu" || $body.data("menu") == "vertical-menu-modern") && $(".main-menu").hasClass("menu-fixed") ) { $(".main-menu-content").css( "height", $(window).height() - $(".header-navbar").height() ); if (!$(".main-menu-content").hasClass("ps")) { this.manualScroller.enable(); } } } ); } }, toOverlayMenu: function (screen, menuType) { var menu = $body.data("menu"); if (menuType == "vertical-menu-modern") { if (screen == "md" || screen == "sm" || screen == "xs") { if ($body.hasClass(menu)) { $body.removeClass(menu).addClass("vertical-overlay-menu"); } } else { if ($body.hasClass("vertical-overlay-menu")) { $body.removeClass("vertical-overlay-menu").addClass(menu); } } } else { if (screen == "sm" || screen == "xs") { if ($body.hasClass(menu)) { $body.removeClass(menu).addClass("vertical-overlay-menu"); } if (menu == "vertical-content-menu") { $(".main-menu").addClass("menu-fixed"); } } else { if ($body.hasClass("vertical-overlay-menu")) { $body.removeClass("vertical-overlay-menu").addClass(menu); } if (menu == "vertical-content-menu") { $(".main-menu").removeClass("menu-fixed"); } } } }, changeMenu: function (screen) { // Replace menu html $('div[data-menu="menu-wrapper"]').html(""); $('div[data-menu="menu-wrapper"]').html(menuWrapper_el); var menuWrapper = $('div[data-menu="menu-wrapper"]'), menuContainer = $('div[data-menu="menu-container"]'), menuNavigation = $('ul[data-menu="menu-navigation"]'), megaMenu = $('li[data-menu="megamenu"]'), megaMenuCol = $("li[data-mega-col]"), dropdownMenu = $('li[data-menu="dropdown"]'), dropdownSubMenu = $('li[data-menu="dropdown-submenu"]'); if (screen === "xl") { // Change body classes $body .removeClass("vertical-layout vertical-overlay-menu fixed-navbar") .addClass($body.data("menu")); // Remove navbar-fix-top class on large screens $("nav.header-navbar").removeClass("fixed-top"); // Change menu wrapper, menu container, menu navigation classes menuWrapper.removeClass().addClass(menuWrapperClasses); $("a.dropdown-item.nav-has-children").on("click", function () { event.preventDefault(); event.stopPropagation(); }); $("a.dropdown-item.nav-has-parent").on("click", function () { event.preventDefault(); event.stopPropagation(); }); } else { // Change body classes $body .removeClass($body.data("menu")) .addClass("vertical-layout vertical-overlay-menu fixed-navbar"); // Add navbar-fix-top class on small screens $("nav.header-navbar").addClass("fixed-top"); // Change menu wrapper, menu container, menu navigation classes menuWrapper .removeClass() .addClass("main-menu menu-light menu-fixed menu-shadow"); // menuContainer.removeClass().addClass('main-menu-content'); menuNavigation.removeClass().addClass("navigation navigation-main"); // If Mega Menu megaMenu.removeClass("dropdown mega-dropdown").addClass("has-sub"); megaMenu.children("ul").removeClass(); megaMenuCol.each(function (index, el) { var megaMenuSub = $(el).find(".mega-menu-sub"); megaMenuSub .find("li") .has("ul") .addClass("has-sub"); // if mega menu title is given, remove title and make it list item with mega menu title's text var first_child = $(el) .children() .first(), first_child_text = ""; if (first_child.is("h6")) { first_child_text = first_child.html(); first_child.remove(); $(el) .prepend('' + first_child_text + "") .addClass("has-sub mega-menu-title"); } }); megaMenu.find("a").removeClass("dropdown-toggle"); megaMenu.find("a").removeClass("dropdown-item"); // If Dropdown Menu dropdownMenu.removeClass("dropdown").addClass("has-sub"); dropdownMenu.find("a").removeClass("dropdown-toggle nav-link"); dropdownMenu .children("ul") .find("a") .removeClass("dropdown-item"); dropdownMenu.find("ul").removeClass("dropdown-menu"); dropdownSubMenu.removeClass().addClass("has-sub"); $.app.nav.init(); // Dropdown submenu on small screen on click // -------------------------------------------------- $("ul.dropdown-menu [data-toggle=dropdown]").on("click", function ( event ) { event.preventDefault(); event.stopPropagation(); $(this) .parent() .siblings() .removeClass("open"); $(this) .parent() .toggleClass("open"); }); } }, toggle: function () { var currentBreakpoint = Unison.fetch.now(); // Current Breakpoint var collapsed = this.collapsed; var expanded = this.expanded; var hidden = this.hidden; var menu = $body.data("menu"); switch (currentBreakpoint.name) { case "xl": if (expanded === true) { if ( menu == "vertical-compact-menu" || menu == "vertical-overlay-menu" ) { this.hide(); } else { this.collapse(); } } else { if ( menu == "vertical-compact-menu" || menu == "vertical-overlay-menu" ) { this.open(); } else { this.expand(); } } break; case "lg": if (expanded === true) { if ( menu == "vertical-compact-menu" || menu == "vertical-overlay-menu" || menu == "horizontal-menu" ) { this.hide(); } else { this.collapse(); } } else { if ( menu == "vertical-compact-menu" || menu == "vertical-overlay-menu" || menu == "horizontal-menu" ) { this.open(); } else { this.expand(); } } break; case "md": if (expanded === true) { if ( menu == "vertical-compact-menu" || menu == "vertical-overlay-menu" || menu == "vertical-menu-modern" || menu == "horizontal-menu" ) { this.hide(); } else { this.collapse(); } } else { if ( menu == "vertical-compact-menu" || menu == "vertical-overlay-menu" || menu == "vertical-menu-modern" || menu == "horizontal-menu" ) { this.open(); } else { this.expand(); } } break; case "sm": if (hidden === true) { this.open(); } else { this.hide(); } break; case "xs": if (hidden === true) { this.open(); } else { this.hide(); } break; } }, update: function () { this.manualScroller.update(); }, reset: function () { this.expanded = false; this.collapsed = false; this.hidden = false; $body.removeClass("menu-hide menu-open menu-collapsed menu-expanded"); } }; // Navigation Menu $.app.nav = { container: $(".navigation-main"), initialized: false, navItem: $(".navigation-main") .find("li") .not(".navigation-category"), config: { speed: 300 }, init: function (config) { this.initialized = true; // Set to true when initialized $.extend(this.config, config); this.bind_events(); }, // Detect IE detectIE: function ($menuItem) { var ua = window.navigator.userAgent; // Test values; Uncomment to check result … // IE 10 // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)'; // IE 11 // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko'; // Edge 12 (Spartan) // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0'; // Edge 13 // ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; var msie = ua.indexOf("MSIE "); if (msie > 0) { // IE 10 or older => return version number return parseInt(ua.substring(msie + 5, ua.indexOf(".", msie)), 10); } var trident = ua.indexOf("Trident/"); if (trident > 0) { // IE 11 => return version number var rv = ua.indexOf("rv:"); return parseInt(ua.substring(rv + 3, ua.indexOf(".", rv)), 10); } var edge = ua.indexOf("Edge/"); if (edge > 0) { // Edge (IE 12+) => return version number return parseInt(ua.substring(edge + 5, ua.indexOf(".", edge)), 10); } // other browser return false; }, bind_events: function () { var menuObj = this; $(".navigation-main") .on("mouseenter.app.menu", "li", function () { var $this = $(this); $(".hover", ".navigation-main").removeClass("hover"); if ( ($body.hasClass("menu-collapsed") && $body.data("menu") != "vertical-menu-modern") || ($body.data("menu") == "vertical-compact-menu" && !$body.hasClass("vertical-overlay-menu")) ) { $(".main-menu-content") .children("span.menu-title") .remove(); $(".main-menu-content") .children("a.menu-title") .remove(); $(".main-menu-content") .children("ul.menu-content") .remove(); // Title var menuTitle = $this.find("span.menu-title").clone(), tempTitle, tempLink; if (!$this.hasClass("has-sub")) { tempTitle = $this.find("span.menu-title").text(); tempLink = $this.children("a").attr("href"); if (tempTitle !== "") { menuTitle = $(""); menuTitle.attr("href", tempLink); menuTitle.attr("title", tempTitle); menuTitle.text(tempTitle); menuTitle.addClass("menu-title"); } } var fromTop; if ($this.css("border-top")) { fromTop = $this.position().top + parseInt($this.css("border-top"), 10); } else { fromTop = $this.position().top; } if ($body.hasClass("material-vertical-layout")) { fromTop = $(".user-profile").height() + $this.position().top; } // Get IE or Edge browser version var version = menuObj.detectIE(); if (version !== false) { if ($body.hasClass("material-vertical-layout")) { fromTop = $(".user-profile").height() + $this.position().top + $(".header-navbar").height(); } } if ($body.data("menu") !== "vertical-compact-menu") { menuTitle.appendTo(".main-menu-content").css({ position: "fixed", top: fromTop }); } // Content if ($this.hasClass("has-sub") && $this.hasClass("nav-item")) { var menuContent = $this.children("ul:first"); if ($body.data("menu") !== "vertical-compact-menu") { menuObj.adjustSubmenu($this); } else { menuObj.fullSubmenu($this); } } } $this.addClass("hover"); }) .on("mouseleave.app.menu", "li", function () { // $(this).removeClass('hover'); }) .on("active.app.menu", "li", function (e) { $(this).addClass("active"); e.stopPropagation(); }) .on("deactive.app.menu", "li.active", function (e) { $(this).removeClass("active"); e.stopPropagation(); }) .on("open.app.menu", "li", function (e) { var $listItem = $(this); $listItem.addClass("open"); menuObj.expand($listItem); // If menu collapsible then do not take any action if ($(".main-menu").hasClass("menu-collapsible")) { return false; } // If menu accordion then close all except clicked once else { $listItem .siblings(".open") .find("li.open") .trigger("close.app.menu"); $listItem.siblings(".open").trigger("close.app.menu"); } e.stopPropagation(); }) .on("close.app.menu", "li.open", function (e) { var $listItem = $(this); $listItem.removeClass("open"); menuObj.collapse($listItem); e.stopPropagation(); }) .on("click.app.menu", "li", function (e) { var $listItem = $(this); if ($listItem.is(".disabled")) { e.preventDefault(); } else { if ( ($body.hasClass("menu-collapsed") && $body.data("menu") != "vertical-menu-modern") || ($body.data("menu") == "vertical-compact-menu" && $listItem.is(".has-sub") && !$body.hasClass("vertical-overlay-menu")) ) { e.preventDefault(); } else { if ($listItem.has("ul")) { if ($listItem.is(".open")) { $listItem.trigger("close.app.menu"); } else { $listItem.trigger("open.app.menu"); } } else { if (!$listItem.is(".active")) { $listItem.siblings(".active").trigger("deactive.app.menu"); $listItem.trigger("active.app.menu"); } } } } e.stopPropagation(); }); $(".navbar-header, .main-menu") .on("mouseenter", modernMenuExpand) .on("mouseleave", modernMenuCollapse); function modernMenuExpand() { if ($body.data("menu") == "vertical-menu-modern") { $(".main-menu, .navbar-header").addClass("expanded"); if ($body.hasClass("menu-collapsed")) { var $listItem = $(".main-menu li.menu-collapsed-open"), $subList = $listItem.children("ul"); $subList.hide().slideDown(200, function () { $(this).css("display", ""); }); $listItem.addClass("open").removeClass("menu-collapsed-open"); } } } function modernMenuCollapse() { if ( $body.hasClass("menu-collapsed") && $body.data("menu") == "vertical-menu-modern" ) { setTimeout(function () { if ( $(".main-menu:hover").length === 0 && $(".navbar-header:hover").length === 0 ) { $(".main-menu, .navbar-header").removeClass("expanded"); // Hide dropdown of user profile section for material templates if ($(".user-profile .user-info .dropdown").hasClass("show")) { $(".user-profile .user-info .dropdown").removeClass("show"); $( ".user-profile .user-info .dropdown .dropdown-menu" ).removeClass("show"); } if ($body.hasClass("menu-collapsed")) { var $listItem = $(".main-menu li.open"), $subList = $listItem.children("ul"); $listItem.addClass("menu-collapsed-open"); $subList.show().slideUp(200, function () { $(this).css("display", ""); }); $listItem.removeClass("open"); } } }, 1); } } $(".main-menu-content").on("mouseleave", function () { if ( $body.hasClass("menu-collapsed") || $body.data("menu") == "vertical-compact-menu" ) { $(".main-menu-content") .children("span.menu-title") .remove(); $(".main-menu-content") .children("a.menu-title") .remove(); $(".main-menu-content") .children("ul.menu-content") .remove(); } $(".hover", ".navigation-main").removeClass("hover"); }); // If list item has sub menu items then prevent redirection. $(".navigation-main li.has-sub > a").on("click", function (e) { e.preventDefault(); }); $("ul.menu-content").on("click", "li", function (e) { var $listItem = $(this); if ($listItem.is(".disabled")) { e.preventDefault(); } else { if ($listItem.has("ul")) { if ($listItem.is(".open")) { $listItem.removeClass("open"); menuObj.collapse($listItem); } else { $listItem.addClass("open"); menuObj.expand($listItem); // If menu collapsible then do not take any action if ($(".main-menu").hasClass("menu-collapsible")) { return false; } // If menu accordion then close all except clicked once else { $listItem .siblings(".open") .find("li.open") .trigger("close.app.menu"); $listItem.siblings(".open").trigger("close.app.menu"); } e.stopPropagation(); } } else { if (!$listItem.is(".active")) { $listItem.siblings(".active").trigger("deactive.app.menu"); $listItem.trigger("active.app.menu"); } } } e.stopPropagation(); }); }, /** * Ensure an admin submenu is within the visual viewport. * @param {jQuery} $menuItem The parent menu item containing the submenu. */ adjustSubmenu: function ($menuItem) { var menuHeaderHeight, menutop, topPos, winHeight, bottomOffset, subMenuHeight, popOutMenuHeight, borderWidth, scroll_theme, $submenu = $menuItem.children("ul:first"), ul = $submenu.clone(true); menuHeaderHeight = $(".main-menu-header").height(); menutop = $menuItem.position().top; winHeight = $window.height() - $(".header-navbar").height(); borderWidth = 0; subMenuHeight = $submenu.height(); if (parseInt($menuItem.css("border-top"), 10) > 0) { borderWidth = parseInt($menuItem.css("border-top"), 10); } popOutMenuHeight = winHeight - menutop - $menuItem.height() - 30; scroll_theme = $(".main-menu").hasClass("menu-dark") ? "light" : "dark"; if ($body.data("menu") === "vertical-compact-menu") { topPos = menutop + borderWidth; popOutMenuHeight = winHeight - menutop - 30; } else if ($body.data("menu") === "vertical-content-menu") { topPos = menutop + $menuItem.height() + borderWidth - 5; popOutMenuHeight = winHeight - $(".content-header").height() - $menuItem.height() - menutop - 60; if ($body.hasClass("material-vertical-layout")) { topPos = menutop + $menuItem.height() + $(".user-profile").height() + borderWidth; } } else if ($body.hasClass("material-vertical-layout")) { topPos = menutop + $menuItem.height() + $(".user-profile").height() + borderWidth; } else { topPos = menutop + $menuItem.height() + borderWidth; } // Get IE or Edge browser version var version = this.detectIE(); if (version !== false) { if ($body.hasClass("material-vertical-layout")) { topPos = menutop + $menuItem.height() + $(".user-profile").height() + borderWidth + $(".header-navbar").height(); } } if ($body.data("menu") == "vertical-content-menu") { ul.addClass("menu-popout") .appendTo(".main-menu-content") .css({ top: topPos, position: "fixed" }); } else { ul.addClass("menu-popout") .appendTo(".main-menu-content") .css({ top: topPos, position: "fixed", "max-height": popOutMenuHeight }); var menu_content = new PerfectScrollbar( ".main-menu-content > ul.menu-content" ); } }, fullSubmenu: function ($menuItem) { var $submenu = $menuItem.children("ul:first"), ul = $submenu.clone(true); ul.addClass("menu-popout") .appendTo(".main-menu-content") .css({ top: 0, position: "fixed", height: "100%" }); var menu_content = new PerfectScrollbar( ".main-menu-content > ul.menu-content" ); }, collapse: function ($listItem, callback) { var $subList = $listItem.children("ul"); $subList.show().slideUp($.app.nav.config.speed, function () { $(this).css("display", ""); $(this) .find("> li") .removeClass("is-shown"); if (callback) { callback(); } $.app.nav.container.trigger("collapsed.app.menu"); }); }, expand: function ($listItem, callback) { var $subList = $listItem.children("ul"); var $children = $subList.children("li").addClass("is-hidden"); $subList.hide().slideDown($.app.nav.config.speed, function () { $(this).css("display", ""); if (callback) { callback(); } $.app.nav.container.trigger("expanded.app.menu"); }); setTimeout(function () { $children.addClass("is-shown"); $children.removeClass("is-hidden"); }, 0); }, refresh: function () { $.app.nav.container.find(".open").removeClass("open"); } }; })(window, document, jQuery);