From f26adb6ac182439866ef1349c968079ffb0ae340 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Thu, 28 Oct 2021 13:50:16 +0200 Subject: [PATCH 01/15] remove jquery from components --- src/SideMenu.vue | 4 +++- src/SideMenuBig.vue | 4 +++- src/SideMenuWithCategories.vue | 4 +++- templates/js/script.php | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/SideMenu.vue b/src/SideMenu.vue index 68fcccb..908f84c 100644 --- a/src/SideMenu.vue +++ b/src/SideMenu.vue @@ -128,7 +128,9 @@ export default { (function(apps) { window.setTimeout(function() { - jQuery('body').trigger('side-menu.apps', [apps]) + document.querySelector('body').dispatchEvent(new CustomEvent('side-menu.apps', { + detail: {apps: apps}, + })); }, 1000) })(this.apps) }, diff --git a/src/SideMenuBig.vue b/src/SideMenuBig.vue index 9f6d8f2..31b9992 100644 --- a/src/SideMenuBig.vue +++ b/src/SideMenuBig.vue @@ -97,7 +97,9 @@ export default { } } - jQuery('body').trigger('side-menu.apps', [apps]) + document.querySelector('body').dispatchEvent(new CustomEvent('side-menu.apps', { + detail: {apps: apps}, + })); }); }, diff --git a/src/SideMenuWithCategories.vue b/src/SideMenuWithCategories.vue index 6b63689..0ba9c45 100644 --- a/src/SideMenuWithCategories.vue +++ b/src/SideMenuWithCategories.vue @@ -95,7 +95,9 @@ export default { } } - jQuery('body').trigger('side-menu.apps', [apps]) + document.querySelector('body').dispatchEvent(new CustomEvent('side-menu.apps', { + detail: {apps: apps}, + })); }); }, diff --git a/templates/js/script.php b/templates/js/script.php index cf4b2ce..1bf944b 100644 --- a/templates/js/script.php +++ b/templates/js/script.php @@ -28,7 +28,9 @@ if ($_['always-displayed']) { var targetBlankApps = ; - body.on('side-menu.apps', function(e, apps) { + document.querySelector('body').addEventListener('side-menu.apps', function(e) { + const apps = e.detail.apps; + sideMenu = jQuery('#side-menu') From cc7c9f6ed578dc9bc63c84c75f6278b48d043c39 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Thu, 28 Oct 2021 15:47:03 +0200 Subject: [PATCH 02/15] remove most of jquery --- src/SideMenu.js | 2 +- templates/js/_alwaysDisplayed.js | 20 ++++- templates/js/_loaderEnabled.js | 17 ++-- templates/js/script.php | 146 +++++++++++++++++++------------ 4 files changed, 115 insertions(+), 70 deletions(-) diff --git a/src/SideMenu.js b/src/SideMenu.js index 441d0a4..a9848c4 100644 --- a/src/SideMenu.js +++ b/src/SideMenu.js @@ -41,7 +41,7 @@ const mountSideMenuComponent = () => { sideMenu.$mount('#side-menu') - $('body').trigger('side-menu.ready') + document.querySelector('body').dispatchEvent(new CustomEvent('side-menu.ready')) } else { window.setTimeout(mountSideMenuComponent, 50) } diff --git a/templates/js/_alwaysDisplayed.js b/templates/js/_alwaysDisplayed.js index 2b58bc7..f56b2a2 100644 --- a/templates/js/_alwaysDisplayed.js +++ b/templates/js/_alwaysDisplayed.js @@ -1,5 +1,5 @@ var alwaysDisplayed = function() { - var elements = document.querySelectorAll('*'); + var elements = querySelectorAll('*') var fixedElements = [] for (var i in elements) { @@ -25,7 +25,21 @@ var alwaysDisplayed = function() { continue } - if (jQuery(element).parents('#side-menu').length) { + let elementIsInSideMenu = false + let parent = element.parentNode + + while (parent && !elementIsInSideMenu) { + try { + if (parent.getAttribute('id') === 'side-menu') { + elementIsInSideMenu = true + } + } catch (e) { + } + + parent = parent.parentNode + } + + if (elementIsInSideMenu) { continue } @@ -56,7 +70,7 @@ if (content && content.classList.contains('app-settings')) { } const observer = new MutationObserver(() => { if (loaded) { - return; + return } const element = content.querySelector('#app-category-your-apps') || content.querySelector('#app-navigation ul') diff --git a/templates/js/_loaderEnabled.js b/templates/js/_loaderEnabled.js index b391e4b..1d5ff4e 100644 --- a/templates/js/_loaderEnabled.js +++ b/templates/js/_loaderEnabled.js @@ -1,15 +1,14 @@ -var pageLoader = jQuery('
') -var pageLoaderBar = jQuery('
') +let pageLoader = createElement('div', {id: 'side-menu-loader'}) +let pageLoaderBar = createElement('div', {id: 'side-menu-loader-bar'}) -body.append(pageLoader) -pageLoader.append(pageLoaderBar) +pageLoader.appendChild(pageLoaderBar) +querySelector('body').appendChild(pageLoader) -var pageLoaderValue = 0 - -$(window).on('beforeunload', function() { - setInterval(function() { - pageLoaderBar.width(pageLoaderValue.toString() + '%') +let pageLoaderValue = 0 +window.addEventListener('beforeunload', () => { + setInterval(() => { + pageLoaderBar.style.width = pageLoaderValue.toString() + '%' pageLoaderValue = Math.min(pageLoaderValue + .2, 100) }, 25) }) diff --git a/templates/js/script.php b/templates/js/script.php index 1bf944b..e32af22 100644 --- a/templates/js/script.php +++ b/templates/js/script.php @@ -13,65 +13,94 @@ if ($_['always-displayed']) { ?> (function() { - var sideMenuContainer = jQuery('
') - var sideMenuOpener = jQuery('') - var sideMenu = jQuery('
') - var body = jQuery('body') - var html = jQuery('html') - var isTouchDevice = window.matchMedia("(pointer: coarse)").matches + 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 = - sideMenu.attr('data-bigmenu', '1') + sideMenu.setAttribute('data-bigmenu', '1') - sideMenu.attr('data-sidewithcategories', '1') + sideMenu.setAttribute('data-sidewithcategories', '1') - var targetBlankApps = ; - - document.querySelector('body').addEventListener('side-menu.apps', function(e) { + querySelector('body').addEventListener('side-menu.apps', (e) => { const apps = e.detail.apps; - sideMenu = jQuery('#side-menu') + const sideMenu = querySelector('#side-menu') if (apps.length === 0) { - sideMenu.removeClass('open') - sideMenu.addClass('hide') - sideMenuOpener.addClass('hide') + sideMenu.classList.remove('open') + sideMenu.classList.add('hide') + sideMenuOpener.classList.add('hide') } else { - sideMenu.removeClass('hide') - sideMenuOpener.removeClass('hide') + sideMenu.classList.remove('hide') + sideMenuOpener.classList.remove('hide') } if (apps.length === 0) { - html.removeClass('side-menu-always-displayed'); + html.classList.remove('side-menu-always-displayed') } else { - html.addClass('side-menu-always-displayed'); + html.classList.add('side-menu-always-displayed') } if (apps.length === 0) { - html.removeClass('side-menu-always-displayed'); + html.classList.remove('side-menu-always-displayed') } else { - html.addClass('side-menu-always-displayed'); + html.classList.add('side-menu-always-displayed') } }) - body.on('side-menu.ready', function() { - sideMenu = jQuery('#side-menu') + body.addEventListener('side-menu.ready', () => { + const sideMenu = querySelector('#side-menu') + const headerMenuOpener = querySelector('#header .side-menu-opener') + const sideMenuOpener = querySelector('#side-menu .side-menu-opener') - var headerMenuOpener = jQuery('#header .side-menu-opener') - var sideMenuOpener = jQuery('#side-menu .side-menu-opener') - - sideMenuFocus = function() { - var a = sideMenu.find('.side-menu-app.active a') + sideMenuFocus = () => { + let a = querySelector('.side-menu-app.active a', sideMenu) if (a.length === 0) { - a = sideMenu.find('.side-menu-app:first-child a') + a = querySelector('.side-menu-app:first-child a', sideMenu) } if (a.length > 0) { @@ -80,78 +109,81 @@ if ($_['always-displayed']) { } - var sideMenuMouseLeave = function() { - sideMenu - .removeClass('open') - .off('mouseleave', sideMenuMouseLeave) + const sideMenuMouseLeave = () => { + sideMenu.classList.remove('open') + sideMenu.removeEventListener('mouseleave', sideMenuMouseLeave) } - var sideMenuMouseEnter = function() { - sideMenu.on('mouseleave', sideMenuMouseLeave) + const sideMenuMouseEnter = () => { + sideMenu.addEventListener('mouseleave', sideMenuMouseLeave) } - var sideMenuOpenerMouseEnter = function() { - sideMenu - .addClass('open') - .on('mouseenter', sideMenuMouseEnter) + const sideMenuOpenerMouseEnter = () => { + sideMenu.classList.add('open') + sideMenu.addEventListener('mouseenter', sideMenuMouseEnter) sideMenuFocus() } if (!isTouchDevice) { - headerMenuOpener.on('mouseenter', sideMenuOpenerMouseEnter) + headerMenuOpener.addEventListener('mouseenter', sideMenuOpenerMouseEnter) - sideMenu.addClass('hide-opener') + sideMenu.classList.add('hide-opener') - sideMenu.on('mouseleave', sideMenuMouseLeave) - sideMenu.on('mouseenter', sideMenuOpenerMouseEnter) + sideMenu.addEventListener('mouseleave', sideMenuMouseLeave) + sideMenu.addEventListener('mouseenter', sideMenuOpenerMouseEnter) } - headerMenuOpener.on('click', function() { - sideMenu.addClass('open') - sideMenu.find('.side-menu-app.active a').focus() + headerMenuOpener.addEventListener('click', () => { + sideMenu.classList.add('open') + + const a = querySelector('.side-menu-app.active a', sideMenu) + + if (a.length) { + a.focus() + } }) - sideMenuOpener.on('click', function() { - sideMenu.toggleClass('open') + sideMenuOpener.addEventListener('click', () => { + sideMenu.classList.toggle('open') }) - sideMenuOpener.on('click', function() { - sideMenu.removeClass('open') + sideMenuOpener.addEventListener('click', () => { + sideMenu.classList.remove('open') }) - jQuery(document).keydown(function(e) { + document.addEventListener('keydown', (e) => { var key = e.key || e.keyCode if ((key === 'o' || key === 79) && e.ctrlKey === true) { e.preventDefault() - sideMenu.toggleClass('open') + sideMenu.classList.toggle('open') sideMenuFocus() } }) }) - body.append(sideMenuContainer) - sideMenuContainer.append(sideMenu) + body.appendChild(sideMenuContainer) + sideMenuContainer.appendChild(sideMenu) - sideMenuOpener.insertBefore('#nextcloud') + nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud) - sideMenuOpener.insertAfter('#nextcloud') + nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud.nextSibling) - var topMenuApps = ; + const topMenuApps = From a074d747c19cbc8a66a13fa0e7f088b05e0adeff Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 29 Oct 2021 11:14:27 +0200 Subject: [PATCH 03/15] remove most of jquery from top menu --- templates/js/_topMenuApps.js | 221 ++++++++++++++++++++--------------- templates/js/script.php | 26 +++-- 2 files changed, 142 insertions(+), 105 deletions(-) diff --git a/templates/js/_topMenuApps.js b/templates/js/_topMenuApps.js index 57b7088..589c464 100644 --- a/templates/js/_topMenuApps.js +++ b/templates/js/_topMenuApps.js @@ -1,32 +1,55 @@ -var menuCache = null +let 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 +const breakpointMobileWidth = 1024 +const usePercentualAppMenuLimit = 0.8 +const minAppsDesktop = 8 - var currentMenuCache = menu.html() + menu.next().html() +const handleMenuClick = (e, icon) => { + let element = e.target - if (currentMenuCache === menuCache) { + while (element.tagName !== 'LI') { + element = element.parentNode + } + + const a = querySelector('a', element) + + if (a.getAttribute('target') !== '_blank' && e.which === 1 && !e.ctrlKey && !e.metaKey) { + for (let tag of ['svg', 'div']) { + let el = querySelector(tag, element) + + if (el) { + el.remove() + } + } + + const loader = createElement('div', {'class': icon}) + + a.insertBefore(loader, querySelector('span', a)) + } +} + +const updateTopMenu = function() { + const isMobile = window.innerWidth < breakpointMobileWidth + const menu = querySelector('#appmenu') + const moreApps = querySelector('#more-apps') + const navigation = querySelector('#navigation') + const navigationApps = querySelector('#apps ul') + + let apps = querySelectorAll('li', menu) + let lastShownApp = null + let appShown = [] + + if ((menu.innerHTML + menu.nextSibling.innerHTML) === menuCache) { return } - navigationApps.html('') + navigationAppsHtml = '' - apps.each(function(i, app) { - var dataId = app.getAttribute('data-id') + for (let app of apps) { + const dataId = app.getAttribute('data-id') if (dataId === null) { - return + continue } if (topMenuApps.indexOf(dataId) === -1) { @@ -36,25 +59,28 @@ var updateTopMenu = function() { app.classList.remove('hidden') app.classList.add('app-external-site') appShown.push(app) - navigationApps.append(app.outerHTML) + + navigationAppsHtml = navigationAppsHtml + app.outerHTML } if (targetBlankApps.indexOf(dataId) !== -1) { - jQuery(app).children('a').attr('target', '_blank'); + querySelector('a', app).setAttribute('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()) + navigationApps.innerHTML = navigationAppsHtml + + const rightHeaderWidth = querySelector('.header-right').offsetWidth + const headerWidth = querySelector('header').offsetWidth + + let availableWidth = headerWidth + + availableWidth -= nextcloud.offsetWidth + availableWidth -= querySelector('#header .side-menu-opener').offsetWidth + availableWidth -= rightHeaderWidth > 230 ? rightHeaderWidth : 230 + availableWidth *= isMobile ? usePercentualAppMenuLimit : 1 + + let appCount = Math.floor(availableWidth / querySelector('#appmenu li:not(.hidden)').offsetWidth) if (isMobile && appCount > minAppsDesktop) { appCount = minAppsDesktop @@ -63,110 +89,117 @@ var updateTopMenu = function() { } if (appCount === 0) { - menu.addClass('hidden') + menu.classList.add('hidden') + } else { + menu.classList.remove('hidden') } - menu.removeClass('hidden') - menu.css('opacity', 1) + menu.style.opacity = 1 if (appShown.length - 1 - appCount >= 1) { appCount-- } - moreApps.find('a').removeClass('active') + for (let item of querySelectorAll('a', moreApps)) { + item.classList.remove('active') + } - var k = 0 - var notInHeader = 0 - var name + let k = 0 + let notInHeader = 0 - jQuery(appShown).each(function(i, app) { - app = jQuery(app) - name = app.data('id') + for (let app of appShown) { + const name = app.getAttribute('data-id') + const item = querySelector('#apps li[data-id=' + name + '].app-external-site') if (k < appCount && appCount > 0) { - app.removeClass('hidden') + app.classList.remove('hidden') lastShownApp = app - jQuery('#apps li[data-id=' + name + '].app-external-site').addClass('in-header') + item.classList.add('in-header') } else { - app.addClass('hidden') + app.classList.add('hidden') notInHeader++ - jQuery('#apps li[data-id=' + name + '].app-external-site').removeClass('in-header') + item.classList.remove('in-header') - if (appCount > 0 && app.children('a').hasClass('active')) { - lastShownApp.addClass('hidden') - app.removeClass('hidden') + const a = querySelector('a', app) + + if (appCount > 0 && a.classList.contains('active')) { + lastShownApp.classList.add('hidden') + app.classList.remove('hidden') notInHeader++ - jQuery('#apps li[data-id=' + name + '].app-external-site') - .removeClass('in-header') - .addClass('in-header') + item.classList.add('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) + // Hack for: + // - https://github.com/nextcloud/server/blob/master/core/src/components/MainMenu.js#L97-L119 + // - https://github.com/nextcloud/server/blob/master/core/src/components/MainMenu.js#L97-L119 + jQuery(menu).undelegate('li:not(#more-apps) > a', 'click') + jQuery(navigation).undelegate('a', 'click') - if (!a.is('a')) { - a = a.closest('a') + const confs = [ + { + items: querySelectorAll('#navigation li'), + icon: 'icon-loading-small' + }, + { + items: querySelectorAll('li:not(#more-apps)', menu), + icon: OCA.Theming && OCA.Theming.inverted ? 'icon-loading-small' : 'icon-loading-small-dark' + }, + ] + + for (let conf of confs) { + for (let item of conf.items) { + item.addEventListener('click', (e) => { + handleMenuClick(e, conf.icon) + }) } + } - 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' - )) + for (let app of querySelectorAll('#apps li.app-external-site')) { + const appId = app.getAttribute('data-id') - 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() + if (app.classList.contains('in-header')) { + for (let defs of querySelectorAll('svg defs', app)) { + defs.remove() + } } else { - var svg = app.find('svg'); + const svg = querySelector('svg', app) - if (svg.find('defs').length > 0) { + if (querySelectorAll('svg defs', app).length > 0) { return; } - var defs = ` + const defs = ` ` - svg.prepend(defs) - svg.find('image').attr('filter', `url(#invertMenuMore-${appId})`) + svg.innerHTML = defs + svg.innerHTML - var html = svg.get(0).innerHTML.replace(/fecolormatrix/g, 'feColorMatrix'); + for (let image of querySelectorAll('image', svg)) { + image.setAttribute('filter', `url(#invertMenuMore-${appId})`) + } - svg.html(html) + svg.innerHTML = svg.innerHTML.replace(/fecolormatrix/g, 'feColorMatrix') } - }) - - if (notInHeader === 0) { - moreApps.hide() - navigation.hide() - } else { - moreApps.show() } - menuCache = menu.html() + menu.next().html() + if (notInHeader === 0) { + moreApps.style.display = 'none' + navigation.style.display = 'none' + } else { + moreApps.style.display = 'flex' + } + + menuCache = menu.innerHTML + menu.nextSibling.innerHTML } -setInterval(updateTopMenu, 50) +setInterval(updateTopMenu, 1000) diff --git a/templates/js/script.php b/templates/js/script.php index e32af22..8f22477 100644 --- a/templates/js/script.php +++ b/templates/js/script.php @@ -94,11 +94,15 @@ if ($_['always-displayed']) { body.addEventListener('side-menu.ready', () => { const sideMenu = querySelector('#side-menu') const headerMenuOpener = querySelector('#header .side-menu-opener') - const sideMenuOpener = querySelector('#side-menu .side-menu-opener') + const sideMenuOpener = querySelectorAll('#side-menu .side-menu-opener') sideMenuFocus = () => { let a = querySelector('.side-menu-app.active a', sideMenu) + if (!a) { + return + } + if (a.length === 0) { a = querySelector('.side-menu-app:first-child a', sideMenu) } @@ -108,7 +112,7 @@ if ($_['always-displayed']) { } } - + const sideMenuMouseLeave = () => { sideMenu.classList.remove('open') sideMenu.removeEventListener('mouseleave', sideMenuMouseLeave) @@ -142,20 +146,20 @@ if ($_['always-displayed']) { const a = querySelector('.side-menu-app.active a', sideMenu) - if (a.length) { + if (a !== null) { a.focus() } }) - - sideMenuOpener.addEventListener('click', () => { - sideMenu.classList.toggle('open') + for (let opener of sideMenuOpener) { + opener.addEventListener('click', () => { + + sideMenu.classList.toggle('open') + + sideMenu.classList.remove('open') + }) - - sideMenuOpener.addEventListener('click', () => { - sideMenu.classList.remove('open') - }) - + } document.addEventListener('keydown', (e) => { var key = e.key || e.keyCode From 5d93d02960b1baffce6e5622d83808b3eccb7a1e Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 29 Oct 2021 11:24:01 +0200 Subject: [PATCH 04/15] refactoring of alwaysDisplayed function --- templates/js/_alwaysDisplayed.js | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/templates/js/_alwaysDisplayed.js b/templates/js/_alwaysDisplayed.js index f56b2a2..7a2a36b 100644 --- a/templates/js/_alwaysDisplayed.js +++ b/templates/js/_alwaysDisplayed.js @@ -1,21 +1,19 @@ -var alwaysDisplayed = function() { - var elements = querySelectorAll('*') - var fixedElements = [] - - for (var i in elements) { - var element = elements[i] +const alwaysDisplayed = function() { + const elements = querySelectorAll('*') + const fixedElements = [] + for (var element of elements) { if (typeof element !== 'object') { continue } - var position = window.getComputedStyle(element, null).getPropertyValue('position'); + const position = window.getComputedStyle(element, null).getPropertyValue('position'); if (position !== 'fixed') { continue } - var id = element.getAttribute('id') + const id = element.getAttribute('id') if (id === 'header' || id === 'side-menu' || id === 'side-menu-loader') { continue @@ -47,19 +45,19 @@ var alwaysDisplayed = function() { } for (var i in fixedElements) { - var element = fixedElements[i] - var computedStyle = window.getComputedStyle(element, null) - var left = computedStyle.getPropertyValue('left') - var right = computedStyle.getPropertyValue('right') + const element = fixedElements[i] + const computedStyle = window.getComputedStyle(element, null) + const left = computedStyle.getPropertyValue('left') + const right = computedStyle.getPropertyValue('right') if (right !== '0px') { - var intValue = parseInt(left.replace('px', '')) - element.style.setProperty('transform', 'translateX(' + (intValue + 50) + 'px)') + const intValue = parseInt(left.replace('px', '')) + 50 + element.style.setProperty('transform', 'translateX(' + intValue.toString() + 'px)') } } } -let content = document.getElementById('content') +const content = querySelector('#content') if (content && content.classList.contains('app-settings')) { let loaded = false From c2e6d24b95e16c420b5af38218bb081925a00b11 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 29 Oct 2021 11:27:45 +0200 Subject: [PATCH 05/15] remove ';' on endline --- src/SideMenu.vue | 6 +++--- src/SideMenuBig.vue | 6 +++--- src/SideMenuWithCategories.vue | 6 +++--- templates/js/_alwaysDisplayed.js | 2 +- templates/js/_topMenuApps.js | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/SideMenu.vue b/src/SideMenu.vue index 908f84c..7ab3cab 100644 --- a/src/SideMenu.vue +++ b/src/SideMenu.vue @@ -122,7 +122,7 @@ export default { name: trim(element.querySelector('span').innerHTML), icon: svg, active: element.classList.contains('active') - }); + }) } } @@ -130,7 +130,7 @@ export default { window.setTimeout(function() { document.querySelector('body').dispatchEvent(new CustomEvent('side-menu.apps', { detail: {apps: apps}, - })); + })) }, 1000) })(this.apps) }, @@ -149,7 +149,7 @@ export default { that.logo = config['logo'] that.logoLink = config['logo-link'] that.settings = config['settings'] - }); + }) }, }, mounted() { diff --git a/src/SideMenuBig.vue b/src/SideMenuBig.vue index 31b9992..72e6321 100644 --- a/src/SideMenuBig.vue +++ b/src/SideMenuBig.vue @@ -99,8 +99,8 @@ export default { document.querySelector('body').dispatchEvent(new CustomEvent('side-menu.apps', { detail: {apps: apps}, - })); - }); + })) + }) }, retrieveActiveApp() { @@ -118,7 +118,7 @@ export default { that.targetBlankApps = config['target-blank-apps'] that.settings = config['settings'] - }); + }) }, }, mounted() { diff --git a/src/SideMenuWithCategories.vue b/src/SideMenuWithCategories.vue index 0ba9c45..7accbf0 100644 --- a/src/SideMenuWithCategories.vue +++ b/src/SideMenuWithCategories.vue @@ -97,8 +97,8 @@ export default { document.querySelector('body').dispatchEvent(new CustomEvent('side-menu.apps', { detail: {apps: apps}, - })); - }); + })) + }) }, retrieveActiveApp() { @@ -116,7 +116,7 @@ export default { that.targetBlankApps = config['target-blank-apps'] that.settings = config['settings'] - }); + }) }, }, mounted() { diff --git a/templates/js/_alwaysDisplayed.js b/templates/js/_alwaysDisplayed.js index 7a2a36b..e37230a 100644 --- a/templates/js/_alwaysDisplayed.js +++ b/templates/js/_alwaysDisplayed.js @@ -7,7 +7,7 @@ const alwaysDisplayed = function() { continue } - const position = window.getComputedStyle(element, null).getPropertyValue('position'); + const position = window.getComputedStyle(element, null).getPropertyValue('position') if (position !== 'fixed') { continue diff --git a/templates/js/_topMenuApps.js b/templates/js/_topMenuApps.js index 589c464..9a6af72 100644 --- a/templates/js/_topMenuApps.js +++ b/templates/js/_topMenuApps.js @@ -144,11 +144,11 @@ const updateTopMenu = function() { const confs = [ { - items: querySelectorAll('#navigation li'), + items: querySelectorAll('#navigation li'), icon: 'icon-loading-small' }, { - items: querySelectorAll('li:not(#more-apps)', menu), + items: querySelectorAll('li:not(#more-apps)', menu), icon: OCA.Theming && OCA.Theming.inverted ? 'icon-loading-small' : 'icon-loading-small-dark' }, ] @@ -172,7 +172,7 @@ const updateTopMenu = function() { const svg = querySelector('svg', app) if (querySelectorAll('svg defs', app).length > 0) { - return; + return } const defs = ` From 6f0c4e98e0c72d1b01de1c6e1fcd0d03baeffb5a Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 29 Oct 2021 13:56:48 +0200 Subject: [PATCH 06/15] fix top menu generation; fix issue #66 by removing usage of setInterval --- templates/js/_topMenuApps.js | 40 +++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/templates/js/_topMenuApps.js b/templates/js/_topMenuApps.js index 9a6af72..188382f 100644 --- a/templates/js/_topMenuApps.js +++ b/templates/js/_topMenuApps.js @@ -1,4 +1,6 @@ let menuCache = null +let updateTopMenuIsRunning = false +let forceUpdateTopMenu = false const breakpointMobileWidth = 1024 const usePercentualAppMenuLimit = 0.8 @@ -58,6 +60,7 @@ const updateTopMenu = function() { } else { app.classList.remove('hidden') app.classList.add('app-external-site') + appShown.push(app) navigationAppsHtml = navigationAppsHtml + app.outerHTML @@ -66,6 +69,7 @@ const updateTopMenu = function() { if (targetBlankApps.indexOf(dataId) !== -1) { querySelector('a', app).setAttribute('target', '_blank') } + } navigationApps.innerHTML = navigationAppsHtml @@ -88,12 +92,6 @@ const updateTopMenu = function() { appCount = minAppsDesktop } - if (appCount === 0) { - menu.classList.add('hidden') - } else { - menu.classList.remove('hidden') - } - menu.style.opacity = 1 if (appShown.length - 1 - appCount >= 1) { @@ -107,20 +105,21 @@ const updateTopMenu = function() { let k = 0 let notInHeader = 0 + for (let app of appShown) { const name = app.getAttribute('data-id') - const item = querySelector('#apps li[data-id=' + name + '].app-external-site') + const li = querySelector('#apps li[data-id=' + name + '].app-external-site') if (k < appCount && appCount > 0) { app.classList.remove('hidden') - lastShownApp = app + li.classList.add('in-header') - item.classList.add('in-header') + lastShownApp = app } else { app.classList.add('hidden') - notInHeader++ + li.classList.remove('in-header') - item.classList.remove('in-header') + notInHeader++ const a = querySelector('a', app) @@ -129,7 +128,7 @@ const updateTopMenu = function() { app.classList.remove('hidden') notInHeader++ - item.classList.add('in-header') + li.classList.add('in-header') } } @@ -172,7 +171,7 @@ const updateTopMenu = function() { const svg = querySelector('svg', app) if (querySelectorAll('svg defs', app).length > 0) { - return + continue } const defs = ` @@ -202,4 +201,17 @@ const updateTopMenu = function() { menuCache = menu.innerHTML + menu.nextSibling.innerHTML } -setInterval(updateTopMenu, 1000) + +for (let timeout of [300, 500, 700]) { + setTimeout(updateTopMenu, timeout) +} + +let resizeTimeout = null; + +window.addEventListener('resize', () => { + if (resizeTimeout !== null) { + clearTimeout(resizeTimeout) + } + + resizeTimeout = setTimeout(updateTopMenu, 100) +}) From 96ffdf93ea099f44cc187c6a39bd6533f1a2b26e Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Fri, 29 Oct 2021 15:30:22 +0200 Subject: [PATCH 07/15] remove useless vars --- templates/js/_topMenuApps.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/templates/js/_topMenuApps.js b/templates/js/_topMenuApps.js index 188382f..92658a2 100644 --- a/templates/js/_topMenuApps.js +++ b/templates/js/_topMenuApps.js @@ -1,6 +1,4 @@ let menuCache = null -let updateTopMenuIsRunning = false -let forceUpdateTopMenu = false const breakpointMobileWidth = 1024 const usePercentualAppMenuLimit = 0.8 From d1faf881daa8c49ef1e292d5b0a25a0015be1392 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Sun, 31 Oct 2021 16:54:16 +0100 Subject: [PATCH 08/15] add timeout --- templates/js/_topMenuApps.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/js/_topMenuApps.js b/templates/js/_topMenuApps.js index 92658a2..dee32c8 100644 --- a/templates/js/_topMenuApps.js +++ b/templates/js/_topMenuApps.js @@ -199,8 +199,7 @@ const updateTopMenu = function() { menuCache = menu.innerHTML + menu.nextSibling.innerHTML } - -for (let timeout of [300, 500, 700]) { +for (let timeout of [300, 500, 700, 900, 1100]) { setTimeout(updateTopMenu, timeout) } From 7471e93847ef72235bc82c18c8bdf7fad282b6d5 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Sun, 31 Oct 2021 16:55:04 +0100 Subject: [PATCH 09/15] fix null setting update --- templates/settings/admin-form.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/settings/admin-form.php b/templates/settings/admin-form.php index 0f2e509..30fc3a9 100644 --- a/templates/settings/admin-form.php +++ b/templates/settings/admin-form.php @@ -799,7 +799,7 @@ $choicesSizes = [ 🖱️ t('Show and hide the list of categories')); ?> -