ibms-dome/Frontend/lib/app.menu.js

205 lines
6.2 KiB
JavaScript

/*!
* jQuery app.navigation v1.0.0
*
* Copyright 2019, 2020 SmartAdmin WebApp
* Released under Marketplace License (see your license details for usage)
*
* Publish Date: 2018-01-01T17:42Z
*/
(function($) {
/**
* Menu Plugin
**/
$.fn.extend({
/**
* pass the options variable to the function
*
* $(id).navigation({
* accordion: true,
* animate: 'easeOutExpo',
* speed: 200,
* closedSign: '[+]',
* openedSign: '[-]',
* initClass: 'js-nav-built'
* });
*
**/
navigation: function(options) {
var defaults = {
accordion: true,
animate: 'swing',
speed: 100,
closedSign: '[+]',
openedSign: '[-]',
initClass: 'js-nav-built'
},
/**
* extend our default options with those provided.
**/
opts = $.extend(defaults, options),
/**
* assign current element to variable, in this case is UL element
**/
self = $(this);
if (!self.hasClass(opts.initClass)) {
/**
* confirm build to prevent rebuild error
**/
self.addClass(opts.initClass);
/**
* add a mark [+] to a multilevel menu
**/
self.find("li").each(function() {
if ($(this).find("ul").length !== 0) {
/**
* add the multilevel sign next to the link
**/
$(this).find("a:first").append("<b class='collapse-sign'>" + opts.closedSign + "</b>");
/**
* avoid jumping to the top of the page when the href is an #
**/
if ($(this).find("a:first").attr('href') == "#") {
$(this).find("a:first").click(function() {
return false;
});
}
}
});
/**
* add open sign to all active lists
**/
self.find("li.active").each(function() {
$(this).parents("ul")
.parent("li")
.find("a:first")
.attr('aria-expanded', true)
.find("b:first")
.html(opts.openedSign);
});
/**
* click events
**/
self.find("li a").on('mousedown', function(e) {
if ($(this).parent().find("ul").length !== 0) {
if (opts.accordion) {
/**
* do nothing when the list is open
**/
if (!$(this).parent().find("ul").is(':visible')) {
parents = $(this).parent().parents("ul");
visible = self.find("ul:visible");
visible.each(function(visibleIndex) {
var close = true;
parents.each(function(parentIndex) {
if (parents[parentIndex] == visible[visibleIndex]) {
close = false;
return false;
}
});
if (close) {
if ($(this).parent().find("ul") != visible[visibleIndex]) {
$(visible[visibleIndex]).slideUp(opts.speed + 300, opts.animate, function() {
$(this).parent("li")
.removeClass("open")
.find("a:first")
.attr('aria-expanded', false)
.find("b:first")
.html(opts.closedSign);
if (myapp_config.debugState)
console.log("nav item closed")
});
}
}
});
}
}
/**
* Add active class to open element
**/
if ($(this).parent().find("ul:first").is(":visible") && !$(this).parent().find("ul:first").hasClass("active")) {
$(this).parent().find("ul:first").slideUp(opts.speed + 100, opts.animate, function() {
$(this).parent("li")
.removeClass("open")
.find("a:first")
.attr('aria-expanded', false)
.find("b:first").delay(opts.speed)
.html(opts.closedSign);
if (myapp_config.debugState)
console.log("nav item closed")
});
} else {
$(this).parent().find("ul:first").slideDown(opts.speed, opts.animate, function() {
$(this).parent("li")
.addClass("open")
.find("a:first")
.attr('aria-expanded', true)
.find("b:first").delay(opts.speed)
.html(opts.openedSign);
if (myapp_config.debugState)
console.log("nav item opened");
});
}
}
});
} else {
if (myapp_config.debugState)
console.log(self.get(0) + " this menu already exists");
}
},
/**
* DOC: $(id).destroy();
**/
navigationDestroy: function() {
self = $(this);
if (self.hasClass(myapp_config.navInitalized)) {
self.find("li").removeClass("active open");
self.find("li a").off('mousedown').removeClass("active").removeAttr("aria-expanded").find(".collapse-sign").remove();
self.removeClass(myapp_config.navInitalized).find("ul").removeAttr("style");
if (myapp_config.debugState)
console.log( self.get(0) + " destroyed");
} else {
console.log("menu does not exist")
}
}
});
})(jQuery, window, document);