Compare commits
75 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6eb977dad5 | |||
| e571be5fcf | |||
| 432e0f175f | |||
| 022e8af6a2 | |||
| b8a5a82fd2 | |||
| 5f307cd046 | |||
| 8cd54eea19 | |||
| 072707772d | |||
| 0b3d2d9781 | |||
| 04af12691c | |||
| 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 | |||
| dbd0de7679 | |||
| 07a1d356de | |||
| d3359337f9 | |||
| 4b9378f923 | |||
| 117e33692b | |||
| 48b2b30406 | |||
| 18e8f42dc3 | |||
| ce969b4061 | |||
| 1965aedc43 |
@@ -26,7 +26,7 @@ body:
|
|||||||
id: configuration
|
id: configuration
|
||||||
attributes:
|
attributes:
|
||||||
label: Configuration
|
label: Configuration
|
||||||
description: Export the configuration using the admin page and copy/paste here.
|
description: Export the configuration using the admin page and copy/paste here ([documentation](https://deblan.gitnet.page/side_menu_doc/tips/#export-the-configuration)).
|
||||||
value: |
|
value: |
|
||||||
```
|
```
|
||||||
{
|
{
|
||||||
|
|||||||
+56
-25
@@ -1,47 +1,78 @@
|
|||||||
pipeline:
|
pipeline:
|
||||||
dependencies:
|
dependencies:
|
||||||
image: gitnet.fr/deblan/devenv
|
image: node:16
|
||||||
|
pull: true
|
||||||
commands:
|
commands:
|
||||||
- make dep
|
- npm i
|
||||||
when:
|
when:
|
||||||
event: [tag, push, pull_request]
|
event: [tag, push, pull_request]
|
||||||
branch: [master, develop, feature/*, translations]
|
branch: [master, develop, feature/*, fix/*, translations]
|
||||||
|
|
||||||
osv_detector:
|
osv-detector:
|
||||||
image: gitnet.fr/deblan/docker-osv-detector:v0.9
|
image: gitnet.fr/deblan/osv-detector:v0.10
|
||||||
commands:
|
commands:
|
||||||
- osv-detector package-lock.json
|
- osv-detector package-lock.json
|
||||||
failure: ignore
|
failure: ignore
|
||||||
|
|
||||||
build:
|
build-js:
|
||||||
image: gitnet.fr/deblan/devenv
|
image: node:16
|
||||||
commands:
|
commands:
|
||||||
- make build
|
- npm run build
|
||||||
when:
|
when:
|
||||||
branch: [master, develop, feature/*, translations]
|
branch: [master, develop, feature/*, fix/*, translations]
|
||||||
event: [push, pull_request]
|
event: [tag, push, pull_request]
|
||||||
|
|
||||||
code_quality:
|
build-translations:
|
||||||
image: sonarsource/sonar-scanner-cli
|
image: deblan/php:8.0
|
||||||
secrets: [sonar_token, sonar_host, sonar_project]
|
|
||||||
commands:
|
commands:
|
||||||
- sonar-scanner
|
- php bin/generate_l10n.php
|
||||||
-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:
|
when:
|
||||||
event: [pull_request]
|
branch: [master, develop, feature/*, fix/*, translations]
|
||||||
|
event: [tag, push, pull_request]
|
||||||
|
|
||||||
package:
|
create-signature:
|
||||||
image: gitnet.fr/deblan/devenv
|
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:
|
volumes:
|
||||||
- /var/www/html/artifacts:/var/www/html/artifacts
|
- /var/www/html/artifacts:/var/www/html/artifacts
|
||||||
secrets: [app_certificate]
|
secrets: [app_certificate]
|
||||||
commands:
|
commands:
|
||||||
|
- apt-get update
|
||||||
|
- apt-get install -y zip make
|
||||||
- mkdir -p "$HOME/.nextcloud/certificates"
|
- mkdir -p "$HOME/.nextcloud/certificates"
|
||||||
- echo "$APP_CERTIFICATE" > "$HOME/.nextcloud/certificates/side_menu.key"
|
- 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)
|
- export VERSION=$(grep "<version>" appinfo/info.xml | grep -o "[0-9]*\.[0-9]*\.[0-9]*" --color=never)
|
||||||
@@ -50,7 +81,7 @@ pipeline:
|
|||||||
when:
|
when:
|
||||||
event: [tag]
|
event: [tag]
|
||||||
|
|
||||||
release:
|
push-release:
|
||||||
image: plugins/gitea-release
|
image: plugins/gitea-release
|
||||||
volumes:
|
volumes:
|
||||||
- /var/www/html/artifacts:/var/www/html/artifacts
|
- /var/www/html/artifacts:/var/www/html/artifacts
|
||||||
|
|||||||
@@ -1,5 +1,54 @@
|
|||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## 3.10.1
|
||||||
|
### Fixed
|
||||||
|
* fix #269: use php7 syntax
|
||||||
|
|
||||||
|
## 3.10.0
|
||||||
|
### Added
|
||||||
|
* add compatibility with NC28
|
||||||
|
### Fixed
|
||||||
|
* fix NC28 error: remove deprecated method `OC_App::getNavigation()`
|
||||||
|
|
||||||
|
## 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)
|
||||||
|
* add compatibility with NC26
|
||||||
|
|
||||||
## 3.6.0
|
## 3.6.0
|
||||||
### Added
|
### Added
|
||||||
* add hidden apps compatible with default menu (#219)
|
* add hidden apps compatible with default menu (#219)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ dep:
|
|||||||
npm link @nextcloud/vue || sudo npm link @nextcloud/vue
|
npm link @nextcloud/vue || sudo npm link @nextcloud/vue
|
||||||
|
|
||||||
.ONESHELL:
|
.ONESHELL:
|
||||||
release: build translations
|
release:
|
||||||
if [ -z "$$VERSION" ]; then
|
if [ -z "$$VERSION" ]; then
|
||||||
echo "VERSION required"
|
echo "VERSION required"
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
[](https://ci.gitnet.fr/deblan/side_menu)
|
[](https://ci.gitnet.fr/deblan/side_menu)
|
||||||
[](https://translate.codeberg.org/engage/custom-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.
|
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.
|
You can also add and sort custom categories, define apps that must be displayed in the top menu, etc. Fully customisable.
|
||||||
|
|||||||
+2
-2
@@ -32,7 +32,7 @@ Notice
|
|||||||
Because I believe in a free and decentralized Internet, [Gitnet](https://gitnet.fr) is **self-hosted at home**.
|
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/).
|
In case of downtime, you can download **Custom Menu** from [here](https://kim.deblan.fr/~side_menu/).
|
||||||
]]></description>
|
]]></description>
|
||||||
<version>3.6.0</version>
|
<version>3.10.1</version>
|
||||||
<licence>agpl</licence>
|
<licence>agpl</licence>
|
||||||
<author mail="contact@deblan.fr" homepage="https://www.deblan.io/">Simon Vieille</author>
|
<author mail="contact@deblan.fr" homepage="https://www.deblan.io/">Simon Vieille</author>
|
||||||
<namespace>SideMenu</namespace>
|
<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_big_menu.png</screenshot>
|
||||||
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_default_menu.png</screenshot>
|
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_default_menu.png</screenshot>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="25" max-version="25"/>
|
<nextcloud min-version="25" max-version="28"/>
|
||||||
<php min-version="7.4"/>
|
<php min-version="7.4"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<settings>
|
<settings>
|
||||||
|
|||||||
+10
-1
@@ -239,14 +239,23 @@
|
|||||||
left: 50px;
|
left: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.side-menu-always-displayed #header {
|
||||||
|
position: absolute !important;
|
||||||
|
}
|
||||||
|
|
||||||
.side-menu-always-displayed #side-menu {
|
.side-menu-always-displayed #side-menu {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-menu-always-displayed .side-menu-apps-list {
|
.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);
|
height: calc(100vh - 49px);
|
||||||
top: 49px;
|
top: 49px;
|
||||||
overflow: hidden;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-menu-always-displayed .side-menu-apps-list:hover {
|
.side-menu-always-displayed .side-menu-apps-list:hover {
|
||||||
|
|||||||
@@ -74,33 +74,37 @@ class AppController extends Controller
|
|||||||
$inTopMenuApps = in_array($app['id'], $topMenuApps);
|
$inTopMenuApps = in_array($app['id'], $topMenuApps);
|
||||||
$inHiddenApps = in_array($app['id'], $hiddenApps);
|
$inHiddenApps = in_array($app['id'], $hiddenApps);
|
||||||
|
|
||||||
if (!$inTopMenuApps || $inHiddenApps) {
|
if (!$inTopMenuApps && $inHiddenApps) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToApp($app['id']);
|
return $this->redirectToApp($app, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->redirectToApp('files');
|
return $this->redirectToApp('files');
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function redirectToApp($appId): RedirectResponse
|
protected function redirectToApp($app, bool $isHref = false): RedirectResponse
|
||||||
{
|
{
|
||||||
$isIgnoreFrontController = true === OC::$server->getConfig()->getSystemValue(
|
if (!$isHref) {
|
||||||
'htaccess.IgnoreFrontController',
|
$isIgnoreFrontController = true === OC::$server->getConfig()->getSystemValue(
|
||||||
false
|
'htaccess.IgnoreFrontController',
|
||||||
);
|
false
|
||||||
|
);
|
||||||
|
|
||||||
$isFrontControllerActive = 'true' === getenv('front_controller_active');
|
$isFrontControllerActive = 'true' === getenv('front_controller_active');
|
||||||
|
|
||||||
if ($isIgnoreFrontController || $isFrontControllerActive) {
|
if ($isIgnoreFrontController || $isFrontControllerActive) {
|
||||||
$path = '/apps/%s/';
|
$path = '/apps/%s/';
|
||||||
|
} else {
|
||||||
|
$path = '/index.php/apps/%s/';
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = $this->urlGenerator->getAbsoluteURL(sprintf($path, $app));
|
||||||
} else {
|
} else {
|
||||||
$path = '/index.php/apps/%s/';
|
$url = $app['href'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$url = $this->urlGenerator->getAbsoluteURL(sprintf($path, $appId));
|
|
||||||
|
|
||||||
return new RedirectResponse($url);
|
return new RedirectResponse($url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -171,7 +171,7 @@ class JsController extends Controller
|
|||||||
'avatar' => $avatar,
|
'avatar' => $avatar,
|
||||||
'top-menu-apps' => $topMenuApps,
|
'top-menu-apps' => $topMenuApps,
|
||||||
'top-side-menu-apps' => $topSideMenuApps,
|
'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',
|
'top-menu-mouse-over-hidden-label',
|
||||||
'0'
|
'0'
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
namespace OCA\SideMenu\Service;
|
namespace OCA\SideMenu\Service;
|
||||||
|
|
||||||
use OC\User\User;
|
use OC\User\User;
|
||||||
|
use OCP\INavigationManager;
|
||||||
use OCP\L10N\IFactory;
|
use OCP\L10N\IFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,6 +35,7 @@ class AppRepository
|
|||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
\OC_App $ocApp,
|
\OC_App $ocApp,
|
||||||
|
INavigationManager $navigationManager,
|
||||||
IFactory $l10nFactory,
|
IFactory $l10nFactory,
|
||||||
ConfigProxy $config,
|
ConfigProxy $config,
|
||||||
CategoryRepository $categoryRepository
|
CategoryRepository $categoryRepository
|
||||||
@@ -41,6 +43,7 @@ class AppRepository
|
|||||||
$this->ocApp = $ocApp;
|
$this->ocApp = $ocApp;
|
||||||
$this->l10nFactory = $l10nFactory;
|
$this->l10nFactory = $l10nFactory;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
|
$this->navigationManager = $navigationManager;
|
||||||
$this->categoryRepository = $categoryRepository;
|
$this->categoryRepository = $categoryRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +54,7 @@ class AppRepository
|
|||||||
*/
|
*/
|
||||||
public function getVisibleApps()
|
public function getVisibleApps()
|
||||||
{
|
{
|
||||||
$navigation = $this->ocApp->getNavigation();
|
$navigation = $this->navigationManager->getAll();
|
||||||
$appCategoriesCustom = $this->config->getAppValueArray('apps-categories-custom', '[]');
|
$appCategoriesCustom = $this->config->getAppValueArray('apps-categories-custom', '[]');
|
||||||
$categories = $this->categoryRepository->getOrderedCategories();
|
$categories = $this->categoryRepository->getOrderedCategories();
|
||||||
$apps = $this->ocApp->listAllApps();
|
$apps = $this->ocApp->listAllApps();
|
||||||
|
|||||||
+22
-7
@@ -24,14 +24,14 @@
|
|||||||
<nav class="app-menu show">
|
<nav class="app-menu show">
|
||||||
<ul
|
<ul
|
||||||
class="app-menu-main"
|
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"
|
v-if="apps !== null"
|
||||||
>
|
>
|
||||||
<li v-for="app in mainAppList()"
|
<li v-for="app in mainAppList()"
|
||||||
:key="app.id"
|
:key="app.id"
|
||||||
:data-app-id="app.id"
|
:data-app-id="app.id"
|
||||||
class="app-menu-entry"
|
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)"
|
:style="makeStyle(app)"
|
||||||
>
|
>
|
||||||
<a :href="app.href"
|
<a :href="app.href"
|
||||||
@@ -233,8 +233,8 @@ $header-icon-size: 20px;
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(.app-menu-entry__hidden-label):hover,
|
&:not(.app-menu-entry__hidden-label):not(.app-menu-entry__show-hovered):hover,
|
||||||
&:not(.app-menu-entry__hidden-label):focus-within {
|
&:not(.app-menu-entry__hidden-label):not(.app-menu-entry__show-hovered):focus-within {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
.app-menu-entry--label {
|
.app-menu-entry--label {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
@@ -245,7 +245,6 @@ $header-icon-size: 20px;
|
|||||||
overflow: visible;
|
overflow: visible;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Show labels
|
// Show labels
|
||||||
@@ -256,8 +255,8 @@ $header-icon-size: 20px;
|
|||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:not(.app-menu-main__hidden-label):hover,
|
&:not(.app-menu-main__hidden-label):not(.app-menu-main__show-hovered):hover,
|
||||||
&:not(.app-menu-main__hidden-label):focus-within,
|
&: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):hover,
|
||||||
.app-menu-entry:not(.app-menu-entry__hidden-label):focus {
|
.app-menu-entry:not(.app-menu-entry__hidden-label):focus {
|
||||||
img {
|
img {
|
||||||
@@ -273,6 +272,22 @@ $header-icon-size: 20px;
|
|||||||
opacity: 0;
|
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 {
|
::v-deep .app-menu-more .button-vue--vue-tertiary {
|
||||||
|
|||||||
+28
-21
@@ -16,7 +16,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
-->
|
-->
|
||||||
<template>
|
<template>
|
||||||
<div id="side-menu">
|
<div id="side-menu">
|
||||||
<div class="side-menu-header">
|
<div class="side-menu-header" v-if="settings || !openerHover || (!avatar && !alwaysDisplayed && logo) || avatar">
|
||||||
<SettingsButton
|
<SettingsButton
|
||||||
v-if="settings"
|
v-if="settings"
|
||||||
v-bind:href="settings.href"
|
v-bind:href="settings.href"
|
||||||
@@ -26,7 +26,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
<OpenerButton />
|
<OpenerButton />
|
||||||
|
|
||||||
<Logo
|
<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:image="logo"
|
||||||
v-bind:link="logoLink"
|
v-bind:link="logoLink"
|
||||||
/>
|
/>
|
||||||
@@ -38,7 +38,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="side-menu-apps-list">
|
<ul class="side-menu-apps-list" :class="{'side-menu-apps-list--with-settings': !!settings}">
|
||||||
<SideMenuApp
|
<SideMenuApp
|
||||||
v-for="(app, key) in apps"
|
v-for="(app, key) in apps"
|
||||||
v-if="!hiddenApps.includes(app.id)"
|
v-if="!hiddenApps.includes(app.id)"
|
||||||
@@ -79,6 +79,8 @@ export default {
|
|||||||
targetBlankApps: [],
|
targetBlankApps: [],
|
||||||
hiddenApps: [],
|
hiddenApps: [],
|
||||||
settings: null,
|
settings: null,
|
||||||
|
openerHover: false,
|
||||||
|
alwaysDisplayed: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -93,7 +95,11 @@ export default {
|
|||||||
|
|
||||||
for (let id in ncApps) {
|
for (let id in ncApps) {
|
||||||
if (window.topMenuApps.includes(id) && !window.topSideMenuApps.includes(id)) {
|
if (window.topMenuApps.includes(id) && !window.topSideMenuApps.includes(id)) {
|
||||||
continue;
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.hiddenApps.includes(id)) {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
let app = ncApps[id]
|
let app = ncApps[id]
|
||||||
@@ -104,10 +110,10 @@ export default {
|
|||||||
|
|
||||||
finalApps.sort((a, b) => {
|
finalApps.sort((a, b) => {
|
||||||
if (a.order === null || b.order === null) {
|
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
|
this.apps = finalApps
|
||||||
@@ -118,24 +124,25 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
retrieveConfig() {
|
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() {
|
mounted() {
|
||||||
this.retrieveConfig()
|
axios
|
||||||
this.retrieveApps()
|
.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>
|
</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í"
|
"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ě."
|
"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"
|
"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"
|
"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."
|
"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"
|
"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"
|
"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."
|
"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"
|
"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"
|
"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."
|
"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"
|
"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"
|
"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."
|
"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"
|
"Hide labels on mouse over": "Hide labels on mouse over"
|
||||||
|
"Except the hovered app": "Except the hovered app"
|
||||||
|
|||||||
+22
-21
@@ -7,7 +7,7 @@
|
|||||||
: 'Используйте сочетание клавиш <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span>, чтобы открыть или скрыть боковое меню. Используйте <span class="keyboard-key">Tab</span> для навигации.'
|
: 'Используйте сочетание клавиш <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span>, чтобы открыть или скрыть боковое меню. Используйте <span class="keyboard-key">Tab</span> для навигации.'
|
||||||
"Top menu": "Верхнее меню"
|
"Top menu": "Верхнее меню"
|
||||||
"Apps that not must be moved in the side menu": "Приложения не перемещаемые в боковое меню"
|
"Apps that not must be moved in the side menu": "Приложения не перемещаемые в боковое меню"
|
||||||
"If there is no selection then the global configuration is applied.": "If there is no selection then the global configuration is applied."
|
"If there is no selection then the global configuration is applied.": "Если тут ничего не отмечено, применяются глобальные настройки."
|
||||||
"Experimental": "Экспериментальный"
|
"Experimental": "Экспериментальный"
|
||||||
"Save": "Сохранить"
|
"Save": "Сохранить"
|
||||||
"You like this app and you want to support me?": "Вам нравится приложение или вы хотите поддержать меня?"
|
"You like this app and you want to support me?": "Вам нравится приложение или вы хотите поддержать меня?"
|
||||||
@@ -16,11 +16,11 @@
|
|||||||
"Small": "Маленький"
|
"Small": "Маленький"
|
||||||
"Normal": "Средний"
|
"Normal": "Средний"
|
||||||
"Big": "Большой"
|
"Big": "Большой"
|
||||||
"Hidden icon": "Скрытая иконка"
|
"Hidden icon": "Без иконки"
|
||||||
"Small icon": "Маленькая иконка"
|
"Small icon": "Маленькая иконка"
|
||||||
"Normal icon": "Средняя иконка"
|
"Normal icon": "Средняя иконка"
|
||||||
"Big icon": "Большая иконка"
|
"Big icon": "Большая иконка"
|
||||||
"Hidden text": "Скрытый текст"
|
"Hidden text": "Без текста"
|
||||||
"Small text": "Маленький текст"
|
"Small text": "Маленький текст"
|
||||||
"Normal text": "Средний текст"
|
"Normal text": "Средний текст"
|
||||||
"Big text": "Большой текст"
|
"Big text": "Большой текст"
|
||||||
@@ -35,44 +35,44 @@
|
|||||||
"Transparent": "Прозрачный"
|
"Transparent": "Прозрачный"
|
||||||
"Opaque": "Непрозрачный"
|
"Opaque": "Непрозрачный"
|
||||||
"Opener": "Открывалка"
|
"Opener": "Открывалка"
|
||||||
"Default": "По-умолчанию"
|
"Default": "По умолчанию"
|
||||||
"Default (dark)": "По-умолчанию (тёмный)"
|
"Default (dark)": "По умолчанию (тёмный)"
|
||||||
"Hamburger": "Гамбургер"
|
"Hamburger": "Гамбургер"
|
||||||
"Hamburger (dark)": "Гамбургер (тёмный)"
|
"Hamburger (dark)": "Гамбургер (тёмный)"
|
||||||
"Hamburger 2": "Гамбургер 2"
|
"Hamburger 2": "Гамбургер 2"
|
||||||
"Hamburger 2 (dark)": "Гамбургер 2 (тёмный)"
|
"Hamburger 2 (dark)": "Гамбургер 2 (тёмный)"
|
||||||
"Before the logo": "Перед логотипом"
|
"Before the logo": "Перед логотипом"
|
||||||
"After the logo": "После логотипа"
|
"After the logo": "После логотипа"
|
||||||
"Position": "Позиция"
|
"Position": "Положение"
|
||||||
"Show only the opener (hidden logo)": "Показать только открывающую часть (скрытый логотип)"
|
"Show only the opener (hidden logo)": "Показать только открывающую часть (скрытый логотип)"
|
||||||
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Не отображать боковое меню и открывалку, если нет приложения (например, публичные страницы)."
|
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Не отображать боковое меню и открывалку, если нет приложения (например, публичные страницы)."
|
||||||
"Panel": "Панеот"
|
"Panel": "Панель"
|
||||||
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Открывать меню при наведении мыши на экран (автоматически отключается на сенсорных экранах)"
|
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Открывать меню при наведении мыши на экран (автоматически отключается на сенсорных экранах)"
|
||||||
"Display the big menu": "Отобразить большое меню"
|
"Display the big menu": "Отобразить большое меню"
|
||||||
"Display the logo": "Показать лого"
|
"Display the logo": "Показать логотип"
|
||||||
"Icons and texts": "Иконки и текст"
|
"Icons and texts": "Иконки и текст"
|
||||||
"Loader enabled": "Loader enabled"
|
"Loader enabled": "Загрузчик включен"
|
||||||
"Tips": "Советы"
|
"Tips": "Советы"
|
||||||
"Always displayed": "Всегда отображается"
|
"Always displayed": "Всегда отображается"
|
||||||
"This is the automatic behavior when the menu is always displayed.": "This is the automatic behavior when the menu is always displayed."
|
"This is the automatic behavior when the menu is always displayed.": "This is the automatic behavior when the menu is always displayed."
|
||||||
"Not compatible with touch screens.": "Не совместимо с сенсорными экранами"
|
"Not compatible with touch screens.": "Не совместимо с сенсорными экранами."
|
||||||
"Big menu": "Большое меню"
|
"Big menu": "Большое меню"
|
||||||
"Live preview": "Live preview"
|
"Live preview": "Live preview"
|
||||||
"Open apps in new tab": "Открывать приложения в новой вкладке"
|
"Open apps in new tab": "Открывать приложения в новой вкладке"
|
||||||
"Use the global setting": "Use the global setting"
|
"Use the global setting": "Использовать глобальные настройки"
|
||||||
"Use my selection": "Use my selection"
|
"Use my selection": "Использовать мои настройки"
|
||||||
"Show and hide the list of applications": "Показать или скрыть список приложений"
|
"Show and hide the list of applications": "Показать или скрыть список приложений"
|
||||||
"Use the avatar instead of the logo": "Использовать аватар вместо логотипа"
|
"Use the avatar instead of the logo": "Использовать аватар вместо логотипа"
|
||||||
"You do not have permission to change the settings.": "У вас нет разрешения изменять настройки"
|
"You do not have permission to change the settings.": "У вас нет разрешения изменять настройки."
|
||||||
"Force this configuration to users": "Force this configuration to users"
|
"Force this configuration to users": "Force this configuration to users"
|
||||||
"Export the configuration": "Экспортировать конфигурацию"
|
"Export the configuration": "Экспортировать конфигурацию"
|
||||||
"Purge the cache": "Очистить кэш"
|
"Purge the cache": "Очистить кэш"
|
||||||
"Show the link to settings": "Показать ссылку на настройки"
|
"Show the link to settings": "Показать ссылку на настройки"
|
||||||
"The menu is enabled by default for users": "The menu is enabled by default for users"
|
"The menu is enabled by default for users": "Это меню включено по умолчанию для пользователей"
|
||||||
"Except when the configuration is forced.": "Except when the configuration is forced."
|
"Except when the configuration is forced.": "Except when the configuration is forced."
|
||||||
"Apps that should not be displayed in the menu": "Apps that should not be displayed in the menu"
|
"Apps that should not be displayed in the menu": "Ппрограммы, скрытые из меню"
|
||||||
"This feature is only compatible with the <code>big menu</code> display.": "This feature is only compatible with the <code>big menu</code> display."
|
"This feature is only compatible with the <code>big menu</code> display.": "This feature is only compatible with the <code>big menu</code> display."
|
||||||
"The logo is a link to the default app": "The logo is a link to the default app"
|
"The logo is a link to the default app": "Логотип открывает приложение по умолчанию"
|
||||||
"Others": "Прочие"
|
"Others": "Прочие"
|
||||||
"Categories": "Категории"
|
"Categories": "Категории"
|
||||||
"Customize sorting": "Настроить сортировку"
|
"Customize sorting": "Настроить сортировку"
|
||||||
@@ -80,14 +80,15 @@
|
|||||||
"Name": "Название"
|
"Name": "Название"
|
||||||
"Customed": "Customed"
|
"Customed": "Customed"
|
||||||
"Show and hide the list of categories": "Показать или скрыть список категорий"
|
"Show and hide the list of categories": "Показать или скрыть список категорий"
|
||||||
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "This parameters are used when Dark theme or Breeze Dark Theme are enabled."
|
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Эти настройки используются темами Тёмная и Тёмная Breeze."
|
||||||
"Dark mode colors": "Цвета тёмной темы"
|
"Dark mode colors": "Цвета тёмной темы"
|
||||||
"With categories": "С категориями"
|
"With categories": "С категориями"
|
||||||
"Custom categories": "Custom categories"
|
"Custom categories": "Пользовательские категории"
|
||||||
"Customize application categories": "Customize application categories"
|
"Customize application categories": "Изменить категории приложений"
|
||||||
"Reset to default": "Сбросить к значениям по-умолчанию"
|
"Reset to default": "Сбросить к значениям по умолчанию"
|
||||||
"Applications": "Приложения"
|
"Applications": "Приложения"
|
||||||
"Applications kept in the top menu": "Applications kept in the top menu"
|
"Applications kept in the top menu": "Applications kept in the top menu"
|
||||||
"Applications kept in the top menu but also shown in side menu": "Applications kept in the top menu but also shown in side menu"
|
"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."
|
"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"
|
"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": ""
|
"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": ""
|
||||||
|
|||||||
@@ -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"
|
"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."
|
"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"
|
"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">
|
<div class="side-menu-setting-label">
|
||||||
<?php p($l->t('Hide labels on mouse over')); ?>
|
<?php p($l->t('Hide labels on mouse over')); ?>
|
||||||
</div>
|
</div>
|
||||||
|
<?php
|
||||||
|
$choices = array_merge(
|
||||||
|
$choicesYesNo,
|
||||||
|
['Except the hovered app' => '2']
|
||||||
|
);
|
||||||
|
?>
|
||||||
<div class="side-menu-setting-form">
|
<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">
|
<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; ?>>
|
<option value="<?php echo $value ?>" <?php if ($value === $_['top-menu-mouse-over-hidden-label']): ?>selected<?php endif; ?>>
|
||||||
<?php echo $l->t($label); ?>
|
<?php echo $l->t($label); ?>
|
||||||
</option>
|
</option>
|
||||||
|
|||||||
Reference in New Issue
Block a user