diff --git a/src/SideMenu.vue b/src/SideMenu.vue index b3b9cdd..b715f42 100644 --- a/src/SideMenu.vue +++ b/src/SideMenu.vue @@ -54,9 +54,17 @@ export default { for (let element of links) { let href = element.getAttribute('href') + var parent = element.parentNode - if (this.ignoreExternalSites && element.parentNode.getAttribute('data-id').indexOf('external_index') !== -1) { - continue; + if (!parent) { + continue + } + + var dataId = parent.getAttribute('data-id') + dataId = dataId !== null ? dataId : '' + + if (this.ignoreExternalSites && dataId.indexOf('external_index') !== -1) { + continue } if (href !== '#') { diff --git a/src/admin.js b/src/admin.js index 15be7bd..38c675a 100644 --- a/src/admin.js +++ b/src/admin.js @@ -30,7 +30,6 @@ const appConfig = (name, value, callbacks) => { OCP.AppConfig.setValue('side_menu', name, value, callbacks) } - const saveSettings = (key) => { const element = elements.get(key) const name = $(element).attr('name') diff --git a/templates/css/stylesheet.php b/templates/css/stylesheet.php index da86494..6311518 100644 --- a/templates/css/stylesheet.php +++ b/templates/css/stylesheet.php @@ -12,11 +12,16 @@ #appmenu { display: none; } + + #appmenu + nav { + display: none; + } + + .app-hidden { + opacity: 0; + } -#appmenu + nav { - display: none; -} #nextcloud { @@ -42,11 +47,6 @@ visibility: hidden; } - #side-menu.hide-opener .side-menu-apps-list { - /* height: calc(100vh); - top: 0; */ - } - #side-menu, .side-menu-apps-list { diff --git a/templates/js/script.php b/templates/js/script.php index 284c1da..2ce91ca 100644 --- a/templates/js/script.php +++ b/templates/js/script.php @@ -9,30 +9,6 @@ sideMenuContainer.attr('data-forcelighticon', '1') - - sideMenuContainer.attr('data-externalsitesintopmenu', '1') - - var externalSitesInTopMenu = function() { - var items = $('#appmenu').find('li') - - items.each(function(i, item) { - var dataId = item.getAttribute('data-id') - - if (dataId === null || dataId.indexOf('external_index') === -1) { - item.style.display = 'none' - item.classList.remove('hidden') - } else { - item.style.display = 'flex' - item.classList.add('hidden') - } - }) - } - - $(window).resize(externalSitesInTopMenu); - - setInterval(externalSitesInTopMenu, 500); - - body.on('side-menu.apps', function(e, apps) { sideMenu = $('#side-menu') @@ -93,4 +69,114 @@ sideMenuOpener.insertAfter('#nextcloud') + + + sideMenuContainer.attr('data-externalsitesintopmenu', '1') + + var updateTopMenu = function() { + var breakpointMobileWidth = 1024 + var menu = $('#appmenu') + var apps = menu.find('li') + var minAppsDesktop = 8 + var usePercentualAppMenuLimit = 0.9 + var isMobile = $(window).width() < breakpointMobileWidth + var lastShownApp = null + var appShown = [] + var moreApps = $('#more-apps') + var navigation = $('#navigation') + var navigationApps = $('#apps ul') + var appCount = null + + navigationApps.html('') + + apps.each(function(i, app) { + var dataId = app.getAttribute('data-id') + + if (dataId === null) { + return + } + + if (dataId.indexOf('external_index') === -1) { + app.classList.add('hidden') + app.classList.add('app-hidden') + } else { + app.classList.remove('hidden') + app.classList.add('app-external-site') + appShown.push(app) + navigationApps.append(app.outerHTML) + } + }) + + var rightHeaderWidth = $('.header-right').outerWidth() + var headerWidth = $('header').outerWidth() + var availableWidth = headerWidth - $('#nextcloud').outerWidth() - $('#header .side-menu-opener').outerWidth() - (rightHeaderWidth > 210 ? rightHeaderWidth : 210) + + if (!isMobile) { + availableWidth = availableWidth * usePercentualAppMenuLimit + } + + if (isMobile && appCount > minAppsDesktop) { + appCount = minAppsDesktop + } else if (!isMobile && appCount < minAppsDesktop) { + appCount = minAppsDesktop + } else { + appCount = Math.floor(availableWidth / $('#appmenu li').width()) + } + + if (appCount === 0) { + menu.addClass('hidden') + } + + menu.removeClass('hidden') + menu.css('opacity', 1) + + if (appShown.length - 1 - appCount >= 1) { + appCount-- + } + + moreApps.find('a').removeClass('active') + + var k = 0 + var notInHeader = 0 + var name + + $(appShown).each(function(i, app) { + app = $(app) + name = app.data('id') + + if (k < appCount && appCount > 0) { + app.removeClass('hidden') + lastShownApp = app + + $('#apps li[data-id=' + name + '].app-external-site').addClass('in-header') + } else { + app.addClass('hidden') + notInHeader++ + + $('#apps li[data-id=' + name + '].app-external-site').removeClass('in-header') + + if (appCount > 0 && app.children('a').hasClass('active')) { + lastShownApp.addClass('hidden') + app.removeClass('hidden') + notInHeader++ + + $('#apps li[data-id=' + name + '].app-external-site') + .removeClass('in-header') + .addClass('in-header') + } + } + + k++ + }) + + if (notInHeader === 0) { + moreApps.hide() + navigation.hide() + } else { + moreApps.show() + } + } + + setInterval(updateTopMenu, 50) + })();