Compare commits
72 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 291eaa4f83 | |||
| 794d86f69e | |||
| e61e6880a2 | |||
| 4b81fa715c | |||
| 330ee2a43e | |||
| b246fa0281 | |||
| 3bc214b72e | |||
| 64f77b102d | |||
| 9f5143cc25 | |||
| 48737c5300 | |||
| 293e4bf62b | |||
| 049e601f62 | |||
| 16ab6bfece | |||
| 7892ce98d2 | |||
| 2a1e9f5010 | |||
| 05b1b16cb1 | |||
| 0176ef22d4 | |||
| a8ecf3ea46 | |||
| 8d1842f622 | |||
| a0be3757e9 | |||
| 7b2f64c5cd | |||
| 6b1a995d5d | |||
| 814567635d | |||
| 32322a0ab2 | |||
| 95230e9e4a | |||
| e2430866e5 | |||
| 9f9f8f90c8 | |||
| 28fc33ee79 | |||
| f116b8463a | |||
| d8edbae848 | |||
| 4e0c7be2c6 | |||
| 2cb8c22be0 | |||
| 389da47cab | |||
| a6a84ee784 | |||
| 52bbd49d9a | |||
| c0b1701744 | |||
| ee98a49366 | |||
| a67688e779 | |||
| 9afde0dc9d | |||
| 0f73ad42c4 | |||
| 007ac2bb8e | |||
| 8c5b0e9834 | |||
| 59e3b6b85e | |||
| a913bd5ba2 | |||
| 2d32e542cb | |||
| 5d03fbaa49 | |||
| 015493fc08 | |||
| 992e54ac30 | |||
| 67dfb7e833 | |||
| 2ae08f7b77 | |||
| 489321081a | |||
| 66a1528341 | |||
| 64b7f3f534 | |||
| 715dae6ab4 | |||
| e2a9fecac9 | |||
| e2d17022f9 | |||
| 29d79ad589 | |||
| 5a4294fad4 | |||
| d34b41ba94 | |||
| a6016552c9 | |||
| 50c65811a6 | |||
| f64436f0a3 | |||
| 34b1c2809b | |||
| 5d9dc804f8 | |||
| 30072500bc | |||
| a9ca55390d | |||
| 7230863d0a | |||
| d9046a205f | |||
| 0923a9107c | |||
| 1cbdca87df | |||
| 506fa22f4b | |||
| a97e94e2e5 |
@@ -15,8 +15,14 @@ steps:
|
|||||||
- make npm-build
|
- make npm-build
|
||||||
when:
|
when:
|
||||||
branch:
|
branch:
|
||||||
|
exclude:
|
||||||
|
- master
|
||||||
|
include:
|
||||||
- develop
|
- develop
|
||||||
- feature/*
|
- feature/*
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
- pull_request
|
||||||
|
|
||||||
- name: release
|
- name: release
|
||||||
image: deblan/devenv
|
image: deblan/devenv
|
||||||
@@ -34,7 +40,13 @@ steps:
|
|||||||
- make release
|
- make release
|
||||||
when:
|
when:
|
||||||
branch:
|
branch:
|
||||||
|
exclude:
|
||||||
|
- develop
|
||||||
|
- feature/*
|
||||||
|
include:
|
||||||
- master
|
- master
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: artifacts
|
- name: artifacts
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
version: '1'
|
|
||||||
image: deblan/devenv
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
script:
|
|
||||||
- npm install
|
|
||||||
- make npm-build
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
pipeline:
|
||||||
|
dependencies:
|
||||||
|
image: deblan/devenv
|
||||||
|
commands:
|
||||||
|
- npm install
|
||||||
|
when:
|
||||||
|
event: [tag, push, pull_request]
|
||||||
|
|
||||||
|
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
|
||||||
|
files: /var/www/html/artifacts/deblan/side_menu/${CI_COMMIT_TAG/v//}/*
|
||||||
|
when:
|
||||||
|
event: [tag]
|
||||||
@@ -1,5 +1,71 @@
|
|||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## 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
|
||||||
|
### Added
|
||||||
|
* hide the scrollbar when mouse is out (menu always displayed)
|
||||||
|
### Fixed
|
||||||
|
* fix SQL Exception InvalidFieldNameException (#93)
|
||||||
|
|
||||||
|
## 2.3.2
|
||||||
|
### Fixed
|
||||||
|
- fix hidden menu
|
||||||
|
|
||||||
|
## 2.3.1
|
||||||
|
### Fixed
|
||||||
|
- fix #88: does not work with default menu
|
||||||
|
|
||||||
|
## 2.3.0
|
||||||
|
### Added
|
||||||
|
- fix #82: add an option to keep visible an app in both menus
|
||||||
|
- fix #83: add custom categories
|
||||||
|
- add auto-reload when settings are saved
|
||||||
|
|
||||||
|
## 2.2.0
|
||||||
|
### Added
|
||||||
|
- fix #84: update icons
|
||||||
|
- fix #85: use Nextcloud colors by default
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- fix categories order in large menu
|
||||||
|
|
||||||
|
## 2.1.0
|
||||||
|
### Added
|
||||||
|
- add compatibility with Nextcloud 23
|
||||||
|
|
||||||
## 2.0.1
|
## 2.0.1
|
||||||
### Fixed
|
### Fixed
|
||||||
- fix #78: Top menu is broken - invisible apps are shown
|
- fix #78: Top menu is broken - invisible apps are shown
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
===============================
|
===============================
|
||||||
|
|
||||||
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 define apps that must be displayed in the top menu. Fully customisable.
|
You can also add and sort custom categories, define apps that must be displayed in the top menu, etc. Fully customisable.
|
||||||
|
|
||||||
This application is rather suitable for instances that activate a lot of applications.
|
This application is rather suitable for instances that activate a lot of applications.
|
||||||
|
|
||||||
@@ -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)
|
||||||
|
|
||||||
|
[](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
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
use OCA\SideMenu\AppInfo\Application;
|
|
||||||
|
|
||||||
$app = new Application();
|
|
||||||
|
|
||||||
if ($app->isEnabled()) {
|
|
||||||
$app->registerAssets();
|
|
||||||
$app->registerServices();
|
|
||||||
}
|
|
||||||
@@ -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.0.1</version>
|
<version>2.4.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="22"/>
|
<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>
|
||||||
|
|||||||
@@ -97,6 +97,10 @@
|
|||||||
margin-top: -1px;
|
margin-top: -1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#apps-categories-custom-list select {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.side-menu-setting-table {
|
.side-menu-setting-table {
|
||||||
display: table;
|
display: table;
|
||||||
@@ -115,7 +119,7 @@
|
|||||||
|
|
||||||
.side-menu-setting-form {
|
.side-menu-setting-form {
|
||||||
display: table-cell;
|
display: table-cell;
|
||||||
width: 300px;
|
min-width: 300px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-menu-setting-label-short {
|
.side-menu-setting-label-short {
|
||||||
@@ -125,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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -247,6 +257,11 @@
|
|||||||
.side-menu-always-displayed .side-menu-apps-list {
|
.side-menu-always-displayed .side-menu-apps-list {
|
||||||
height: calc(100vh - 49px);
|
height: calc(100vh - 49px);
|
||||||
top: 49px;
|
top: 49px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.side-menu-always-displayed .side-menu-apps-list:hover {
|
||||||
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-menu-always-displayed #side-menu,
|
.side-menu-always-displayed #side-menu,
|
||||||
@@ -293,6 +308,10 @@
|
|||||||
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;
|
||||||
|
|||||||
@@ -1,6 +1 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 10.583 10.583">
|
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 10.583 10.583"><g fill="#fff" color="#000" transform="translate(-.067 .224)"><rect width="5.027" height=".777" x="-2.307" y="6.984" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none" transform="rotate(-45)"/><rect width="5.027" height=".777" x="4.859" y="-.595" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none" transform="rotate(45)"/></g></svg>
|
||||||
<g color="#000" fill="#fff">
|
|
||||||
<rect transform="rotate(135)" ry=".545" rx=".545" y="-8.209" x="-3.608" height="1.451" width="7.216" style="marker:none" overflow="visible" paint-order="stroke markers fill"/>
|
|
||||||
<rect transform="rotate(-135)" ry=".545" rx=".545" y="-.726" x="-11.091" height="1.451" width="7.216" style="marker:none" overflow="visible" paint-order="stroke markers fill"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 498 B After Width: | Height: | Size: 495 B |
@@ -1,173 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 10.583 10.583"><g fill-opacity=".898" color="#000" transform="matrix(.90559 0 0 .86896 .772 -247.893)"><rect width="1.451" height="1.451" x="4.266" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><g transform="translate(-.13)"><rect width="1.451" height="1.451" x="6.445" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="1.451" height="1.451" x="2.345" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g><rect width="1.451" height="1.451" x="4.266" y="290.631" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><g transform="translate(-.13 2.157)"><rect width="1.451" height="1.451" x="6.445" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="1.451" height="1.451" x="2.345" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g><rect width="1.451" height="1.451" x="4.266" y="292.808" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><g transform="translate(-.13 4.334)"><rect width="1.451" height="1.451" x="6.445" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="1.451" height="1.451" x="2.345" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g></g></svg>
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="40"
|
|
||||||
height="40"
|
|
||||||
viewBox="0 0 10.583 10.583"
|
|
||||||
version="1.1"
|
|
||||||
id="svg935"
|
|
||||||
sodipodi:docname="side-menu-opener-dark.svg"
|
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
|
||||||
<metadata
|
|
||||||
id="metadata941">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs939" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1918"
|
|
||||||
inkscape:window-height="1008"
|
|
||||||
id="namedview937"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="8.34386"
|
|
||||||
inkscape:cx="83.025045"
|
|
||||||
inkscape:cy="14.304895"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="41"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg935" />
|
|
||||||
<g
|
|
||||||
transform="translate(.3 -286.074)"
|
|
||||||
fill="#fff"
|
|
||||||
color="#000"
|
|
||||||
fill-opacity=".855"
|
|
||||||
id="g933"
|
|
||||||
style="fill:#000000;fill-opacity:0.89855075">
|
|
||||||
<rect
|
|
||||||
ry="0"
|
|
||||||
rx="0"
|
|
||||||
y="288.474"
|
|
||||||
x="4.266"
|
|
||||||
height="1.451"
|
|
||||||
width="1.451"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect909" />
|
|
||||||
<g
|
|
||||||
transform="translate(-.13)"
|
|
||||||
id="g915"
|
|
||||||
style="fill:#000000;fill-opacity:0.89855075">
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="6.445"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect911" />
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="2.345"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect913" />
|
|
||||||
</g>
|
|
||||||
<rect
|
|
||||||
ry="0"
|
|
||||||
rx="0"
|
|
||||||
y="290.631"
|
|
||||||
x="4.266"
|
|
||||||
height="1.451"
|
|
||||||
width="1.451"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect917" />
|
|
||||||
<g
|
|
||||||
transform="translate(-.13 2.157)"
|
|
||||||
id="g923"
|
|
||||||
style="fill:#000000;fill-opacity:0.89855075">
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="6.445"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect919" />
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="2.345"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect921" />
|
|
||||||
</g>
|
|
||||||
<rect
|
|
||||||
ry="0"
|
|
||||||
rx="0"
|
|
||||||
y="292.808"
|
|
||||||
x="4.266"
|
|
||||||
height="1.451"
|
|
||||||
width="1.451"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect925" />
|
|
||||||
<g
|
|
||||||
transform="translate(-.13 4.334)"
|
|
||||||
id="g931"
|
|
||||||
style="fill:#000000;fill-opacity:0.89855075">
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="6.445"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect927" />
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.89855075"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="2.345"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect929" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -1,102 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 10.583 10.583"><rect width="7.62" height="7.62" x="1.482" y="1.482" fill="none" stroke="#000" stroke-linecap="square" stroke-width=".777" color="#000" overflow="visible" paint-order="markers fill stroke" rx="0" ry="0" style="marker:none"/><rect width="5.027" height=".777" x="2.778" y="3.148" color="#000" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="5.027" height=".777" x="2.778" y="6.658" color="#000" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="5.027" height=".777" x="2.778" y="4.936" color="#000" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></svg>
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="40"
|
|
||||||
height="40"
|
|
||||||
viewBox="0 0 10.583 10.583"
|
|
||||||
version="1.1"
|
|
||||||
id="svg1090"
|
|
||||||
sodipodi:docname="side-menu-opener-hamburger-2-dark.svg"
|
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
|
||||||
<metadata
|
|
||||||
id="metadata1096">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs1094" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1918"
|
|
||||||
inkscape:window-height="1008"
|
|
||||||
id="namedview1092"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="8.34386"
|
|
||||||
inkscape:cx="84.523455"
|
|
||||||
inkscape:cy="12.270318"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="41"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg1090" />
|
|
||||||
<rect
|
|
||||||
overflow="visible"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:1"
|
|
||||||
width="4.806"
|
|
||||||
height="1.256"
|
|
||||||
x="2.888"
|
|
||||||
y="2.787"
|
|
||||||
rx="0"
|
|
||||||
ry=".472"
|
|
||||||
color="#000"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1082" />
|
|
||||||
<rect
|
|
||||||
overflow="visible"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:1"
|
|
||||||
width="4.806"
|
|
||||||
height="1.256"
|
|
||||||
x="2.888"
|
|
||||||
y="4.655"
|
|
||||||
rx="0"
|
|
||||||
ry=".472"
|
|
||||||
color="#000"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1084" />
|
|
||||||
<rect
|
|
||||||
overflow="visible"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:1"
|
|
||||||
width="4.806"
|
|
||||||
height="1.256"
|
|
||||||
x="2.888"
|
|
||||||
y="6.54"
|
|
||||||
rx="0"
|
|
||||||
ry=".472"
|
|
||||||
color="#000"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1086" />
|
|
||||||
<path
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:1"
|
|
||||||
d="M1.243.71A.469.469 0 0 0 .881.88a.469.469 0 0 0-.171.362V9.34c0 .146.067.275.171.362a.469.469 0 0 0 .362.171H9.34a.469.469 0 0 0 .362-.171.469.469 0 0 0 .171-.362V1.243a.469.469 0 0 0-.171-.362A.469.469 0 0 0 9.34.71zm.723 1.256h6.65v6.65h-6.65z"
|
|
||||||
color="#000"
|
|
||||||
overflow="visible"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="path1088" />
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 786 B |
@@ -1,101 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 10.583 10.583"><rect width="7.62" height="7.62" x="1.482" y="1.482" fill="none" stroke="#fff" stroke-linecap="square" stroke-width=".777" color="#000" overflow="visible" paint-order="markers fill stroke" rx="0" ry="0" style="marker:none"/><g fill="#fff" color="#000" transform="translate(0 .034)"><rect width="5.027" height=".777" x="2.778" y="3.114" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="5.027" height=".777" x="2.778" y="6.624" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="5.027" height=".777" x="2.778" y="4.903" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g></svg>
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="40"
|
|
||||||
height="40"
|
|
||||||
viewBox="0 0 10.583 10.583"
|
|
||||||
version="1.1"
|
|
||||||
id="svg1443"
|
|
||||||
sodipodi:docname="side-menu-opener-hamburger-2.svg"
|
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
|
||||||
<metadata
|
|
||||||
id="metadata1449">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs1447" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1918"
|
|
||||||
inkscape:window-height="1008"
|
|
||||||
id="namedview1445"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="5.9"
|
|
||||||
inkscape:cx="90.508475"
|
|
||||||
inkscape:cy="4.5762712"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="41"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg1443" />
|
|
||||||
<rect
|
|
||||||
overflow="visible"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:1"
|
|
||||||
width="4.806"
|
|
||||||
height="1.256"
|
|
||||||
x="2.888"
|
|
||||||
y="2.787"
|
|
||||||
rx="0"
|
|
||||||
ry=".472"
|
|
||||||
color="#000"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1435" />
|
|
||||||
<rect
|
|
||||||
overflow="visible"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:1"
|
|
||||||
width="4.806"
|
|
||||||
height="1.256"
|
|
||||||
x="2.888"
|
|
||||||
y="4.655"
|
|
||||||
rx="0"
|
|
||||||
ry=".472"
|
|
||||||
color="#000"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1437" />
|
|
||||||
<rect
|
|
||||||
overflow="visible"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:1"
|
|
||||||
width="4.806"
|
|
||||||
height="1.256"
|
|
||||||
x="2.888"
|
|
||||||
y="6.54"
|
|
||||||
rx="0"
|
|
||||||
ry=".472"
|
|
||||||
color="#000"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1439" />
|
|
||||||
<path
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:1"
|
|
||||||
d="M1.243.71A.469.469 0 0 0 .881.88a.469.469 0 0 0-.171.362V9.34c0 .146.067.275.171.362a.469.469 0 0 0 .362.171H9.34a.469.469 0 0 0 .362-.171.469.469 0 0 0 .171-.362V1.243a.469.469 0 0 0-.171-.362A.469.469 0 0 0 9.34.71zm.723 1.256h6.65v6.65h-6.65z"
|
|
||||||
color="#000"
|
|
||||||
overflow="visible"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="path1441" />
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 809 B |
@@ -1,92 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 10.583 10.583"><g color="#000" transform="matrix(.85624 0 0 .9944 .747 .03)"><g transform="matrix(1.0055 0 0 1 -.013 0)"><rect width="5.839" height=".782" x="2.372" y="2.764" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="5.839" height=".782" x="2.372" y="7.037" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g><rect width="5.871" height=".782" x="2.372" y="4.901" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g></svg>
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="40"
|
|
||||||
height="40"
|
|
||||||
viewBox="0 0 10.583 10.583"
|
|
||||||
version="1.1"
|
|
||||||
id="svg1168"
|
|
||||||
sodipodi:docname="side-menu-opener-hamburger-dark.svg"
|
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
|
||||||
<metadata
|
|
||||||
id="metadata1174">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title></dc:title>
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs1172" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1918"
|
|
||||||
inkscape:window-height="1008"
|
|
||||||
id="namedview1170"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="5.9"
|
|
||||||
inkscape:cx="112.71186"
|
|
||||||
inkscape:cy="0.16949153"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="41"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg1168" />
|
|
||||||
<g
|
|
||||||
color="#000"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
transform="translate(0 -286.417)"
|
|
||||||
id="g1166"
|
|
||||||
style="fill:#000000;fill-opacity:0.99637681">
|
|
||||||
<rect
|
|
||||||
ry=".545"
|
|
||||||
rx="0"
|
|
||||||
y="288.816"
|
|
||||||
x="2.516"
|
|
||||||
height="1.451"
|
|
||||||
width="5.551"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.99637681"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1160" />
|
|
||||||
<rect
|
|
||||||
ry=".545"
|
|
||||||
rx="0"
|
|
||||||
y="290.973"
|
|
||||||
x="2.516"
|
|
||||||
height="1.451"
|
|
||||||
width="5.551"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.99637681"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1162" />
|
|
||||||
<rect
|
|
||||||
ry=".545"
|
|
||||||
rx="0"
|
|
||||||
y="293.15"
|
|
||||||
x="2.516"
|
|
||||||
height="1.451"
|
|
||||||
width="5.551"
|
|
||||||
style="marker:none;fill:#000000;fill-opacity:0.99637681"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1164" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 637 B |
@@ -1,91 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 10.583 10.583"><g fill="#fff" color="#000" transform="matrix(.85624 0 0 .9944 .747 .03)"><g transform="matrix(1.0055 0 0 1 -.013 0)"><rect width="5.839" height=".782" x="2.372" y="2.764" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="5.839" height=".782" x="2.372" y="7.037" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g><rect width="5.871" height=".782" x="2.372" y="4.901" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g></svg>
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="40"
|
|
||||||
height="40"
|
|
||||||
viewBox="0 0 10.583 10.583"
|
|
||||||
version="1.1"
|
|
||||||
id="svg1382"
|
|
||||||
sodipodi:docname="side-menu-opener-hamburger.svg"
|
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
|
||||||
<metadata
|
|
||||||
id="metadata1388">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs1386" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1918"
|
|
||||||
inkscape:window-height="1008"
|
|
||||||
id="namedview1384"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="5.9"
|
|
||||||
inkscape:cx="108.13559"
|
|
||||||
inkscape:cy="3.8983051"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="41"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg1382" />
|
|
||||||
<g
|
|
||||||
color="#000"
|
|
||||||
fill="#fff"
|
|
||||||
fill-opacity=".855"
|
|
||||||
transform="translate(0 -286.417)"
|
|
||||||
id="g1380"
|
|
||||||
style="fill:#ffffff;fill-opacity:1">
|
|
||||||
<rect
|
|
||||||
ry=".545"
|
|
||||||
rx="0"
|
|
||||||
y="288.816"
|
|
||||||
x="2.516"
|
|
||||||
height="1.451"
|
|
||||||
width="5.551"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:1"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1374" />
|
|
||||||
<rect
|
|
||||||
ry=".545"
|
|
||||||
rx="0"
|
|
||||||
y="290.973"
|
|
||||||
x="2.516"
|
|
||||||
height="1.451"
|
|
||||||
width="5.551"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:1"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1376" />
|
|
||||||
<rect
|
|
||||||
ry=".545"
|
|
||||||
rx="0"
|
|
||||||
y="293.15"
|
|
||||||
x="2.516"
|
|
||||||
height="1.451"
|
|
||||||
width="5.551"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:1"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1378" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 649 B |
@@ -1,172 +1 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 10.583 10.583"><g fill="#fff" fill-opacity=".946" color="#000" transform="matrix(.90559 0 0 .86896 .772 -247.893)"><rect width="1.451" height="1.451" x="4.266" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><g transform="translate(-.13)"><rect width="1.451" height="1.451" x="6.445" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="1.451" height="1.451" x="2.345" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g><rect width="1.451" height="1.451" x="4.266" y="290.631" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><g transform="translate(-.13 2.157)"><rect width="1.451" height="1.451" x="6.445" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="1.451" height="1.451" x="2.345" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g><rect width="1.451" height="1.451" x="4.266" y="292.808" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><g transform="translate(-.13 4.334)"><rect width="1.451" height="1.451" x="6.445" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/><rect width="1.451" height="1.451" x="2.345" y="288.474" overflow="visible" paint-order="stroke markers fill" rx="0" ry="0" style="marker:none"/></g></g></svg>
|
||||||
<svg
|
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
|
||||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
|
||||||
width="40"
|
|
||||||
height="40"
|
|
||||||
viewBox="0 0 10.583 10.583"
|
|
||||||
version="1.1"
|
|
||||||
id="svg1321"
|
|
||||||
sodipodi:docname="side-menu-opener.svg"
|
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
|
||||||
<metadata
|
|
||||||
id="metadata1327">
|
|
||||||
<rdf:RDF>
|
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
|
||||||
id="defs1325" />
|
|
||||||
<sodipodi:namedview
|
|
||||||
pagecolor="#ffffff"
|
|
||||||
bordercolor="#666666"
|
|
||||||
borderopacity="1"
|
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
|
||||||
inkscape:window-width="1918"
|
|
||||||
inkscape:window-height="1008"
|
|
||||||
id="namedview1323"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="5.9"
|
|
||||||
inkscape:cx="78.983051"
|
|
||||||
inkscape:cy="5.5932203"
|
|
||||||
inkscape:window-x="0"
|
|
||||||
inkscape:window-y="41"
|
|
||||||
inkscape:window-maximized="0"
|
|
||||||
inkscape:current-layer="svg1321" />
|
|
||||||
<g
|
|
||||||
transform="translate(.3 -286.074)"
|
|
||||||
fill="#fff"
|
|
||||||
color="#000"
|
|
||||||
fill-opacity=".855"
|
|
||||||
id="g1319"
|
|
||||||
style="fill:#ffffff;fill-opacity:0.94565219">
|
|
||||||
<rect
|
|
||||||
ry="0"
|
|
||||||
rx="0"
|
|
||||||
y="288.474"
|
|
||||||
x="4.266"
|
|
||||||
height="1.451"
|
|
||||||
width="1.451"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1295" />
|
|
||||||
<g
|
|
||||||
transform="translate(-.13)"
|
|
||||||
id="g1301"
|
|
||||||
style="fill:#ffffff;fill-opacity:0.94565219">
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="6.445"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1297" />
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="2.345"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1299" />
|
|
||||||
</g>
|
|
||||||
<rect
|
|
||||||
ry="0"
|
|
||||||
rx="0"
|
|
||||||
y="290.631"
|
|
||||||
x="4.266"
|
|
||||||
height="1.451"
|
|
||||||
width="1.451"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1303" />
|
|
||||||
<g
|
|
||||||
transform="translate(-.13 2.157)"
|
|
||||||
id="g1309"
|
|
||||||
style="fill:#ffffff;fill-opacity:0.94565219">
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="6.445"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1305" />
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="2.345"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1307" />
|
|
||||||
</g>
|
|
||||||
<rect
|
|
||||||
ry="0"
|
|
||||||
rx="0"
|
|
||||||
y="292.808"
|
|
||||||
x="4.266"
|
|
||||||
height="1.451"
|
|
||||||
width="1.451"
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1311" />
|
|
||||||
<g
|
|
||||||
transform="translate(-.13 4.334)"
|
|
||||||
id="g1317"
|
|
||||||
style="fill:#ffffff;fill-opacity:0.94565219">
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="6.445"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1313" />
|
|
||||||
<rect
|
|
||||||
style="marker:none;fill:#ffffff;fill-opacity:0.94565219"
|
|
||||||
width="1.451"
|
|
||||||
height="1.451"
|
|
||||||
x="2.345"
|
|
||||||
y="288.474"
|
|
||||||
rx="0"
|
|
||||||
ry="0"
|
|
||||||
overflow="visible"
|
|
||||||
paint-order="stroke markers fill"
|
|
||||||
id="rect1315" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -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 $key => $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 (ContainerInterface $c) {
|
||||||
|
return new AppRepository();
|
||||||
|
});
|
||||||
|
|
||||||
|
$context->registerService('CategoryRepository', function (ContainerInterface $c) {
|
||||||
|
return new CategoryRepository();
|
||||||
|
});
|
||||||
|
|
||||||
|
$context->registerService('ConfigProxy', function (ContainerInterface $c) {
|
||||||
|
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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,8 @@ use OCP\AppFramework\Http\Response;
|
|||||||
use OCP\AppFramework\Http\TemplateResponse;
|
use OCP\AppFramework\Http\TemplateResponse;
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
use OCP\IUserSession;
|
use OCP\IUserSession;
|
||||||
|
use OCA\Theming\ThemingDefaults;
|
||||||
|
use OCA\SideMenu\Service\Color;
|
||||||
|
|
||||||
class CssController extends Controller
|
class CssController extends Controller
|
||||||
{
|
{
|
||||||
@@ -40,12 +42,30 @@ class CssController extends Controller
|
|||||||
*/
|
*/
|
||||||
protected $user;
|
protected $user;
|
||||||
|
|
||||||
public function __construct(string $appName, IRequest $request, ConfigProxy $config)
|
/**
|
||||||
|
* @var ThemingDefaults
|
||||||
|
*/
|
||||||
|
protected $theming;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Color
|
||||||
|
*/
|
||||||
|
protected $color;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
string $appName,
|
||||||
|
IRequest $request,
|
||||||
|
ConfigProxy $config,
|
||||||
|
ThemingDefaults $theming,
|
||||||
|
Color $color
|
||||||
|
)
|
||||||
{
|
{
|
||||||
parent::__construct($appName, $request);
|
parent::__construct($appName, $request);
|
||||||
|
|
||||||
$this->user = OC::$server[IUserSession::class]->getUser();
|
$this->user = OC::$server[IUserSession::class]->getUser();
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
|
$this->theming = $theming;
|
||||||
|
$this->color = $color;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -67,6 +87,7 @@ class CssController extends Controller
|
|||||||
{
|
{
|
||||||
$isForced = $this->config->getAppValueBool('force', '0');
|
$isForced = $this->config->getAppValueBool('force', '0');
|
||||||
$topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]');
|
$topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]');
|
||||||
|
$topSideMenuApps = $this->config->getAppValueArray('top-side-menu-apps', '[]');
|
||||||
|
|
||||||
$isAccessibilityAppEnabled = $this->config->getAppValueBool('enabled', '0', 'accessibility');
|
$isAccessibilityAppEnabled = $this->config->getAppValueBool('enabled', '0', 'accessibility');
|
||||||
$isBreezeDarkAppEnabled = $this->config->getAppValueBool('enabled', '0', 'breezedark');
|
$isBreezeDarkAppEnabled = $this->config->getAppValueBool('enabled', '0', 'breezedark');
|
||||||
@@ -74,11 +95,16 @@ class CssController extends Controller
|
|||||||
|
|
||||||
if ($this->user) {
|
if ($this->user) {
|
||||||
$userTopMenuApps = $this->config->getUserValueArray($this->user, 'top-menu-apps', '[]');
|
$userTopMenuApps = $this->config->getUserValueArray($this->user, 'top-menu-apps', '[]');
|
||||||
|
$userTopSideMenuApps = $this->config->getUserValueArray($this->user, 'top-side-menu-apps', '[]');
|
||||||
|
|
||||||
if (!empty($userTopMenuApps) && !$isForced) {
|
if (!empty($userTopMenuApps) && !$isForced) {
|
||||||
$topMenuApps = $userTopMenuApps;
|
$topMenuApps = $userTopMenuApps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!empty($userTopSideMenuApps) && !$isForced) {
|
||||||
|
$topSideMenuApps = $userTopSideMenuApps;
|
||||||
|
}
|
||||||
|
|
||||||
$isDarkThemeUserEnabled = $this->config->getUserValue($this->user, 'theme', '', 'accessibility') === 'dark';
|
$isDarkThemeUserEnabled = $this->config->getUserValue($this->user, 'theme', '', 'accessibility') === 'dark';
|
||||||
$isBreezeDarkUserEnabled = $this->config->getUserValue($this->user, 'theme_enabled', '', 'breezedark');
|
$isBreezeDarkUserEnabled = $this->config->getUserValue($this->user, 'theme_enabled', '', 'breezedark');
|
||||||
|
|
||||||
@@ -90,23 +116,29 @@ class CssController extends Controller
|
|||||||
|
|
||||||
$isDarkMode = ($isAccessibilityAppEnabled && $isDarkThemeUserEnabled) || ($isBreezeDarkAppEnabled && $isBreezeDarkUserEnabled);
|
$isDarkMode = ($isAccessibilityAppEnabled && $isDarkThemeUserEnabled) || ($isBreezeDarkAppEnabled && $isBreezeDarkUserEnabled);
|
||||||
|
|
||||||
|
$primaryColor = $this->theming->getColorPrimary();
|
||||||
|
$lightenPrimaryColor = $this->color->adjustBrightness($primaryColor, 0.2);
|
||||||
|
$darkenPrimaryColor = $this->color->adjustBrightness($primaryColor, -0.2);
|
||||||
|
$darkenPrimaryColor2 = $this->color->adjustBrightness($primaryColor, -0.3);
|
||||||
|
$textColor = $this->theming->getTextColorPrimary();
|
||||||
|
|
||||||
if ($isDarkMode) {
|
if ($isDarkMode) {
|
||||||
$backgroundColor = $this->config->getAppValue('dark-mode-background-color', '#333333');
|
$backgroundColor = $this->config->getAppValue('dark-mode-background-color', $darkenPrimaryColor);
|
||||||
$backgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $backgroundColor);
|
$backgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkenPrimaryColor);
|
||||||
$currentAppBackgroundColor = $this->config->getAppValue('dark-mode-current-app-background-color', '#444444');
|
$currentAppBackgroundColor = $this->config->getAppValue('dark-mode-current-app-background-color', $darkenPrimaryColor2);
|
||||||
$loaderColor = $this->config->getAppValue('dark-mode-loader-color', '#cccccc');
|
$loaderColor = $this->config->getAppValue('dark-mode-loader-color', $lightenPrimaryColor);
|
||||||
$textColor = $this->config->getAppValue('dark-mode-text-color', '#FFFFFF');
|
$textColor = $this->config->getAppValue('dark-mode-text-color', $textColor);
|
||||||
$iconInvertFilter = abs($this->config->getAppValueInt('dark-mode-icon-invert-filter', '0')).'%';
|
$iconInvertFilter = abs($this->config->getAppValueInt('dark-mode-icon-invert-filter', '0')).'%';
|
||||||
$iconOpacity = abs($this->config->getAppValueInt('dark-mode-icon-opacity', '100') / 100);
|
$iconOpacity = abs($this->config->getAppValueInt('dark-mode-icon-opacity', '100') / 100);
|
||||||
$opener = $this->config->getAppValue('dark-mode-opener', 'side-menu-opener');
|
$opener = $this->config->getAppValue('dark-mode-opener', 'side-menu-opener');
|
||||||
|
|
||||||
$backgroundOpacity = dechex($this->config->getAppValueInt('dark-mode-background-color-opacity', '100') * 255 / 100);
|
$backgroundOpacity = dechex($this->config->getAppValueInt('dark-mode-background-color-opacity', '100') * 255 / 100);
|
||||||
} else {
|
} else {
|
||||||
$backgroundColor = $this->config->getAppValue('background-color', '#333333');
|
$backgroundColor = $this->config->getAppValue('background-color', $darkenPrimaryColor);
|
||||||
$backgroundColorTo = $this->config->getAppValue('background-color-to', $backgroundColor);
|
$backgroundColorTo = $this->config->getAppValue('background-color-to', $darkenPrimaryColor);
|
||||||
$currentAppBackgroundColor = $this->config->getAppValue('current-app-background-color', '#444444');
|
$currentAppBackgroundColor = $this->config->getAppValue('current-app-background-color', $darkenPrimaryColor2);
|
||||||
$loaderColor = $this->config->getAppValue('loader-color', '#0e75ac');
|
$loaderColor = $this->config->getAppValue('loader-color', $lightenPrimaryColor);
|
||||||
$textColor = $this->config->getAppValue('text-color', '#FFFFFF');
|
$textColor = $this->config->getAppValue('text-color', $textColor);
|
||||||
$iconInvertFilter = abs($this->config->getAppValueInt('icon-invert-filter', '0')).'%';
|
$iconInvertFilter = abs($this->config->getAppValueInt('icon-invert-filter', '0')).'%';
|
||||||
$iconOpacity = abs($this->config->getAppValueInt('icon-opacity', '100') / 100);
|
$iconOpacity = abs($this->config->getAppValueInt('icon-opacity', '100') / 100);
|
||||||
$opener = $this->config->getAppValue('opener', 'side-menu-opener');
|
$opener = $this->config->getAppValue('opener', 'side-menu-opener');
|
||||||
@@ -136,6 +168,7 @@ class CssController extends Controller
|
|||||||
'always-displayed' => $this->config->getAppValueBool('always-displayed', '0'),
|
'always-displayed' => $this->config->getAppValueBool('always-displayed', '0'),
|
||||||
'big-menu' => $this->config->getAppValueBool('big-menu', '0'),
|
'big-menu' => $this->config->getAppValueBool('big-menu', '0'),
|
||||||
'top-menu-apps' => $topMenuApps,
|
'top-menu-apps' => $topMenuApps,
|
||||||
|
'top-side-menu-apps' => $topSideMenuApps,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,6 +94,7 @@ class JsController extends Controller
|
|||||||
protected function getConfig(): array
|
protected function getConfig(): array
|
||||||
{
|
{
|
||||||
$topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]');
|
$topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]');
|
||||||
|
$topSideMenuApps = $this->config->getAppValueArray('top-side-menu-apps', '[]');
|
||||||
$targetBlankApps = $this->config->getAppValueArray('target-blank-apps', '[]');
|
$targetBlankApps = $this->config->getAppValueArray('target-blank-apps', '[]');
|
||||||
$useAvatar = $this->config->getAppValueBool('use-avatar', '0');
|
$useAvatar = $this->config->getAppValueBool('use-avatar', '0');
|
||||||
$isForced = $this->config->getAppValueBool('force', '0');
|
$isForced = $this->config->getAppValueBool('force', '0');
|
||||||
@@ -103,11 +104,16 @@ class JsController extends Controller
|
|||||||
|
|
||||||
if ($this->user) {
|
if ($this->user) {
|
||||||
$userTopMenuApps = $this->config->getUserValueArray($this->user, 'top-menu-apps', '[]');
|
$userTopMenuApps = $this->config->getUserValueArray($this->user, 'top-menu-apps', '[]');
|
||||||
|
$userTopSideMenuApps = $this->config->getUserValueArray($this->user, 'top-side-menu-apps', '[]');
|
||||||
|
|
||||||
if (!empty($userTopMenuApps) && !$isForced) {
|
if (!empty($userTopMenuApps) && !$isForced) {
|
||||||
$topMenuApps = $userTopMenuApps;
|
$topMenuApps = $userTopMenuApps;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!empty($userTopSideMenuApps) && !$isForced) {
|
||||||
|
$topSideMenuApps = $userTopSideMenuApps;
|
||||||
|
}
|
||||||
|
|
||||||
$userTargetBlankMode = $this->config->getUserValueInt($this->user, 'target-blank-mode', '1');
|
$userTargetBlankMode = $this->config->getUserValueInt($this->user, 'target-blank-mode', '1');
|
||||||
$userTargetBlankApps = $this->config->getUserValueArray($this->user, 'target-blank-apps', '[]');
|
$userTargetBlankApps = $this->config->getUserValueArray($this->user, 'target-blank-apps', '[]');
|
||||||
|
|
||||||
@@ -157,6 +163,7 @@ class JsController extends Controller
|
|||||||
'big-menu-hidden-apps' => $this->config->getAppValueArray('big-menu-hidden-apps', '[]'),
|
'big-menu-hidden-apps' => $this->config->getAppValueArray('big-menu-hidden-apps', '[]'),
|
||||||
'avatar' => $avatar,
|
'avatar' => $avatar,
|
||||||
'top-menu-apps' => $topMenuApps,
|
'top-menu-apps' => $topMenuApps,
|
||||||
|
'top-side-menu-apps' => $topSideMenuApps,
|
||||||
'target-blank-apps' => $targetBlankApps,
|
'target-blank-apps' => $targetBlankApps,
|
||||||
'settings' => $settings,
|
'settings' => $settings,
|
||||||
'logo' => $this->themingDefaults->getLogo(),
|
'logo' => $this->themingDefaults->getLogo(),
|
||||||
|
|||||||
@@ -187,9 +187,18 @@ class NavController extends Controller
|
|||||||
|
|
||||||
usort($items, function ($a, $b) use ($categoriesLabels) {
|
usort($items, function ($a, $b) use ($categoriesLabels) {
|
||||||
foreach ($categoriesLabels as $key => $value) {
|
foreach ($categoriesLabels as $key => $value) {
|
||||||
|
if ($a['categoryId'] === 'other') {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($b['categoryId'] === 'other') {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if ($a['categoryId'] === $key) {
|
if ($a['categoryId'] === $key) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($b['categoryId'] === $key) {
|
if ($b['categoryId'] === $key) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ class PersonalSettingController extends Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ('top-menu-apps' === $name) {
|
if (in_array($name, ['top-menu-apps', 'top-side-menu-apps'])) {
|
||||||
$doSave = true;
|
$doSave = true;
|
||||||
$data = json_decode($value, true);
|
$data = json_decode($value, true);
|
||||||
|
|
||||||
|
|||||||
@@ -21,10 +21,27 @@ class AppRepository
|
|||||||
*/
|
*/
|
||||||
protected $l10nFactory;
|
protected $l10nFactory;
|
||||||
|
|
||||||
public function __construct(\OC_App $ocApp, IFactory $l10nFactory)
|
/**
|
||||||
|
* @var ConfigProxy
|
||||||
|
*/
|
||||||
|
protected $config;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var CategoryRepository
|
||||||
|
*/
|
||||||
|
protected $categoryRepository;
|
||||||
|
|
||||||
|
public function __construct(
|
||||||
|
\OC_App $ocApp,
|
||||||
|
IFactory $l10nFactory,
|
||||||
|
ConfigProxy $config,
|
||||||
|
CategoryRepository $categoryRepository
|
||||||
|
)
|
||||||
{
|
{
|
||||||
$this->ocApp = $ocApp;
|
$this->ocApp = $ocApp;
|
||||||
$this->l10nFactory = $l10nFactory;
|
$this->l10nFactory = $l10nFactory;
|
||||||
|
$this->config = $config;
|
||||||
|
$this->categoryRepository = $categoryRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -35,6 +52,9 @@ class AppRepository
|
|||||||
public function getVisibleApps()
|
public function getVisibleApps()
|
||||||
{
|
{
|
||||||
$navigation = $this->ocApp->getNavigation();
|
$navigation = $this->ocApp->getNavigation();
|
||||||
|
$appCategoriesCustom = $this->config->getAppValueArray('apps-categories-custom', '[]');
|
||||||
|
$categoriesCustom = $this->config->getAppValueArray('categories-custom', '[]');
|
||||||
|
$categories = $this->categoryRepository->getOrderedCategories();
|
||||||
$apps = $this->ocApp->listAllApps();
|
$apps = $this->ocApp->listAllApps();
|
||||||
$visibleApps = [];
|
$visibleApps = [];
|
||||||
|
|
||||||
@@ -74,6 +94,12 @@ class AppRepository
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($visibleApps as $id => $app) {
|
||||||
|
if (isset($appCategoriesCustom[$id], $categories[$appCategoriesCustom[$id]])) {
|
||||||
|
$visibleApps[$id]['category'] = [$appCategoriesCustom[$id]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
usort($visibleApps, function ($a, $b) {
|
usort($visibleApps, function ($a, $b) {
|
||||||
return ($a['name'] < $b['name']) ? -1 : 1;
|
return ($a['name'] < $b['name']) ? -1 : 1;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ namespace OCA\SideMenu\Service;
|
|||||||
use OC\App\AppStore\Fetcher\CategoryFetcher;
|
use OC\App\AppStore\Fetcher\CategoryFetcher;
|
||||||
use OCA\SideMenu\AppInfo\Application;
|
use OCA\SideMenu\AppInfo\Application;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
|
use OCP\IUserSession;
|
||||||
use OCP\L10N\IFactory;
|
use OCP\L10N\IFactory;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,16 +35,23 @@ class CategoryRepository
|
|||||||
*/
|
*/
|
||||||
protected $iConfig;
|
protected $iConfig;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var IUserSession
|
||||||
|
*/
|
||||||
|
protected $userSession;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
CategoryFetcher $categoryFetcher,
|
CategoryFetcher $categoryFetcher,
|
||||||
ConfigProxy $config,
|
ConfigProxy $config,
|
||||||
IConfig $iConfig,
|
IConfig $iConfig,
|
||||||
IFactory $l10nFactory
|
IFactory $l10nFactory,
|
||||||
|
IUserSession $userSession
|
||||||
) {
|
) {
|
||||||
$this->categoryFetcher = $categoryFetcher;
|
$this->categoryFetcher = $categoryFetcher;
|
||||||
$this->l10nFactory = $l10nFactory;
|
$this->l10nFactory = $l10nFactory;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->iConfig = $iConfig;
|
$this->iConfig = $iConfig;
|
||||||
|
$this->userSession = $userSession;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,8 +64,8 @@ class CategoryRepository
|
|||||||
$currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2);
|
$currentLanguage = substr($this->l10nFactory->findLanguage(), 0, 2);
|
||||||
$type = $this->config->getAppValue('categories-order-type', 'default');
|
$type = $this->config->getAppValue('categories-order-type', 'default');
|
||||||
$order = $this->config->getAppValueArray('categories-order', '[]');
|
$order = $this->config->getAppValueArray('categories-order', '[]');
|
||||||
|
|
||||||
$categoriesLabels = $this->config->getAppValueArray('cache-categories', '[]');
|
$categoriesLabels = $this->config->getAppValueArray('cache-categories', '[]');
|
||||||
|
$customCategories = $this->config->getAppValueArray('categories-custom', '[]');
|
||||||
|
|
||||||
if (empty($categoriesLabels)) {
|
if (empty($categoriesLabels)) {
|
||||||
$categoriesLabels = $this->categoryFetcher->get();
|
$categoriesLabels = $this->categoryFetcher->get();
|
||||||
@@ -74,6 +82,18 @@ class CategoryRepository
|
|||||||
$categoriesLabels['external_links'] = $this->l10nFactory->get('external')->t('External sites');
|
$categoriesLabels['external_links'] = $this->l10nFactory->get('external')->t('External sites');
|
||||||
$categoriesLabels['other'] = '';
|
$categoriesLabels['other'] = '';
|
||||||
|
|
||||||
|
$user = $this->userSession->getUser();
|
||||||
|
|
||||||
|
if ($user) {
|
||||||
|
$lang = $this->iConfig->getUserValue($user->getUid(), 'core', 'lang');
|
||||||
|
} else {
|
||||||
|
$lang = 'en';
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($customCategories as $category) {
|
||||||
|
$categoriesLabels[$category['id']] = $category[$lang] ?? $category['en'];
|
||||||
|
}
|
||||||
|
|
||||||
asort($categoriesLabels);
|
asort($categoriesLabels);
|
||||||
|
|
||||||
if ('custom' === $type) {
|
if ('custom' === $type) {
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace OCA\SideMenu\Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class Color.
|
||||||
|
*
|
||||||
|
* @author Simon Vieille <simon@deblan.fr>
|
||||||
|
*/
|
||||||
|
class Color
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @thanks https://stackoverflow.com/posts/54393956/revision
|
||||||
|
*/
|
||||||
|
public function adjustBrightness(string $hexCode, float $adjustPercent): string
|
||||||
|
{
|
||||||
|
$hexCode = ltrim($hexCode, '#');
|
||||||
|
|
||||||
|
if (3 == strlen($hexCode)) {
|
||||||
|
$hexCode = $hexCode[0].$hexCode[0].$hexCode[1].$hexCode[1].$hexCode[2].$hexCode[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
$hexCode = array_map('hexdec', str_split($hexCode, 2));
|
||||||
|
|
||||||
|
foreach ($hexCode as &$color) {
|
||||||
|
$adjustableLimit = $adjustPercent < 0 ? $color : 255 - $color;
|
||||||
|
$adjustAmount = ceil($adjustableLimit * $adjustPercent);
|
||||||
|
|
||||||
|
$color = str_pad(dechex($color + $adjustAmount), 2, '0', STR_PAD_LEFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
return '#'.implode($hexCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace OCA\SideMenu\Service;
|
||||||
|
|
||||||
|
use OCP\IDBConnection;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class LangRepository.
|
||||||
|
*
|
||||||
|
* @author Simon Vieille <simon@deblan.fr>
|
||||||
|
*/
|
||||||
|
class LangRepository
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var IDBConnection
|
||||||
|
*/
|
||||||
|
protected $db;
|
||||||
|
|
||||||
|
public function __construct(IDBConnection $db)
|
||||||
|
{
|
||||||
|
$this->db = $db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getUsedLangs(): array
|
||||||
|
{
|
||||||
|
$qb = $this->db->getQueryBuilder();
|
||||||
|
|
||||||
|
$qb->select($qb->createFunction('DISTINCT configvalue'))
|
||||||
|
->where('configkey=:configkey and appid=:appid and configvalue<>:configvalue')
|
||||||
|
->setParameters([
|
||||||
|
'configkey' => 'lang',
|
||||||
|
'appid' => 'core',
|
||||||
|
'configvalue' => 'en',
|
||||||
|
])
|
||||||
|
->from('preferences')
|
||||||
|
;
|
||||||
|
|
||||||
|
$stmt = $qb->execute();
|
||||||
|
|
||||||
|
$langs = ['en'];
|
||||||
|
|
||||||
|
foreach ($stmt->fetchAll() as $result) {
|
||||||
|
$langs[] = $result['configvalue'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $langs;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,6 +26,9 @@ use OCP\AppFramework\Http\TemplateResponse;
|
|||||||
use OCP\IL10N;
|
use OCP\IL10N;
|
||||||
use OCP\ILogger;
|
use OCP\ILogger;
|
||||||
use OCP\Settings\ISettings;
|
use OCP\Settings\ISettings;
|
||||||
|
use OCA\Theming\ThemingDefaults;
|
||||||
|
use OCA\SideMenu\Service\Color;
|
||||||
|
use OCA\SideMenu\Service\LangRepository;
|
||||||
|
|
||||||
class Admin implements ISettings
|
class Admin implements ISettings
|
||||||
{
|
{
|
||||||
@@ -54,18 +57,39 @@ class Admin implements ISettings
|
|||||||
*/
|
*/
|
||||||
private $categoryRepository;
|
private $categoryRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ThemingDefaults
|
||||||
|
*/
|
||||||
|
protected $theming;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var Color
|
||||||
|
*/
|
||||||
|
protected $color;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var LangRepository
|
||||||
|
*/
|
||||||
|
protected $langRepository;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
IL10N $l,
|
IL10N $l,
|
||||||
ILogger $logger,
|
ILogger $logger,
|
||||||
ConfigProxy $config,
|
ConfigProxy $config,
|
||||||
AppRepository $appRepository,
|
AppRepository $appRepository,
|
||||||
CategoryRepository $categoryRepository
|
CategoryRepository $categoryRepository,
|
||||||
|
ThemingDefaults $theming,
|
||||||
|
Color $color,
|
||||||
|
LangRepository $langRepository
|
||||||
) {
|
) {
|
||||||
$this->l = $l;
|
$this->l = $l;
|
||||||
$this->logger = $logger;
|
$this->logger = $logger;
|
||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->appRepository = $appRepository;
|
$this->appRepository = $appRepository;
|
||||||
$this->categoryRepository = $categoryRepository;
|
$this->categoryRepository = $categoryRepository;
|
||||||
|
$this->theming = $theming;
|
||||||
|
$this->color = $color;
|
||||||
|
$this->langRepository = $langRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -73,29 +97,47 @@ class Admin implements ISettings
|
|||||||
*/
|
*/
|
||||||
public function getForm()
|
public function getForm()
|
||||||
{
|
{
|
||||||
$backgroundColor = $this->config->getAppValue('background-color', '#333333');
|
$primaryColor = $this->theming->getColorPrimary();
|
||||||
$backgroundColorTo = $this->config->getAppValue('background-color-to', $backgroundColor);
|
$lightenPrimaryColor = $this->color->adjustBrightness($primaryColor, 0.2);
|
||||||
|
$darkenPrimaryColor = $this->color->adjustBrightness($primaryColor, -0.2);
|
||||||
|
$darkenPrimaryColor2 = $this->color->adjustBrightness($primaryColor, -0.3);
|
||||||
|
$textColor = $this->theming->getTextColorPrimary();
|
||||||
|
|
||||||
$darkModeBackgroundColor = $this->config->getAppValue('dark-mode-background-color', '#333333');
|
$backgroundColor = $this->config->getAppValue('background-color', $darkenPrimaryColor);
|
||||||
$darkModeBackgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkModeBackgroundColor);
|
$backgroundColorTo = $this->config->getAppValue('background-color-to', $darkenPrimaryColor);
|
||||||
|
|
||||||
|
$darkModeBackgroundColor = $this->config->getAppValue('dark-mode-background-color', $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'),
|
||||||
'current-app-background-color' => $this->config->getAppValue('current-app-background-color', '#444444'),
|
'current-app-background-color' => $this->config->getAppValue('current-app-background-color', $darkenPrimaryColor2),
|
||||||
'loader-color' => $this->config->getAppValue('loader-color', '#0e75ac'),
|
'loader-color' => $this->config->getAppValue('loader-color', $lightenPrimaryColor),
|
||||||
'icon-invert-filter' => $this->config->getAppValueInt('icon-invert-filter', '0'),
|
'icon-invert-filter' => $this->config->getAppValueInt('icon-invert-filter', '0'),
|
||||||
'icon-opacity' => $this->config->getAppValueInt('icon-opacity', '100'),
|
'icon-opacity' => $this->config->getAppValueInt('icon-opacity', '100'),
|
||||||
'text-color' => $this->config->getAppValue('text-color', '#FFFFFF'),
|
'text-color' => $this->config->getAppValue('text-color', $textColor),
|
||||||
'dark-mode-background-color' => $darkModeBackgroundColor,
|
'dark-mode-background-color' => $darkModeBackgroundColor,
|
||||||
'dark-mode-background-color-to' => $darkModeBackgroundColorTo,
|
'dark-mode-background-color-to' => $darkModeBackgroundColorTo,
|
||||||
'dark-mode-background-color-opacity' => $this->config->getAppValueInt('dark-mode-background-color-opacity', '100'),
|
'dark-mode-background-color-opacity' => $this->config->getAppValueInt('dark-mode-background-color-opacity', '100'),
|
||||||
'dark-mode-current-app-background-color' => $this->config->getAppValue('dark-mode-current-app-background-color', '#444444'),
|
'dark-mode-current-app-background-color' => $this->config->getAppValue('dark-mode-current-app-background-color', $darkenPrimaryColor2),
|
||||||
'dark-mode-loader-color' => $this->config->getAppValue('dark-mode-loader-color', '#cccccc'),
|
'dark-mode-loader-color' => $this->config->getAppValue('dark-mode-loader-color', $textColor),
|
||||||
'dark-mode-icon-invert-filter' => $this->config->getAppValueInt('dark-mode-icon-invert-filter', '0'),
|
'dark-mode-icon-invert-filter' => $this->config->getAppValueInt('dark-mode-icon-invert-filter', '0'),
|
||||||
'dark-mode-icon-opacity' => $this->config->getAppValueInt('dark-mode-icon-opacity', '100'),
|
'dark-mode-icon-opacity' => $this->config->getAppValueInt('dark-mode-icon-opacity', '100'),
|
||||||
'dark-mode-text-color' => $this->config->getAppValue('dark-mode-text-color', '#FFFFFF'),
|
'dark-mode-text-color' => $this->config->getAppValue('dark-mode-text-color', $textColor),
|
||||||
'dark-mode-opener' => $this->config->getAppValue('dark-mode-opener', 'side-menu-opener'),
|
'dark-mode-opener' => $this->config->getAppValue('dark-mode-opener', 'side-menu-opener'),
|
||||||
'opener' => $this->config->getAppValue('opener', 'side-menu-opener'),
|
'opener' => $this->config->getAppValue('opener', 'side-menu-opener'),
|
||||||
'loader-enabled' => $this->config->getAppValue('loader-enabled', '1'),
|
'loader-enabled' => $this->config->getAppValue('loader-enabled', '1'),
|
||||||
@@ -117,11 +159,15 @@ class Admin implements ISettings
|
|||||||
'force' => $this->config->getAppValue('force', '0'),
|
'force' => $this->config->getAppValue('force', '0'),
|
||||||
'target-blank-apps' => $this->config->getAppValueArray('target-blank-apps', '[]'),
|
'target-blank-apps' => $this->config->getAppValueArray('target-blank-apps', '[]'),
|
||||||
'top-menu-apps' => $this->config->getAppValueArray('top-menu-apps', '[]'),
|
'top-menu-apps' => $this->config->getAppValueArray('top-menu-apps', '[]'),
|
||||||
|
'top-side-menu-apps' => $this->config->getAppValueArray('top-side-menu-apps', '[]'),
|
||||||
'default-enabled' => $this->config->getAppValue('default-enabled', '1'),
|
'default-enabled' => $this->config->getAppValue('default-enabled', '1'),
|
||||||
|
'apps' => $this->appRepository->getVisibleApps(),
|
||||||
|
'apps-categories-custom' => $this->config->getAppValueArray('apps-categories-custom', '[]'),
|
||||||
'categories-order-type' => $this->config->getAppValue('categories-order-type', 'default'),
|
'categories-order-type' => $this->config->getAppValue('categories-order-type', 'default'),
|
||||||
'categories-order' => $this->config->getAppValueArray('categories-order', '[]'),
|
'categories-order' => $this->config->getAppValueArray('categories-order', '[]'),
|
||||||
'apps' => $this->appRepository->getVisibleApps(),
|
'categories-custom' => $this->config->getAppValueArray('categories-custom', '[]'),
|
||||||
'categories' => $this->categoryRepository->getOrderedCategories(),
|
'categories' => $this->categoryRepository->getOrderedCategories(),
|
||||||
|
'langs' => $this->langRepository->getUsedLangs(),
|
||||||
];
|
];
|
||||||
|
|
||||||
return new TemplateResponse(Application::APP_ID, 'settings/admin-form', $parameters, '');
|
return new TemplateResponse(Application::APP_ID, 'settings/admin-form', $parameters, '');
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ class Personal implements ISettings
|
|||||||
$this->config->getAppValue('default-enabled', '1')
|
$this->config->getAppValue('default-enabled', '1')
|
||||||
),
|
),
|
||||||
'top-menu-apps' => $this->config->getUserValueArray($user, 'top-menu-apps', '[]'),
|
'top-menu-apps' => $this->config->getUserValueArray($user, 'top-menu-apps', '[]'),
|
||||||
|
'top-side-menu-apps' => $this->config->getUserValueArray($user, 'top-side-menu-apps', '[]'),
|
||||||
'target-blank-mode' => $this->config->getUserValue($user, 'target-blank-mode', '1'),
|
'target-blank-mode' => $this->config->getUserValue($user, 'target-blank-mode', '1'),
|
||||||
'target-blank-apps' => $this->config->getUserValueArray($user, 'target-blank-apps', '[]'),
|
'target-blank-apps' => $this->config->getUserValueArray($user, 'target-blank-apps', '[]'),
|
||||||
'apps' => $this->appRepository->getVisibleApps(),
|
'apps' => $this->appRepository->getVisibleApps(),
|
||||||
|
|||||||
@@ -11,9 +11,9 @@
|
|||||||
"stylelint:fix": "stylelint src --fix"
|
"stylelint:fix": "stylelint src --fix"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nextcloud/axios": "^1.3.2",
|
"@nextcloud/axios": "^1.8.0",
|
||||||
"@nextcloud/vue": "^1.4.0",
|
"@nextcloud/vue": "^1.5.0",
|
||||||
"axios": "^0.19.2",
|
"axios": "^0.24.0",
|
||||||
"trim": "0.0.1",
|
"trim": "0.0.1",
|
||||||
"vue": "^2.6.11"
|
"vue": "^2.6.11"
|
||||||
},
|
},
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
"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",
|
||||||
@@ -43,9 +43,9 @@
|
|||||||
"eslint-plugin-standard": "^4.0.1",
|
"eslint-plugin-standard": "^4.0.1",
|
||||||
"eslint-plugin-vue": "^5.2.3",
|
"eslint-plugin-vue": "^5.2.3",
|
||||||
"file-loader": "^6.0.0",
|
"file-loader": "^6.0.0",
|
||||||
"node-sass": "^4.13.1",
|
|
||||||
"sass-loader": "^8.0.2",
|
"sass-loader": "^8.0.2",
|
||||||
"stylelint": "^8.4.0",
|
"stylelint": "^8.4.0",
|
||||||
|
"sass": "^1.49.9",
|
||||||
"stylelint-config-recommended-scss": "^3.3.0",
|
"stylelint-config-recommended-scss": "^3.3.0",
|
||||||
"stylelint-scss": "^3.16.0",
|
"stylelint-scss": "^3.16.0",
|
||||||
"stylelint-webpack-plugin": "^0.10.5",
|
"stylelint-webpack-plugin": "^0.10.5",
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 195 KiB After Width: | Height: | Size: 321 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 57 KiB |
@@ -0,0 +1,182 @@
|
|||||||
|
<!--
|
||||||
|
@license GNU AGPL version 3 or any later version
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as
|
||||||
|
published by the Free Software Foundation, either version 3 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<ul class="side-menu-setting-list">
|
||||||
|
<li v-for="item in values" class="side-menu-setting-list-item" v-on:click="showEditForm(item)">
|
||||||
|
<span v-html="item.en"></span>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<Actions>
|
||||||
|
<ActionButton @click="showAddForm" icon="icon-add"></ActionButton>
|
||||||
|
</Actions>
|
||||||
|
|
||||||
|
<Modal v-if="addForm" @close="hideAddForm">
|
||||||
|
<div class="modal__content">
|
||||||
|
<div v-for="lang in langs">
|
||||||
|
<span class="lang" v-html="lang"></span>
|
||||||
|
<input type="text" v-model="newValue[lang]" required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Actions>
|
||||||
|
<ActionButton @click="saveAdd" icon="icon-checkmark"></ActionButton>
|
||||||
|
</Actions>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
|
||||||
|
<Modal v-if="editForm" @close="hideEditForm">
|
||||||
|
<div class="modal__content">
|
||||||
|
<div v-for="lang in langs">
|
||||||
|
<span class="lang" v-html="lang"></span>
|
||||||
|
<input type="text" v-model="editValue[lang]" required>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pull-right">
|
||||||
|
<Actions>
|
||||||
|
<ActionButton @click="removeEdit" icon="icon-delete"></ActionButton>
|
||||||
|
</Actions>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Actions>
|
||||||
|
<ActionButton @click="saveEdit" icon="icon-checkmark"></ActionButton>
|
||||||
|
</Actions>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.modal__content {
|
||||||
|
width: 200px;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal__content .lang {
|
||||||
|
width: 60px;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 4px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal__content input[type=text] {
|
||||||
|
width: calc(100% - 85px);
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pull-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import Modal from '@nextcloud/vue/dist/Components/Modal'
|
||||||
|
import Actions from '@nextcloud/vue/dist/Components/Actions'
|
||||||
|
import ActionButton from '@nextcloud/vue/dist/Components/ActionButton'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'AdminCategoriesCustom',
|
||||||
|
components: {
|
||||||
|
Modal,
|
||||||
|
Actions,
|
||||||
|
ActionButton,
|
||||||
|
},
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
input: null,
|
||||||
|
values: [],
|
||||||
|
langs: [],
|
||||||
|
addForm: false,
|
||||||
|
editForm: false,
|
||||||
|
newValue: {},
|
||||||
|
editValue: {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
init() {
|
||||||
|
this.values = JSON.parse(this.input.value)
|
||||||
|
this.langs = JSON.parse(this.input.getAttribute('data-langs'))
|
||||||
|
},
|
||||||
|
update() {
|
||||||
|
this.input.value = JSON.stringify(this.values)
|
||||||
|
},
|
||||||
|
showAddForm() {
|
||||||
|
this.newValue = {id: 'cat' + Math.random().toString().replace('0.', '')}
|
||||||
|
|
||||||
|
this.addForm = true
|
||||||
|
},
|
||||||
|
showEditForm(value) {
|
||||||
|
this.editValue = {id: value.id}
|
||||||
|
|
||||||
|
for (let i of this.langs) {
|
||||||
|
this.editValue[i] = typeof value[i] !== 'undefined' ? value[i] : ''
|
||||||
|
}
|
||||||
|
|
||||||
|
this.editForm = true
|
||||||
|
},
|
||||||
|
saveAdd() {
|
||||||
|
for (let i of this.langs) {
|
||||||
|
if (!this.newValue[i] || /^\s*$/.test(this.newValue[i])) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.values.push(this.newValue)
|
||||||
|
this.update()
|
||||||
|
this.hideAddForm()
|
||||||
|
this.newValue = {}
|
||||||
|
},
|
||||||
|
saveEdit() {
|
||||||
|
for (let i of this.langs) {
|
||||||
|
if (!this.editValue[i] || /^\s*$/.test(this.editValue[i])) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i in this.values) {
|
||||||
|
if (this.values[i].id === this.editValue.id) {
|
||||||
|
this.values[i] = this.editValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.update()
|
||||||
|
this.hideEditForm()
|
||||||
|
},
|
||||||
|
removeEdit() {
|
||||||
|
for (let i in this.values) {
|
||||||
|
if (this.values[i].id === this.editValue.id) {
|
||||||
|
this.values.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.update()
|
||||||
|
this.hideEditForm()
|
||||||
|
},
|
||||||
|
hideAddForm() {
|
||||||
|
this.addForm = false
|
||||||
|
},
|
||||||
|
hideEditForm() {
|
||||||
|
this.editForm = false
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.input = document.querySelector('input[name="categories-custom"]')
|
||||||
|
this.init()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -100,7 +100,7 @@ export default {
|
|||||||
var dataId = parent.getAttribute('data-id')
|
var dataId = parent.getAttribute('data-id')
|
||||||
dataId = dataId !== null ? dataId : ''
|
dataId = dataId !== null ? dataId : ''
|
||||||
|
|
||||||
if (!parent.classList.contains('app-hidden') && !menuIsHidden) {
|
if (!parent.classList.contains('app-top-side-menu') && !parent.classList.contains('app-hidden') && !menuIsHidden) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,12 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import AdminCategoriesCustom from './AdminCategoriesCustom.vue'
|
||||||
|
import Vue from 'vue'
|
||||||
|
|
||||||
|
Vue.prototype.OC = window.OC
|
||||||
|
Vue.prototype.OCA = window.OCA
|
||||||
|
|
||||||
let elements = []
|
let elements = []
|
||||||
|
|
||||||
const selector = '#side-menu-message'
|
const selector = '#side-menu-message'
|
||||||
@@ -73,17 +79,21 @@ 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)
|
|
||||||
)
|
|
||||||
|
|
||||||
if (key < size) {
|
progress.setAttribute('value', percent)
|
||||||
|
|
||||||
|
if (key < size - 1) {
|
||||||
saveSettings(key + 1)
|
saveSettings(key + 1)
|
||||||
} else {
|
} else {
|
||||||
OC.msg.finishedSuccess(selector, t('side_menu', 'Saved'))
|
location.reload()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
error: () => {
|
error: () => {
|
||||||
@@ -108,7 +118,31 @@ const elementToggler = (element) => {
|
|||||||
element.style.display = display
|
element.style.display = display
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const updateAppsCategoriesCustom = () => {
|
||||||
|
let values = {}
|
||||||
|
|
||||||
|
for (let item of document.querySelectorAll('.apps-categories-custom')) {
|
||||||
|
let app = item.getAttribute('data-app')
|
||||||
|
let value = item.value
|
||||||
|
|
||||||
|
if (value) {
|
||||||
|
values[app] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.querySelector('#apps-categories-custom').value = JSON.stringify(values)
|
||||||
|
}
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
$('*[data-toggle="tooltip"]').tooltip();
|
||||||
|
|
||||||
|
if (document.querySelector('#side-menu-categories-custom')) {
|
||||||
|
const View = Vue.extend(AdminCategoriesCustom)
|
||||||
|
const adminCategoriesCustom = new View({})
|
||||||
|
|
||||||
|
adminCategoriesCustom.$mount('#side-menu-categories-custom')
|
||||||
|
}
|
||||||
|
|
||||||
elements = document.querySelectorAll('.side-menu-setting')
|
elements = document.querySelectorAll('.side-menu-setting')
|
||||||
|
|
||||||
document.querySelector('#side-menu-save').addEventListener('click', (event) => {
|
document.querySelector('#side-menu-save').addEventListener('click', (event) => {
|
||||||
@@ -118,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) {
|
||||||
@@ -134,6 +181,12 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (let item of document.querySelectorAll('.apps-categories-custom')) {
|
||||||
|
item.addEventListener('change', (event) => {
|
||||||
|
updateAppsCategoriesCustom()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
for (let item of document.querySelectorAll('.side-menu-setting-live')) {
|
for (let item of document.querySelectorAll('.side-menu-setting-live')) {
|
||||||
item.addEventListener('change', (event) => {
|
item.addEventListener('change', (event) => {
|
||||||
const target = event.target
|
const target = event.target
|
||||||
@@ -196,6 +249,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
let value = []
|
let value = []
|
||||||
|
|
||||||
for (let item of document.querySelectorAll('#categories-list .side-menu-setting-list-item')) {
|
for (let item of document.querySelectorAll('#categories-list .side-menu-setting-list-item')) {
|
||||||
|
console.log(item.getAttribute('data-id'))
|
||||||
value.push(item.getAttribute('data-id'))
|
value.push(item.getAttribute('data-id'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,3 +77,17 @@
|
|||||||
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Tyto parametry jsou použity v případě, že je zapnutý (Breeze) tmavý motiv vzhledu."
|
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Tyto parametry jsou použity v případě, že je zapnutý (Breeze) tmavý motiv vzhledu."
|
||||||
"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"
|
||||||
|
"Customize application categories": "Personnaliser les catégories des applications"
|
||||||
|
"Customize application categories": "Přizpůsobte kategorie aplikací"
|
||||||
|
"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"
|
||||||
|
"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"
|
||||||
|
|||||||
@@ -77,3 +77,16 @@
|
|||||||
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Diese Optionen werden auf <code>Dark Theme</code> oder <code>Breeze Dark Theme</code> angewendet."
|
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Diese Optionen werden auf <code>Dark Theme</code> oder <code>Breeze Dark Theme</code> angewendet."
|
||||||
"Dark mode colors": "Farben für den dunklen Modus"
|
"Dark mode colors": "Farben für den dunklen Modus"
|
||||||
"With categories": "Mit Kategorien"
|
"With categories": "Mit Kategorien"
|
||||||
|
"Custom categories": "Benutzerdefinierte Kategorien"
|
||||||
|
"Customize application categories": "Anwendungskategorien anpassen"
|
||||||
|
"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"
|
||||||
|
"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"
|
||||||
|
|||||||
@@ -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"
|
||||||
@@ -77,3 +85,8 @@
|
|||||||
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Ces paramètres sont utilisés lorsque le thème sombre ou le thème Breeze Dark sont activés."
|
"This parameters are used when Dark theme or Breeze Dark Theme are enabled.": "Ces paramètres sont utilisés lorsque le thème sombre ou le thème Breeze Dark sont activés."
|
||||||
"Dark mode colors": "Couleurs du mode sombre"
|
"Dark mode colors": "Couleurs du mode sombre"
|
||||||
"With categories": "Avec les catégories"
|
"With categories": "Avec les catégories"
|
||||||
|
"Custom categories": "Catégories personnalisées"
|
||||||
|
"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 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"
|
||||||
|
|||||||
@@ -77,3 +77,16 @@
|
|||||||
"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.": "此参数将应用于暗黑主题激活时。"
|
||||||
"Dark mode colors": "暗黑模式颜色"
|
"Dark mode colors": "暗黑模式颜色"
|
||||||
"With categories": "有类别"
|
"With categories": "有类别"
|
||||||
|
"Custom categories": "自定义类别"
|
||||||
|
"Customize application categories": "自定义应用程序类别"
|
||||||
|
"Apps only visible in the top menu": "应用程序仅在顶部菜单中可见"
|
||||||
|
"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": "大文本"
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
}
|
}
|
||||||
|
|
||||||
<?php if (empty($_['top-menu-apps'])): ?>
|
<?php if (empty($_['top-menu-apps']) && empty($_['top-side-menu-apps'])): ?>
|
||||||
#appmenu {
|
#appmenu {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,13 +52,17 @@ const updateTopMenu = function() {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if (topMenuApps.indexOf(dataId) === -1) {
|
if (topMenuApps.indexOf(dataId) === -1 && topSideMenuApps.indexOf(dataId) === -1) {
|
||||||
app.classList.add('hidden')
|
app.classList.add('hidden')
|
||||||
app.classList.add('app-hidden')
|
app.classList.add('app-hidden')
|
||||||
} else {
|
} else {
|
||||||
app.classList.remove('hidden')
|
app.classList.remove('hidden')
|
||||||
app.classList.add('app-external-site')
|
app.classList.add('app-external-site')
|
||||||
|
|
||||||
|
if (topSideMenuApps.indexOf(dataId) !== -1) {
|
||||||
|
app.classList.add('app-top-side-menu')
|
||||||
|
}
|
||||||
|
|
||||||
appShown.push(app)
|
appShown.push(app)
|
||||||
|
|
||||||
navigationAppsHtml = navigationAppsHtml + app.outerHTML
|
navigationAppsHtml = navigationAppsHtml + app.outerHTML
|
||||||
@@ -67,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
|
||||||
@@ -198,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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -149,6 +149,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 +173,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)
|
||||||
@@ -186,8 +203,9 @@ if ($_['always-displayed']) {
|
|||||||
nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud.nextSibling)
|
nextcloud.parentNode.insertBefore(sideMenuOpener, nextcloud.nextSibling)
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<?php if (!empty($_['top-menu-apps'])): ?>
|
<?php if (!empty($_['top-menu-apps']) || !empty($_['top-side-menu-apps'])): ?>
|
||||||
const topMenuApps = <?php echo json_encode($_['top-menu-apps']); ?>
|
const topMenuApps = <?php echo json_encode($_['top-menu-apps']), "\n"; ?>
|
||||||
|
const topSideMenuApps = <?php echo json_encode($_['top-side-menu-apps']); ?>
|
||||||
|
|
||||||
<?php require_once __DIR__.'/_topMenuApps.js'; ?>
|
<?php require_once __DIR__.'/_topMenuApps.js'; ?>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|||||||
@@ -67,6 +67,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('Reset to default')); ?>" 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 +106,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('Reset to default')); ?>" 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 +126,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('Reset to default')); ?>" data-reset="<?php echo htmlentities(json_encode([
|
||||||
|
'side-menu-text-color' => $_['defaults']['text-color'],
|
||||||
|
])) ?>"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -134,6 +146,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('Reset to default')); ?>" data-reset="<?php echo htmlentities(json_encode([
|
||||||
|
'side-menu-loader-color' => $_['defaults']['loader-color'],
|
||||||
|
])) ?>"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -227,16 +243,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('Reset to default')); ?>" 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 +289,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('Reset to default')); ?>" 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 +309,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('Reset to default')); ?>" 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 +329,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('Reset to default')); ?>" 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>
|
||||||
@@ -497,7 +535,6 @@ $choicesSizes = [
|
|||||||
<div>
|
<div>
|
||||||
<label for="side-menu-opener">
|
<label for="side-menu-opener">
|
||||||
<?php p($l->t('Always displayed')); ?>
|
<?php p($l->t('Always displayed')); ?>
|
||||||
<small><span class="warning"><?php p($l->t('Experimental')); ?></span></small>
|
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<p><em><?php p($l->t('Not compatible with touch screens.')); ?></em></p>
|
<p><em><?php p($l->t('Not compatible with touch screens.')); ?></em></p>
|
||||||
@@ -660,7 +697,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>
|
||||||
@@ -668,7 +705,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>
|
||||||
@@ -731,7 +768,7 @@ $choicesSizes = [
|
|||||||
<div class="side-menu-setting-table">
|
<div class="side-menu-setting-table">
|
||||||
<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('Apps that not must be moved in the side menu')); ?>
|
<?php p($l->t('Apps only visible in the top menu')); ?>
|
||||||
</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="#_">
|
||||||
@@ -760,6 +797,39 @@ $choicesSizes = [
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="side-menu-setting-table">
|
||||||
|
<div class="side-menu-setting-row">
|
||||||
|
<div class="side-menu-setting-label">
|
||||||
|
<?php p($l->t('Apps visible in the top and side menus')); ?>
|
||||||
|
</div>
|
||||||
|
<div class="side-menu-setting-form">
|
||||||
|
<a class="side-menu-toggler" data-target="#top-side-menu-apps" href="#_">
|
||||||
|
🖱️ <?php p($l->t('Show and hide the list of applications')); ?>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div class="side-menu-setting" data-name="top-side-menu-apps" id="top-side-menu-apps" data-checkbox style="display: none">
|
||||||
|
<ul class="side-menu-setting-list">
|
||||||
|
<?php foreach ($_['apps'] as $app): ?>
|
||||||
|
<li class="side-menu-setting-list-item">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
name="top-side-menu-apps[]"
|
||||||
|
value="<?php echo $app['id'] ?>"
|
||||||
|
id="top-side-menu-app-<?php echo $app['id'] ?>"
|
||||||
|
<?php if (in_array($app['id'], $_['top-side-menu-apps'])): ?>checked<?php endif; ?>
|
||||||
|
/>
|
||||||
|
|
||||||
|
<label for="top-side-menu-app-<?php echo $app['id'] ?>">
|
||||||
|
<?php echo p($l->t($app['name'])); ?>
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@@ -790,6 +860,60 @@ $choicesSizes = [
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="side-menu-setting-row">
|
||||||
|
<div class="side-menu-setting-label">
|
||||||
|
<?php p($l->t('Custom categories')); ?>
|
||||||
|
</div>
|
||||||
|
<div class="side-menu-setting-form">
|
||||||
|
<input type="hidden" name="categories-custom" class="side-menu-setting" data-langs="<?php echo htmlentities(json_encode($langs)) ?>" value="<?php echo htmlentities(json_encode($_['categories-custom'])) ?>">
|
||||||
|
|
||||||
|
<div id="side-menu-categories-custom">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="side-menu-setting-row">
|
||||||
|
<div class="side-menu-setting-label">
|
||||||
|
<?php p($l->t('Customize application categories')); ?>
|
||||||
|
</div>
|
||||||
|
<div class="side-menu-setting-form">
|
||||||
|
<a class="side-menu-toggler" data-target="#apps-categories-custom-list" href="#_">
|
||||||
|
🖱️ <?php p($l->t('Show and hide the list of applications')); ?>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div id="apps-categories-custom-list" style="display: none">
|
||||||
|
<ul class="side-menu-setting-list">
|
||||||
|
<?php foreach ($_['apps'] as $app): ?>
|
||||||
|
<li class="side-menu-setting-list-item">
|
||||||
|
<label for="apps-categories-custom-<?php echo $app['id'] ?>">
|
||||||
|
<?php echo p($l->t($app['name'])); ?>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<select data-app="<?php echo $app['id'] ?>" class="apps-categories-custom">
|
||||||
|
<option value=""></option>
|
||||||
|
|
||||||
|
<?php foreach ($_['categories'] as $id => $category): ?>
|
||||||
|
<?php if ($category): ?>
|
||||||
|
<option
|
||||||
|
value="<?php echo $id ?>"
|
||||||
|
<?php if (($_['apps-categories-custom'][$app['id']] ?? '') === $id): ?>
|
||||||
|
selected
|
||||||
|
<?php endif; ?>
|
||||||
|
><?php echo $category ?></option>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</select>
|
||||||
|
</li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input type="hidden" class="side-menu-setting" id="apps-categories-custom" name="apps-categories-custom" value="<?php echo htmlentities(json_encode($_['apps-categories-custom'])) ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<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 sorting')); ?>
|
<?php p($l->t('Customize sorting')); ?>
|
||||||
@@ -870,10 +994,9 @@ $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">
|
<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')); ?>
|
||||||
|
|||||||
@@ -43,17 +43,16 @@ $choicesYesNo = [
|
|||||||
<?php p($l->t('Menu')); ?>
|
<?php p($l->t('Menu')); ?>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div>
|
|
||||||
<label for="side-menu-enabled">
|
|
||||||
<?php p($l->t('Enable the custom menu')); ?>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<em><?php echo $l->t('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.'); ?></em>
|
<em><?php echo $l->t('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.'); ?></em>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div>
|
<div class="side-menu-setting-table">
|
||||||
|
<div class="side-menu-setting-row">
|
||||||
|
<div class="side-menu-setting-label">
|
||||||
|
<?php p($l->t('Enable the custom menu')); ?>
|
||||||
|
</div>
|
||||||
|
<div class="side-menu-setting-form">
|
||||||
<select id="side-menu-enabled" name="enabled" class="side-menu-setting" data-personal>
|
<select id="side-menu-enabled" name="enabled" class="side-menu-setting" data-personal>
|
||||||
<?php foreach ($choicesYesNo as $label => $value): ?>
|
<?php foreach ($choicesYesNo as $label => $value): ?>
|
||||||
<option value="<?php echo $value ?>" <?php if ($value === $_['enabled']): ?>selected<?php endif; ?>>
|
<option value="<?php echo $value ?>" <?php if ($value === $_['enabled']): ?>selected<?php endif; ?>>
|
||||||
@@ -62,14 +61,15 @@ $choicesYesNo = [
|
|||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div>
|
|
||||||
<label for="side-menu-target-blank">
|
|
||||||
<?php p($l->t('Open apps in new tab')); ?>
|
|
||||||
</label>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div class="side-menu-setting-table">
|
||||||
|
<div class="side-menu-setting-row">
|
||||||
|
<div class="side-menu-setting-label">
|
||||||
|
<?php p($l->t('Open apps in new tab')); ?>
|
||||||
|
</div>
|
||||||
|
<div class="side-menu-setting-form">
|
||||||
<?php $choices = [
|
<?php $choices = [
|
||||||
'Use the global setting' => '1',
|
'Use the global setting' => '1',
|
||||||
'Use my selection' => '2',
|
'Use my selection' => '2',
|
||||||
@@ -82,7 +82,6 @@ $choicesYesNo = [
|
|||||||
</option>
|
</option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<a class="side-menu-toggler" data-target="#target-blank-apps" href="#_">
|
<a class="side-menu-toggler" data-target="#target-blank-apps" href="#_">
|
||||||
@@ -91,8 +90,9 @@ $choicesYesNo = [
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="side-menu-setting" data-name="target-blank-apps" id="target-blank-apps" data-personal data-checkbox style="display: none">
|
<div class="side-menu-setting" data-name="target-blank-apps" id="target-blank-apps" data-personal data-checkbox style="display: none">
|
||||||
|
<ul class="side-menu-setting-list">
|
||||||
<?php foreach ($_['apps'] as $app): ?>
|
<?php foreach ($_['apps'] as $app): ?>
|
||||||
<div>
|
<li class="side-menu-setting-list-item">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="target-blank-apps[]"
|
name="target-blank-apps[]"
|
||||||
@@ -104,8 +104,12 @@ $choicesYesNo = [
|
|||||||
<label for="target-blank-app-<?php echo $app['id'] ?>">
|
<label for="target-blank-app-<?php echo $app['id'] ?>">
|
||||||
<?php echo p($l->t($app['name'])); ?>
|
<?php echo p($l->t($app['name'])); ?>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</li>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -113,18 +117,18 @@ $choicesYesNo = [
|
|||||||
<h2>
|
<h2>
|
||||||
<?php p($l->t('Top menu')); ?>
|
<?php p($l->t('Top menu')); ?>
|
||||||
</h2>
|
</h2>
|
||||||
<div>
|
|
||||||
<label for="side-menu-top-menu-apps">
|
|
||||||
<?php p($l->t('Apps that not must be moved in the side menu')); ?>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
<div class="side-menu-setting-table">
|
||||||
|
<div class="side-menu-setting-row">
|
||||||
|
<div class="side-menu-setting-label">
|
||||||
|
<?php p($l->t('Apps only visible in the top menu')); ?>
|
||||||
<p>
|
<p>
|
||||||
<em>
|
<em>
|
||||||
<?php p($l->t('If there is no selection then the global configuration is applied.')); ?>
|
<?php p($l->t('If there is no selection then the global configuration is applied.')); ?>
|
||||||
</em>
|
</em>
|
||||||
</p>
|
</p>
|
||||||
|
</div>
|
||||||
|
<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('Show and hide the list of applications')); ?>
|
||||||
@@ -132,8 +136,9 @@ $choicesYesNo = [
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div class="side-menu-setting" data-name="top-menu-apps" data-checkbox data-personal id="top-menu-apps" style="display: none">
|
<div class="side-menu-setting" data-name="top-menu-apps" data-checkbox data-personal id="top-menu-apps" style="display: none">
|
||||||
|
<ul class="side-menu-setting-list">
|
||||||
<?php foreach ($_['apps'] as $app): ?>
|
<?php foreach ($_['apps'] as $app): ?>
|
||||||
<div>
|
<li class="side-menu-setting-list-item">
|
||||||
<input
|
<input
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
name="top-menu-apps[]"
|
name="top-menu-apps[]"
|
||||||
@@ -145,15 +150,62 @@ $choicesYesNo = [
|
|||||||
<label for="top-menu-app-<?php echo $app['id'] ?>">
|
<label for="top-menu-app-<?php echo $app['id'] ?>">
|
||||||
<?php echo $app['name'] ?>
|
<?php echo $app['name'] ?>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</li>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="side-menu-setting-table">
|
||||||
|
<div class="side-menu-setting-row">
|
||||||
|
<div class="side-menu-setting-label">
|
||||||
|
<?php p($l->t('Apps visible in the top and side menus')); ?>
|
||||||
|
<p>
|
||||||
|
<em>
|
||||||
|
<?php p($l->t('If there is no selection then the global configuration is applied.')); ?>
|
||||||
|
</em>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="side-menu-setting-form">
|
||||||
|
<p>
|
||||||
|
<a class="side-menu-toggler" data-target="#top-side-menu-apps" href="#_">
|
||||||
|
🖱️ <?php p($l->t('Show and hide the list of applications')); ?>
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="side-menu-setting" data-name="top-side-menu-apps" data-checkbox data-personal id="top-side-menu-apps" style="display: none">
|
||||||
|
<ul class="side-menu-setting-list">
|
||||||
|
<?php foreach ($_['apps'] as $app): ?>
|
||||||
|
<li class="side-menu-setting-list-item">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
name="top-side-menu-apps[]"
|
||||||
|
value="<?php echo $app['id'] ?>"
|
||||||
|
id="top-side-menu-app-<?php echo $app['id'] ?>"
|
||||||
|
<?php if (in_array($app['id'], $_['top-side-menu-apps'])): ?>checked<?php endif; ?>
|
||||||
|
/>
|
||||||
|
|
||||||
|
<label for="top-side-menu-app-<?php echo $app['id'] ?>">
|
||||||
|
<?php echo $app['name'] ?>
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
|
|
||||||
<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>
|
||||||
|
|
||||||
|
|||||||