Merge branch 'develop' into translations

This commit is contained in:
Simon Vieille
2023-11-05 18:40:51 +01:00
26 changed files with 386 additions and 92 deletions
+24 -8
View File
@@ -24,14 +24,14 @@
<nav class="app-menu show">
<ul
class="app-menu-main"
:class="{ 'app-menu-main__hidden-label': hiddenLabels }"
:class="{ 'app-menu-main__hidden-label': hiddenLabels === 1, 'app-menu-main__show-hovered': hiddenLabels === 2 }"
v-if="apps !== null"
>
<li v-for="app in mainAppList()"
:key="app.id"
:data-app-id="app.id"
class="app-menu-entry"
:class="{ 'app-menu-entry__active': app.active, 'app-menu-entry__hidden-label': hiddenLabels }"
:class="{ 'app-menu-entry__active': app.active, 'app-menu-entry__hidden-label': hiddenLabels === 1, 'app-menu-main__show-hovered': hiddenLabels === 2 }"
:style="makeStyle(app)"
>
<a :href="app.href"
@@ -69,7 +69,8 @@
<script>
import { loadState } from '@nextcloud/initial-state'
import { NcActions, NcActionLink } from '@nextcloud/vue'
import NcActions from '@nextcloud/vue/dist/Components/NcActions.js'
import NcActionLink from '@nextcloud/vue/dist/Components/NcActionLink.js'
export default {
name: 'AppMenu',
@@ -233,8 +234,8 @@ $header-icon-size: 20px;
overflow: hidden;
}
&:not(.app-menu-entry__hidden-label):hover,
&:not(.app-menu-entry__hidden-label):focus-within {
&:not(.app-menu-entry__hidden-label):not(.app-menu-entry__show-hovered):hover,
&:not(.app-menu-entry__hidden-label):not(.app-menu-entry__show-hovered):focus-within {
opacity: 1;
.app-menu-entry--label {
opacity: 1;
@@ -245,7 +246,6 @@ $header-icon-size: 20px;
overflow: visible;
}
}
}
// Show labels
@@ -256,8 +256,8 @@ $header-icon-size: 20px;
opacity: 1;
}
&:not(.app-menu-main__hidden-label):hover,
&:not(.app-menu-main__hidden-label):focus-within,
&:not(.app-menu-main__hidden-label):not(.app-menu-main__show-hovered):hover,
&:not(.app-menu-main__hidden-label):not(.app-menu-main__show-hovered):focus-within,
.app-menu-entry:not(.app-menu-entry__hidden-label):hover,
.app-menu-entry:not(.app-menu-entry__hidden-label):focus {
img {
@@ -273,6 +273,22 @@ $header-icon-size: 20px;
opacity: 0;
}
}
&.app-menu-main__show-hovered .app-menu-entry:hover,
&.app-menu-main__show-hovered .app-menu-entry:focus {
img {
margin-top: -6px;
}
.app-menu-entry--label {
opacity: 1;
bottom: 0;
}
&::before, .app-menu-entry::before {
opacity: 0;
}
}
}
::v-deep .app-menu-more .button-vue--vue-tertiary {
+32
View File
@@ -0,0 +1,32 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="side-menu-search">
<input type="text" :value="value" :placeholder="t('side_menu', 'Search')" @input="$emit('input', $event.target.value)">
</div>
</template>
<script>
export default {
name: 'AppSearch',
props: {
value: {
required: true
},
},
}
</script>
+2
View File
@@ -17,7 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<template>
<div class="side-menu-settings">
<a v-bind:href="href">
<!--
{{ label }}
-->
<span class="avatardiv avatardiv-shown">
<img v-bind:src="avatar" :alt="label">
+54 -24
View File
@@ -16,21 +16,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div id="side-menu">
<div class="side-menu-header">
<div class="side-menu-header" v-if="settings || !openerHover || (!avatar && !alwaysDisplayed && logo) || avatar">
<SettingsButton
v-if="settings"
v-bind:href="settings.href"
v-bind:label="settings.name"
v-bind:avatar="settings.avatar" />
<AppSearch v-model:search="search" />
<OpenerButton />
<Logo
v-if="!avatar && logo" v-bind:classes="{'side-menu-logo': true, 'avatardiv': false}"
v-if="!avatar && !alwaysDisplayed && logo" v-bind:classes="{'side-menu-logo': true, 'avatardiv': false}"
v-bind:image="logo"
v-bind:link="logoLink"
/>
<Logo
v-if="avatar" v-bind:classes="{'side-menu-logo': true, 'avatardiv': true}"
v-bind:image="avatar"
@@ -38,10 +36,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/>
</div>
<ul class="side-menu-apps-list">
<ul class="side-menu-apps-list" :class="{'side-menu-apps-list--with-settings': !!settings}">
<SideMenuApp
v-for="(app, key) in apps"
v-if="!hiddenApps.includes(app.id)"
v-if="!hiddenApps.includes(app.id) && searchMatch(app.name)"
v-bind:classes="{'side-menu-app': true, 'active': app.active}"
v-bind:key="key"
v-bind:icon="app.icon"
@@ -58,6 +56,7 @@ import axios from 'axios'
import OpenerButton from './OpenerButton'
import SettingsButton from './SettingsButton'
import SideMenuApp from './SideMenuApp'
import AppSearch from './AppSearch'
import Logo from './Logo'
import { loadState } from '@nextcloud/initial-state'
@@ -68,6 +67,7 @@ export default {
OpenerButton,
SideMenuApp,
Logo,
AppSearch,
},
data() {
return {
@@ -79,6 +79,9 @@ export default {
targetBlankApps: [],
hiddenApps: [],
settings: null,
openerHover: false,
alwaysDisplayed: false,
search: '',
}
},
methods: {
@@ -93,7 +96,11 @@ export default {
for (let id in ncApps) {
if (window.topMenuApps.includes(id) && !window.topSideMenuApps.includes(id)) {
continue;
continue
}
if (this.hiddenApps.includes(id)) {
continue
}
let app = ncApps[id]
@@ -104,10 +111,10 @@ export default {
finalApps.sort((a, b) => {
if (a.order === null || b.order === null) {
return a.name < b.name ? -1 : 1;
return a.name < b.name ? -1 : 1
}
return a.order < b.order ? -1 : 1;
return a.order < b.order ? -1 : 1
})
this.apps = finalApps
@@ -118,24 +125,47 @@ export default {
},
retrieveConfig() {
axios
.get(OC.generateUrl('/apps/side_menu/js/config'))
.then((response) => {
const config = response.data
},
this.targetBlankApps = config['target-blank-apps']
this.forceLightIcon = config['force-light-icon']
this.avatar = config['avatar']
this.logo = config['logo']
this.logoLink = config['logo-link']
this.settings = config['settings']
this.hiddenApps = config['big-menu-hidden-apps']
})
hasSearchMatch(apps) {
if (this.search.trim() === '') {
return true
}
for (let key in apps) {
if (this.searchMatch(apps[key].name)) {
return true
}
}
return false
},
searchMatch(name) {
if (this.search.trim() === '') {
return true
}
return name.toLowerCase().includes(this.search.toLowerCase())
},
},
mounted() {
this.retrieveConfig()
this.retrieveApps()
axios
.get(OC.generateUrl('/apps/side_menu/js/config'))
.then((response) => {
const config = response.data
this.targetBlankApps = config['target-blank-apps']
this.forceLightIcon = config['force-light-icon']
this.avatar = config['avatar']
this.logo = config['logo']
this.logoLink = config['logo-link']
this.settings = config['settings']
this.openerHover = config['opener-hover']
this.alwaysDisplayed = config['always-displayed']
this.hiddenApps = config['big-menu-hidden-apps']
this.retrieveApps()
})
}
}
</script>
+28 -3
View File
@@ -18,14 +18,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div id="side-menu" class="side-menu-big">
<div class="side-menu-header">
<CloserButton />
<SettingsButton
v-if="settings"
v-bind:href="settings.href"
v-bind:label="settings.name"
v-bind:avatar="settings.avatar"
/>
<AppSearch v-model:search="search" />
<OpenerButton />
</div>
@@ -33,12 +32,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div class="side-menu-categories">
<Loader v-if="!items.length" />
<div class="side-menu-category" v-for="(category, key) in items" v-bind:key="key">
<div class="side-menu-category" v-for="(category, key) in items" v-if="hasSearchMatch(category.apps)" v-bind:key="key">
<h2 class="side-menu-category-title" v-if="category.name != ''" v-text="category.name"></h2>
<ul class="side-menu-apps-list">
<SideMenuBigApp
v-for="(app, appId) in category.apps"
v-if="searchMatch(app.name)"
v-bind:key="appId"
v-bind:classes="{'side-menu-app': true, 'active': activeApp === appId}"
v-bind:icon="app.icon"
@@ -59,6 +59,7 @@ import OpenerButton from './OpenerButton'
import CloserButton from './CloserButton'
import SettingsButton from './SettingsButton'
import Loader from './Loader'
import AppSearch from './AppSearch'
import SideMenuBigApp from './SideMenuBigApp'
import { loadState } from '@nextcloud/initial-state'
@@ -70,6 +71,7 @@ export default {
CloserButton,
Loader,
SideMenuBigApp,
AppSearch,
},
data() {
return {
@@ -78,6 +80,7 @@ export default {
targetBlank: false,
targetBlankApps: [],
settings: null,
search: '',
}
},
methods: {
@@ -120,6 +123,28 @@ export default {
this.settings = config['settings']
})
},
hasSearchMatch(apps) {
if (this.search.trim() === '') {
return true
}
for (let key in apps) {
if (this.searchMatch(apps[key].name)) {
return true
}
}
return false
},
searchMatch(name) {
if (this.search.trim() === '') {
return true
}
return name.toLowerCase().includes(this.search.toLowerCase())
},
},
mounted() {
this.retrieveConfig()
+28 -2
View File
@@ -23,7 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
v-bind:label="settings.name"
v-bind:avatar="settings.avatar"
/>
<AppSearch v-model:search="search" />
<OpenerButton />
</div>
@@ -31,12 +31,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div class="side-menu-categories">
<Loader v-if="!items.length" />
<div class="side-menu-category" v-for="(category, key) in items" v-bind:key="key">
<div class="side-menu-category" v-for="(category, key) in items" v-if="hasSearchMatch(category.apps)" v-bind:key="key">
<h2 class="side-menu-category-title" v-if="category.name != ''" v-text="category.name"></h2>
<ul class="side-menu-apps-list">
<SideMenuBigApp
v-for="(app, appId) in category.apps"
v-if="searchMatch(app.name)"
v-bind:key="appId"
v-bind:classes="{'side-menu-app': true, 'active': activeApp === appId}"
v-bind:icon="app.icon"
@@ -56,6 +57,7 @@ import axios from 'axios'
import OpenerButton from './OpenerButton'
import SettingsButton from './SettingsButton'
import Loader from './Loader'
import AppSearch from './AppSearch'
import SideMenuBigApp from './SideMenuBigApp'
import { loadState } from '@nextcloud/initial-state'
@@ -66,6 +68,7 @@ export default {
OpenerButton,
Loader,
SideMenuBigApp,
AppSearch,
},
data() {
return {
@@ -74,6 +77,7 @@ export default {
targetBlank: false,
targetBlankApps: [],
settings: null,
search: '',
}
},
methods: {
@@ -116,6 +120,28 @@ export default {
this.settings = config['settings']
})
},
hasSearchMatch(apps) {
if (this.search.trim() === '') {
return true
}
for (let key in apps) {
if (this.searchMatch(apps[key].name)) {
return true
}
}
return false
},
searchMatch(name) {
if (this.search.trim() === '') {
return true
}
return name.toLowerCase().includes(this.search.toLowerCase())
},
},
mounted() {
this.retrieveConfig()
+2
View File
@@ -91,3 +91,5 @@
"Applications kept in the top menu but also shown in side menu": "Aplikace ponechané v horní nabídce ale také zobrazené v té boční"
"These applications must be selected in the previous option.": "Tyto aplikace je třeba vybrat v předchozí volbě."
"Hide labels on mouse over": "Skrýt popisky při najetím ukazatele myši"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
+2
View File
@@ -91,3 +91,5 @@
"Applications kept in the top menu but also shown in side menu": "Apps in der oberen Navigationsleiste, die auch im Seitenmenü angezeigt werden sollen"
"These applications must be selected in the previous option.": "Diese Apps müssen auch in der vorherigen Einstellung ausgewählt werden."
"Hide labels on mouse over": "Labels ausblenden, wenn sich die Maus darüber befindet (Hover)"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
+2
View File
@@ -91,3 +91,5 @@
"Applications kept in the top menu but also shown in side menu": "Las aplicaciones se mantienen en el menú superior pero también se muestran en el menú lateral"
"These applications must be selected in the previous option.": "Estas aplicaciones deben ser seleccionadas en las opciones anteriores."
"Hide labels on mouse over": "Ocultar las etiquetas al pasar el ratón"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
+2
View File
@@ -91,3 +91,5 @@
"Applications kept in the top menu but also shown in side menu": "Applications conservées dans le menu supérieur mais également affichées dans le menu latéral"
"These applications must be selected in the previous option.": "Ces applications doivent également être sélectionnées dans l'option précédente."
"Hide labels on mouse over": "Masquer le libellé des applications au passage de la souris"
"Except the hovered app": "À l'exception de l'application survolée"
"Search": "Rechercher"
+2
View File
@@ -91,3 +91,5 @@
"Applications kept in the top menu but also shown in side menu": "Applicaties blijven in het topmenu maar worden ook in het zijmenu getoond"
"These applications must be selected in the previous option.": "Deze toepassingen moeten bij de vorige optie zijn geselecteerd."
"Hide labels on mouse over": "Hide labels on mouse over"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
+2
View File
@@ -91,3 +91,5 @@
"Applications kept in the top menu but also shown in side menu": "Applications kept in the top menu but also shown in side menu"
"These applications must be selected in the previous option.": "These applications must be selected in the previous option."
"Hide labels on mouse over": "Скрыть название при наведении мыши"
"Except the hovered app": "Except the hovered app"
"Search": "Search"
+2
View File
@@ -93,3 +93,5 @@
"Applications kept in the top menu but also shown in side menu": ""
"These applications must be selected in the previous option.": ""
"Hide labels on mouse over": ""
"Except the hovered app": ""
"Search": ""
+2
View File
@@ -91,3 +91,5 @@
"Applications kept in the top menu but also shown in side menu": "Applications kept in the top menu but also shown in side menu"
"These applications must be selected in the previous option.": "These applications must be selected in the previous option."
"Hide labels on mouse over": "Hide labels on mouse over"
"Except the hovered app": "Except the hovered app"
"Search": "Search"