205 lines
6.2 KiB
JavaScript
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);
|