var menuCache = null var updateTopMenu = function() { var breakpointMobileWidth = 1024 var menu = jQuery('#appmenu') var apps = menu.find('li') var minAppsDesktop = 8 var usePercentualAppMenuLimit = 0.8 var isMobile = jQuery(window).width() < breakpointMobileWidth var lastShownApp = null var appShown = [] var moreApps = jQuery('#more-apps') var navigation = jQuery('#navigation') var navigationApps = jQuery('#apps ul') var appCount = null var currentMenuCache = menu.html() + menu.next().html() if (currentMenuCache === menuCache) { return } navigationApps.html('') apps.each(function(i, app) { var dataId = app.getAttribute('data-id') if (dataId === null) { return } if (topMenuApps.indexOf(dataId) === -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) } if (targetBlankApps.indexOf(dataId) !== -1) { jQuery(app).children('a').attr('target', '_blank'); } }) var rightHeaderWidth = jQuery('.header-right').outerWidth() var headerWidth = jQuery('header').outerWidth() var availableWidth = headerWidth - jQuery('#nextcloud').outerWidth() - jQuery('#header .side-menu-opener').outerWidth() - (rightHeaderWidth > 230 ? rightHeaderWidth : 230) if (!isMobile) { availableWidth = availableWidth * usePercentualAppMenuLimit } appCount = Math.floor(availableWidth / jQuery('#appmenu li').width()) if (isMobile && appCount > minAppsDesktop) { appCount = minAppsDesktop } else if (!isMobile && appCount < minAppsDesktop) { appCount = minAppsDesktop } 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 jQuery(appShown).each(function(i, app) { app = jQuery(app) name = app.data('id') if (k < appCount && appCount > 0) { app.removeClass('hidden') lastShownApp = app jQuery('#apps li[data-id=' + name + '].app-external-site').addClass('in-header') } else { app.addClass('hidden') notInHeader++ jQuery('#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++ jQuery('#apps li[data-id=' + name + '].app-external-site') .removeClass('in-header') .addClass('in-header') } } k++ }) // Hack for https://github.com/nextcloud/server/blob/23b0b63c213f5b31eecae817ffd4a9e26f6624d0/core/src/components/MainMenu.js#L74-L96 menu.undelegate('li:not(#more-apps) > a', 'click') menu.delegate('li:not(#more-apps) > a', 'click', function(e) { var a = $(e.target) if (!a.is('a')) { a = a.closest('a') } if (a.attr('target') !== '_blank' && e.which === 1 && !e.ctrlKey && !e.metaKey && a.parent('#more-apps').length === 0) { a.find('svg').remove() a.find('div').remove() a.prepend(jQuery('
').addClass( OCA.Theming && OCA.Theming.inverted ? 'icon-loading-small' : 'icon-loading-small-dark' )) window.location.href = a.attr('href') } }) jQuery('#apps li.app-external-site').each(function(i, app) { app = jQuery(app) var appId = app.attr('data-id') if (app.hasClass('in-header')) { app.find('svg').find('defs').remove() } else { var svg = app.find('svg'); if (svg.find('defs').length > 0) { return; } var defs = ` ` svg.prepend(defs) svg.find('image').attr('filter', `url(#invertMenuMore-${appId})`) var html = svg.get(0).innerHTML.replace(/fecolormatrix/g, 'feColorMatrix'); svg.html(html) } }) if (notInHeader === 0) { moreApps.hide() navigation.hide() } else { moreApps.show() } menuCache = menu.html() + menu.next().html() } setInterval(updateTopMenu, 50)