refactor asidenav js util

This commit is contained in:
Felix Hamann 2019-04-10 20:01:56 +02:00
parent 346067ccdd
commit 796cddf21e
4 changed files with 60 additions and 19 deletions

View File

@ -1069,8 +1069,8 @@ siteLayout' headingOverride widget = do
addScript $ StaticR js_services_httpClient_js addScript $ StaticR js_services_httpClient_js
addScript $ StaticR js_services_i18n_js addScript $ StaticR js_services_i18n_js
-- addScript $ StaticR js_utils_alerts_js -- addScript $ StaticR js_utils_alerts_js
-- addScript $ StaticR js_utils_asidenav_js
-- JavaScript utils -- JavaScript utils
addScript $ StaticR js_utils_asidenav_js
addScript $ StaticR js_utils_asyncForm_js addScript $ StaticR js_utils_asyncForm_js
addScript $ StaticR js_utils_asyncTable_js addScript $ StaticR js_utils_asyncTable_js
addScript $ StaticR js_utils_checkAll_js addScript $ StaticR js_utils_checkAll_js

View File

@ -1,31 +1,74 @@
(function() { (function() {
'use strict'; 'use strict';
window.utils = window.utils || {}; /**
*
* Asidenav Utility
* Correctly positions hovered asidenav submenus and handles the favorites button on mobile
*
* Attribute: uw-asidenav
*
* Example usage:
* <div uw-asidenav>
* <div .asidenav>
* <div .asidenav__box>
* <ul .asidenav__list.list--iconless>
* <li .asidenav__list-item>
* <a .asidenav__link-wrapper href="#">
* <div .asidenav__link-shorthand>EIP
* <div .asidenav__link-label>Einführung in die Programmierung
* <div .asidenav__nested-list-wrapper>
* <ul .asidenav__nested-list.list--iconless>
* Übungsblätter
* ...
*
*/
var ASIDENAV_UTIL_NAME = 'asidenav';
var ASIDENAV_UTIL_SELECTOR = '[uw-asidenav]';
var FAVORITES_BTN_CLASS = 'navbar__list-item--favorite'; var FAVORITES_BTN_CLASS = 'navbar__list-item--favorite';
var FAVORITES_BTN_ACTIVE_CLASS = 'navbar__list-item--active'; var FAVORITES_BTN_ACTIVE_CLASS = 'navbar__list-item--active';
var ASIDENAV_INITIALIZED_CLASS = 'asidenav--initialized';
var ASIDENAV_EXPANDED_CLASS = 'main__aside--expanded'; var ASIDENAV_EXPANDED_CLASS = 'main__aside--expanded';
var ASIDENAV_LIST_ITEM_CLASS = 'asidenav__list-item'; var ASIDENAV_LIST_ITEM_CLASS = 'asidenav__list-item';
var ASIDENAV_SUBMENU_CLASS = 'asidenav__nested-list-wrapper'; var ASIDENAV_SUBMENU_CLASS = 'asidenav__nested-list-wrapper';
window.utils.aside = function(asideEl) { var asidenavUtil = function(element) {
if (!asideEl) { function init() {
throw new Error('asideEl not defined'); if (!element) {
throw new Error('Asidenav utility cannot be setup without an element!');
}
if (element.classList.contains(ASIDENAV_INITIALIZED_CLASS)) {
return false;
}
initFavoritesButton();
initAsidenavSubmenus();
// mark initialized
element.classList.add(ASIDENAV_INITIALIZED_CLASS);
return {
name: ASIDENAV_UTIL_NAME,
element: element,
destroy: function() {},
};
} }
function initFavoritesButton() { function initFavoritesButton() {
var favoritesBtn = document.querySelector('.' + FAVORITES_BTN_CLASS); var favoritesBtn = document.querySelector('.' + FAVORITES_BTN_CLASS);
favoritesBtn.addEventListener('click', function(event) { favoritesBtn.addEventListener('click', function(event) {
favoritesBtn.classList.toggle(FAVORITES_BTN_ACTIVE_CLASS); favoritesBtn.classList.toggle(FAVORITES_BTN_ACTIVE_CLASS);
asideEl.classList.toggle(ASIDENAV_EXPANDED_CLASS); element.classList.toggle(ASIDENAV_EXPANDED_CLASS);
event.preventDefault(); event.preventDefault();
}, true); }, true);
} }
function initAsidenavSubmenus() { function initAsidenavSubmenus() {
var asidenavLinksWithSubmenus = Array.from(asideEl.querySelectorAll('.' + ASIDENAV_LIST_ITEM_CLASS)) var asidenavLinksWithSubmenus = Array.from(element.querySelectorAll('.' + ASIDENAV_LIST_ITEM_CLASS))
.map(function(listItem) { .map(function(listItem) {
var submenu = listItem.querySelector('.' + ASIDENAV_SUBMENU_CLASS); var submenu = listItem.querySelector('.' + ASIDENAV_SUBMENU_CLASS);
return { listItem, submenu }; return { listItem, submenu };
@ -53,12 +96,14 @@
}; };
} }
initFavoritesButton(); return init();
initAsidenavSubmenus();
return {
scope: asideEl,
destroy: function() {},
};
}; };
if (UtilRegistry) {
UtilRegistry.register({
name: ASIDENAV_UTIL_NAME,
selector: ASIDENAV_UTIL_SELECTOR,
setup: asidenavUtil,
});
}
})(); })();

View File

@ -1,5 +1,5 @@
$newline never $newline never
<aside .main__aside> <aside .main__aside uw-asidenav>
<div .asidenav__logo> <div .asidenav__logo>
<a href="/" .asidenav__logo-link> <a href="/" .asidenav__logo-link>
<span .asidenav__logo-link-item.asidenav__logo-lmu>LMU <span .asidenav__logo-link-item.asidenav__logo-lmu>LMU

View File

@ -1,4 +0,0 @@
document.addEventListener('DOMContentLoaded', function() {
var asidenavEl = document.querySelector('.main__aside');
window.utils.setup('aside', asidenavEl);
});