Compare commits

..

114 Commits

Author SHA1 Message Date
Simon Vieille 711d169d22 Merge pull request 'add check if menu exists before adding event listeners (#210)' (#211) from feature/issue210 into v2.x
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/211
2023-01-21 21:49:02 +01:00
Simon Vieille ddcd10f7b0 release v2.5.2 2023-01-21 21:45:41 +01:00
Simon Vieille ab8b745496 add check if menu exists before adding event listeners (#210) 2023-01-21 21:41:22 +01:00
Simon Vieille 401b351fbd include v2.x in CI 2022-10-11 22:49:02 +02:00
Simon Vieille b6a529d65e Merge pull request 'fix #133' (#134) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/134
2022-09-01 17:00:32 +02:00
Simon Vieille b30e822bde update changelog 2022-09-01 16:59:46 +02:00
Simon Vieille 13688cd3d3 fix icon render 2022-09-01 16:59:04 +02:00
Simon Vieille 22fd48cf8d Merge pull request 'release v2.5.0' (#132) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/132
2022-09-01 10:50:17 +02:00
Simon Vieille f9c41e9407 Merge branch 'master' into develop 2022-09-01 10:49:37 +02:00
Simon Vieille 1da1cff551 release v2.5.0 2022-09-01 10:44:13 +02:00
Simon Vieille 1c2c413eef update changelog 2022-08-21 18:02:28 +02:00
Simon Vieille 36388bd472 add code quality makefile action 2022-08-21 18:02:28 +02:00
Simon Vieille 0c304b06a0 (cq) add missing let 2022-08-21 18:02:28 +02:00
Simon Vieille 538467dc99 (cq) replace v-html with v-text to prevent xss 2022-08-21 18:02:28 +02:00
Simon Vieille eba06e8ef8 (cq) replace var with let 2022-08-21 18:02:28 +02:00
Simon Vieille 3cf8b685ba (cq) replace var with let 2022-08-21 18:02:28 +02:00
Simon Vieille ed8f0e0959 (cq) remove unused package* 2022-08-21 18:02:28 +02:00
Simon Vieille ba7f0673b4 (cq) add alt attribute on app icon 2022-08-21 18:02:28 +02:00
Simon Vieille d2b589a644 (cq) add rel noopener attribute 2022-08-21 18:02:28 +02:00
Simon Vieille ca08a26e1b (cq) add alt attribute on logo 2022-08-21 18:02:28 +02:00
Simon Vieille 6347403ed7 (cq) remove unsed variable 2022-08-21 18:02:28 +02:00
Simon Vieille 80532ead63 (cq) rename variable 2022-08-21 18:02:28 +02:00
Simon Vieille 7b8d8800fc (cq) replace repeated strings with variables 2022-08-21 18:02:28 +02:00
Simon Vieille a20b0d4709 (cq) remove unsed variables 2022-08-21 18:02:28 +02:00
Simon Vieille 47c2beae4a (cq) remove duplicated code 2022-08-21 18:02:28 +02:00
Simon Vieille 49f45534de update changelog 2022-08-21 18:02:28 +02:00
Simon Vieille fd99827390 update changelog 2022-08-21 16:20:42 +02:00
Simon Vieille e802e05888 add code quality makefile action 2022-08-21 16:20:05 +02:00
Simon Vieille 13f535250a (cq) add missing let 2022-08-21 16:13:39 +02:00
Simon Vieille d837f1acf5 (cq) replace v-html with v-text to prevent xss 2022-08-21 16:12:52 +02:00
Simon Vieille f058ec10d3 (cq) replace var with let 2022-08-21 15:58:12 +02:00
Simon Vieille d3b3989e02 (cq) replace var with let 2022-08-21 15:55:59 +02:00
Simon Vieille 984bfcdc05 (cq) remove unused package* 2022-08-21 15:54:02 +02:00
Simon Vieille 983fabd460 (cq) add alt attribute on app icon 2022-08-21 15:53:26 +02:00
Simon Vieille ca7e8674e4 (cq) add rel noopener attribute 2022-08-21 15:46:33 +02:00
Simon Vieille 69e2c0670a (cq) add alt attribute on logo 2022-08-21 13:55:29 +02:00
Simon Vieille 4676243b2e (cq) remove unsed variable 2022-08-21 13:53:40 +02:00
Simon Vieille 84b50710a6 (cq) rename variable 2022-08-21 13:52:08 +02:00
Simon Vieille 059002ef1c (cq) replace repeated strings with variables 2022-08-21 13:49:20 +02:00
Simon Vieille fa9d5abf62 (cq) remove unsed variables 2022-08-21 13:48:42 +02:00
Simon Vieille 280c1d72ae (cq) remove duplicated code 2022-08-21 13:48:16 +02:00
Simon Vieille 373b8393bf update changelog 2022-08-15 15:03:46 +02:00
Simon Vieille 6205c9a6b6 Merge pull request 'upgrade dependencies' (#116) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/116
2022-08-15 14:26:44 +02:00
Simon Vieille d381d479da upgrade dependences 2022-08-15 14:17:36 +02:00
Simon Vieille ce9d6b93b1 upgrade dependences 2022-08-15 14:17:21 +02:00
Simon Vieille dc49747115 Merge pull request 'v2.4.3' (#115) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/115
2022-08-13 17:30:51 +02:00
Simon Vieille 1ce3f06b46 release v2.4.3 2022-08-13 17:26:35 +02:00
Simon Vieille 5fe272405e Merge pull request 'Tweaks to Czech localization' (#114) from Pavelb/side_menu:develop into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/114
2022-08-13 17:23:19 +02:00
Pavelb f2a09bc170 Updated Czech localization
Removed duplicated source string, minor tweaks to wording.
2022-08-13 14:50:46 +02:00
Pavelb a2ab8fa907 Merge pull request 'develop' (#1) from deblan/side_menu:develop into develop
Reviewed-on: https://gitnet.fr/Pavelb/side_menu/pulls/1
2022-08-13 14:38:27 +02:00
Simon Vieille 638ba27564 remove drone ci conf and update woodpecker ci conf 2022-07-28 10:14:37 +02:00
Simon Vieille 013d5b99f1 Merge pull request 'update ci' (#113) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/113
2022-07-26 15:29:33 +02:00
Simon Vieille 291eaa4f83 update ci 2022-07-26 15:27:56 +02:00
Simon Vieille 5bd88a32d9 Merge branch 'develop' 2022-07-26 15:08:39 +02:00
Simon Vieille 794d86f69e update ci 2022-07-26 15:05:44 +02:00
Simon Vieille e61e6880a2 update ci 2022-07-26 15:04:48 +02:00
Simon Vieille 4b81fa715c update ci 2022-07-26 15:04:22 +02:00
Simon Vieille 330ee2a43e update ci 2022-07-26 15:03:53 +02:00
Simon Vieille 3cf1b358b3 Merge pull request 'update ci' (#110) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/110
2022-07-26 14:57:46 +02:00
Simon Vieille ff1ebb4a50 update ci 2022-07-26 14:57:46 +02:00
Simon Vieille b246fa0281 update ci 2022-07-26 14:57:19 +02:00
Simon Vieille e6176d3e01 Merge pull request 'update ci' (#109) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/109
2022-07-26 14:55:43 +02:00
Simon Vieille 06b10568e7 update ci 2022-07-26 14:55:43 +02:00
Simon Vieille 3bc214b72e update ci 2022-07-26 14:55:25 +02:00
Simon Vieille a6df8db96b Merge pull request 'update ci' (#108) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/108
2022-07-26 14:50:14 +02:00
Simon Vieille 64f77b102d update ci 2022-07-26 14:49:29 +02:00
Simon Vieille ef604ee612 fix merge 2022-07-26 14:44:43 +02:00
Simon Vieille eafc020210 merge develop 2022-07-26 14:43:25 +02:00
Simon Vieille 2dac9ce0f4 Merge branch 'develop' 2022-07-26 14:41:52 +02:00
Simon Vieille 9f5143cc25 update changelog 2022-07-26 14:33:45 +02:00
Simon Vieille 48737c5300 update ci 2022-07-26 14:31:01 +02:00
Simon Vieille 293e4bf62b fix woodpecker pipeline 2022-07-25 11:06:27 +02:00
Simon Vieille 4c74b620b1 Merge pull request 'add new ci and fix minur bugs' (#107) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/107
2022-07-25 11:04:22 +02:00
Simon Vieille b83d9f8d76 add woodpacker ci 2022-07-25 11:04:22 +02:00
Simon Vieille 5835f1ae92 add woodpacker ci 2022-07-25 11:04:22 +02:00
Simon Vieille f6c40d9391 fix typo 2022-07-25 11:04:22 +02:00
Simon Vieille 049e601f62 add woodpacker ci 2022-07-25 10:38:59 +02:00
Simon Vieille 16ab6bfece add woodpacker ci 2022-07-25 10:34:24 +02:00
Simon Vieille 325b618434 Merge branch 'master' of gitnet.fr:deblan/side_menu 2022-07-05 16:52:13 +02:00
Simon Vieille 7892ce98d2 fix typo 2022-07-05 16:52:03 +02:00
Simon Vieille 4ea6c5b191 Merge pull request 'develop' (#106) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/106
2022-07-05 14:51:05 +02:00
Simon Vieille 87090b90c2 Merge branch 'develop' 2022-07-05 14:49:13 +02:00
Simon Vieille 2a1e9f5010 release v2.4.1 2022-07-05 14:49:06 +02:00
Simon Vieille 05b1b16cb1 fix user setting save 2022-07-05 14:49:00 +02:00
Simon Vieille 0176ef22d4 update readme 2022-05-31 21:39:55 +02:00
Simon Vieille 1d914458d0 Merge pull request 'release v2.4.0' (#104) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/104
2022-05-31 21:28:36 +02:00
Simon Vieille a8ecf3ea46 release v2.4.0 2022-05-31 21:24:08 +02:00
Simon Vieille 8d1842f622 update changelog 2022-05-31 21:23:53 +02:00
Simon Vieille a0be3757e9 update screenshots 2022-05-31 21:21:30 +02:00
Simon Vieille 7b2f64c5cd add translations 2022-05-31 21:11:11 +02:00
Simon Vieille 6b1a995d5d add tooltips 2022-05-31 16:43:49 +02:00
Simon Vieille 814567635d update changelog 2022-05-31 16:29:29 +02:00
Simon Vieille 32322a0ab2 add button to set default colors 2022-05-31 16:28:43 +02:00
Simon Vieille 95230e9e4a add menu hover effect 2022-05-31 15:48:17 +02:00
Simon Vieille e2430866e5 add button to set default colors 2022-05-31 15:48:02 +02:00
Simon Vieille 9f9f8f90c8 remove focus on opener after click 2022-05-30 19:49:59 +02:00
Simon Vieille 28fc33ee79 change saving progression 2022-05-30 19:49:36 +02:00
Simon Vieille f116b8463a fix menu with categories header 2022-05-30 13:22:03 +02:00
Simon Vieille d8edbae848 fix minor issues 2022-05-30 12:58:49 +02:00
Simon Vieille 4e0c7be2c6 remove deprecated app.php file 2022-05-30 12:04:15 +02:00
Simon Vieille 3fc141bee1 Merge branch 'develop' 2022-05-04 21:05:43 +02:00
Simon Vieille 2cb8c22be0 fix avatar size (nextcloud 24) 2022-05-04 21:05:38 +02:00
Simon Vieille 3e3e6ae943 Merge pull request 'release v2.3.5' (#100) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/100
2022-04-11 19:15:24 +02:00
Simon Vieille d759ccbdcc Merge branch 'develop' 2022-04-11 19:11:51 +02:00
Simon Vieille 389da47cab release v2.3.5 2022-04-11 19:11:41 +02:00
Simon Vieille 457c1ff53e Merge branch 'develop' 2022-04-10 18:56:58 +02:00
Simon Vieille a6a84ee784 update opener active style (fix #99) 2022-04-10 18:56:50 +02:00
Simon Vieille 52bbd49d9a update readme 2022-03-15 11:44:11 +01:00
Simon Vieille 92e1857ae8 Merge pull request 'fix issue #96' (#97) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/97
2022-03-15 11:14:40 +01:00
Simon Vieille c0b1701744 release v2.3.4 2022-03-15 10:56:05 +01:00
Simon Vieille ee98a49366 fix blank line when settings are open 2022-03-15 10:51:40 +01:00
Simon Vieille 17a8137b4e Merge branch 'master' of gitnet.fr:deblan/side_menu 2022-01-13 00:20:11 +01:00
Simon Vieille 8d287672e9 Merge branch 'master' of gitnet.fr:deblan/side_menu 2021-11-14 20:07:49 +01:00
Simon Vieille 0ecc706bad Merge branch 'develop' 2021-11-14 20:05:33 +01:00
33 changed files with 405 additions and 208 deletions
-54
View File
@@ -1,54 +0,0 @@
---
kind: pipeline
type: docker
name: default
steps:
- name: dependencies
image: deblan/devenv
commands:
- npm install
- name: build
image: deblan/devenv
commands:
- make npm-build
when:
branch:
exclude:
- master
include:
- develop
- feature/*
event:
- push
- pull_request
- name: release
image: deblan/devenv
volumes:
- name: artifacts
path: /artifacts
environment:
APP_CERTIFICATE:
from_secret: app_certificate
commands:
- 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)
- export RELEASE_DIRECTORY="/artifacts/deblan/side_menu"
- make release
when:
branch:
exclude:
- develop
- feature/*
include:
- master
event:
- push
volumes:
- name: artifacts
host:
path: /var/www/html/artifacts
+5
View File
@@ -0,0 +1,5 @@
{
"rules": {
"indentation": 4
}
}
+42
View File
@@ -0,0 +1,42 @@
pipeline:
dependencies:
image: deblan/devenv
commands:
- npm install
when:
event: [tag, push, pull_request]
branch: [master, develop, v2.x, feature/*]
build:
image: deblan/devenv
commands:
- make npm-build
when:
event: [push, pull_request]
package:
image: deblan/devenv
volumes:
- /var/www/html/artifacts:/var/www/html/artifacts
secrets: [app_certificate]
commands:
- 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)
- export RELEASE_DIRECTORY="/var/www/html/artifacts/deblan/side_menu"
- make release
when:
event: [tag]
release:
image: plugins/gitea-release
volumes:
- /var/www/html/artifacts:/var/www/html/artifacts
settings:
api_key:
from_secret: gitnet_api_key
base_url: https://gitnet.fr
note: ${CI_COMMIT_MESSAGE}
files: /var/www/html/artifacts/deblan/side_menu/${CI_COMMIT_TAG/v//}/*
when:
event: [tag]
+57
View File
@@ -1,5 +1,62 @@
## [Unreleased] ## [Unreleased]
## 2.5.2
### Fixed
* add check if menu exists before adding event listeners (#210)
## 2.5.1
### Fixed
* fix icon render (#133)
## 2.5.0
### Changed
* upgrade dependencies
### Fixed
* remove duplicated code
* remove unused variables and packages
* replace repeated strings with variables
* add html attributes
* replace var with let
* replace v-html with v-text to prevent xss
## 2.4.3
### Fixed
* fix translations
## 2.4.2
### Fixed
* fix typo
### Changed
* change ci/cd
## 2.4.1
### Fixed
* fix user setting save
## 2.4.0
### Added
* remove focus on opener after click
* add button to set default colors
* add menu hover effect
* add translations
### Fixed
* fix deprecated app.php file
* fix menu with categories header
* fix minor issues
### Changed
* change saving progression
### Removed
* Nextcloud 19 is not supported anymore
* PHP 7.3 is not supported anymore
## 2.3.5
### Fixed
* fix white square (#99)
## 2.3.4
### Fixed
* fix blank line when settings are open (#96)
## 2.3.3 ## 2.3.3
### Added ### Added
* hide the scrollbar when mouse is out (menu always displayed) * hide the scrollbar when mouse is out (menu always displayed)
+5
View File
@@ -26,3 +26,8 @@ release: npm-build translations
translations: translations:
php bin/generate_l10n.php php bin/generate_l10n.php
.ONESHELL:
run-code-quality-analysis:
export SONAR_TOKEN="$$SONAR_TOKEN_DEBLAN_SIDE_MENU"
sonar-scanner -Dsonar.projectKey=deblan-side_menu -Dsonar.sources=. -Dsonar.host.url=https://cq.gitnet.fr
+3 -1
View File
@@ -15,10 +15,12 @@ You can customize colors depending of the theme (Dark theme and Breeze Dark). Co
You like this app and you want to support me? ☕ [Buy me a coffee](https://www.buymeacoffee.com/deblan) or [Donate with liberapay](https://liberapay.com/deblan) You like this app and you want to support me? ☕ [Buy me a coffee](https://www.buymeacoffee.com/deblan) or [Donate with liberapay](https://liberapay.com/deblan)
[![Build Status](https://ci.gitnet.fr/api/badges/deblan/side_menu/status.svg)](https://ci.gitnet.fr/deblan/side_menu)
Requirements Requirements
------------ ------------
* PHP >= 7.3 * PHP >= 7.4
* App `theming` enabled * App `theming` enabled
Installation and upgrade Installation and upgrade
-10
View File
@@ -1,10 +0,0 @@
<?php
use OCA\SideMenu\AppInfo\Application;
$app = new Application();
if ($app->isEnabled()) {
$app->registerAssets();
$app->registerServices();
}
+4 -4
View File
@@ -17,7 +17,7 @@ You can report a bug or request a feature by opening an issue.
Requirements: Requirements:
* PHP >= 7.3 * PHP >= 7.4
* App `theming` enabled * App `theming` enabled
If you like this application and if you want to support the development: If you like this application and if you want to support the development:
@@ -26,7 +26,7 @@ If you like this application and if you want to support the development:
* [Donate with liberapay](https://liberapay.com/deblan) * [Donate with liberapay](https://liberapay.com/deblan)
* [Leave a comment](https://apps.nextcloud.com/apps/side_menu#comments) * [Leave a comment](https://apps.nextcloud.com/apps/side_menu#comments)
]]></description> ]]></description>
<version>2.3.3</version> <version>2.5.2</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>
@@ -46,8 +46,8 @@ If you like this application and if you want to support the development:
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc20_big_menu_responsive.png</screenshot> <screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc20_big_menu_responsive.png</screenshot>
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/personal_settings.png</screenshot> <screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/personal_settings.png</screenshot>
<dependencies> <dependencies>
<nextcloud min-version="19" max-version="23"/> <nextcloud min-version="20" max-version="24"/>
<php min-version="7.3"/> <php min-version="7.4"/>
</dependencies> </dependencies>
<settings> <settings>
<admin>OCA\SideMenu\Settings\Admin</admin> <admin>OCA\SideMenu\Settings\Admin</admin>
+15
View File
@@ -129,3 +129,18 @@
.side-menu-setting-form-long { .side-menu-setting-form-long {
width: 400px; width: 400px;
} }
#side-menu-save-progress {
display: inline-block;
width: 0;
height: 15px;
background: #fff;
}
.btn-reset {
display: inline-block;
cursor: pointer;
position: absolute;
margin-top: 17px;
margin-left: 5px;
}
+17 -6
View File
@@ -29,6 +29,10 @@
display: none; display: none;
} }
#side-menu a {
transition: 0.2s;
}
#side-menu.open { #side-menu.open {
display: block; display: block;
} }
@@ -59,6 +63,8 @@
.side-menu-settings img { .side-menu-settings img {
vertical-align: bottom; vertical-align: bottom;
margin-left: 3px; margin-left: 3px;
width: 32px;
height: 32px;
} }
#side-menu.open .side-menu-settings { #side-menu.open .side-menu-settings {
@@ -78,8 +84,8 @@
margin-left: 3px !important; margin-left: 3px !important;
} }
.side-menu-opener:active { .side-menu-opener:active, .side-menu-opener:focus {
background-color: var(--color-background-dark) !important; background-color: var(--side-menu-current-app-background-color, #444) !important;
} }
.side-menu-closer { .side-menu-closer {
@@ -151,6 +157,10 @@
top: 0; top: 0;
} }
#side-menu.side-menu-with-categories .side-menu-header {
max-width: 295px;
}
#side-menu.hide-opener .side-menu-logo { #side-menu.hide-opener .side-menu-logo {
margin-top: 20px; margin-top: 20px;
} }
@@ -298,9 +308,14 @@
padding: 10px 0; padding: 10px 0;
} }
.side-menu-always-displayed #body-settings, #body-settings.body-settings-side-menu {
overflow-x: visible;
}
@media screen and (max-width: 1024px) { @media screen and (max-width: 1024px) {
#side-menu.side-menu-big { #side-menu.side-menu-big {
max-width: 290px; max-width: 290px;
height: 100vh;
} }
.side-menu-categories { .side-menu-categories {
@@ -311,10 +326,6 @@
.side-menu-category { .side-menu-category {
padding: 10px 0; padding: 10px 0;
} }
#side-menu.side-menu-big {
height: 100vh;
}
} }
@media screen and (min-width: 1024px) { @media screen and (min-width: 1024px) {
+57 -60
View File
@@ -9,6 +9,9 @@ use OCA\SideMenu\Service\AppRepository;
use OCA\SideMenu\Service\CategoryRepository; use OCA\SideMenu\Service\CategoryRepository;
use OCA\SideMenu\Service\ConfigProxy; use OCA\SideMenu\Service\ConfigProxy;
use OCP\AppFramework\App; use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\IUserSession; use OCP\IUserSession;
use OCP\Util; use OCP\Util;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
@@ -18,7 +21,7 @@ use Psr\Container\ContainerInterface;
* *
* @author Simon Vieille <simon@deblan.fr> * @author Simon Vieille <simon@deblan.fr>
*/ */
class Application extends App class Application extends App implements IBootstrap
{ {
public const APP_ID = 'side_menu'; public const APP_ID = 'side_menu';
@@ -44,16 +47,9 @@ class Application extends App
public function __construct(array $urlParams = []) public function __construct(array $urlParams = [])
{ {
parent::__construct(self::APP_ID, $urlParams); parent::__construct(self::APP_ID, $urlParams);
$this->config = OC::$server->getConfig();
$this->cspnm = OC::$server->getContentSecurityPolicyNonceManager();
$this->user = OC::$server[IUserSession::class]->getUser();
} }
/** protected function isEnabled(): bool
* Checks if this app is enabled.
*/
public function isEnabled(): bool
{ {
$enabled = true; $enabled = true;
$isForced = (bool) $this->config->getAppValue(self::APP_ID, 'force', '0'); $isForced = (bool) $this->config->getAppValue(self::APP_ID, 'force', '0');
@@ -74,64 +70,65 @@ class Application extends App
return $enabled; return $enabled;
} }
/** protected function addAssets()
* Registes services.
*/
public function registerServices()
{
$container = $this->getContainer();
$container->registerService('AppRepository', function (ContainerInterface $c) {
return new AppRepository();
});
$container->registerService('CategoryRepository', function (ContainerInterface $c) {
return new CategoryRepository();
});
$container->registerService('ConfigProxy', function (ContainerInterface $c) {
return new ConfigProxy();
});
}
/**
* Registers assets.
*/
public function registerAssets()
{ {
Util::addScript(self::APP_ID, 'sideMenu'); Util::addScript(self::APP_ID, 'sideMenu');
Util::addStyle(self::APP_ID, 'sideMenu'); Util::addStyle(self::APP_ID, 'sideMenu');
$stylesheet = OC::$server->getURLGenerator()->linkToRoute( $assets = [
'side_menu.Css.stylesheet', 'stylesheet' => [
[ 'route' => 'side_menu.Css.stylesheet',
'v' => $this->config->getAppValue(self::APP_ID, 'cache', '0'), 'type' => 'link',
] 'route_attr' => 'href',
); 'attr' => [
$script = OC::$server->getURLGenerator()->linkToRoute(
'side_menu.Js.script',
[
'v' => $this->config->getAppValue(self::APP_ID, 'cache', '0'),
]
);
Util::addHeader(
'link',
[
'href' => $stylesheet,
'rel' => 'stylesheet', 'rel' => 'stylesheet',
], ],
'' ],
); 'script' => [
'route' => 'side_menu.Js.script',
Util::addHeader( 'type' => 'script',
'script', 'route_attr' => 'src',
[ 'attr' => [
'src' => $script,
'nonce' => $this->cspnm->getNonce(), 'nonce' => $this->cspnm->getNonce(),
], ],
'' ],
); ];
$cache = $this->config->getAppValue(self::APP_ID, 'cache', '0');
foreach ($assets as $value) {
$route = OC::$server->getURLGenerator()->linkToRoute($value['route'], ['v' => $cache]);
$value['attr'][$value['route_attr']] = $route;
Util::addHeader($value['type'], $value['attr'], '');
}
}
public function register(IRegistrationContext $context): void
{
$context->registerService('AppRepository', function () {
return new AppRepository();
});
$context->registerService('CategoryRepository', function () {
return new CategoryRepository();
});
$context->registerService('ConfigProxy', function () {
return new ConfigProxy();
});
}
public function boot(IBootContext $context): void
{
$this->config = OC::$server->getConfig();
$this->cspnm = OC::$server->getContentSecurityPolicyNonceManager();
$this->user = OC::$server[IUserSession::class]->getUser();
if (!$this->isEnabled()) {
return;
}
$this->addAssets();
} }
} }
+3 -3
View File
@@ -69,7 +69,7 @@ class AdminSettingController extends Controller
public function exportConfiguration() public function exportConfiguration()
{ {
$keys = $this->config->getAppKeys(Application::APP_ID); $keys = $this->config->getAppKeys(Application::APP_ID);
$config = []; $appConfig = [];
$excludedKeys = [ $excludedKeys = [
'cache', 'cache',
'cache-categories', 'cache-categories',
@@ -80,11 +80,11 @@ class AdminSettingController extends Controller
continue; continue;
} }
$config[$key] = $this->config->getAppValue(Application::APP_ID, $key); $appConfig[$key] = $this->config->getAppValue(Application::APP_ID, $key);
} }
return new DataDownloadResponse( return new DataDownloadResponse(
json_encode($config, JSON_PRETTY_PRINT), json_encode($appConfig, JSON_PRETTY_PRINT),
'config.json', 'config.json',
'text/json' 'text/json'
); );
-1
View File
@@ -53,7 +53,6 @@ class AppRepository
{ {
$navigation = $this->ocApp->getNavigation(); $navigation = $this->ocApp->getNavigation();
$appCategoriesCustom = $this->config->getAppValueArray('apps-categories-custom', '[]'); $appCategoriesCustom = $this->config->getAppValueArray('apps-categories-custom', '[]');
$categoriesCustom = $this->config->getAppValueArray('categories-custom', '[]');
$categories = $this->categoryRepository->getOrderedCategories(); $categories = $this->categoryRepository->getOrderedCategories();
$apps = $this->ocApp->listAllApps(); $apps = $this->ocApp->listAllApps();
$visibleApps = []; $visibleApps = [];
+12
View File
@@ -110,6 +110,18 @@ class Admin implements ISettings
$darkModeBackgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkenPrimaryColor); $darkModeBackgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkenPrimaryColor);
$parameters = [ $parameters = [
'defaults' => [
'background-color' => $darkenPrimaryColor,
'background-color-to' => $darkenPrimaryColor,
'current-app-background-color' => $darkenPrimaryColor2,
'text-color' => $textColor,
'loader-color' => $lightenPrimaryColor,
'dark-mode-background-color' => $darkenPrimaryColor,
'dark-mode-background-color-to' => $darkenPrimaryColor,
'dark-mode-current-app-background-color' => $darkenPrimaryColor2,
'dark-mode-text-color' => $textColor,
'dark-mode-loader-color' => $textColor,
],
'background-color' => $backgroundColor, 'background-color' => $backgroundColor,
'background-color-to' => $backgroundColorTo, 'background-color-to' => $backgroundColorTo,
'background-color-opacity' => $this->config->getAppValueInt('background-color-opacity', '100'), 'background-color-opacity' => $this->config->getAppValueInt('background-color-opacity', '100'),
+17 -17
View File
@@ -2,7 +2,7 @@
"license": "agpl", "license": "agpl",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "NODE_ENV=production webpack --progress --hide-modules --config webpack.js", "build": "NODE_ENV=production webpack --progress --config webpack.js",
"dev": "NODE_ENV=development webpack --progress --config webpack.js", "dev": "NODE_ENV=development webpack --progress --config webpack.js",
"watch": "NODE_ENV=development webpack --progress --watch --config webpack.js", "watch": "NODE_ENV=development webpack --progress --watch --config webpack.js",
"lint": "eslint --ext .js,.vue src", "lint": "eslint --ext .js,.vue src",
@@ -14,46 +14,46 @@
"@nextcloud/axios": "^1.8.0", "@nextcloud/axios": "^1.8.0",
"@nextcloud/vue": "^1.5.0", "@nextcloud/vue": "^1.5.0",
"axios": "^0.24.0", "axios": "^0.24.0",
"trim": "0.0.1", "trim": "^1.0.1",
"vue": "^2.6.11" "vue": "^2.6.11"
}, },
"browserslist": [ "browserslist": [
"extends @nextcloud/browserslist-config" "extends @nextcloud/browserslist-config"
], ],
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=16.0.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.9.0", "@babel/core": "^7.9.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "^7.9.0", "@babel/preset-env": "^7.9.0",
"@nextcloud/browserslist-config": "^1.0.0", "@nextcloud/browserslist-config": "^1.0.0",
"@nextcloud/eslint-config": "^8.1.2",
"babel-eslint": "^10.1.0", "babel-eslint": "^10.1.0",
"babel-loader": "^8.1.0", "babel-loader": "^8.1.0",
"css-loader": "^3.4.2", "css-loader": "^3.4.2",
"eslint": "^5.16.0", "eslint": "^8.0.0",
"eslint-config-nextcloud": "0.1.1", "eslint-config-standard": "^17.0.0",
"eslint-config-standard": "^12.0.0",
"eslint-import-resolver-webpack": "^0.12.1", "eslint-import-resolver-webpack": "^0.12.1",
"eslint-loader": "^3.0.3",
"eslint-plugin-import": "^2.20.0", "eslint-plugin-import": "^2.20.0",
"eslint-plugin-nextcloud": "^0.3.0", "eslint-plugin-nextcloud": "^0.3.0",
"eslint-plugin-node": "^10.0.0", "eslint-plugin-node": "^10.0.0",
"eslint-plugin-promise": "^4.2.1", "eslint-plugin-promise": "^6.0.0",
"eslint-plugin-standard": "^4.0.1", "eslint-plugin-standard": "^4.0.1",
"eslint-plugin-vue": "^5.2.3", "eslint-plugin-vue": "^9.0.0",
"eslint-webpack-plugin": "^3.0.0",
"file-loader": "^6.0.0", "file-loader": "^6.0.0",
"node-sass": "^4.13.1", "sass": "^1.49.9",
"sass-loader": "^8.0.2", "sass-loader": "^13.0.2",
"stylelint": "^8.4.0", "stylelint": "^14.0.0",
"stylelint-config-recommended-scss": "^3.3.0", "stylelint-config-recommended-scss": "^7.0.0",
"stylelint-scss": "^3.16.0", "stylelint-scss": "^4.0.0",
"stylelint-webpack-plugin": "^0.10.5", "stylelint-webpack-plugin": "^3.3.0",
"url-loader": "^4.0.0", "url-loader": "^4.0.0",
"vue-loader": "^15.9.1", "vue-loader": "^15.9.1",
"vue-template-compiler": "^2.6.11", "vue-template-compiler": "^2.6.11",
"webpack": "^4.42.0", "webpack": "^5.0.0",
"webpack-cli": "^3.3.11", "webpack-cli": "^4.0.0",
"webpack-merge": "^4.2.2", "webpack-merge": "^4.2.2",
"webpack-node-externals": "^1.7.2" "webpack-node-externals": "^1.7.2"
} }
Binary file not shown.

Before

Width:  |  Height:  |  Size: 254 KiB

After

Width:  |  Height:  |  Size: 321 KiB

+3 -3
View File
@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<div> <div>
<ul class="side-menu-setting-list"> <ul class="side-menu-setting-list">
<li v-for="item in values" class="side-menu-setting-list-item" v-on:click="showEditForm(item)"> <li v-for="item in values" class="side-menu-setting-list-item" v-on:click="showEditForm(item)">
<span v-html="item.en"></span> <span v-text="item.en"></span>
</li> </li>
</ul> </ul>
@@ -29,7 +29,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<Modal v-if="addForm" @close="hideAddForm"> <Modal v-if="addForm" @close="hideAddForm">
<div class="modal__content"> <div class="modal__content">
<div v-for="lang in langs"> <div v-for="lang in langs">
<span class="lang" v-html="lang"></span> <span class="lang" v-text="lang"></span>
<input type="text" v-model="newValue[lang]" required> <input type="text" v-model="newValue[lang]" required>
</div> </div>
@@ -42,7 +42,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<Modal v-if="editForm" @close="hideEditForm"> <Modal v-if="editForm" @close="hideEditForm">
<div class="modal__content"> <div class="modal__content">
<div v-for="lang in langs"> <div v-for="lang in langs">
<span class="lang" v-html="lang"></span> <span class="lang" v-text="lang"></span>
<input type="text" v-model="editValue[lang]" required> <input type="text" v-model="editValue[lang]" required>
</div> </div>
+2 -2
View File
@@ -17,9 +17,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<template> <template>
<div v-bind:class="classes"> <div v-bind:class="classes">
<a v-if="link !== null" v-bind:href="link"> <a v-if="link !== null" v-bind:href="link">
<img v-bind:src="image"> <img v-bind:src="image" alt="Logo">
</a> </a>
<img v-else v-bind:src="image"> <img v-else v-bind:src="image" alt="Logo">
</div> </div>
</template> </template>
+2 -2
View File
@@ -91,13 +91,13 @@ export default {
for (let element of links) { for (let element of links) {
let href = element.getAttribute('href') let href = element.getAttribute('href')
var parent = element.parentNode let parent = element.parentNode
if (!parent) { if (!parent) {
continue continue
} }
var dataId = parent.getAttribute('data-id') let dataId = parent.getAttribute('data-id')
dataId = dataId !== null ? dataId : '' dataId = dataId !== null ? dataId : ''
if (!parent.classList.contains('app-top-side-menu') && !parent.classList.contains('app-hidden') && !menuIsHidden) { if (!parent.classList.contains('app-top-side-menu') && !parent.classList.contains('app-hidden') && !menuIsHidden) {
+1 -1
View File
@@ -18,7 +18,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<li v-bind:class="classes"> <li v-bind:class="classes">
<a v-bind:href="href" :target="target" v-bind:title="label"> <a v-bind:href="href" :target="target" v-bind:title="label">
<span class="side-menu-app-icon" v-html="icon"></span> <span class="side-menu-app-icon" v-html="icon"></span>
<span class="side-menu-app-text" v-html="label"></span> <span class="side-menu-app-text" v-text="label"></span>
</a> </a>
</li> </li>
</template> </template>
+1 -2
View File
@@ -34,7 +34,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<Loader v-if="!items.length" /> <Loader v-if="!items.length" />
<div class="side-menu-category" v-for="category in items"> <div class="side-menu-category" v-for="category in items">
<h2 class="side-menu-category-title" v-if="category.name != ''" v-html="category.name"></h2> <h2 class="side-menu-category-title" v-if="category.name != ''" v-text="category.name"></h2>
<ul class="side-menu-apps-list"> <ul class="side-menu-apps-list">
<SideMenuBigApp <SideMenuBigApp
@@ -53,7 +53,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</template> </template>
<script> <script>
import trim from 'trim'
import axios from 'axios' import axios from 'axios'
import OpenerButton from './OpenerButton' import OpenerButton from './OpenerButton'
import CloserButton from './CloserButton' import CloserButton from './CloserButton'
+2 -2
View File
@@ -17,8 +17,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<template> <template>
<li v-bind:class="classes"> <li v-bind:class="classes">
<a v-bind:href="href" :target="target" v-bind:title="label"> <a v-bind:href="href" :target="target" v-bind:title="label">
<img class="side-menu-app-icon" v-bind:src="icon"></span> <img class="side-menu-app-icon" v-bind:src="icon" v-bind:alt="label" />
<span class="side-menu-app-text" v-html="label"></span> <span class="side-menu-app-text" v-text="label"></span>
</a> </a>
</li> </li>
</template> </template>
+1 -2
View File
@@ -32,7 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<Loader v-if="!items.length" /> <Loader v-if="!items.length" />
<div class="side-menu-category" v-for="category in items"> <div class="side-menu-category" v-for="category in items">
<h2 class="side-menu-category-title" v-if="category.name != ''" v-html="category.name"></h2> <h2 class="side-menu-category-title" v-if="category.name != ''" v-text="category.name"></h2>
<ul class="side-menu-apps-list"> <ul class="side-menu-apps-list">
<SideMenuBigApp <SideMenuBigApp
@@ -51,7 +51,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
</template> </template>
<script> <script>
import trim from 'trim'
import axios from 'axios' import axios from 'axios'
import OpenerButton from './OpenerButton' import OpenerButton from './OpenerButton'
import CloserButton from './CloserButton' import CloserButton from './CloserButton'
+23 -5
View File
@@ -79,17 +79,20 @@ const saveSettings = (key) => {
++value ++value
} }
const progress = document.querySelector('#side-menu-save-progress')
progress.style.width = '40px';
progress.style.marginLeft = '5px';
const callbacks = { const callbacks = {
success: () => { success: () => {
OC.msg.finishedSuccess( const percent = parseInt((key + 1) * 100 / size);
selector,
t('side_menu', (key + 1) + '/' + size) progress.setAttribute('value', percent)
)
if (key < size - 1) { if (key < size - 1) {
saveSettings(key + 1) saveSettings(key + 1)
} else { } else {
OC.msg.finishedSuccess(selector, t('side_menu', 'Saved! Page is reloading...'))
location.reload() location.reload()
} }
}, },
@@ -131,6 +134,8 @@ const updateAppsCategoriesCustom = () => {
} }
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
$('*[data-toggle="tooltip"]').tooltip();
if (document.querySelector('#side-menu-categories-custom')) { if (document.querySelector('#side-menu-categories-custom')) {
const View = Vue.extend(AdminCategoriesCustom) const View = Vue.extend(AdminCategoriesCustom)
const adminCategoriesCustom = new View({}) const adminCategoriesCustom = new View({})
@@ -147,6 +152,19 @@ document.addEventListener('DOMContentLoaded', () => {
saveSettings(0) saveSettings(0)
}) })
const resets = document.querySelectorAll('.btn-reset')
for (let btn of resets) {
btn.addEventListener('click', (event) => {
const target = event.target
const values = JSON.parse(target.getAttribute('data-reset'))
for (let i in values) {
document.querySelector(`#${i}`).value = values[i]
}
})
}
const displays = document.querySelectorAll('.side-menu-display') const displays = document.querySelectorAll('.side-menu-display')
for (let display of displays) { for (let display of displays) {
+12 -4
View File
@@ -3,8 +3,8 @@
"No": "Ne" "No": "Ne"
"Yes": "Ano" "Yes": "Ano"
"Menu": "Nabídka" "Menu": "Nabídka"
'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.': 'Pro otevření/skrytí postranní nabídky použijte zkratku <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span>. Pro pohyb po použijte klávesu <span class="keyboard-key">tab</span>.' 'Use the shortcut <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> to open and to hide the side menu. Use <span class="keyboard-key">tab</span> to navigate.': 'Pro otevření/skrytí postranní nabídky použijte zkratku <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">O</span> („O“ jako otevřít). Pro pohyb po použijte klávesu <span class="keyboard-key">Tab</span>.'
"Top menu": "Hlavní nabídka" "Top menu": "Horní nabídka"
"Apps that not must be moved in the side menu": "Aplikace, které nepřesouvat do postranní nabídky" "Apps that not must be moved in the side menu": "Aplikace, které nepřesouvat do postranní nabídky"
"If there is no selection then the global configuration is applied.": "Pokud neexistuje žádný výběr, je uplatněno globální nastavení." "If there is no selection then the global configuration is applied.": "Pokud neexistuje žádný výběr, je uplatněno globální nastavení."
"Experimental": "Experimentální" "Experimental": "Experimentální"
@@ -62,7 +62,7 @@
"Export the configuration": "Exportovat nastavení" "Export the configuration": "Exportovat nastavení"
"Purge the cache": "Vyprázdnit mezipaměť" "Purge the cache": "Vyprázdnit mezipaměť"
"Show the link to settings": "Zobrazit odkaz na nastavení" "Show the link to settings": "Zobrazit odkaz na nastavení"
"The menu is enabled by default for users": "Nabídka je ve výchozím stavu zapnutá pro uživatele" "The menu is enabled by default for users": "Nabídka je ve výchozím stavu pro uživatele zapnutá"
"Except when the configuration is forced.": "S výjimkou, kdy je nastavení vynuceno." "Except when the configuration is forced.": "S výjimkou, kdy je nastavení vynuceno."
"Apps that should not be displayed in the menu": "Aplikace, které by neměly být v nabídce zobrazeny" "Apps that should not be displayed in the menu": "Aplikace, které by neměly být v nabídce zobrazeny"
"This feature is only compatible with the <code>big menu</code> display.": "Tato funkce je kompatibilní pouze s <code>velkou nabídkou</ code>." "This feature is only compatible with the <code>big menu</code> display.": "Tato funkce je kompatibilní pouze s <code>velkou nabídkou</ code>."
@@ -78,7 +78,15 @@
"Dark mode colors": "Barvy tmavého režimu" "Dark mode colors": "Barvy tmavého režimu"
"With categories": "S kategoriemi" "With categories": "S kategoriemi"
"Custom categories": "Vlastní kategorie" "Custom categories": "Vlastní kategorie"
"Customize application categories": "Personnaliser les catégories des applications"
"Customize application categories": "Přizpůsobte kategorie aplikací" "Customize application categories": "Přizpůsobte kategorie aplikací"
"Apps only visible in the top menu": "Aplikace jsou viditelné pouze v horní nabídce " "Apps only visible in the top menu": "Aplikace jsou viditelné pouze v horní nabídce "
"Apps visible in the top and side menus": "Aplikace viditelné v horní a boční nabídce" "Apps visible in the top and side menus": "Aplikace viditelné v horní a boční nabídce"
"Reset to default": "Vrátit zpět na výchozí hodnoty"
"Hidden icon": "Skrytá ikona"
"Small icon": "Malá ikona"
"Normal icon": "Normální ikona"
"Big icon": "Velká ikona"
"Hidden text": "Skrytý text"
"Small text": "Malý text"
"Normal text": "Normální text"
"Big text": "Velký text"
+9
View File
@@ -81,3 +81,12 @@
"Customize application categories": "Anwendungskategorien anpassen" "Customize application categories": "Anwendungskategorien anpassen"
"Apps only visible in the top menu": "Apps nur im oberen Menü sichtbar " "Apps only visible in the top menu": "Apps nur im oberen Menü sichtbar "
"Apps visible in the top and side menus": "Apps im oberen und seitlichen Menü sichtbar" "Apps visible in the top and side menus": "Apps im oberen und seitlichen Menü sichtbar"
"Reset to default": "Auf Standard zurücksetzen"
"Hidden icon": "Verstecktes Symbol"
"Small icon": "Kleines Symbol"
"Normal icon": "Normales Symbol"
"Big icon": "Große Ikone"
"Hidden text": "Versteckter Text"
"Small text": "Kleiner Text"
"Normal text": "Normaler Text"
"Big text": "Großer Text"
+9
View File
@@ -15,6 +15,14 @@
"Small": "Petit" "Small": "Petit"
"Normal": "Normal" "Normal": "Normal"
"Big": "Gros" "Big": "Gros"
"Hidden icon": "Icône masqué"
"Small icon": "Petit icône"
"Normal icon": "Icône normal"
"Big icon": "Gros icône"
"Hidden text": "Text masqué"
"Small text": "Texte petit"
"Normal text": "Texte normal"
"Big text": "Gros texte"
"Colors": "Couleurs" "Colors": "Couleurs"
"Background color": "Couleur de fond" "Background color": "Couleur de fond"
"Background color of current app": "Couleur de fond de l'application en cours" "Background color of current app": "Couleur de fond de l'application en cours"
@@ -81,3 +89,4 @@
"Customize application categories": "Personnaliser les catégories des applications" "Customize application categories": "Personnaliser les catégories des applications"
"Apps only visible in the top menu": "Applications visibles uniquement dans le menu supérieur" "Apps only visible in the top menu": "Applications visibles uniquement dans le menu supérieur"
"Apps visible in the top and side menus": "Applications visibles dans le menus supérieur et latéral" "Apps visible in the top and side menus": "Applications visibles dans le menus supérieur et latéral"
"Reset to default": "Restaurer les valeurs par défaut"
+9
View File
@@ -81,3 +81,12 @@
"Customize application categories": "自定义应用程序类别" "Customize application categories": "自定义应用程序类别"
"Apps only visible in the top menu": "应用程序仅在顶部菜单中可见" "Apps only visible in the top menu": "应用程序仅在顶部菜单中可见"
"Apps visible in the top and side menus": "顶部和侧边菜单中可见的应用程序" "Apps visible in the top and side menus": "顶部和侧边菜单中可见的应用程序"
"Reset to default": "重置为默认设置"
"Hidden icon": "隐藏图标"
"Small icon": "小图标"
"Normal icon": "正常图标"
"Big icon": "大图标"
"Hidden text": "隐藏文字"
"Small text": "小文本"
"Normal text": "普通文本"
"Big text": "大文本"
+2 -2
View File
@@ -2,7 +2,7 @@ const alwaysDisplayed = function() {
const elements = querySelectorAll('*') const elements = querySelectorAll('*')
const fixedElements = [] const fixedElements = []
for (var element of elements) { for (let element of elements) {
if (typeof element !== 'object') { if (typeof element !== 'object') {
continue continue
} }
@@ -44,7 +44,7 @@ const alwaysDisplayed = function() {
fixedElements.push(element) fixedElements.push(element)
} }
for (var i in fixedElements) { for (let i in fixedElements) {
const element = fixedElements[i] const element = fixedElements[i]
const computedStyle = window.getComputedStyle(element, null) const computedStyle = window.getComputedStyle(element, null)
const left = computedStyle.getPropertyValue('left') const left = computedStyle.getPropertyValue('left')
+2 -3
View File
@@ -43,7 +43,7 @@ const updateTopMenu = function() {
return return
} }
navigationAppsHtml = '' let navigationAppsHtml = ''
for (let app of apps) { for (let app of apps) {
const dataId = app.getAttribute('data-id') const dataId = app.getAttribute('data-id')
@@ -71,7 +71,6 @@ const updateTopMenu = function() {
if (targetBlankApps.indexOf(dataId) !== -1) { if (targetBlankApps.indexOf(dataId) !== -1) {
querySelector('a', app).setAttribute('target', '_blank') querySelector('a', app).setAttribute('target', '_blank')
} }
} }
navigationApps.innerHTML = navigationAppsHtml navigationApps.innerHTML = navigationAppsHtml
@@ -202,7 +201,7 @@ const updateTopMenu = function() {
menuCache = menu.innerHTML + menu.nextSibling.innerHTML menuCache = menu.innerHTML + menu.nextSibling.innerHTML
} }
for (let i = 0; i < 3000; i+= 100) { for (let i = 0; i < 4000; i+= 100) {
setTimeout(updateTopMenu, i) setTimeout(updateTopMenu, i)
} }
+23
View File
@@ -96,6 +96,10 @@ if ($_['always-displayed']) {
const headerMenuOpener = querySelector('#header .side-menu-opener') const headerMenuOpener = querySelector('#header .side-menu-opener')
const sideMenuOpener = querySelectorAll('#side-menu .side-menu-opener') const sideMenuOpener = querySelectorAll('#side-menu .side-menu-opener')
if (!headerMenuOpener) {
return
}
sideMenuFocus = () => { sideMenuFocus = () => {
let a = querySelector('.side-menu-app.active a', sideMenu) let a = querySelector('.side-menu-app.active a', sideMenu)
@@ -149,6 +153,8 @@ if ($_['always-displayed']) {
if (a !== null) { if (a !== null) {
a.focus() a.focus()
} }
headerMenuOpener.blur()
}) })
for (let opener of sideMenuOpener) { for (let opener of sideMenuOpener) {
@@ -171,6 +177,21 @@ if ($_['always-displayed']) {
sideMenuFocus() sideMenuFocus()
} }
}) })
const sideMenuObserver = new MutationObserver((e) => {
if (body.getAttribute('id') !== 'body-settings') {
return
}
body.classList.toggle('body-settings-side-menu', sideMenu.classList.contains('open'))
})
sideMenuObserver.observe(sideMenu, {
attributes: true,
attributeFilter: ['class'],
childList: false,
characterData: false
})
}) })
body.appendChild(sideMenuContainer) body.appendChild(sideMenuContainer)
@@ -180,11 +201,13 @@ if ($_['always-displayed']) {
<?php require_once __DIR__.'/_loaderEnabled.js'; ?> <?php require_once __DIR__.'/_loaderEnabled.js'; ?>
<?php endif; ?> <?php endif; ?>
if (nextcloud) {
<?php if ($_['opener-position'] === 'before'): ?> <?php if ($_['opener-position'] === 'before'): ?>
nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud) nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud)
<?php else: ?> <?php else: ?>
nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud.nextSibling) nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud.nextSibling)
<?php endif; ?> <?php endif; ?>
}
<?php if (!empty($_['top-menu-apps']) || !empty($_['top-side-menu-apps'])): ?> <?php if (!empty($_['top-menu-apps']) || !empty($_['top-side-menu-apps'])): ?>
const topMenuApps = <?php echo json_encode($_['top-menu-apps']), "\n"; ?> const topMenuApps = <?php echo json_encode($_['top-menu-apps']), "\n"; ?>
+50 -12
View File
@@ -39,6 +39,8 @@ $choicesSizes = [
'Big' => 'big', 'Big' => 'big',
]; ];
$labelShowHideApps = 'Show and hide the list of applications';
$labelReset = 'Reset to default';
?> ?>
<div id="side-menu-section"> <div id="side-menu-section">
<div class="section"> <div class="section">
@@ -67,6 +69,10 @@ $choicesSizes = [
class="side-menu-setting side-menu-setting-live" class="side-menu-setting side-menu-setting-live"
value="<?php print_unescaped($_['background-color-to']); ?>"> value="<?php print_unescaped($_['background-color-to']); ?>">
<div class="theme-undo icon icon-history btn-reset" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-background-color' => $_['defaults']['background-color'],
'side-menu-background-color-to' => $_['defaults']['background-color-to'],
])) ?>"></div>
<div> <div>
<em> <em>
<?php p($l->t('Transparent')); ?> <?php p($l->t('Transparent')); ?>
@@ -102,6 +108,10 @@ $choicesSizes = [
type="color" type="color"
class="side-menu-setting side-menu-setting-live" class="side-menu-setting side-menu-setting-live"
value="<?php print_unescaped($_['current-app-background-color']); ?>"> value="<?php print_unescaped($_['current-app-background-color']); ?>">
<div class="theme-undo icon icon-history btn-reset" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-current-app-background-color' => $_['defaults']['current-app-background-color'],
])) ?>"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -118,6 +128,10 @@ $choicesSizes = [
type="color" type="color"
class="side-menu-setting side-menu-setting-live" class="side-menu-setting side-menu-setting-live"
value="<?php print_unescaped($_['text-color']); ?>"> value="<?php print_unescaped($_['text-color']); ?>">
<div class="theme-undo icon icon-history btn-reset" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-text-color' => $_['defaults']['text-color'],
])) ?>"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -134,6 +148,10 @@ $choicesSizes = [
type="color" type="color"
class="side-menu-setting" class="side-menu-setting"
value="<?php print_unescaped($_['loader-color']); ?>"> value="<?php print_unescaped($_['loader-color']); ?>">
<div class="theme-undo icon icon-history btn-reset" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-loader-color' => $_['defaults']['loader-color'],
])) ?>"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -227,16 +245,23 @@ $choicesSizes = [
</div> </div>
<div class="side-menu-setting-form side-menu-setting-form-long"> <div class="side-menu-setting-form side-menu-setting-form-long">
<input <input
id="side-menu-dark-mode-background-color"
name="dark-mode-background-color" name="dark-mode-background-color"
type="color" type="color"
class="side-menu-setting" class="side-menu-setting"
value="<?php print_unescaped($_['dark-mode-background-color']); ?>"> value="<?php print_unescaped($_['dark-mode-background-color']); ?>">
<input <input
id="side-menu-dark-mode-background-color-to"
name="dark-mode-background-color-to" name="dark-mode-background-color-to"
type="color" type="color"
class="side-menu-setting" class="side-menu-setting"
value="<?php print_unescaped($_['dark-mode-background-color-to']); ?>"> value="<?php print_unescaped($_['dark-mode-background-color-to']); ?>">
<div class="theme-undo icon icon-history btn-reset" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-dark-mode-background-color' => $_['defaults']['dark-mode-background-color'],
'side-menu-dark-mode-background-color-to' => $_['defaults']['dark-mode-background-color-to'],
])) ?>"></div>
<div> <div>
<em> <em>
<?php p($l->t('Transparent')); ?> <?php p($l->t('Transparent')); ?>
@@ -266,10 +291,15 @@ $choicesSizes = [
</div> </div>
<div class="side-menu-setting-form side-menu-setting-form-long"> <div class="side-menu-setting-form side-menu-setting-form-long">
<input <input
id="side-menu-dark-mode-current-app-background-color"
name="dark-mode-current-app-background-color" name="dark-mode-current-app-background-color"
type="color" type="color"
class="side-menu-setting" class="side-menu-setting"
value="<?php print_unescaped($_['dark-mode-current-app-background-color']); ?>"> value="<?php print_unescaped($_['dark-mode-current-app-background-color']); ?>">
<div class="theme-undo icon icon-history btn-reset" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-dark-mode-current-app-background-color' => $_['defaults']['dark-mode-current-app-background-color'],
])) ?>"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -281,10 +311,15 @@ $choicesSizes = [
</div> </div>
<div class="side-menu-setting-form side-menu-setting-form-long"> <div class="side-menu-setting-form side-menu-setting-form-long">
<input <input
id="side-menu-dark-mode-text-color"
name="dark-mode-text-color" name="dark-mode-text-color"
type="color" type="color"
class="side-menu-setting" class="side-menu-setting"
value="<?php print_unescaped($_['dark-mode-text-color']); ?>"> value="<?php print_unescaped($_['dark-mode-text-color']); ?>">
<div class="theme-undo icon icon-history btn-reset" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-dark-mode-text-color' => $_['defaults']['dark-mode-text-color'],
])) ?>"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -296,10 +331,15 @@ $choicesSizes = [
</div> </div>
<div class="side-menu-setting-form side-menu-setting-form-long"> <div class="side-menu-setting-form side-menu-setting-form-long">
<input <input
id="side-menu-dark-mode-loader-color"
name="dark-mode-loader-color" name="dark-mode-loader-color"
type="color" type="color"
class="side-menu-setting" class="side-menu-setting"
value="<?php print_unescaped($_['dark-mode-loader-color']); ?>"> value="<?php print_unescaped($_['dark-mode-loader-color']); ?>">
<div class="theme-undo icon icon-history btn-reset" data-toggle="tooltip" data-original-title="<?php echo p($l->t($labelReset)); ?>" data-reset="<?php echo htmlentities(json_encode([
'side-menu-dark-mode-loader-color' => $_['defaults']['dark-mode-loader-color'],
])) ?>"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -611,7 +651,7 @@ $choicesSizes = [
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
<a class="side-menu-toggler" data-target="#big-menu-hidden-apps" href="#_"> <a class="side-menu-toggler" data-target="#big-menu-hidden-apps" href="#_">
🖱️ <?php p($l->t('Show and hide the list of applications')); ?> 🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a> </a>
<div class="side-menu-setting" data-name="big-menu-hidden-apps" id="big-menu-hidden-apps" data-checkbox style="display: none"> <div class="side-menu-setting" data-name="big-menu-hidden-apps" id="big-menu-hidden-apps" data-checkbox style="display: none">
@@ -659,7 +699,7 @@ $choicesSizes = [
<select id="side-menu-size-icon" name="size-icon" class="side-menu-setting"> <select id="side-menu-size-icon" name="size-icon" class="side-menu-setting">
<?php foreach ($choicesSizes as $label => $value): ?> <?php foreach ($choicesSizes as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['size-icon']): ?>selected<?php endif; ?>> <option value="<?php echo $value ?>" <?php if ($value === $_['size-icon']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?> icon <?php echo $l->t($label.' icon'); ?>
</option> </option>
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
@@ -667,7 +707,7 @@ $choicesSizes = [
<select id="side-menu-size-text" name="size-text" class="side-menu-setting"> <select id="side-menu-size-text" name="size-text" class="side-menu-setting">
<?php foreach ($choicesSizes as $label => $value): ?> <?php foreach ($choicesSizes as $label => $value): ?>
<option value="<?php echo $value ?>" <?php if ($value === $_['size-text']): ?>selected<?php endif; ?>> <option value="<?php echo $value ?>" <?php if ($value === $_['size-text']): ?>selected<?php endif; ?>>
<?php echo $l->t($label); ?> text <?php echo $l->t($label.' text'); ?>
</option> </option>
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
@@ -680,7 +720,7 @@ $choicesSizes = [
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
<a class="side-menu-toggler" data-target="#target-blank-apps" href="#_"> <a class="side-menu-toggler" data-target="#target-blank-apps" href="#_">
🖱️ <?php p($l->t('Show and hide the list of applications')); ?> 🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a> </a>
<div class="side-menu-setting" data-name="target-blank-apps" id="target-blank-apps" data-checkbox style="display: none"> <div class="side-menu-setting" data-name="target-blank-apps" id="target-blank-apps" data-checkbox style="display: none">
@@ -734,7 +774,7 @@ $choicesSizes = [
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
<a class="side-menu-toggler" data-target="#top-menu-apps" href="#_"> <a class="side-menu-toggler" data-target="#top-menu-apps" href="#_">
🖱️ <?php p($l->t('Show and hide the list of applications')); ?> 🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a> </a>
<div class="side-menu-setting" data-name="top-menu-apps" id="top-menu-apps" data-checkbox style="display: none"> <div class="side-menu-setting" data-name="top-menu-apps" id="top-menu-apps" data-checkbox style="display: none">
@@ -767,7 +807,7 @@ $choicesSizes = [
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
<a class="side-menu-toggler" data-target="#top-side-menu-apps" href="#_"> <a class="side-menu-toggler" data-target="#top-side-menu-apps" href="#_">
🖱️ <?php p($l->t('Show and hide the list of applications')); ?> 🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a> </a>
<div class="side-menu-setting" data-name="top-side-menu-apps" id="top-side-menu-apps" data-checkbox style="display: none"> <div class="side-menu-setting" data-name="top-side-menu-apps" id="top-side-menu-apps" data-checkbox style="display: none">
@@ -837,11 +877,10 @@ $choicesSizes = [
<div class="side-menu-setting-row"> <div class="side-menu-setting-row">
<div class="side-menu-setting-label"> <div class="side-menu-setting-label">
<?php p($l->t('Customize application categories')); ?> <?php p($l->t('Customize application categories')); ?>
<small><span class="warning"><?php p($l->t('Experimental')); ?></span></small>
</div> </div>
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
<a class="side-menu-toggler" data-target="#apps-categories-custom-list" href="#_"> <a class="side-menu-toggler" data-target="#apps-categories-custom-list" href="#_">
🖱️ <?php p($l->t('Show and hide the list of applications')); ?> 🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a> </a>
<div id="apps-categories-custom-list" style="display: none"> <div id="apps-categories-custom-list" style="display: none">
@@ -957,11 +996,10 @@ $choicesSizes = [
<div class="section" id="more"> <div class="section" id="more">
<button id="side-menu-save" class="btn btn-info"> <button id="side-menu-save" class="btn btn-info">
<?php p($l->t('Save')); ?> <?php p($l->t('Save')); ?>
<progress max="100" value="0" id="side-menu-save-progress"></progress>
</button> </button>
<span id="side-menu-message" class="msg"></span> <a href="<?php echo $urlGenerator->linkToRoute('side_menu.AdminSetting.exportConfiguration') ?>" target="_blank" rel="noopener">
<a href="<?php echo $urlGenerator->linkToRoute('side_menu.AdminSetting.exportConfiguration') ?>" target="_blank">
<button class="btn btn-primary" > <button class="btn btn-primary" >
<?php p($l->t('Export the configuration')); ?> <?php p($l->t('Export the configuration')); ?>
</button> </button>
@@ -979,7 +1017,7 @@ $choicesSizes = [
<span for="side-menu-opener"> <span for="side-menu-opener">
<?php p($l->t('You like this app and you want to support me?')); ?> <?php p($l->t('You like this app and you want to support me?')); ?>
<a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan"> <a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan" rel="noopener">
<button> <button>
<?php p($l->t('Buy me a coffee ☕')); ?> <?php p($l->t('Buy me a coffee ☕')); ?>
</button> </button>
+10 -5
View File
@@ -25,6 +25,8 @@ $choicesYesNo = [
'Yes' => '1', 'Yes' => '1',
]; ];
$labelShowHideApps = 'Show and hide the list of applications';
?> ?>
<div id="side-menu-section"> <div id="side-menu-section">
<?php if ($_['force']): ?> <?php if ($_['force']): ?>
@@ -85,7 +87,7 @@ $choicesYesNo = [
<p> <p>
<a class="side-menu-toggler" data-target="#target-blank-apps" href="#_"> <a class="side-menu-toggler" data-target="#target-blank-apps" href="#_">
🖱️ <?php p($l->t('Show and hide the list of applications')); ?> 🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a> </a>
</p> </p>
@@ -131,7 +133,7 @@ $choicesYesNo = [
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
<p> <p>
<a class="side-menu-toggler" data-target="#top-menu-apps" href="#_"> <a class="side-menu-toggler" data-target="#top-menu-apps" href="#_">
🖱️ <?php p($l->t('Show and hide the list of applications')); ?> 🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a> </a>
</p> </p>
@@ -171,7 +173,7 @@ $choicesYesNo = [
<div class="side-menu-setting-form"> <div class="side-menu-setting-form">
<p> <p>
<a class="side-menu-toggler" data-target="#top-side-menu-apps" href="#_"> <a class="side-menu-toggler" data-target="#top-side-menu-apps" href="#_">
🖱️ <?php p($l->t('Show and hide the list of applications')); ?> 🖱️ <?php p($l->t($labelShowHideApps)); ?>
</a> </a>
</p> </p>
@@ -202,7 +204,10 @@ $choicesYesNo = [
<div class="section"> <div class="section">
<?php if (!$_['force']): ?> <?php if (!$_['force']): ?>
<button id="side-menu-save" class="btn btn-primary"><?php p($l->t('Save')); ?></button> <button id="side-menu-save" class="btn btn-info">
<?php p($l->t('Save')); ?>
<progress max="100" value="0" id="side-menu-save-progress"></progress>
</button>
<span id="side-menu-message" class="msg"></span> <span id="side-menu-message" class="msg"></span>
@@ -213,7 +218,7 @@ $choicesYesNo = [
<span for="side-menu-opener"> <span for="side-menu-opener">
<?php p($l->t('You like this app and you want to support me?')); ?> <?php p($l->t('You like this app and you want to support me?')); ?>
<a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan"> <a style="margin-left: 10px" target="_blank" href="https://www.buymeacoffee.com/deblan" rel="noopener">
<button> <button>
<?php p($l->t('Buy me a coffee ☕')); ?> <?php p($l->t('Buy me a coffee ☕')); ?>
</button> </button>