239 lines
8.4 KiB
JavaScript
Executable File
239 lines
8.4 KiB
JavaScript
Executable File
'use strict';
|
|
/**
|
|
* A set of directives for left and right sidebar.
|
|
*/
|
|
app.directive('sidebar', ['$document', '$rootScope',
|
|
function ($document, $rootScope) {
|
|
return {
|
|
replace: false,
|
|
restrict: "C",
|
|
link: function (scope, elem, attrs) {
|
|
var shouldCloseOnOuterClicks = true;
|
|
|
|
if (attrs.closeOnOuterClicks == 'false' || attrs.closeOnOuterClicks == '0') {
|
|
shouldCloseOnOuterClicks = false;
|
|
}
|
|
|
|
var isAncestorOrSelf = function (element, target) {
|
|
var parent = element;
|
|
|
|
while (parent.length > 0) {
|
|
if (parent[0] === target[0]) {
|
|
parent = null;
|
|
return true;
|
|
}
|
|
parent = parent.parent();
|
|
}
|
|
|
|
parent = null;
|
|
return false;
|
|
};
|
|
|
|
var closeOnOuterClicks = function (e) {
|
|
|
|
if (!isAncestorOrSelf(angular.element(e.target), elem)) {
|
|
$rootScope.toggle(attrs.id, 'off');
|
|
e.preventDefault();
|
|
return false;
|
|
}
|
|
};
|
|
|
|
var clearCb1 = angular.noop();
|
|
|
|
if (shouldCloseOnOuterClicks) {
|
|
clearCb1 = $rootScope.$on('clip-two.toggled', function (e, id, active) {
|
|
|
|
if (id == attrs.id) {
|
|
|
|
if (active) {
|
|
setTimeout(function () {
|
|
$document.on('click tap', closeOnOuterClicks);
|
|
}, 300);
|
|
} else {
|
|
$document.off('click tap', closeOnOuterClicks);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
scope.$on('$destroy', function () {
|
|
clearCb1();
|
|
$document.off('click tap', closeOnOuterClicks);
|
|
});
|
|
|
|
}
|
|
};
|
|
}]).directive('searchForm', function () {
|
|
return {
|
|
restrict: 'AC',
|
|
link: function (scope, elem, attrs) {
|
|
var wrap = $('.app-aside');
|
|
var searchForm = elem.children('form');
|
|
var formWrap = elem.parent();
|
|
|
|
$(".s-open").on('click', function (e) {
|
|
searchForm.prependTo(wrap);
|
|
e.preventDefault();
|
|
$(document).on("mousedown touchstart", closeForm);
|
|
});
|
|
$(".s-remove").on('click', function (e) {
|
|
searchForm.appendTo(elem);
|
|
e.preventDefault();
|
|
});
|
|
var closeForm = function (e) {
|
|
if (!searchForm.is(e.target) && searchForm.has(e.target).length === 0) {
|
|
$(".s-remove").trigger('click');
|
|
$(document).off("mousedown touchstart", closeForm);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
function isSidebarClosed() {
|
|
return $('.app-sidebar-closed').length;
|
|
}
|
|
|
|
function isSidebarFixed() {
|
|
return $('.app-sidebar-fixed').length;
|
|
}
|
|
|
|
}).directive('appAside', ['$window', '$rootScope', '$timeout', 'APP_MEDIAQUERY',
|
|
function ($window, $rootScope, $timeout, mq) {
|
|
var $html = $('html'), $win = $($window), _this, wrap = $('.app-aside');
|
|
return {
|
|
restrict: 'AC',
|
|
|
|
link: function (scope, elem, attrs, controllers) {
|
|
var eventObject = isTouch() ? 'click' : 'mouseenter';
|
|
var ul = "";
|
|
var menuTitle;
|
|
elem.on('click', 'a', function (e) {
|
|
|
|
_this = $(this);
|
|
if (isSidebarClosed() && !isMobile() && !_this.closest("ul").hasClass("sub-menu"))
|
|
return;
|
|
|
|
_this.closest("ul").find(".open").not(".active").children("ul").not(_this.next()).slideUp(200).parent('.open').removeClass("open");
|
|
if (_this.next().is('ul') && _this.parent().toggleClass('open')) {
|
|
|
|
_this.next().slideToggle(200, function () {
|
|
$win.trigger("resize");
|
|
|
|
});
|
|
e.stopPropagation();
|
|
e.preventDefault();
|
|
} else {
|
|
$rootScope.toggle('sidebar', 'off');
|
|
|
|
}
|
|
});
|
|
elem.on(eventObject, 'a', function (e) {
|
|
if (!isSidebarClosed() || isMobile())
|
|
return;
|
|
_this = $(this);
|
|
|
|
if (!_this.parent().hasClass('hover') && !_this.closest("ul").hasClass("sub-menu")) {
|
|
wrapLeave();
|
|
_this.parent().addClass('hover');
|
|
menuTitle = _this.find(".item-inner").clone();
|
|
if (_this.parent().hasClass('active')) {
|
|
menuTitle.addClass("active");
|
|
}
|
|
var offset = $("#sidebar").position().top;
|
|
var itemTop = isSidebarFixed() ? _this.parent().position().top + offset : (_this.parent().position().top);
|
|
menuTitle.css({
|
|
position: isSidebarFixed() ? 'fixed' : 'absolute',
|
|
height: _this.outerHeight(),
|
|
top: itemTop
|
|
}).appendTo(wrap);
|
|
if (_this.next().is('ul')) {
|
|
ul = _this.next().clone(true);
|
|
|
|
ul.appendTo(wrap).css({
|
|
top: menuTitle.position().top + _this.outerHeight(),
|
|
position: isSidebarFixed() ? 'fixed' : 'absolute',
|
|
});
|
|
if (_this.parent().position().top + _this.outerHeight() + offset + ul.height() > $win.height() && isSidebarFixed()) {
|
|
ul.css('bottom', 0);
|
|
} else {
|
|
ul.css('bottom', 'auto');
|
|
}
|
|
|
|
wrap.children().first().scroll(function () {
|
|
if (isSidebarFixed())
|
|
wrapLeave();
|
|
});
|
|
|
|
setTimeout(function () {
|
|
|
|
if (!wrap.is(':empty')) {
|
|
$(document).on('click tap', wrapLeave);
|
|
}
|
|
}, 300);
|
|
|
|
} else {
|
|
ul = "";
|
|
return;
|
|
}
|
|
|
|
}
|
|
});
|
|
wrap.on('mouseleave', function (e) {
|
|
$(document).off('click tap', wrapLeave);
|
|
$('.hover', wrap).removeClass('hover');
|
|
$('> .item-inner', wrap).remove();
|
|
$('> ul', wrap).remove();
|
|
|
|
});
|
|
|
|
|
|
$rootScope
|
|
.$on('$locationChangeSuccess',
|
|
function () {
|
|
var newPath;
|
|
newPath = window.location.hash;
|
|
angular.forEach(elem.find('.main-navigation-menu a'), function (domLink) {
|
|
var link = angular.element(domLink);
|
|
var menu;
|
|
if (domLink.hash === newPath && (!isSidebarClosed() || isMobile())) {
|
|
|
|
if (link.closest("ul").hasClass("sub-menu")) {
|
|
menu = link.closest("ul");
|
|
var activeMenu = menu;
|
|
menu.slideDown(200).parent().siblings().children('.sub-menu').slideUp(200, function () {
|
|
$(this).parent().removeClass("open");
|
|
});
|
|
} else {
|
|
$('.sub-menu').slideUp(200, function () {
|
|
$(this).parent().removeClass("open");
|
|
});
|
|
}
|
|
|
|
}
|
|
activeMenu = null;
|
|
menu = null;
|
|
});
|
|
});
|
|
|
|
}
|
|
};
|
|
function wrapLeave() {
|
|
wrap.trigger('mouseleave');
|
|
}
|
|
function isTouch() {
|
|
return $html.hasClass('touch');
|
|
}
|
|
|
|
function isMobile() {
|
|
return $win.width() < mq.desktop;
|
|
}
|
|
|
|
function isSidebarClosed() {
|
|
return $('.app-sidebar-closed').length;
|
|
}
|
|
|
|
function isSidebarFixed() {
|
|
return $('.app-sidebar-fixed').length;
|
|
}
|
|
|
|
}]);
|