forked from deblan/side_menu
Compare commits
64 commits
translatio
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| d2421f90bf | |||
|
|
0ea5a579a6 |
||
| b9c3543c61 | |||
|
|
49979c858b |
||
| b16da36507 | |||
|
|
def1ec4aa7 |
||
|
|
40441a61ae |
||
| ea3820904c | |||
| dad7d8a964 | |||
|
|
32f1869828 |
||
|
|
dd9fbcb654 |
||
|
|
a96e6e3c70 |
||
| 29f0ead9cc | |||
|
|
a5effe1fd3 |
||
|
|
13b6ae23c2 |
||
| 79ddb5fa47 | |||
|
|
1454dbba4d |
||
|
|
ee8ca7134c |
||
|
|
93fef37033 |
||
| e1567b0689 | |||
|
|
135f27cc32 |
||
| c5e1a8d37b | |||
|
|
27f8888a90 |
||
|
|
6583883e2d |
||
|
|
0a556670b1 |
||
| aa139bc671 | |||
|
|
b9264d7e05 |
||
| 88c14b6aec | |||
| 2be53211b8 | |||
|
|
dca727c120 |
||
|
|
361badff6b |
||
|
|
917288eb54 |
||
| b133ba3a97 | |||
| 2ff4fee927 | |||
|
|
b65c0c650a |
||
| 22335700ce | |||
|
|
7ab2816bd9 |
||
| 396d3cfbc5 | |||
|
|
66e4d2989a |
||
|
|
9ccd11b6dc |
||
| aaf2bb55db | |||
| a7ec95da7c | |||
|
|
42043c5390 |
||
|
|
019f79d45f |
||
|
|
3a80215657 |
||
|
|
7d0b55243e |
||
|
|
097ccc9dc9 |
||
|
|
7227f59dab |
||
|
|
3a51e6ecd5 |
||
|
|
112e669723 |
||
|
|
fc5a6a4c64 |
||
|
|
02afac5267 |
||
|
|
1eb392834c |
||
| 749f25a231 | |||
|
|
5df389dd42 |
||
| 04026f5c75 | |||
| 48b2b30406 | |||
| 22e5445330 | |||
| 0544fd3765 | |||
| 2635dd89ca | |||
| aa203bb406 | |||
| 368c59a2bd | |||
| ab7b1e96fe | |||
| f4322a8d71 |
19 changed files with 188 additions and 73 deletions
|
|
@ -1,47 +1,78 @@
|
|||
pipeline:
|
||||
dependencies:
|
||||
image: gitnet.fr/deblan/devenv
|
||||
image: node:16
|
||||
pull: true
|
||||
commands:
|
||||
- make dep
|
||||
- npm i
|
||||
when:
|
||||
event: [tag, push, pull_request]
|
||||
branch: [master, develop, feature/*, translations]
|
||||
branch: [master, develop, feature/*, fix/*, translations]
|
||||
|
||||
osv_detector:
|
||||
image: gitnet.fr/deblan/docker-osv-detector:v0.9
|
||||
osv-detector:
|
||||
image: gitnet.fr/deblan/osv-detector:v0.10
|
||||
commands:
|
||||
- osv-detector package-lock.json
|
||||
failure: ignore
|
||||
|
||||
build:
|
||||
image: gitnet.fr/deblan/devenv
|
||||
build-js:
|
||||
image: node:16
|
||||
commands:
|
||||
- make build
|
||||
- npm run build
|
||||
when:
|
||||
branch: [master, develop, feature/*, translations]
|
||||
event: [push, pull_request]
|
||||
branch: [master, develop, feature/*, fix/*, translations]
|
||||
event: [tag, push, pull_request]
|
||||
|
||||
code_quality:
|
||||
image: sonarsource/sonar-scanner-cli
|
||||
secrets: [sonar_token, sonar_host, sonar_project]
|
||||
build-translations:
|
||||
image: deblan/php:8.0
|
||||
commands:
|
||||
- sonar-scanner
|
||||
-Dsonar.projectKey=$SONAR_PROJECT
|
||||
-Dsonar.sources=.
|
||||
-Dsonar.host.url=$SONAR_HOST
|
||||
-Dsonar.pullrequest.key=$CI_COMMIT_PULL_REQUEST
|
||||
-Dsonar.pullrequest.branch=$CI_COMMIT_SOURCE_BRANCH
|
||||
-Dsonar.pullrequest.base=$CI_COMMIT_TARGET_BRANCH
|
||||
failure: ignore
|
||||
- php bin/generate_l10n.php
|
||||
when:
|
||||
event: [pull_request]
|
||||
branch: [master, develop, feature/*, fix/*, translations]
|
||||
event: [tag, push, pull_request]
|
||||
|
||||
package:
|
||||
image: gitnet.fr/deblan/devenv
|
||||
create-signature:
|
||||
image: nextcloud:25
|
||||
secrets: [app_certificate, app_public_certificate]
|
||||
environment:
|
||||
SQLITE_DATABASE: /var/www/data/data.db
|
||||
NEXTCLOUD_ADMIN_USER: admin
|
||||
NEXTCLOUD_ADMIN_PASSWORD: admin
|
||||
commands:
|
||||
- echo "$APP_CERTIFICATE" > "/tmp/side_menu.key"
|
||||
- echo "$APP_PUBLIC_CERTIFICATE" > "/tmp/side_menu.crt"
|
||||
- mkdir /tmp/app
|
||||
- cp -r README.md CHANGELOG.md appinfo css lib img l10n js src templates screenshots vendor /tmp/app
|
||||
- /usr/src/nextcloud/occ integrity:sign-app
|
||||
--privateKey=/tmp/side_menu.key
|
||||
--certificate=/tmp/side_menu.crt
|
||||
--path=/tmp/app
|
||||
- mv /tmp/app/appinfo/signature.json appinfo/
|
||||
when:
|
||||
event: [tag]
|
||||
|
||||
# check-code-quality:
|
||||
# image: sonarsource/sonar-scanner-cli
|
||||
# secrets: [sonar_token, sonar_host, sonar_project]
|
||||
# commands:
|
||||
# - sonar-scanner
|
||||
# -Dsonar.projectKey=$SONAR_PROJECT
|
||||
# -Dsonar.sources=.
|
||||
# -Dsonar.host.url=$SONAR_HOST
|
||||
# -Dsonar.pullrequest.key=$CI_COMMIT_PULL_REQUEST
|
||||
# -Dsonar.pullrequest.branch=$CI_COMMIT_SOURCE_BRANCH
|
||||
# -Dsonar.pullrequest.base=$CI_COMMIT_TARGET_BRANCH
|
||||
# failure: ignore
|
||||
# when:
|
||||
# event: [pull_request]
|
||||
|
||||
create-package:
|
||||
image: deblan/php:8.0
|
||||
volumes:
|
||||
- /var/www/html/artifacts:/var/www/html/artifacts
|
||||
secrets: [app_certificate]
|
||||
commands:
|
||||
- apt-get update
|
||||
- apt-get install -y zip make
|
||||
- mkdir -p "$HOME/.nextcloud/certificates"
|
||||
- echo "$APP_CERTIFICATE" > "$HOME/.nextcloud/certificates/side_menu.key"
|
||||
- export VERSION=$(grep "<version>" appinfo/info.xml | grep -o "[0-9]*\.[0-9]*\.[0-9]*" --color=never)
|
||||
|
|
@ -50,7 +81,7 @@ pipeline:
|
|||
when:
|
||||
event: [tag]
|
||||
|
||||
release:
|
||||
push-release:
|
||||
image: plugins/gitea-release
|
||||
volumes:
|
||||
- /var/www/html/artifacts:/var/www/html/artifacts
|
||||
|
|
|
|||
34
CHANGELOG.md
34
CHANGELOG.md
|
|
@ -1,5 +1,39 @@
|
|||
## [Unreleased]
|
||||
|
||||
## 3.9.1
|
||||
### Fixed
|
||||
* fix fixed menu on dashboard (#262)
|
||||
|
||||
## 3.9.0
|
||||
### Added
|
||||
* add compatibility with NC27
|
||||
### Fixed
|
||||
* fix app redirect (#261)
|
||||
|
||||
## 3.8.0
|
||||
### Added
|
||||
* add option to show hovered label only on top menu (fix #253)
|
||||
|
||||
## 3.7.4
|
||||
### Fixed
|
||||
* fix Integrity failed (#247)
|
||||
|
||||
## 3.7.3
|
||||
### Fixed
|
||||
* fix #244: use app href for redirection
|
||||
### Added
|
||||
* add signature on build
|
||||
|
||||
## 3.7.2
|
||||
### Added
|
||||
* update pipeline conditions allowing `fix/*`
|
||||
### Fixed
|
||||
* fix #233: load configuration and then retrieve apps in default side menu display
|
||||
|
||||
## 3.7.1
|
||||
### Fixed
|
||||
* fix build process (#230)
|
||||
|
||||
## 3.7.0
|
||||
### Added
|
||||
* add translations (thanks to AHOHNMYC)
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -9,7 +9,7 @@ dep:
|
|||
npm link @nextcloud/vue || sudo npm link @nextcloud/vue
|
||||
|
||||
.ONESHELL:
|
||||
release: build translations
|
||||
release:
|
||||
if [ -z "$$VERSION" ]; then
|
||||
echo "VERSION required"
|
||||
exit 1
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
[](https://ci.gitnet.fr/deblan/side_menu)
|
||||
[](https://translate.codeberg.org/engage/custom-menu/)
|
||||

|
||||
|
||||
Allows you to modify the position of the main menu by creating a panel on the left of the interface or with a big menu on the top.
|
||||
You can also add and sort custom categories, define apps that must be displayed in the top menu, etc. Fully customisable.
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ Notice
|
|||
Because I believe in a free and decentralized Internet, [Gitnet](https://gitnet.fr) is **self-hosted at home**.
|
||||
In case of downtime, you can download **Custom Menu** from [here](https://kim.deblan.fr/~side_menu/).
|
||||
]]></description>
|
||||
<version>3.7.0</version>
|
||||
<version>3.9.1</version>
|
||||
<licence>agpl</licence>
|
||||
<author mail="contact@deblan.fr" homepage="https://www.deblan.io/">Simon Vieille</author>
|
||||
<namespace>SideMenu</namespace>
|
||||
|
|
@ -54,7 +54,7 @@ In case of downtime, you can download **Custom Menu** from [here](https://kim.de
|
|||
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_big_menu.png</screenshot>
|
||||
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_default_menu.png</screenshot>
|
||||
<dependencies>
|
||||
<nextcloud min-version="25" max-version="26"/>
|
||||
<nextcloud min-version="25" max-version="27"/>
|
||||
<php min-version="7.4"/>
|
||||
</dependencies>
|
||||
<settings>
|
||||
|
|
|
|||
|
|
@ -239,14 +239,23 @@
|
|||
left: 50px;
|
||||
}
|
||||
|
||||
.side-menu-always-displayed #header {
|
||||
position: absolute !important;
|
||||
}
|
||||
|
||||
.side-menu-always-displayed #side-menu {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.side-menu-always-displayed .side-menu-apps-list {
|
||||
height: 100vh;
|
||||
top: 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.side-menu-always-displayed .side-menu-apps-list--with-settings {
|
||||
height: calc(100vh - 49px);
|
||||
top: 49px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.side-menu-always-displayed .side-menu-apps-list:hover {
|
||||
|
|
|
|||
|
|
@ -74,33 +74,37 @@ class AppController extends Controller
|
|||
$inTopMenuApps = in_array($app['id'], $topMenuApps);
|
||||
$inHiddenApps = in_array($app['id'], $hiddenApps);
|
||||
|
||||
if (!$inTopMenuApps || $inHiddenApps) {
|
||||
if (!$inTopMenuApps && $inHiddenApps) {
|
||||
continue;
|
||||
}
|
||||
|
||||
return $this->redirectToApp($app['id']);
|
||||
return $this->redirectToApp($app, true);
|
||||
}
|
||||
|
||||
return $this->redirectToApp('files');
|
||||
}
|
||||
|
||||
protected function redirectToApp($appId): RedirectResponse
|
||||
protected function redirectToApp($app, bool $isHref = false): RedirectResponse
|
||||
{
|
||||
$isIgnoreFrontController = true === OC::$server->getConfig()->getSystemValue(
|
||||
'htaccess.IgnoreFrontController',
|
||||
false
|
||||
);
|
||||
if (!$isHref) {
|
||||
$isIgnoreFrontController = true === OC::$server->getConfig()->getSystemValue(
|
||||
'htaccess.IgnoreFrontController',
|
||||
false
|
||||
);
|
||||
|
||||
$isFrontControllerActive = 'true' === getenv('front_controller_active');
|
||||
$isFrontControllerActive = 'true' === getenv('front_controller_active');
|
||||
|
||||
if ($isIgnoreFrontController || $isFrontControllerActive) {
|
||||
$path = '/apps/%s/';
|
||||
if ($isIgnoreFrontController || $isFrontControllerActive) {
|
||||
$path = '/apps/%s/';
|
||||
} else {
|
||||
$path = '/index.php/apps/%s/';
|
||||
}
|
||||
|
||||
$url = $this->urlGenerator->getAbsoluteURL(sprintf($path, $app));
|
||||
} else {
|
||||
$path = '/index.php/apps/%s/';
|
||||
$url = $app['href'];
|
||||
}
|
||||
|
||||
$url = $this->urlGenerator->getAbsoluteURL(sprintf($path, $appId));
|
||||
|
||||
return new RedirectResponse($url);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -171,7 +171,7 @@ class JsController extends Controller
|
|||
'avatar' => $avatar,
|
||||
'top-menu-apps' => $topMenuApps,
|
||||
'top-side-menu-apps' => $topSideMenuApps,
|
||||
'top-menu-mouse-over-hidden-label' => $this->config->getAppValueBool(
|
||||
'top-menu-mouse-over-hidden-label' => $this->config->getAppValueInt(
|
||||
'top-menu-mouse-over-hidden-label',
|
||||
'0'
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
@ -233,8 +233,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 +245,6 @@ $header-icon-size: 20px;
|
|||
overflow: visible;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Show labels
|
||||
|
|
@ -256,8 +255,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 +272,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 {
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ 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"
|
||||
|
|
@ -26,7 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
<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"
|
||||
/>
|
||||
|
|
@ -38,7 +38,7 @@ 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)"
|
||||
|
|
@ -79,6 +79,8 @@ export default {
|
|||
targetBlankApps: [],
|
||||
hiddenApps: [],
|
||||
settings: null,
|
||||
openerHover: false,
|
||||
alwaysDisplayed: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
|
|
@ -93,7 +95,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 +110,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 +124,25 @@ 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']
|
||||
})
|
||||
},
|
||||
},
|
||||
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>
|
||||
|
|
|
|||
|
|
@ -91,3 +91,4 @@
|
|||
"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"
|
||||
|
|
|
|||
|
|
@ -91,3 +91,4 @@
|
|||
"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"
|
||||
|
|
|
|||
|
|
@ -91,3 +91,4 @@
|
|||
"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"
|
||||
|
|
|
|||
|
|
@ -91,3 +91,4 @@
|
|||
"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"
|
||||
|
|
|
|||
|
|
@ -91,3 +91,4 @@
|
|||
"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"
|
||||
|
|
|
|||
|
|
@ -91,3 +91,4 @@
|
|||
"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"
|
||||
|
|
|
|||
|
|
@ -93,3 +93,4 @@
|
|||
"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": ""
|
||||
|
|
|
|||
|
|
@ -91,3 +91,4 @@
|
|||
"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"
|
||||
|
|
|
|||
|
|
@ -878,9 +878,15 @@ $labelAlwaysDisplayed = 'Always displayed';
|
|||
<div class="side-menu-setting-label">
|
||||
<?php p($l->t('Hide labels on mouse over')); ?>
|
||||
</div>
|
||||
<?php
|
||||
$choices = array_merge(
|
||||
$choicesYesNo,
|
||||
['Except the hovered app' => '2']
|
||||
);
|
||||
?>
|
||||
<div class="side-menu-setting-form">
|
||||
<select id="side-menu-top-menu-mouse-over-hidden-label" name="top-menu-mouse-over-hidden-label" class="side-menu-setting">
|
||||
<?php foreach ($choicesYesNo as $label => $value): ?>
|
||||
<?php foreach ($choices as $label => $value): ?>
|
||||
<option value="<?php echo $value ?>" <?php if ($value === $_['top-menu-mouse-over-hidden-label']): ?>selected<?php endif; ?>>
|
||||
<?php echo $l->t($label); ?>
|
||||
</option>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue