147 lines
4 KiB
JavaScript
147 lines
4 KiB
JavaScript
var menuCache = null
|
|
|
|
var updateTopMenu = function() {
|
|
var breakpointMobileWidth = 1024
|
|
var menu = $('#appmenu')
|
|
var apps = menu.find('li')
|
|
var minAppsDesktop = 8
|
|
var usePercentualAppMenuLimit = 0.8
|
|
var isMobile = $(window).width() < breakpointMobileWidth
|
|
var lastShownApp = null
|
|
var appShown = []
|
|
var moreApps = $('#more-apps')
|
|
var navigation = $('#navigation')
|
|
var navigationApps = $('#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)
|
|
}
|
|
})
|
|
|
|
var rightHeaderWidth = $('.header-right').outerWidth()
|
|
var headerWidth = $('header').outerWidth()
|
|
var availableWidth = headerWidth - $('#nextcloud').outerWidth()
|
|
- $('#header .side-menu-opener').outerWidth()
|
|
- (rightHeaderWidth > 230 ? rightHeaderWidth : 230)
|
|
|
|
if (!isMobile) {
|
|
availableWidth = availableWidth * usePercentualAppMenuLimit
|
|
}
|
|
|
|
appCount = Math.floor(availableWidth / $('#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
|
|
|
|
$(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++
|
|
})
|
|
|
|
$('#apps li.app-external-site').each(function(i, app) {
|
|
app = $(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 = `
|
|
<defs>
|
|
<filter id="invertMenuMore-${appId}">
|
|
<feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"></feColorMatrix>
|
|
</filter>
|
|
</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)
|