side_menu/templates/js/script.php

199 lines
6.2 KiB
PHP
Raw Normal View History

<?php
$display = 'default';
if ($_['always-displayed']) {
$display = 'always-displayed';
} elseif ($_['big-menu']) {
$display = 'big-menu';
} elseif ($_['side-with-categories']) {
$display = 'side-with-categories';
}
?>
2020-04-17 13:57:23 +02:00
(function() {
2021-10-28 15:47:03 +02:00
const querySelector = function(selector, element) {
if (element) {
return element.querySelector(selector)
}
return document.querySelector(selector)
}
const querySelectorAll = function(selector, element) {
if (element) {
return element.querySelectorAll(selector)
}
return document.querySelectorAll(selector)
}
const createElement = function(tagName, attributes) {
const element = document.createElement(tagName)
if (typeof attributes === 'object') {
for (let i in attributes) {
element.setAttribute(i, attributes[i])
}
}
return element
}
const sideMenuContainer = createElement('div', {id: 'side-menu-container'})
const sideMenuOpener = createElement('button', {'class': 'side-menu-opener'})
const sideMenu = createElement('div', {id: 'side-menu'})
const body = querySelector('body')
const html = querySelector('html')
const nextcloud = querySelector('#nextcloud')
const isTouchDevice = window.matchMedia("(pointer: coarse)").matches
const targetBlankApps = <?php echo json_encode($_['target-blank-apps']) ?>
2020-04-17 13:57:23 +02:00
<?php if ($display === 'big-menu'): ?>
2021-10-28 15:47:03 +02:00
sideMenu.setAttribute('data-bigmenu', '1')
<?php elseif ($display === 'side-with-categories'): ?>
2021-10-28 15:47:03 +02:00
sideMenu.setAttribute('data-sidewithcategories', '1')
2020-08-06 15:00:59 +02:00
<?php endif; ?>
2021-10-28 15:47:03 +02:00
querySelector('body').addEventListener('side-menu.apps', (e) => {
2021-10-28 13:50:16 +02:00
const apps = e.detail.apps;
<?php if ($_['hide-when-no-apps']): ?>
2021-10-28 15:47:03 +02:00
const sideMenu = querySelector('#side-menu')
2020-04-26 21:36:54 +02:00
if (apps.length === 0) {
2021-10-28 15:47:03 +02:00
sideMenu.classList.remove('open')
sideMenu.classList.add('hide')
sideMenuOpener.classList.add('hide')
} else {
2021-10-28 15:47:03 +02:00
sideMenu.classList.remove('hide')
sideMenuOpener.classList.remove('hide')
}
<?php if ($display === 'always-displayed'): ?>
if (apps.length === 0) {
2021-10-28 15:47:03 +02:00
html.classList.remove('side-menu-always-displayed')
2020-09-03 10:31:11 +02:00
} else {
2021-10-28 15:47:03 +02:00
html.classList.add('side-menu-always-displayed')
2020-09-03 10:31:11 +02:00
}
<?php endif; ?>
<?php else: ?>
<?php if ($display === 'always-displayed'): ?>
2020-09-03 10:31:11 +02:00
if (apps.length === 0) {
2021-10-28 15:47:03 +02:00
html.classList.remove('side-menu-always-displayed')
} else {
2021-10-28 15:47:03 +02:00
html.classList.add('side-menu-always-displayed')
}
<?php endif; ?>
<?php endif; ?>
2020-04-26 21:36:54 +02:00
})
2021-10-28 15:47:03 +02:00
body.addEventListener('side-menu.ready', () => {
const sideMenu = querySelector('#side-menu')
const headerMenuOpener = querySelector('#header .side-menu-opener')
2021-10-29 11:14:27 +02:00
const sideMenuOpener = querySelectorAll('#side-menu .side-menu-opener')
2020-04-17 13:57:23 +02:00
2021-10-28 15:47:03 +02:00
sideMenuFocus = () => {
let a = querySelector('.side-menu-app.active a', sideMenu)
2021-10-29 11:14:27 +02:00
if (!a) {
return
}
if (a.length === 0) {
2021-10-28 15:47:03 +02:00
a = querySelector('.side-menu-app:first-child a', sideMenu)
}
if (a.length > 0) {
a.focus()
}
}
2021-10-29 11:14:27 +02:00
<?php if ($_['opener-hover']): ?>
2021-10-28 15:47:03 +02:00
const sideMenuMouseLeave = () => {
sideMenu.classList.remove('open')
sideMenu.removeEventListener('mouseleave', sideMenuMouseLeave)
2020-04-17 13:57:23 +02:00
}
2021-10-28 15:47:03 +02:00
const sideMenuMouseEnter = () => {
sideMenu.addEventListener('mouseleave', sideMenuMouseLeave)
2020-04-17 13:57:23 +02:00
}
2021-10-28 15:47:03 +02:00
const sideMenuOpenerMouseEnter = () => {
sideMenu.classList.add('open')
sideMenu.addEventListener('mouseenter', sideMenuMouseEnter)
sideMenuFocus()
2020-04-17 13:57:23 +02:00
}
if (!isTouchDevice) {
2020-09-14 14:40:14 +02:00
<?php if ($_['opener-hover']): ?>
2021-10-28 15:47:03 +02:00
headerMenuOpener.addEventListener('mouseenter', sideMenuOpenerMouseEnter)
2020-09-14 14:40:14 +02:00
2021-10-28 15:47:03 +02:00
sideMenu.classList.add('hide-opener')
2020-09-14 14:40:14 +02:00
<?php endif ?>
2021-10-28 15:47:03 +02:00
sideMenu.addEventListener('mouseleave', sideMenuMouseLeave)
sideMenu.addEventListener('mouseenter', sideMenuOpenerMouseEnter)
2020-04-17 13:57:23 +02:00
}
<?php endif; ?>
2021-10-28 15:47:03 +02:00
headerMenuOpener.addEventListener('click', () => {
sideMenu.classList.add('open')
const a = querySelector('.side-menu-app.active a', sideMenu)
2021-10-29 11:14:27 +02:00
if (a !== null) {
2021-10-28 15:47:03 +02:00
a.focus()
}
2020-04-17 13:57:23 +02:00
})
2021-10-29 11:14:27 +02:00
for (let opener of sideMenuOpener) {
opener.addEventListener('click', () => {
<?php if ($display === 'always-displayed'): ?>
sideMenu.classList.toggle('open')
<?php else: ?>
sideMenu.classList.remove('open')
<?php endif; ?>
})
2021-10-29 11:14:27 +02:00
}
2021-10-28 15:47:03 +02:00
document.addEventListener('keydown', (e) => {
var key = e.key || e.keyCode
if ((key === 'o' || key === 79) && e.ctrlKey === true) {
e.preventDefault()
2021-10-28 15:47:03 +02:00
sideMenu.classList.toggle('open')
sideMenuFocus()
}
2020-04-17 13:57:23 +02:00
})
})
2021-10-28 15:47:03 +02:00
body.appendChild(sideMenuContainer)
sideMenuContainer.appendChild(sideMenu)
2020-05-19 15:17:54 +02:00
<?php if ($_['loader-enabled'] === true): ?>
2020-08-04 09:15:16 +02:00
<?php require_once __DIR__.'/_loaderEnabled.js'; ?>
2020-05-19 15:17:54 +02:00
<?php endif; ?>
<?php if ($_['opener-position'] === 'before'): ?>
2021-10-28 15:47:03 +02:00
nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud)
<?php else: ?>
2021-10-28 15:47:03 +02:00
nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud.nextSibling)
<?php endif; ?>
<?php if (!empty($_['top-menu-apps'])): ?>
2021-10-28 15:47:03 +02:00
const topMenuApps = <?php echo json_encode($_['top-menu-apps']); ?>
<?php require_once __DIR__.'/_topMenuApps.js'; ?>
<?php endif; ?>
2020-09-02 19:09:37 +02:00
<?php if ($display === 'always-displayed'): ?>
<?php require_once __DIR__.'/_alwaysDisplayed.js'; ?>
<?php endif; ?>
2020-04-17 13:57:23 +02:00
})();