Compare commits

..

848 Commits

Author SHA1 Message Date
Simon Vieille d666cac5be Merge pull request 'fix #510 #520 #417' (#521) from feature/nc35 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/521
2026-09-18 18:33:50 +02:00
Simon Vieille 9a71429182 doc: update changelog 2026-09-18 18:30:48 +02:00
Simon Vieille f1b495809f fix #510: [Bug] Styling of the icon labels and overflow icon is not correct 2026-09-18 18:28:08 +02:00
Simon Vieille e44b2c70a7 feat(app): add compatibility with Nextcloud 35 2026-09-18 18:06:54 +02:00
Simon Vieille 52de7326ec Merge pull request 'feat: release v6.1.0' (#518) from feature/release into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/518
2026-09-07 18:07:26 +02:00
Simon Vieille 4975743441 feat: release v6.1.0 2026-09-07 18:06:55 +02:00
Simon Vieille be6e9eaced Merge pull request 'fix(admin): add toggle menu button for admin navigation (#462)' (#517) from bugfix/issue462-adminmenu into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/517
2026-09-05 16:46:37 +02:00
Simon Vieille 627b9e8bf4 fix(admin): add toggle menu button for admin navigation (#462) 2026-09-05 16:44:52 +02:00
Simon Vieille 7bc64003a5 Merge pull request 'bugfix/issue510-styling' (#516) from bugfix/issue510-styling into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/516
2026-09-05 15:56:05 +02:00
Simon Vieille d078cc68e7 fix(StandardMenu): move 'more apps' buttons down (#510) 2026-09-05 15:54:26 +02:00
Simon Vieille 55a2b21ed1 fix(StandardMenu): move app labels down (#510) 2026-09-05 15:43:35 +02:00
Simon Vieille f7a8a41f6e merge develop 2026-09-05 13:16:38 +02:00
Simon Vieille c2c6399106 Merge pull request 'feat: add search toggle option (fix #509)' (#515) from feature/issue509-search-toggle into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/515
2026-09-05 13:09:52 +02:00
Simon Vieille f4833d1956 feat: add search toggle option (fix #509) 2026-09-05 13:06:24 +02:00
Simon Vieille 9eab478c36 chore(info): set version 2026-07-18 16:28:51 +02:00
Simon Vieille c1588dfc2e Merge pull request 'feat(standard-menu): add unified-search-input size handling' (#507) from bugfix/top-menu-popover into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/507
2026-07-18 16:26:18 +02:00
Simon Vieille c24bb6f8c8 feat(standard-menu): add unified-search-input size handling 2026-07-18 16:26:06 +02:00
Simon Vieille ca689d8b6f Merge pull request 'bugfix/top-menu-popover' (#506) from bugfix/top-menu-popover into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/506
2026-07-18 15:52:52 +02:00
Simon Vieille e81f0e4b76 doc: update changelog 2026-07-18 15:52:34 +02:00
Simon Vieille 7033569bed feat(standard-menu): add unified-search-input size handling 2026-07-18 15:52:21 +02:00
Simon Vieille a9788f0ab8 Merge pull request 'bugfix/always-displays-no-apps' (#505) from bugfix/always-displays-no-apps into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/505
2026-07-18 13:03:22 +02:00
Simon Vieille 1a8063bd94 doc: update changelog 2026-07-18 13:00:51 +02:00
Simon Vieille cc841570ec fix(ui): only apply always-displayed display css rules when the menu is displayed 2026-07-18 13:00:35 +02:00
Simon Vieille d6a2da402c fix(webpack): set global appVersion 2026-07-18 12:44:22 +02:00
Simon Vieille fef11cd0cf Merge pull request 'feature/nc34' (#503) from feature/nc34 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/503
2026-07-17 18:59:17 +02:00
Simon Vieille 12b35470c7 doc: update changelog 2026-07-17 18:58:42 +02:00
Simon Vieille 23cb8fcfc1 chore(app): remove compatibility with Nextcloud < 34 2026-07-17 18:58:24 +02:00
Simon Vieille 2b4da9cfce Merge pull request 'chore(info): set version' (#502) from feature/nc34 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/502
2026-07-17 18:45:08 +02:00
Simon Vieille f2af45711d chore(info): set version 2026-07-17 18:44:57 +02:00
Simon Vieille 35afa38f73 Merge pull request 'feature/nc34' (#500) from feature/nc34 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/500
2026-07-17 18:43:53 +02:00
Simon Vieille ad162f5821 doc: update changelog 2026-07-17 18:34:53 +02:00
Simon Vieille d3f87adcca feat(app): add compatibility with Nextcloud 34 2026-07-17 18:34:53 +02:00
Simon Vieille b32e4ded42 fix(app): add compatibility with Nextcloud 34 2026-07-17 18:31:25 +02:00
Simon Vieille 88e54e01b6 chore(dep): update @nextcloud/vue 2026-07-17 18:29:11 +02:00
Simon Vieille ce01983f1c Merge pull request 'fix: #489: allow PHP 8.5 compatibility' (#490) from feature/php85 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/490
2026-04-05 09:23:27 +02:00
Simon Vieille 6ee79a3110 chore: app version 2026-04-05 09:23:09 +02:00
Simon Vieille a32bf417a7 fix: #489: allow PHP 8.5 compatibility 2026-04-05 09:12:58 +02:00
Simon Vieille 337e1a07e3 doc: update changelog 2026-03-08 19:10:29 +01:00
gallegonovato fccfe1341a Translated using Weblate (Spanish)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2026-03-08 19:09:32 +01:00
Outbreak2096 242569316f Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/zh_Hans/
2026-03-08 19:09:31 +01:00
gallegonovato 78888460fc Translated using Weblate (Spanish)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2026-03-08 19:09:31 +01:00
Simon Vieille 4d453676dc Merge branch 'develop' into translations 2026-03-08 19:08:08 +01:00
Simon Vieille f49b30b20e Merge pull request 'bugfix/intl-segmenter-polyfill' (#479) from bugfix/intl-segmenter-polyfill into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/479
2026-03-08 19:06:18 +01:00
Simon Vieille 0067b4e1c8 doc: update changelog 2026-03-08 19:05:56 +01:00
Simon Vieille 77cf610c8b Merge branch 'develop' into bugfix/intl-segmenter-polyfill 2026-03-08 19:05:14 +01:00
Simon Vieille 5cd106640c Merge pull request 'bugfix/issue475-orm' (#476) from bugfix/issue475-orm into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/476
2026-03-01 13:18:24 +01:00
Simon Vieille d057cd7665 doc: update changelog 2026-03-01 13:11:26 +01:00
Simon Vieille 520225603b fix(admin/*SaveButton): cast settings to string 2026-03-01 13:09:02 +01:00
Simon Vieille c2ecc5bf98 fix(LangRepository): check orm capabilities to query entities 2026-03-01 13:08:26 +01:00
Simon Vieille 8cca320a43 chore: set side_menu as package name 2026-03-01 13:07:07 +01:00
Simon Vieille 19aaf0759b Merge pull request 'chore: app version' (#473) from feature/nc33 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/473
2026-02-27 09:18:16 +01:00
Simon Vieille 47a83f10cc chore: app version 2026-02-27 09:17:46 +01:00
Simon Vieille e1a191121d Merge pull request 'chore: add compatibility with NC33' (#471) from feature/nc33 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/471
2026-02-27 09:16:32 +01:00
Simon Vieille 54f4dce09b chore: add compatibility with NC33 2026-02-27 09:16:02 +01:00
Simon Vieille c0aaa206ed Merge pull request 'bugfix/issue468-logo' (#469) from bugfix/issue468-logo into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/469
2026-02-16 11:52:40 +01:00
Simon Vieille 0124336558 doc: update changelog 2026-02-16 10:12:09 +01:00
Simon Vieille 5ccb56309a fix #468: force nextcloud logo display css rule (opener-only) 2026-02-16 10:09:31 +01:00
gallegonovato 0cb14258ad Translated using Weblate (Spanish)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2026-02-13 18:29:09 +00:00
Simon Vieille 7d26be253a doc: update changelog 2026-01-10 15:51:26 +01:00
Simon Vieille 0437019bb0 fix #464: add Intl.Segmenter polyfill 2026-01-10 15:49:16 +01:00
Outbreak2096 7e7397735b Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/zh_Hans/
2025-11-21 16:10:09 +00:00
Simon Vieille be68f2ef55 fix(doc): fix curl cmd 2025-10-29 17:48:09 +01:00
Codeberg Translate ccfb541404 Merge branch 'origin/translations' into Weblate. 2025-09-30 21:16:55 +00:00
gallegonovato f4e35bdc5d Translated using Weblate (Spanish)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2025-09-30 21:16:53 +00:00
Simon Vieille 1bf9cee8d6 Merge pull request 'bugfix/build' (#446) from bugfix/build into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/446
2025-09-29 00:19:56 +02:00
Simon Vieille 403a7a72fb update changelog 2025-09-29 00:18:55 +02:00
Simon Vieille 81ae76cdb7 build: add package-lock.json 2025-09-29 00:17:57 +02:00
Simon Vieille 32e5ecda8f ci: rollback node to v20 2025-09-29 00:12:56 +02:00
Simon Vieille de98967da5 ci: upgrade node to v22 2025-09-28 23:50:10 +02:00
Simon Vieille f39f3b3aef Merge branch 'translations' into develop 2025-09-28 19:49:28 +02:00
Simon Vieille 0db732b921 fix(trans/fr): remove typo 2025-09-28 19:48:27 +02:00
Simon Vieille ce39df6c2d update changelog 2025-09-28 19:47:42 +02:00
Simon Vieille bc94b61c12 Merge branch 'translations' into develop 2025-09-28 19:46:14 +02:00
Simon Vieille c54c969824 release v5.1.2 2025-09-28 19:43:27 +02:00
Simon Vieille e828a914cf Merge pull request '"Refactor Side Menu JsController to Use IAvatarManager via Dependency Injection for Nextcloud 32 Com' (#442) from AndyXheli/side_menu:develop into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/442
2025-09-28 19:40:50 +02:00
mbouzada 177f88b9aa Translated using Weblate (Galician)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/gl/
2025-09-28 01:36:08 +00:00
p-bo 66a6fda385 Translated using Weblate (Czech)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/cs/
2025-09-28 01:36:08 +00:00
AndyXheli 9ad73c7bf7 Update lib/Controller/JsController.php
Signed-off-by: AndyXheli <andyxheli@gmail.com>
2025-09-20 16:43:41 +02:00
AndyXheli acde24ea71 Update lib/Controller/JsController.php 2025-09-20 16:42:52 +02:00
AndyXheli 8bd89b4565 Update lib/Controller/JsController.php 2025-09-20 16:41:49 +02:00
AndyXheli 58cfbc24af "Refactor Side Menu JsController to Use IAvatarManager via Dependency Injection for Nextcloud 32 Com
🔧 Problem: The Side Menu app was calling OC\Server::getAvatarManager(), which no longer exists in Nextcloud 32.

✅ Fix:

Injected IAvatarManager using Nextcloud’s public API instead of accessing it via OC::$server.

Updated the constructor to accept IAvatarManager, IUserSession, INavigationManager, and IURLGenerator.

Replaced all direct calls to OC::$server->getAvatarManager() and similar with the injected services.

This makes the app compatible with Nextcloud 32 and avoids deprecated internal method calls.

Signed-off-by: AndyXheli <andyxheli@gmail.com>
2025-09-20 16:25:58 +02:00
s0undy a00fcb1423 Translated using Weblate (Swedish)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/sv/
2025-06-08 19:58:24 +00:00
s0undy f335c086b6 Translated using Weblate (Swedish)
Currently translated at 15.3% (17 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/sv/
2025-06-01 23:58:24 +00:00
yurtpage 7bc8cd857c Translated using Weblate (Russian)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2025-06-01 23:58:24 +00:00
Simon Vieille d9051304c8 Merge branch 'translations' into develop 2025-05-26 18:48:38 +02:00
yurtpage 95d7c1f0c7 Translated using Weblate (Slovak)
Currently translated at 52.2% (57 of 109 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/sk/
2025-05-26 18:45:36 +02:00
yurtpage c6fe0db0b6 Translated using Weblate (Russian)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2025-05-26 18:45:35 +02:00
Outbreak2096 3fbfd36cba Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/zh_Hans/
2025-05-26 18:45:35 +02:00
Simon 70a3fefb3d Translated using Weblate (French)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom Menu/Application
Translate-URL: https://translate.gitnet.fr/projects/custom-menu/application/fr/
2025-05-26 18:45:35 +02:00
deblan ddb5b13849 Added translation using Weblate (Swedish) 2025-05-26 14:37:17 +00:00
Simon Vieille 3f16a674e6 release v5.1.1 2025-05-23 09:02:11 +02:00
Simon Vieille 782faf6add update changelog 2025-05-04 18:34:29 +02:00
Simon Vieille 92d15d161b Merge pull request 'fix #349: add custom controller to retrieve core apps' (#431) from bugfix/issue349-components-apps into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/431
2025-05-04 18:31:36 +02:00
Simon Vieille cd4b3b1054 fix #349: add custom controller to retrieve core apps 2025-05-04 18:24:32 +02:00
Simon Vieille f58dedf553 fix(build): define appName to fix this error: "The '@nextcloud/vue' library was used without setting / replacing the 'appName'" 2025-05-04 13:11:05 +02:00
Simon Vieille 8c6f0ad1da release v5.1.0 2025-04-30 13:01:22 +02:00
Simon Vieille 7485a5b349 Merge pull request 'fix #425: allow to set a color using hex code' (#427) from feature/issue425-colorpicker into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/427
2025-04-30 13:00:29 +02:00
Simon Vieille b0e01c2eec update changelog 2025-04-30 12:57:49 +02:00
Simon Vieille d2730afe9f fix #425: allow to set a color using hex code 2025-04-30 12:57:13 +02:00
Simon Vieille 33ab7dff97 update changelog 2025-04-30 12:50:51 +02:00
Simon Vieille 0da550e3eb Merge pull request 'Use Request object' (#426) from llaumgui-develop into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/426
2025-04-30 12:47:23 +02:00
Simon Vieille 4bea4afb07 refactor(Application): add properties types 2025-04-30 12:45:32 +02:00
llaumgui d485b728e7 Use Request object 2025-04-30 09:30:35 +02:00
Simon Vieille 8772504b76 release v5.0.3 2025-04-30 08:41:10 +02:00
Simon Vieille 75bea4be38 Merge pull request 'Update lib/AppInfo/Application.php' (#421) from Monica-Wood/side_menu:http_user_agent_check_patch into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/421
Reviewed-by: Simon Vieille <contact@deblan.fr>
2025-04-30 08:37:15 +02:00
Monica-Wood 8787918547 Update lib/AppInfo/Application.php
The current change is currently filling the nextcloud logs up with the error:
`Undefined array key \"HTTP_USER_AGENT\" at /srv/www/nextcloud/apps/side_menu/lib/AppInfo/Application.php#109`

This adds a check to ensure the index exists before read it.
2025-04-30 07:31:13 +02:00
Simon Vieille 1fcbd89d19 release v5.0.2 2025-04-29 19:26:07 +02:00
Simon Vieille f177340b13 update changelog 2025-04-29 19:24:04 +02:00
Simon Vieille aaa7afac51 Merge pull request 'fix #418: allow non admin user to access their settings' (#419) from bugfix/issue418-userconfigaccess into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/419
2025-04-29 19:23:27 +02:00
Simon Vieille fd4628d209 update changelog 2025-04-29 19:22:25 +02:00
Simon Vieille f9aa59ca04 fix #418: allow non admin user to access their settings 2025-04-29 19:21:17 +02:00
yurtpage 9f8db6be4f Translated using Weblate (Slovak)
Currently translated at 52.2% (57 of 109 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/sk/
2025-04-23 20:53:03 +00:00
yurtpage cc28ad4dc5 Translated using Weblate (Russian)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2025-04-23 20:53:02 +00:00
Codeberg Translate 3e139d42a8 Merge branch 'origin/translations' into Weblate. 2025-04-18 20:39:10 +00:00
Outbreak2096 a956efaf15 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/zh_Hans/
2025-04-18 20:39:09 +00:00
Simon 6a54ae3781 Translated using Weblate (French)
Currently translated at 100.0% (111 of 111 strings)

Translation: Custom Menu/Application
Translate-URL: https://translate.gitnet.fr/projects/custom-menu/application/fr/
2025-04-18 16:49:52 +00:00
Simon Vieille 95e4ef136e Merge pull request 'fix #413: add user-agent check for memories mobile app' (#414) from bugfix/issues413-memories into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/414
2025-04-18 10:36:15 +02:00
Simon Vieille c0eb65547d fix #413: add user-agent check for memories mobile app 2025-04-17 15:15:03 +02:00
Simon Vieille 29d061c379 update readme 2025-04-17 08:48:14 +02:00
Simon Vieille 8e22d9ea62 Merge pull request 'bugfix/standard-menu-mobile' (#411) from bugfix/standard-menu-mobile into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/411
2025-04-17 00:04:48 +02:00
Simon Vieille 8957f1ae78 update app info 2025-04-17 00:03:04 +02:00
Simon Vieille 7b4b447754 fix(StandardMenu): appLimit must return a value > 0 2025-04-17 00:02:47 +02:00
Simon Vieille e297a27f83 fix(build): remove css directory 2025-04-16 20:09:45 +02:00
Simon Vieille 3f6ce2df34 fix(build): remove css directory 2025-04-16 20:03:21 +02:00
Simon Vieille 15cc6a129b Merge pull request 'migration from vue2 to vue3' (#405) from feature/vue3 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/405
2025-04-16 19:56:02 +02:00
Simon Vieille 174c80e654 update changelog 2025-04-16 19:55:07 +02:00
Simon Vieille 17f1d91851 upgrade app version 2025-04-16 19:46:51 +02:00
Simon Vieille cdad60ca7a update changelog 2025-04-16 19:46:40 +02:00
Simon Vieille 94efc26cd5 update screenshots 2025-04-16 19:39:51 +02:00
Simon Vieille a47a8d6c63 remove route unused route 2025-04-16 19:37:28 +02:00
Simon Vieille 9278d61719 Merge remote-tracking branch 'weblate/translations' into translations 2025-04-16 19:20:27 +02:00
Simon Vieille ea29deaa75 update translations 2025-04-16 17:24:10 +02:00
Simon Vieille 835c437923 improve always displayed menu icons style 2025-04-16 12:19:08 +02:00
Simon Vieille a43da950e8 optimize FormDisplayPicker ui 2025-04-16 12:18:26 +02:00
Simon Vieille 0278a92c4f allow to easly import components 2025-04-16 12:18:06 +02:00
Simon Vieille 4de7c72b1e use external link component for links 2025-04-16 12:17:40 +02:00
Simon Vieille 51233920f9 add translations 2025-04-16 12:17:12 +02:00
Simon Vieille 36737cf6d5 show error on save 2025-04-16 09:16:33 +02:00
Simon Vieille f6b9d91e3f fix default menu 'more app' 2025-04-16 09:16:26 +02:00
Simon Vieille cbd8462333 scss: set root vars depending of the theme 2025-04-16 09:16:15 +02:00
Simon Vieille b98bbd1053 save settings with password confirmation 2025-04-16 09:15:58 +02:00
Simon Vieille 31b330451c remove console.log 2025-04-16 09:15:52 +02:00
Simon Vieille a8ed3e1752 increase internal integration of the standard menu 2025-04-16 09:15:35 +02:00
Simon Vieille c32d1fffec refactore of menus: classes and scss 2025-04-16 09:15:25 +02:00
Simon Vieille c4a92dbbc3 format code 2025-04-16 09:15:18 +02:00
Simon Vieille 009a5ed024 improve settings components and scss 2025-04-16 09:15:10 +02:00
Simon Vieille c8194a4dcc improve settings components and scss 2025-04-16 09:15:02 +02:00
Simon Vieille 0313ce4099 PageLoader: hide after full progress 2025-04-16 09:14:52 +02:00
Simon Vieille b835bbb34d format code 2025-04-16 09:14:12 +02:00
Simon Vieille fdd8f8850d add user settings 2025-04-16 09:14:06 +02:00
Simon Vieille 6c4f9120ff format code 2025-04-16 09:13:54 +02:00
Simon Vieille 0bf7eada4c format code 2025-04-16 09:13:45 +02:00
Simon Vieille 89ca510897 add categories customization 2025-04-16 09:13:38 +02:00
Simon Vieille 63b32ea40f add categories orderer
move the admin menu to the left
2025-04-16 09:13:28 +02:00
Simon Vieille 0821802157 format code 2025-04-16 09:13:20 +02:00
Simon Vieille ab64a13fc1 add app orderer 2025-04-16 09:13:12 +02:00
Simon Vieille c8eed69672 optimize build size 2025-04-16 09:12:52 +02:00
Simon Vieille 0c993c6f7b add admin responsive view 2025-04-16 09:12:23 +02:00
Simon Vieille 952106f437 add admin responsive view 2025-04-16 09:11:54 +02:00
Simon Vieille e616f0204b add display picker 2025-04-16 09:11:48 +02:00
Simon Vieille 5e06d02812 add licence 2025-04-16 09:11:38 +02:00
Simon Vieille 502cc4f3f0 add top menu (StandardMenu) 2025-04-16 09:11:31 +02:00
Simon Vieille e74de11215 ci: node version updated 2025-04-16 09:11:25 +02:00
Simon Vieille 67dd3d4334 ci: node version updated 2025-04-16 09:11:13 +02:00
Simon Vieille 532aadf179 fix makefile build rule 2025-04-16 09:09:07 +02:00
Simon Vieille a209ae66c2 fix: ci config 2025-04-16 09:08:50 +02:00
Simon Vieille 3b8c457d88 add MenuLogo component 2025-04-16 09:08:21 +02:00
Simon Vieille f4b134cd28 rename Logo component and remove Loader component
add licence
2025-04-16 09:07:56 +02:00
Simon Vieille 8474f0945b fix linter issues 2025-04-16 09:07:17 +02:00
Simon Vieille f9c3f96919 migrate admin settings 2025-04-16 09:07:10 +02:00
Simon Vieille 8c5c43dafa remove archive of admin form file 2025-04-16 09:06:52 +02:00
Simon Vieille 52b2d18a03 refactor of menus
begin work on settings
2025-04-16 09:06:34 +02:00
Simon Vieille ecbe2f7d72 add shortscuts
add open/close action
2025-04-16 09:05:46 +02:00
Simon Vieille b287b671be add mount of menu
fix store usage

add page loader
2025-04-16 09:05:26 +02:00
Simon Vieille d8a622ce0f refactoring: update severals components 2025-04-16 09:04:18 +02:00
Simon Vieille 4f261c434d webpack: allow to build and watch js 2025-04-16 09:04:01 +02:00
Simon Vieille 5f5ce968c2 add config and move components 2025-04-16 09:03:17 +02:00
gallegonovato b9786036fb Translated using Weblate (Spanish)
Currently translated at 100.0% (95 of 95 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2025-04-05 16:21:05 +00:00
Simon Vieille e159aff3e7 release v4.1.1 2025-03-12 18:35:34 +01:00
Simon Vieille b8998d356d Merge pull request 'bugfix/issue369' (#399) from bugfix/issue369 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/399
2025-03-12 18:21:36 +01:00
Simon Vieille 20946bcb06 update changelog 2025-03-12 18:21:18 +01:00
Simon Vieille 2bdea0d828 fix(SideMenu): ncApps must be an array (#369) 2025-03-12 18:20:15 +01:00
Simon Vieille b2fc5340be Merge pull request 'bugfix/issue397' (#398) from bugfix/issue397 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/398
2025-03-12 17:59:23 +01:00
Simon Vieille ba737434e5 update changelog 2025-03-12 17:58:29 +01:00
Simon Vieille 788affe386 fix: add missing NoCSRFRequired import in CssController (#397) 2025-03-12 17:57:49 +01:00
Simon Vieille 45c7bd361f update changelog 2025-03-10 19:17:04 +01:00
Simon Vieille c9fb83cdda Merge branch 'develop' into translations 2025-03-10 19:14:33 +01:00
Simon Vieille 4c4540e2a2 Merge pull request 'feature/nc31' (#394) from feature/nc31 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/394
2025-03-10 19:14:21 +01:00
Simon Vieille 4e8a751f33 update changelog 2025-03-10 19:11:59 +01:00
Simon Vieille 0edde4b9b9 fix(ci): add woodpecker 3 syntax 2025-03-10 19:08:16 +01:00
Simon Vieille a15c281aaa fix(appinfo): add cdata and fix urls 2025-03-10 19:05:42 +01:00
Simon Vieille 214cdaa330 apply lint (php) 2025-03-10 18:45:26 +01:00
Simon Vieille 7ab3269fbe fix(settings): remove non-existing and unused ILogger service 2025-03-10 18:42:12 +01:00
Simon Vieille 44fd4fab52 fix(service): add service constructor arguments 2025-03-10 18:41:09 +01:00
Simon Vieille 3058c225e0 style: apply php linter 2025-03-05 21:55:53 +01:00
Simon Vieille b03a7f7bad refactor(controller): usage of attributes instead of annotations 2025-03-05 21:54:59 +01:00
ba3r 6342c55547 Translated using Weblate (German)
Currently translated at 100.0% (95 of 95 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/de/
2025-02-27 09:09:27 +00:00
Simon Vieille 37b9beb8f7 update app version 2024-10-30 19:07:47 +01:00
Simon Vieille 0402e00eac update changelog 2024-10-30 19:07:31 +01:00
Simon Vieille 8c9dc83a59 Merge pull request 'fix #369: The menu is displayed even if there are no apps' (#370) from bugfix/issue369 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/370
2024-10-30 19:00:43 +01:00
Simon Vieille 66716ec53b Merge pull request 'fix top menu labels (fix #368)' (#371) from bugfix/issue368-top-menu-labels into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/371
2024-10-30 19:00:28 +01:00
Simon Vieille 879f9f092b fix op menu labels (fix #368) 2024-10-30 18:33:16 +01:00
Simon Vieille 66a2843a14 remove logs 2024-10-30 18:19:13 +01:00
Simon Vieille c517adcb81 remove logs 2024-10-30 18:19:01 +01:00
Simon Vieille 84efcbd36c fix the menu is displayed even if there are no apps (fix #369) 2024-10-30 18:18:01 +01:00
Simon Vieille 6be15c269b remove useless command in ci 2024-10-27 18:56:34 +01:00
Simon Vieille a94e65c279 fix imports 2024-10-27 18:50:27 +01:00
Simon Vieille cef15c82c0 [debug] ci build 2024-10-27 18:21:57 +01:00
Simon Vieille bae53b8e04 [debug] ci build 2024-10-27 18:17:13 +01:00
Simon Vieille ef446085ea update ci 2024-10-27 18:12:59 +01:00
Simon Vieille cc17c48889 change path to nextcloud/vue 2024-10-27 18:10:25 +01:00
Simon Vieille 6ea1a4e6c6 fix build: remove ts, replace hash with chunkhash on webpack conf 2024-10-27 18:06:10 +01:00
Simon Vieille 894e4408f9 update build ci 2024-10-27 17:36:29 +01:00
Simon Vieille df4a94fa6b update build ci 2024-10-27 17:36:01 +01:00
Simon Vieille bb9ed8fe9c update node version for build 2024-10-27 17:29:37 +01:00
Simon Vieille 6bce9981ba Merge pull request 'feature/issue359-nc30' (#362) from feature/issue359-nc30 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/362
2024-10-27 17:19:44 +01:00
Simon Vieille 7388fb3fc0 update version 2024-10-27 17:09:27 +01:00
Simon Vieille ea759e95e4 show more app opener in mobile view (#359) 2024-10-27 17:06:50 +01:00
Simon Vieille b1284fe4dd add more app opener in mobile view (#359) 2024-10-27 17:04:43 +01:00
Simon Vieille 4e62b2e7dc show apps on top menu 2024-10-27 16:43:23 +01:00
p-bo 6a89e7379f Translated using Weblate (Czech)
Currently translated at 100.0% (95 of 95 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/cs/
2024-10-08 00:31:15 +00:00
Simon Vieille 5cc8569277 [WIP] #359: update dependencies 2024-10-06 16:55:57 +02:00
Simon Vieille 0ecd828a5d #359: fix menu category appearance 2024-10-06 16:11:46 +02:00
Outbreak2096 162cc4178e Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (95 of 95 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/zh_Hans/
2024-08-12 14:14:29 +00:00
Simon Vieille 0df8b97686 update PHP requirement
update app version
2024-07-10 19:51:51 +02:00
Simon Vieille 83cc15b1bb update changelog 2024-07-10 19:51:00 +02:00
Simon Vieille f2101f452d Merge pull request 'fix #354 and fix extra margin between the logo and the opener' (#355) from bugfix/issue354-opener into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/355
2024-07-10 19:50:18 +02:00
Simon Vieille 9ed36b6944 fix extra margin between the logo and the opener 2024-07-10 19:47:09 +02:00
Simon Vieille 827bbd7c70 fix #354: remove the opener when the menu is always displayed 2024-07-10 19:39:52 +02:00
Simon Vieille 73b21039b9 rewrite of the script to import config
allow mysql and sqlite
2024-07-10 19:29:51 +02:00
deblan b6275c8070 fix link to the documentation in forgejo issue template
Signed-off-by: deblan <contact@deblan.fr>
2024-07-09 16:43:04 +02:00
Simon Vieille 3b992dc06f release v3.13.0 2024-07-05 12:57:15 +02:00
Simon Vieille ad9bd7c3f3 Merge pull request 'fix #348: remove .app-navigation--close translationX for always-displayed menu' (#352) from bugfix/issue348-buttonvue into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/352
2024-07-05 12:51:29 +02:00
Simon Vieille df525f9858 fix #348: remove .app-navigation--close translationX for always-displayed menu 2024-07-05 12:40:38 +02:00
Simon Vieille bacd1af9a6 Merge pull request 'fix #349 + refactoring' (#351) from feature/issue349-tables-apps into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/351
2024-06-27 20:33:09 +02:00
Simon Vieille 7c5654f3bc add constructor property promotion
add return type of methods
2024-06-27 20:27:31 +02:00
Simon Vieille 05c35b9a63 retrieve tables apps 2024-06-27 20:08:56 +02:00
Simon Vieille 38f400b24c fix app version number 2024-04-08 15:30:20 +02:00
Simon Vieille 012c660fed ci: rollback tag check 2024-04-08 14:33:22 +02:00
Simon Vieille 9c5be63f16 ci: fix signature step (volumes) 2024-04-08 14:14:16 +02:00
Simon Vieille 71f5dfef9a add compatibility with NC29 2024-04-08 11:41:26 +02:00
mbouzada e30de299f0 Translated using Weblate (Galician)
Currently translated at 100.0% (95 of 95 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/gl/
2024-03-27 15:18:22 +00:00
mbouzada b8c07e02b2 Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (93 of 93 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/pt_BR/
2024-03-27 15:18:22 +00:00
mbouzada 63381d3814 Translated using Weblate (Spanish)
Currently translated at 100.0% (95 of 95 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2024-03-27 15:18:22 +00:00
Application-Maker 8054e02e06 Translated using Weblate (Russian)
Currently translated at 87.3% (83 of 95 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2024-02-26 12:56:32 +00:00
Simon Vieille afa48c6239 ci: update deblan/php version 2024-02-21 16:14:05 +01:00
Simon Vieille a94a94b564 update forgejo templates 2024-02-21 15:45:08 +01:00
Simon Vieille 3e7dcac307 add forgejo templates 2024-02-21 12:35:47 +01:00
Simon Vieille 54b64cc54e Merge pull request 'refactoring ci steps' (#337) from feature/ci-refactoring into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/337
2024-02-21 12:22:18 +01:00
Simon Vieille 45d4e5f24c refactorint ci steps
use gitnet.fr/deblan/woodpecker-cache to generate cache
2024-02-21 12:10:02 +01:00
Simon Vieille 56904c5aa0 release v3.11.8 2024-02-20 21:22:05 +01:00
Simon Vieille 32cd25b736 update changelog 2024-02-20 21:18:18 +01:00
Simon Vieille a9a3ba36c1 Merge pull request 'move the logo inside #nextcloud element (fix #278 #239) [NC26]' (#335) from bugfix/issue278-239 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/335
2024-02-20 21:17:39 +01:00
Simon Vieille 2cecd0d6f4 move the logo inside #nextcloud element (fix #278 #239) [NC26] 2024-02-20 21:08:46 +01:00
Simon Vieille 28085d9aa7 remove line breaks 2024-02-20 21:08:12 +01:00
Simon Vieille 9d7c98ddf0 fix gl translations 2024-02-14 18:59:25 +01:00
Simon Vieille c34bd19159 release v3.11.è 2024-02-14 18:57:33 +01:00
Simon Vieille d9d4306ed3 update changelog 2024-02-14 13:31:10 +01:00
Simon Vieille b027f1e558 Merge pull request 'upgrade css-loader' (#330) from feature/dependencies-upgrade into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/330
2024-02-14 13:30:30 +01:00
Simon Vieille cb44d1eb2a update changelog 2024-02-14 13:29:36 +01:00
Simon Vieille 4c76cea7c6 update translations 2024-02-14 13:25:31 +01:00
Simon Vieille 16b166b1cf Merge branch 'develop' into translations 2024-02-14 13:21:58 +01:00
Simon Vieille db9c99b8f2 upgrade css-loader 2024-02-14 13:18:59 +01:00
Simon Vieille 01c782d844 Merge pull request 'fix #301 #301 #311' (#329) from bugfix/issue326-menudark2 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/329
2024-02-14 12:25:17 +01:00
Simon Vieille 1271571427 upgrade axios 2024-02-14 12:22:13 +01:00
Simon Vieille 951dd742d8 add accessibility to open and close buttons (#311)
refactor the way to focus apps when the menu is opened (#301)
2024-02-14 12:12:08 +01:00
Simon Vieille b8aa312a14 fully apply Nextcloud AppMenu.vue updated (#326) 2024-02-14 11:26:54 +01:00
Simon Vieille 774c314e7b add missing label on the 'save' button in personal settings (fix #318) 2024-02-14 11:16:25 +01:00
Simon Vieille 10b91991a9 update ci steps names 2024-02-12 23:29:58 +01:00
Simon Vieille 3de47aa3e3 release v3.11.6 2024-02-12 23:21:30 +01:00
Simon Vieille cd64c0dd93 update changelog 2024-02-12 23:21:12 +01:00
Simon Vieille 13fdd6c0d6 Merge pull request 'add --background-invert-if-bright in top menu (fix #326)' (#327) from bugfix/issue326-menudark into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/327
2024-02-12 23:20:34 +01:00
Simon Vieille 83a2261838 add --background-invert-if-bright in top menu (fix #326) 2024-02-12 23:19:43 +01:00
Simon Vieille c11c4ee197 Merge pull request 'chore: Configure Renovate' (#314) from renovate/configure into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/314
2024-02-06 22:10:22 +01:00
deblan d8aa018f5a Added translation using Weblate (Galician) 2024-02-06 20:04:43 +00:00
Simon Vieille c3c5db8a37 add translations 2024-01-28 23:20:13 +01:00
Simon Vieille 0aa6767090 update app info 2024-01-28 23:07:01 +01:00
Simon Vieille 238a1a905e update changelog 2024-01-28 23:05:46 +01:00
Simon Vieille 4221f81860 Merge pull request 'bugfix/issue311' (#315) from bugfix/issue311 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/315
2024-01-28 23:05:02 +01:00
Simon Vieille 8baaa51b8a fix #311: add missing aria-label attribute 2024-01-28 23:02:35 +01:00
Simon Vieille fc6ebbaa2e add translation item for "Toggle menu" 2024-01-28 23:02:04 +01:00
Renovate Bot 2c83789813 chore(deps): add renovate.json 2024-01-27 22:59:29 +00:00
Simon Vieille 0c143bdb88 release v3.11.3 2024-01-27 10:23:23 +01:00
Simon Vieille 9e1ded6376 [ci] check if the app version is same as the tag 2024-01-27 10:23:10 +01:00
Simon Vieille dbc480a1a7 update changelog 2024-01-27 10:15:10 +01:00
Simon Vieille cf2e28960b Merge pull request 'add labels on buttons (fix #311)' (#312) from feature/issue311-btnlabel into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/312
2024-01-26 23:16:03 +01:00
Simon Vieille 4448412843 add labels on buttons (fix #311) 2024-01-26 23:09:55 +01:00
Simon Vieille c5e126667d fix appinfo version 2024-01-16 20:39:44 +01:00
Simon Vieille 197a6dc413 update changelog 2024-01-16 20:13:14 +01:00
Simon Vieille fbe686c526 Merge pull request '[Bug] Menu-Icon in Decks broken - caused of side_menu #302' (#306) from bugfix/issue302 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/306
2024-01-16 20:11:14 +01:00
Simon Vieille b20f5a471a fix #302: remove "!important" on the rule that moves elements 2024-01-15 21:12:24 +01:00
Simon Vieille f76deeb416 add default translations (fix #298) 2023-11-12 20:30:19 +01:00
Simon Vieille 93a4eccb41 Merge pull request 'Translated using Weblate (Slovak)' (#299) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/299
2023-11-12 20:29:01 +01:00
deblan f8458ed488 Translated using Weblate (Slovak)
Currently translated at 43.4% (40 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/sk/
2023-11-12 19:27:51 +00:00
Simon Vieille c35ecd7444 release v3.11.1 2023-11-12 16:58:24 +01:00
Simon Vieille 2edb771273 release v3.11.1 2023-11-12 16:58:09 +01:00
Simon Vieille 48a2224e3d Merge pull request 'translations' (#296) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/296
2023-11-12 16:56:07 +01:00
Simon Vieille a05ef44ede Merge pull request 'add width to .side-menu-categories for side menu with categories display' (#295) from bugfix/issue294 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/295
2023-11-12 16:54:58 +01:00
Simon Vieille f6d6e263b6 add width to .side-menu-categories for side menu with categories display 2023-11-12 16:49:24 +01:00
igorfreire b2e0898d5b Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/pt_BR/
2023-11-11 20:13:37 +00:00
igorfreire 4af28c303b Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/pt_BR/
2023-11-07 15:15:14 +00:00
Simon Vieille e199019d3d update changelogs 2023-11-05 18:46:31 +01:00
Simon Vieille a18732b043 Merge branch 'develop' into translations 2023-11-05 18:40:51 +01:00
Simon Vieille 9ed3e93bf4 release v3.11.0 2023-11-05 18:37:51 +01:00
Simon Vieille 320f4cca3c Merge pull request 'To add option to filter left menu (fix #282)' (#291) from feature/issue282 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/291
2023-11-05 18:34:47 +01:00
Simon Vieille b1ae62ba2a fix view of side menu headers with search 2023-11-05 18:30:24 +01:00
Simon Vieille 5d91b44c20 add translations 2023-11-05 16:04:44 +01:00
Simon Vieille 3ec823c856 add search component 2023-11-05 16:04:33 +01:00
Simon Vieille c9bae926f1 Merge pull request 'Parameter option not located at the same position menu button is (fix #283)' (#290) from bugfix/issue283 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/290
2023-11-05 14:59:49 +01:00
Simon Vieille 7b1d31d1db fix ci 2023-11-04 13:39:32 +01:00
Simon Vieille c5cac45f7e fix ci 2023-11-04 13:38:28 +01:00
Simon Vieille 9a35734657 remove label of the link to personal settings (fix #283) 2023-11-04 13:33:34 +01:00
deblan 3144f56b80 Added translation using Weblate (Slovak) 2023-10-16 08:16:34 +00:00
Simon Vieille 6248e8ccef Merge pull request 'fix ci syntax' (#280) from bugfix/ci into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/280
2023-09-29 16:48:06 +02:00
Simon Vieille 648bdeae04 fix ci syntax 2023-09-29 16:46:56 +02:00
mschmidm d6a8dee1b2 Translated using Weblate (German)
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/de/
2023-09-19 12:53:08 +00:00
Simon Vieille 1e6d241e5c release v3.10.3 2023-07-24 21:32:13 +02:00
Simon Vieille eeac15d578 Merge pull request 'fix #274' (#275) from feature/issue274 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/275
2023-07-24 21:30:58 +02:00
Simon Vieille 89986cd604 update changelog 2023-07-24 21:12:43 +02:00
Simon Vieille 3c1bd99319 update @nexcloud/* packages
change the way to load nextcloud components (NcActionLink/NcActions)

fix #274
2023-07-24 21:10:30 +02:00
Simon Vieille 33bb8646f4 release v3.10.2 2023-07-15 15:22:09 +02:00
Simon Vieille e571be5fcf release v3.10.1 2023-07-15 14:58:43 +02:00
Simon Vieille 432e0f175f Merge pull request 'use php7 syntax' (#270) from feature/issue269 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/270
2023-07-15 14:57:47 +02:00
Simon Vieille 022e8af6a2 update changelog 2023-07-15 14:53:04 +02:00
Simon Vieille b8a5a82fd2 fix #269: use php7 syntax 2023-07-15 14:50:15 +02:00
Simon Vieille 8cd54eea19 release v3.10.0 2023-07-13 22:26:34 +02:00
Simon Vieille 072707772d update changelog 2023-07-11 17:48:45 +02:00
Simon Vieille 0b3d2d9781 Merge pull request 'Remove deprecated method' (#267) from vitormattos/side_menu:feature/remove-deprecated-method into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/267
2023-07-11 17:46:38 +02:00
Vitor Mattos 04af12691c Remove deprecated method
Fix the follow error:

```
Message: Call to undefined method OC_App::getNavigation() in file '/var/www/html/apps-extra/side_menu/lib/Service/AppRepository.php' line 54
```

Reference: https://github.com/nextcloud/server/commit/167763d3125779fc642f7b169389dea029bb73ed

Signed-off-by: Vitor Mattos <vitor@php.rio>
2023-07-10 15:15:41 -03:00
Simon Vieille 0ea5a579a6 release v3.9.1 2023-06-29 12:54:49 +02:00
Simon Vieille b9c3543c61 Merge pull request 'fix top position of always opened menu' (#264) from fix/issue262 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/264
2023-06-29 12:53:02 +02:00
Simon Vieille 49979c858b fix top position of always opened menu
fix dashboard menu when using always opened menu
2023-06-23 15:37:03 +02:00
Simon Vieille def1ec4aa7 release v3.8.0 2023-06-23 12:28:02 +02:00
Simon Vieille 40441a61ae update changelog 2023-06-23 12:27:34 +02:00
Simon Vieille ea3820904c Merge pull request 'fix app redirect' (#261) from fix/issue257 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/261
2023-06-17 15:21:54 +02:00
Simon Vieille dad7d8a964 Merge pull request 'add compatibility with nextcloud 27' (#260) from feature/issue256 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/260
2023-06-17 15:17:24 +02:00
Simon Vieille 32f1869828 add compatibility with nextcloud 27 2023-06-17 13:04:25 +02:00
Simon Vieille dd9fbcb654 fix default menu redirect (#257) 2023-06-17 12:59:45 +02:00
Simon Vieille a96e6e3c70 fix default menu redirect (#257) 2023-06-17 12:53:10 +02:00
Simon Vieille a5effe1fd3 release v3.8.0 2023-05-25 13:39:45 +02:00
Simon Vieille 13b6ae23c2 ci: remove check-code-quality 2023-05-25 13:39:21 +02:00
Simon Vieille 79ddb5fa47 Merge pull request 'add option to show hovered label only on top menu' (#254) from feature/issue253 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/254
2023-05-23 20:13:11 +02:00
Simon Vieille 1454dbba4d update changelog 2023-05-23 19:56:35 +02:00
Simon Vieille ee8ca7134c refactoring choices 2023-05-23 14:17:45 +02:00
Simon Vieille 93fef37033 add option to show hovered label only on top menu 2023-05-23 14:09:55 +02:00
Simon Vieille 135f27cc32 release v3.7.4 2023-04-16 18:05:25 +02:00
Simon Vieille c5e1a8d37b Merge pull request 'fix Integrity failed' (#248) from fix/issue247 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/248
2023-04-16 18:03:04 +02:00
Simon Vieille 27f8888a90 update signature generation 2023-04-16 14:24:17 +02:00
Simon Vieille 6583883e2d update signature generation 2023-04-16 14:17:09 +02:00
Simon Vieille 0a556670b1 update signature generation 2023-04-16 14:16:18 +02:00
Simon Vieille b9264d7e05 release v3.7.3 2023-04-14 21:12:35 +02:00
Simon Vieille 88c14b6aec Merge pull request 'use app href for redirection' (#245) from fix/issue244 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/245
2023-04-14 21:11:29 +02:00
Simon Vieille 2be53211b8 Merge pull request 'add signature generation' (#243) from feature/issue240 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/243
2023-04-14 21:00:37 +02:00
Simon Vieille dca727c120 use app href for redirection (fix #244) 2023-04-14 20:58:56 +02:00
Simon Vieille 361badff6b update changelog 2023-03-31 17:06:30 +02:00
Simon Vieille 917288eb54 add signature generation
rename steps
2023-03-31 14:07:19 +02:00
Simon Vieille 2ff4fee927 Merge pull request 'changelog' (#237) from changelog into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/237
2023-03-27 18:36:34 +02:00
Simon Vieille b65c0c650a update app version 2023-03-27 18:35:59 +02:00
Simon Vieille 22335700ce Merge pull request 'update pipeline conditions allowing fix/*' (#234) from feature/ci into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/234
2023-03-27 18:35:12 +02:00
Simon Vieille 7ab2816bd9 update changelog 2023-03-27 18:34:50 +02:00
Simon Vieille 396d3cfbc5 Merge pull request 'load configuration and then retrieve apps in default side menu display' (#235) from feature/issue233 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/235
2023-03-27 18:34:21 +02:00
Simon Vieille 66e4d2989a update pipeline conditions allowing fix/* 2023-03-23 22:22:36 +01:00
Simon Vieille 9ccd11b6dc load configuration and then retrieve apps in default side menu display
fix #233
2023-03-23 22:17:05 +01:00
Simon Vieille a7ec95da7c Merge pull request 'Fix build process' (#231) from fix/issue230 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/231
2023-03-19 09:58:11 +01:00
Simon Vieille 42043c5390 update changelog 2023-03-19 09:52:37 +01:00
Simon Vieille 019f79d45f update ci conf 2023-03-19 09:45:51 +01:00
Simon Vieille 3a80215657 update ci conf 2023-03-19 09:35:59 +01:00
Simon Vieille 7d0b55243e add debug version 2023-03-19 09:34:52 +01:00
Simon Vieille 097ccc9dc9 update ci conf 2023-03-19 09:34:23 +01:00
Simon Vieille 7227f59dab add tag on event restriction for build steps 2023-03-17 17:25:22 +01:00
Simon Vieille 3a51e6ecd5 add debug version 2023-03-17 17:22:59 +01:00
Simon Vieille 112e669723 reduce release task as packaging (ci)
move translation build in specific step (ci)
2023-03-17 17:22:35 +01:00
Simon Vieille fc5a6a4c64 fix typo in ci configuration 2023-03-17 17:13:31 +01:00
Simon Vieille 02afac5267 add debug version 2023-03-17 17:11:16 +01:00
Simon Vieille 1eb392834c use specifics images in ci 2023-03-17 17:10:56 +01:00
Codeberg Translate 08b78a2c64 Merge branch 'origin/translations' into Weblate. 2023-03-16 06:11:25 +00:00
deblan 8f86cbe188 Added translation using Weblate (Portuguese (Brazil)) 2023-03-16 06:11:24 +00:00
Simon Vieille 5df389dd42 add badge of downloads 2023-03-11 00:29:32 +01:00
Simon Vieille dbd0de7679 release v3.7.0 2023-03-09 16:46:03 +01:00
Simon Vieille 07a1d356de Merge pull request 'set the app compatible with nextcloud 26' (#225) from feature/nc26 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/225
2023-03-09 15:55:35 +01:00
Simon Vieille d3359337f9 Merge pull request 'translations' (#226) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/226
2023-03-09 15:54:50 +01:00
Simon Vieille 4b9378f923 set the app compatible with nextcloud 26 2023-03-09 14:05:30 +01:00
AHOHNMYC 117e33692b Translated using Weblate (Russian)
Currently translated at 84.7% (78 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2023-03-06 19:08:20 +00:00
Simon Vieille 18e8f42dc3 update issue template 2023-02-20 13:50:53 +01:00
Simon Vieille 01669f83c2 release v3.6.0 2023-02-17 11:46:31 +01:00
Simon Vieille f1c33cc626 release v3.6.0 2023-02-17 11:45:57 +01:00
Simon Vieille 87ff20aa19 Merge pull request 'add hidden apps compatible with default menu' (#220) from feature/issue219 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/220
2023-02-17 11:44:41 +01:00
Simon Vieille ce969b4061 Merge branch 'develop' into translations 2023-02-17 10:54:42 +01:00
Simon Vieille ed4ed62fb6 update admin (hidden apps compatible with defaul) 2023-02-17 10:51:39 +01:00
Simon Vieille 5a586c40a1 add hidden apps compatible with default menu (fix #219) 2023-02-17 10:51:11 +01:00
Simon Vieille b141d7ba7c update readme 2023-02-12 16:56:22 +01:00
Simon Vieille 0ee10e08e9 update readme 2023-02-12 00:31:47 +01:00
Simon Vieille 1093042a17 update readme 2023-02-12 00:29:18 +01:00
Simon Vieille 9566d32a89 update readme 2023-02-12 00:28:51 +01:00
Simon Vieille 3861d78975 Merge pull request 'login error (#210)' (#212) from feature/login_error into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/212
2023-01-21 22:26:04 +01:00
Simon Vieille 571706986e release v3.5.2 2023-01-21 22:18:45 +01:00
Simon Vieille ed31ed3623 add check if menu exists before adding event listeners 2023-01-21 22:12:17 +01:00
Simon Vieille 59af6a9068 release v3.5.1 2023-01-07 10:23:19 +01:00
Simon Vieille 1965aedc43 release v3.5.1 2023-01-07 10:22:56 +01:00
Simon Vieille ab46bd7341 docs(changelog): add v3.5.1 2023-01-07 10:21:46 +01:00
Simon Vieille 3aace8cbdd Merge pull request 'translations' (#209) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/209
2023-01-07 10:19:00 +01:00
Codeberg Translate 6425546cd1 Merge branch 'origin/translations' into Weblate. 2023-01-01 23:31:48 +00:00
gallegonovato 3664b8979d Translated using Weblate (Spanish)
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2023-01-01 23:31:47 +00:00
p-bo 83732994bb Translated using Weblate (Czech)
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/cs/
2023-01-01 23:31:47 +00:00
Simon Vieille c65d09e268 Merge pull request 'ci: add osv detector' (#208) from feature/osv into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/208
2023-01-01 14:59:05 +01:00
Simon Vieille 2da2e10017 ci: add osv detector 2023-01-01 14:52:30 +01:00
Simon Vieille 8da90bbc06 Merge branch 'gitea' into develop 2022-12-29 22:53:50 +01:00
Simon Vieille d4adda19b3 add gitea ISSUE/FEATURE templates 2022-12-29 22:45:36 +01:00
Simon Vieille ae3db9cf7f add gitea ISSUE/FEATURE templates 2022-12-29 22:42:03 +01:00
Simon Vieille 05ff6d483b add gitea ISSUE/FEATURE templates 2022-12-29 22:41:06 +01:00
Simon Vieille dfc61140ec add gitea ISSUE/FEATURE templates 2022-12-29 22:30:33 +01:00
Simon Vieille 4918049270 update changelog 2022-12-28 11:14:09 +01:00
Simon Vieille 4001f162b6 Merge pull request 'Fix custom menu sorting is not applied on Mobile Screens' (#199) from feature/issue189 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/199
2022-12-27 23:20:21 +01:00
Simon Vieille 7a43ca2c75 add sort on in appList and fix appLabel function 2022-12-27 07:02:07 +01:00
Simon Vieille bc6470a440 Merge pull request 'develop' (#197) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/197
2022-12-26 14:00:48 +01:00
Simon Vieille 65e21ab4c5 Merge pull request 'next release' (#191) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/191
2022-12-26 13:59:24 +01:00
Simon Vieille 15ac74d8e9 update version 2022-12-26 13:53:40 +01:00
Simon Vieille 40229b93f6 update changelog 2022-12-26 13:53:40 +01:00
Simon Vieille 9b24f714ce Merge pull request 'translations' (#196) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/196
2022-12-26 13:53:06 +01:00
deblan f0f6c4206a Translated using Weblate (Spanish)
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2022-12-26 12:44:07 +00:00
deblan 3b6478edbb Translated using Weblate (Russian)
Currently translated at 80.4% (74 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2022-12-26 12:44:06 +00:00
deblan df7c94fe24 Translated using Weblate (Dutch)
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/nl/
2022-12-26 12:44:06 +00:00
deblan 7b808d87b1 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/zh_Hans/
2022-12-26 12:44:06 +00:00
deblan 39e3cf9dd3 Translated using Weblate (French)
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/fr/
2022-12-26 12:44:06 +00:00
deblan 5598af213d Translated using Weblate (German)
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/de/
2022-12-26 12:44:06 +00:00
deblan 367bd72bfb Translated using Weblate (Czech)
Currently translated at 100.0% (92 of 92 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/cs/
2022-12-26 12:44:06 +00:00
Simon Vieille c46713dc56 add missing translations 2022-12-26 13:40:45 +01:00
Simon Vieille 1594f3583c Merge branch 'develop' into translations 2022-12-26 13:33:45 +01:00
Codeberg Translate ff7f423dcb Merge branch 'origin/translations' into Weblate. 2022-12-26 12:31:12 +00:00
thejenja f3e1784577 Translated using Weblate (Russian)
Currently translated at 80.2% (73 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2022-12-26 12:31:12 +00:00
Simon Vieille 9264b0f10d add translation configuration 2022-12-26 13:07:59 +01:00
Simon Vieille 08b418d55d add 'top-menu-mouse-over-hidden-label' as window property and use it in the AppMenu component 2022-12-26 13:07:59 +01:00
Simon Vieille 47af9088d4 add the 'top-menu-mouse-over-hidden-label' 2022-12-26 13:07:59 +01:00
Simon Vieille 690c437476 add hiddenLabels variables to show or hide of top menu items on mouse over 2022-12-26 13:07:59 +01:00
Simon Vieille be66c27452 Merge pull request '[FEATURE] Option to disable the display of Icon-Names in the top left Menu-Bar (#194)' (#195) from feature/issue194 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/195
2022-12-26 13:05:25 +01:00
Simon Vieille 785edbf5c5 add translation configuration 2022-12-26 12:59:19 +01:00
Simon Vieille 4258327a70 add 'top-menu-mouse-over-hidden-label' as window property and use it in the AppMenu component 2022-12-26 12:57:07 +01:00
Simon Vieille 37e00c51c3 add the 'top-menu-mouse-over-hidden-label' 2022-12-26 12:56:32 +01:00
Simon Vieille f7d463e734 add hiddenLabels variables to show or hide of top menu items on mouse over 2022-12-26 00:56:27 +01:00
Simon Vieille cae4d8ab66 Merge pull request 'translations' (#190) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/190
2022-12-06 13:27:35 +01:00
Simon Vieille 66a1c1eecb Merge branch 'develop' into translations 2022-12-06 06:49:23 +01:00
Simon Vieille cc799060af update chanlog 2022-12-06 06:49:16 +01:00
Simon Vieille a3802ef298 update ci config 2022-12-06 06:48:27 +01:00
Simon Vieille 901668236f Merge branch 'develop' into translations 2022-12-05 23:44:49 +01:00
gallegonovato fef81eab0f Translated using Weblate (Spanish)
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/es/
2022-12-05 22:39:36 +00:00
Simon Vieille 21e0f4cd89 Merge pull request 'feature/dependency_check' (#188) from feature/dependency_check into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/188
2022-12-05 10:18:23 +01:00
Simon Vieille 5411267960 CI: use nodejs for dependency check 2022-12-04 22:52:02 +01:00
Simon Vieille b50cd5c4d0 CI: update dependency check 2022-12-04 22:42:50 +01:00
Simon Vieille 709ace5d4f CI: add dependency check 2022-12-04 22:25:04 +01:00
Simon Vieille b7595a371d Merge pull request 'improve code quality' (#187) from feature/code_quality into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/187
2022-12-04 20:25:56 +01:00
Simon Vieille a7ab4573c5 update makefile run-code-quality-analysis command: use current branch and envvars 2022-12-04 20:23:48 +01:00
Simon Vieille 62c4333278 Merge branch 'develop' into feature/code_quality 2022-12-04 19:49:20 +01:00
Simon Vieille 8a8d8f2910 Merge pull request 'sonar-scanner configuration' (#186) from feature/ci into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/186
2022-12-04 19:47:44 +01:00
Simon Vieille 7c72198736 sonar-scanner configuration 2022-12-04 19:06:19 +01:00
Simon Vieille d1b2a1ee3c sonar-scanner configuration 2022-12-04 18:59:21 +01:00
deblan 355c73185b Added translation using Weblate (Spanish) 2022-12-04 14:45:47 +00:00
Simon Vieille e1797e1e03 split long lines 2022-12-04 13:01:56 +01:00
Simon Vieille 3f04546a6e split long lines 2022-12-04 00:57:17 +01:00
Simon Vieille 0bd1a5baaf split long lines 2022-12-04 00:56:05 +01:00
Simon Vieille 24c87c0104 add missing img alt 2022-12-04 00:47:30 +01:00
Simon Vieille 4d05079c70 split long lines 2022-12-04 00:45:29 +01:00
Simon Vieille 0382e1c61d replace dupplicated string with variables 2022-12-04 00:19:54 +01:00
Simon Vieille 0f34275d04 remove duplicated selector ".side-menu-always-displayed body" 2022-12-04 00:14:38 +01:00
Simon Vieille 1c2f04f63f replace border-size with border-width 2022-12-04 00:13:28 +01:00
Simon Vieille 81bcad348e remove this unused import of 'trim' 2022-12-04 00:09:11 +01:00
Simon Vieille 053615c2c4 remove this unused "$topMenuAppsOrder" local variable 2022-12-04 00:08:20 +01:00
Simon Vieille 113e4db9b6 Merge pull request 'add code_quality in ci' (#185) from feature/ci into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/185
2022-12-04 00:06:59 +01:00
Simon Vieille 89cf28f9a8 add code_quality in ci 2022-12-03 23:47:55 +01:00
Codeberg Translate 127fb45ece Merge branch 'origin/translations' into Weblate. 2022-12-03 21:18:59 +00:00
deblan a1d3df6018 Translated using Weblate (German)
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/de/
2022-12-03 21:18:58 +00:00
Simon Vieille 9c3d9ccbc4 Merge pull request 'release v3.4.1' (#184) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/184
2022-12-02 12:33:30 +01:00
Simon Vieille 45a68cbfc8 release v3.4.1 2022-12-02 12:25:31 +01:00
Simon Vieille f42cb368db Merge pull request 'hide custom categories list when empty' (#183) from feature/issue182 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/183
2022-12-02 12:23:18 +01:00
Simon Vieille 6d940cc7c4 Merge pull request 'translations' (#181) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/181
2022-12-02 12:19:04 +01:00
Simon Vieille 2d30a1f1ea hide custom categories list when empty 2022-12-02 12:16:49 +01:00
Simon Vieille 599e70bf8a Merge branch 'develop' into translations 2022-11-21 08:43:19 +01:00
Simon Vieille d012e464a1 add translations 2022-11-21 08:43:08 +01:00
Codeberg Translate ae2b52cb36 Merge branch 'origin/translations' into Weblate. 2022-11-20 22:26:39 +00:00
zonorti 5444bbf987 Translated using Weblate (Russian)
Currently translated at 67.0% (61 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2022-11-20 22:26:38 +00:00
jorisvandijk ed7d4f4750 Translated using Weblate (Dutch)
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/nl/
2022-11-20 22:26:38 +00:00
Simon Vieille fe5ffcb6bf Merge pull request 'release v3.4.0' (#179) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/179
2022-11-20 15:17:23 +01:00
Simon Vieille f61f05c1c9 release v3.4.0 2022-11-20 15:10:50 +01:00
Simon Vieille c63ac1556e update ci 2022-11-20 15:04:54 +01:00
Simon Vieille c3cd78971b update changelog 2022-11-20 14:47:09 +01:00
Simon Vieille 0f24133b99 fix merge 2022-11-20 14:43:44 +01:00
deblan 887aa7f7f5 Added translation using Weblate (Dutch) 2022-11-20 14:41:02 +01:00
Codeberg Translate ac30ac25e9 Merge branch 'origin/develop' into Weblate. 2022-11-20 13:33:32 +00:00
Codeberg Translate 445b9d6986 Merge branch 'origin/develop' into Weblate. 2022-11-20 13:33:31 +00:00
nier 98d72a1e95 Translated using Weblate (Russian)
Currently translated at 64.8% (59 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2022-11-20 13:25:04 +00:00
deblan 5ad6af0b0d Translated using Weblate (Russian)
Currently translated at 64.8% (59 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2022-11-20 13:25:04 +00:00
deblan 0f93fbe7ea Translated using Weblate (Dutch)
Currently translated at 0.0% (0 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/nl/
2022-11-20 13:25:04 +00:00
Timur 8db686b3a2 Translated using Weblate (Russian)
Currently translated at 60.4% (55 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/ru/
2022-11-20 13:25:04 +00:00
deblan e208e19b1c Added translation using Weblate (Russian) 2022-11-20 13:25:04 +00:00
Simon Vieille d78bb6d93b update changelog 2022-11-20 14:13:54 +01:00
Simon Vieille 229d25cb44 Merge pull request 'feature/issue177' (#178) from feature/issue177 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/178
2022-11-20 14:12:11 +01:00
Simon Vieille 3ccf754e0d add possibility to define side_menu as default app and redirect to the first top menu app (#177) 2022-11-20 14:00:33 +01:00
Simon Vieille a4060c8db7 add possibility to define side_menu as default app and redirect to the first top menu app (#177) 2022-11-20 14:00:26 +01:00
Simon Vieille b474eeb29a update changelog 2022-11-11 21:20:20 +01:00
Simon Vieille e640343df9 Merge pull request 'translations' (#176) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/176
2022-11-11 19:41:16 +01:00
p-bo 84d1dff0ff Translated using Weblate (Czech)
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/cs/
2022-11-10 21:05:00 +00:00
deblan 13b19c407a Added translation using Weblate (Dutch) 2022-11-10 21:05:00 +00:00
Simon Vieille fa15824dad Merge pull request 'release v3.3.2' (#175) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/175
2022-11-10 13:08:27 +01:00
Simon Vieille 474387ff43 release v3.3.2 2022-11-10 13:07:35 +01:00
Simon Vieille 45ae1b3579 Merge pull request 'reduce the height of categories list (fix #173)' (#174) from feature/issue173 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/174
2022-11-09 13:04:12 +01:00
Simon Vieille c10d0e8442 reduce the height of categories list (fix #173) 2022-11-09 12:51:56 +01:00
Simon Vieille f5cabe9708 Merge pull request 'release v3.3.1' (#171) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/171
2022-11-06 17:01:43 +01:00
Simon Vieille 00e8a56e15 release v3.3.1 2022-11-06 16:55:23 +01:00
Simon Vieille 0ea7fe04bf Merge branch 'feature/issue162' into develop 2022-11-06 16:54:25 +01:00
Simon Vieille 0ac55b7ba4 fix #162: top and side app is broken 2022-11-05 15:40:52 +01:00
Simon Vieille 1794997ca0 Merge pull request 'Translated using Weblate (French)' (#169) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/169
2022-11-05 12:25:05 +01:00
deblan 3c7cd2812f Translated using Weblate (French)
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/fr/
2022-11-05 11:04:27 +00:00
Simon Vieille 2c75ebb3f7 Merge pull request 'translations' (#168) from translations into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/168
2022-11-05 12:02:29 +01:00
Anonymous 8bf7c7a8ce Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/zh_Hans/
2022-11-05 10:49:52 +00:00
Anonymous 5ed9e1e449 Translated using Weblate (French)
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/fr/
2022-11-05 10:49:52 +00:00
Anonymous 2b4feb908e Translated using Weblate (German)
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/de/
2022-11-05 10:49:51 +00:00
Anonymous 572f05ed52 Translated using Weblate (Czech)
Currently translated at 100.0% (91 of 91 strings)

Translation: Custom menu/Application
Translate-URL: https://translate.codeberg.org/projects/custom-menu/application/cs/
2022-11-05 10:49:51 +00:00
Simon Vieille dbf1c4316a Merge pull request 'release v3.3.0' (#167) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/167
2022-11-04 22:43:18 +01:00
Simon Vieille e9fb46b7b7 release v3.3.0 2022-11-04 22:36:54 +01:00
Simon Vieille 1357571104 update screenshots 2022-11-04 22:26:20 +01:00
Simon Vieille 0cec77154a Merge pull request 'fix #164: open apps in new tab does not work' (#166) from feature/issue164 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/166
2022-11-04 22:17:48 +01:00
Simon Vieille 6d7543f381 fix #164: open apps in new tab does not work 2022-11-04 22:14:28 +01:00
Simon Vieille 1d06c1b212 fix issue with top and side apps (#162 #159) 2022-11-04 21:43:18 +01:00
Simon Vieille 712777470c Merge pull request 'Sort menu on user level' (#165) from feature/issue160 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/165
2022-11-04 21:12:16 +01:00
Simon Vieille 52d88771d9 add apps sorter is user side (fix #160) 2022-11-04 21:07:44 +01:00
Simon Vieille c8ac0b5922 Merge pull request 'feature/doc' (#163) from feature/doc into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/163
2022-11-04 19:32:40 +01:00
Simon Vieille 78162f9a1e add translations 2022-11-04 18:53:47 +01:00
Simon Vieille 81f5dfcf2d add compatibility badges for each options 2022-11-04 18:50:45 +01:00
Simon Vieille 7f6f606d75 fix changelog 2022-10-29 11:41:48 +02:00
Simon Vieille 39fd049642 Merge pull request 'release v3.2.1' (#157) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/157
2022-10-29 10:43:56 +02:00
Simon Vieille 227f26679a release v3.2.1 2022-10-29 10:43:08 +02:00
Simon Vieille 6198a2abc2 Merge pull request 'develop' (#156) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/156
2022-10-28 22:44:23 +02:00
Simon Vieille 6e8d3ce245 Merge pull request 'fix #151: opener position' (#155) from feature/issue151 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/155
2022-10-28 22:35:11 +02:00
Simon Vieille c83dfef021 Merge pull request 'fix #150: Active app is not visible has active in menu (except in default menu).' (#153) from feature/issue150 into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/153
2022-10-28 22:35:04 +02:00
Simon Vieille 8b7163b3d5 fix #151: opener position 2022-10-28 22:23:17 +02:00
Simon Vieille bec53f0486 fix #150: Active app is not visible has active in menu (except in default menu). 2022-10-28 22:16:49 +02:00
Simon Vieille 0acb576995 Merge pull request 'release v3.2.0' (#149) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/149
2022-10-27 22:07:47 +02:00
Simon Vieille 131c4b643a release v3.2.0 2022-10-27 22:01:35 +02:00
Simon Vieille c0b187e55e update SideMenu with apps order and changelog 2022-10-27 21:58:21 +02:00
Simon Vieille f09eda85a6 Merge branch 'feature/issue147' into develop 2022-10-27 21:52:34 +02:00
Simon Vieille 1971c6f500 add ordered apps for all displays (#147) 2022-10-27 21:52:29 +02:00
Simon Vieille 07c7221ca2 rename 'top-menu-apps-order' with 'apps-order' 2022-10-27 21:51:58 +02:00
Simon Vieille d42593d203 removed unused translations 2022-10-27 21:50:13 +02:00
Simon Vieille 90fb46fb0e add effect of reset button 2022-10-27 21:49:55 +02:00
Simon Vieille 4b3bb0c5d8 update changelog 2022-10-27 20:32:13 +02:00
Simon Vieille 6533acdd60 use custom app names using 'app.navigation.name' (fix #148) 2022-10-27 20:30:14 +02:00
Simon Vieille 2cdb5d93a2 Merge pull request 'develop' (#146) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/146
2022-10-22 17:22:13 +02:00
Simon Vieille f20dc7282e add selfhosted notice 2022-10-21 23:59:27 +02:00
Simon Vieille 4dc07ed8fc add selfhosted notice 2022-10-21 23:58:36 +02:00
Simon Vieille e48d8d1114 Merge pull request 'update readme' (#145) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/145
2022-10-21 21:29:25 +02:00
Simon Vieille 36c8cb59bb update readme 2022-10-21 21:29:10 +02:00
Simon Vieille bc6ac9c7d3 Merge pull request 'develop' (#144) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/144
2022-10-21 21:27:27 +02:00
Simon Vieille fbe1b4f0bc update readme 2022-10-21 21:17:02 +02:00
Simon Vieille 8d9b12683a add translation badge 2022-10-21 21:16:24 +02:00
Simon Vieille c7bcc4a844 Merge pull request 'add template for translations' (#143) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/143
2022-10-21 20:25:49 +02:00
Simon Vieille 07ad842911 add template for translations 2022-10-21 20:25:35 +02:00
Simon Vieille 874332abf1 Merge pull request 'develop' (#142) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/142
2022-10-21 20:24:04 +02:00
Simon Vieille 5208b5d574 add template for translations 2022-10-21 20:20:23 +02:00
Simon Vieille fcd082cc0a update translations using translate.codeberg.org 2022-10-21 20:12:04 +02:00
Simon Vieille 7472e4050a Merge pull request 'release v3.1.0' (#141) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/141
2022-10-21 19:43:38 +02:00
Simon Vieille be0731f2d5 release v3.1.0 2022-10-21 19:36:55 +02:00
Simon Vieille 6a6792401e add base for translations 2022-10-21 19:34:48 +02:00
Simon Vieille a0c0cc0aa5 add custom apps sorting (fix SideMenu and admin ui) 2022-10-21 19:33:43 +02:00
Simon Vieille 1eb5e18d5c update changelog 2022-10-21 18:01:49 +02:00
Simon Vieille 84c620637e add custom apps sorting 2022-10-21 17:59:41 +02:00
Simon Vieille 7d82c78581 Merge branch 'feature/ui' into develop 2022-10-21 17:08:02 +02:00
Simon Vieille 83c2ccb5b4 update changelog 2022-10-21 17:08:00 +02:00
Simon Vieille 62e4a7df5b fix admin modale 2022-10-21 17:07:43 +02:00
Simon Vieille 16b8326fae update changelog 2022-10-21 16:50:39 +02:00
Simon Vieille 57f3a0d252 Merge branch 'feature/ui' into develop 2022-10-21 16:49:02 +02:00
Simon Vieille 5fac655856 remove unused translation keys 2022-10-21 16:48:59 +02:00
Simon Vieille 8a92b2d803 fix admin list 2022-10-21 16:48:36 +02:00
Simon Vieille 1ec9a3f2ff Merge pull request 'release v3.0.1' (#139) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/139
2022-10-18 22:33:36 +02:00
Simon Vieille 345f165aef release v3.0.1 2022-10-18 22:28:28 +02:00
Simon Vieille f6d9a9f71c refactoring of SideMenuWithCategories.vue 2022-10-18 22:27:50 +02:00
Simon Vieille 2a67038ff4 refactoring of SideMenuBig.vue 2022-10-18 22:22:26 +02:00
Simon Vieille a5ca86f573 add screenshots 2022-10-18 22:07:55 +02:00
Simon Vieille 501a1b23e1 update changelog 2022-10-18 22:07:46 +02:00
Simon Vieille c01db7c9e1 remove the gap between the window's top and menu categories (large menu) 2022-10-18 19:35:35 +02:00
Simon Vieille c0e24e39b6 Merge pull request 'release v3.0.0' (#138) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/138
2022-10-17 18:28:25 +02:00
Simon Vieille e31da3af6f release v3.0.0 2022-10-17 18:27:46 +02:00
Simon Vieille 8e5193417d Merge pull request 'comptability with nc25' (#137) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/137
2022-10-17 18:11:24 +02:00
Simon Vieille 2189d5c2c8 release v3.0.0 2022-10-17 18:06:18 +02:00
Simon Vieille 1adbfb33c9 fix CI 2022-10-17 17:55:50 +02:00
Simon Vieille 842776c2fd [ci] debug 2022-10-16 23:13:52 +02:00
Simon Vieille 719075db6c [ci] debug 2022-10-16 23:11:41 +02:00
Simon Vieille af95ab6265 [ci] debug 2022-10-16 23:09:29 +02:00
Simon Vieille 78e71dce97 update makefile 2022-10-16 23:00:26 +02:00
Simon Vieille d177bdbaeb update makefile 2022-10-16 22:54:28 +02:00
Simon Vieille f67a489130 update js conf 2022-10-16 22:18:56 +02:00
Simon Vieille 23fc3b9e5b update js conf 2022-10-16 22:14:10 +02:00
Simon Vieille e889d1e3d8 update js conf 2022-10-16 22:09:14 +02:00
Simon Vieille 39faeb70dc update js conf 2022-10-16 22:04:51 +02:00
Simon Vieille 433c480637 fix js dependecies 2022-10-16 20:10:55 +02:00
Simon Vieille 0321f6e7f4 update ci config 2022-10-16 20:04:11 +02:00
Simon Vieille ec8cf06082 update gitignore and add yarn lock file 2022-10-16 20:00:06 +02:00
Simon Vieille f30142abe6 update indentation 2022-10-16 19:59:18 +02:00
Simon Vieille 7c86d53da7 fix issue with loader and refactoring 2022-10-16 19:57:32 +02:00
Simon Vieille f0988b93bd fix fixed menu view 2022-10-16 19:19:03 +02:00
Simon Vieille a647f05fa4 update indentation 2022-10-16 19:01:46 +02:00
Simon Vieille 8aa07efaf9 update default view 2022-10-16 19:00:16 +02:00
Simon Vieille 9cdb008a72 update indentation (4 spaces -> 2 spaces) 2022-10-16 18:33:50 +02:00
Simon Vieille 585aec5ee2 update indentation (4 spaces -> 2 spaces) 2022-10-16 18:33:06 +02:00
Simon Vieille 1c1fe946cf update rules of makefile, webpack, stylelintrc 2022-10-16 18:23:20 +02:00
Simon Vieille 1a550f066f replace the top menu component with a custom one 2022-10-16 18:21:23 +02:00
Simon Vieille 01de6d998f lint admin.css 2022-10-14 19:35:49 +02:00
Simon Vieille cf87747924 fix position of reset buttons 2022-10-14 19:35:01 +02:00
Simon Vieille e5b3499077 add vuejs key on loops and apply a lint 2022-10-11 22:24:59 +02:00
Simon Vieille b6a529d65e Merge pull request 'fix #133' (#134) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/134
2022-09-01 17:00:32 +02:00
Simon Vieille b30e822bde update changelog 2022-09-01 16:59:46 +02:00
Simon Vieille 13688cd3d3 fix icon render 2022-09-01 16:59:04 +02:00
Simon Vieille 22fd48cf8d Merge pull request 'release v2.5.0' (#132) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/132
2022-09-01 10:50:17 +02:00
Simon Vieille f9c41e9407 Merge branch 'master' into develop 2022-09-01 10:49:37 +02:00
Simon Vieille 1da1cff551 release v2.5.0 2022-09-01 10:44:13 +02:00
Simon Vieille 1c2c413eef update changelog 2022-08-21 18:02:28 +02:00
Simon Vieille 36388bd472 add code quality makefile action 2022-08-21 18:02:28 +02:00
Simon Vieille 0c304b06a0 (cq) add missing let 2022-08-21 18:02:28 +02:00
Simon Vieille 538467dc99 (cq) replace v-html with v-text to prevent xss 2022-08-21 18:02:28 +02:00
Simon Vieille eba06e8ef8 (cq) replace var with let 2022-08-21 18:02:28 +02:00
Simon Vieille 3cf8b685ba (cq) replace var with let 2022-08-21 18:02:28 +02:00
Simon Vieille ed8f0e0959 (cq) remove unused package* 2022-08-21 18:02:28 +02:00
Simon Vieille ba7f0673b4 (cq) add alt attribute on app icon 2022-08-21 18:02:28 +02:00
Simon Vieille d2b589a644 (cq) add rel noopener attribute 2022-08-21 18:02:28 +02:00
Simon Vieille ca08a26e1b (cq) add alt attribute on logo 2022-08-21 18:02:28 +02:00
Simon Vieille 6347403ed7 (cq) remove unsed variable 2022-08-21 18:02:28 +02:00
Simon Vieille 80532ead63 (cq) rename variable 2022-08-21 18:02:28 +02:00
Simon Vieille 7b8d8800fc (cq) replace repeated strings with variables 2022-08-21 18:02:28 +02:00
Simon Vieille a20b0d4709 (cq) remove unsed variables 2022-08-21 18:02:28 +02:00
Simon Vieille 47c2beae4a (cq) remove duplicated code 2022-08-21 18:02:28 +02:00
Simon Vieille 49f45534de update changelog 2022-08-21 18:02:28 +02:00
Simon Vieille fd99827390 update changelog 2022-08-21 16:20:42 +02:00
Simon Vieille e802e05888 add code quality makefile action 2022-08-21 16:20:05 +02:00
Simon Vieille 13f535250a (cq) add missing let 2022-08-21 16:13:39 +02:00
Simon Vieille d837f1acf5 (cq) replace v-html with v-text to prevent xss 2022-08-21 16:12:52 +02:00
Simon Vieille f058ec10d3 (cq) replace var with let 2022-08-21 15:58:12 +02:00
Simon Vieille d3b3989e02 (cq) replace var with let 2022-08-21 15:55:59 +02:00
Simon Vieille 984bfcdc05 (cq) remove unused package* 2022-08-21 15:54:02 +02:00
Simon Vieille 983fabd460 (cq) add alt attribute on app icon 2022-08-21 15:53:26 +02:00
Simon Vieille ca7e8674e4 (cq) add rel noopener attribute 2022-08-21 15:46:33 +02:00
Simon Vieille 69e2c0670a (cq) add alt attribute on logo 2022-08-21 13:55:29 +02:00
Simon Vieille 4676243b2e (cq) remove unsed variable 2022-08-21 13:53:40 +02:00
Simon Vieille 84b50710a6 (cq) rename variable 2022-08-21 13:52:08 +02:00
Simon Vieille 059002ef1c (cq) replace repeated strings with variables 2022-08-21 13:49:20 +02:00
Simon Vieille fa9d5abf62 (cq) remove unsed variables 2022-08-21 13:48:42 +02:00
Simon Vieille 280c1d72ae (cq) remove duplicated code 2022-08-21 13:48:16 +02:00
Simon Vieille 373b8393bf update changelog 2022-08-15 15:03:46 +02:00
Simon Vieille 6205c9a6b6 Merge pull request 'upgrade dependencies' (#116) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/116
2022-08-15 14:26:44 +02:00
Simon Vieille d381d479da upgrade dependences 2022-08-15 14:17:36 +02:00
Simon Vieille ce9d6b93b1 upgrade dependences 2022-08-15 14:17:21 +02:00
Simon Vieille dc49747115 Merge pull request 'v2.4.3' (#115) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/115
2022-08-13 17:30:51 +02:00
Simon Vieille 1ce3f06b46 release v2.4.3 2022-08-13 17:26:35 +02:00
Simon Vieille 5fe272405e Merge pull request 'Tweaks to Czech localization' (#114) from Pavelb/side_menu:develop into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/114
2022-08-13 17:23:19 +02:00
Pavelb f2a09bc170 Updated Czech localization
Removed duplicated source string, minor tweaks to wording.
2022-08-13 14:50:46 +02:00
Pavelb a2ab8fa907 Merge pull request 'develop' (#1) from deblan/side_menu:develop into develop
Reviewed-on: https://gitnet.fr/Pavelb/side_menu/pulls/1
2022-08-13 14:38:27 +02:00
Simon Vieille 638ba27564 remove drone ci conf and update woodpecker ci conf 2022-07-28 10:14:37 +02:00
Simon Vieille 013d5b99f1 Merge pull request 'update ci' (#113) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/113
2022-07-26 15:29:33 +02:00
Simon Vieille 291eaa4f83 update ci 2022-07-26 15:27:56 +02:00
Simon Vieille 5bd88a32d9 Merge branch 'develop' 2022-07-26 15:08:39 +02:00
Simon Vieille 794d86f69e update ci 2022-07-26 15:05:44 +02:00
Simon Vieille e61e6880a2 update ci 2022-07-26 15:04:48 +02:00
Simon Vieille 4b81fa715c update ci 2022-07-26 15:04:22 +02:00
Simon Vieille 330ee2a43e update ci 2022-07-26 15:03:53 +02:00
Simon Vieille 3cf1b358b3 Merge pull request 'update ci' (#110) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/110
2022-07-26 14:57:46 +02:00
Simon Vieille ff1ebb4a50 update ci 2022-07-26 14:57:46 +02:00
Simon Vieille b246fa0281 update ci 2022-07-26 14:57:19 +02:00
Simon Vieille e6176d3e01 Merge pull request 'update ci' (#109) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/109
2022-07-26 14:55:43 +02:00
Simon Vieille 06b10568e7 update ci 2022-07-26 14:55:43 +02:00
Simon Vieille 3bc214b72e update ci 2022-07-26 14:55:25 +02:00
Simon Vieille a6df8db96b Merge pull request 'update ci' (#108) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/108
2022-07-26 14:50:14 +02:00
Simon Vieille 64f77b102d update ci 2022-07-26 14:49:29 +02:00
Simon Vieille ef604ee612 fix merge 2022-07-26 14:44:43 +02:00
Simon Vieille eafc020210 merge develop 2022-07-26 14:43:25 +02:00
Simon Vieille 2dac9ce0f4 Merge branch 'develop' 2022-07-26 14:41:52 +02:00
Simon Vieille 9f5143cc25 update changelog 2022-07-26 14:33:45 +02:00
Simon Vieille 48737c5300 update ci 2022-07-26 14:31:01 +02:00
Simon Vieille 293e4bf62b fix woodpecker pipeline 2022-07-25 11:06:27 +02:00
Simon Vieille 4c74b620b1 Merge pull request 'add new ci and fix minur bugs' (#107) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/107
2022-07-25 11:04:22 +02:00
Simon Vieille b83d9f8d76 add woodpacker ci 2022-07-25 11:04:22 +02:00
Simon Vieille 5835f1ae92 add woodpacker ci 2022-07-25 11:04:22 +02:00
Simon Vieille f6c40d9391 fix typo 2022-07-25 11:04:22 +02:00
Simon Vieille 049e601f62 add woodpacker ci 2022-07-25 10:38:59 +02:00
Simon Vieille 16ab6bfece add woodpacker ci 2022-07-25 10:34:24 +02:00
Simon Vieille 325b618434 Merge branch 'master' of gitnet.fr:deblan/side_menu 2022-07-05 16:52:13 +02:00
Simon Vieille 7892ce98d2 fix typo 2022-07-05 16:52:03 +02:00
Simon Vieille 4ea6c5b191 Merge pull request 'develop' (#106) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/106
2022-07-05 14:51:05 +02:00
Simon Vieille 87090b90c2 Merge branch 'develop' 2022-07-05 14:49:13 +02:00
Simon Vieille 2a1e9f5010 release v2.4.1 2022-07-05 14:49:06 +02:00
Simon Vieille 05b1b16cb1 fix user setting save 2022-07-05 14:49:00 +02:00
Simon Vieille 0176ef22d4 update readme 2022-05-31 21:39:55 +02:00
Simon Vieille 1d914458d0 Merge pull request 'release v2.4.0' (#104) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/104
2022-05-31 21:28:36 +02:00
Simon Vieille a8ecf3ea46 release v2.4.0 2022-05-31 21:24:08 +02:00
Simon Vieille 8d1842f622 update changelog 2022-05-31 21:23:53 +02:00
Simon Vieille a0be3757e9 update screenshots 2022-05-31 21:21:30 +02:00
Simon Vieille 7b2f64c5cd add translations 2022-05-31 21:11:11 +02:00
Simon Vieille 6b1a995d5d add tooltips 2022-05-31 16:43:49 +02:00
Simon Vieille 814567635d update changelog 2022-05-31 16:29:29 +02:00
Simon Vieille 32322a0ab2 add button to set default colors 2022-05-31 16:28:43 +02:00
Simon Vieille 95230e9e4a add menu hover effect 2022-05-31 15:48:17 +02:00
Simon Vieille e2430866e5 add button to set default colors 2022-05-31 15:48:02 +02:00
Simon Vieille 9f9f8f90c8 remove focus on opener after click 2022-05-30 19:49:59 +02:00
Simon Vieille 28fc33ee79 change saving progression 2022-05-30 19:49:36 +02:00
Simon Vieille f116b8463a fix menu with categories header 2022-05-30 13:22:03 +02:00
Simon Vieille d8edbae848 fix minor issues 2022-05-30 12:58:49 +02:00
Simon Vieille 4e0c7be2c6 remove deprecated app.php file 2022-05-30 12:04:15 +02:00
Simon Vieille 3fc141bee1 Merge branch 'develop' 2022-05-04 21:05:43 +02:00
Simon Vieille 2cb8c22be0 fix avatar size (nextcloud 24) 2022-05-04 21:05:38 +02:00
Simon Vieille 3e3e6ae943 Merge pull request 'release v2.3.5' (#100) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/100
2022-04-11 19:15:24 +02:00
Simon Vieille d759ccbdcc Merge branch 'develop' 2022-04-11 19:11:51 +02:00
Simon Vieille 389da47cab release v2.3.5 2022-04-11 19:11:41 +02:00
Simon Vieille 457c1ff53e Merge branch 'develop' 2022-04-10 18:56:58 +02:00
Simon Vieille a6a84ee784 update opener active style (fix #99) 2022-04-10 18:56:50 +02:00
Simon Vieille 52bbd49d9a update readme 2022-03-15 11:44:11 +01:00
Simon Vieille 92e1857ae8 Merge pull request 'fix issue #96' (#97) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/97
2022-03-15 11:14:40 +01:00
Simon Vieille c0b1701744 release v2.3.4 2022-03-15 10:56:05 +01:00
Simon Vieille ee98a49366 fix blank line when settings are open 2022-03-15 10:51:40 +01:00
Simon Vieille b4951b6cf1 Merge pull request 'develop' (#94) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/94
2022-02-07 14:35:05 +01:00
Simon Vieille a67688e779 release v2.3.3 2022-02-07 14:30:08 +01:00
Simon Vieille 9afde0dc9d update changelog 2022-02-07 14:29:51 +01:00
Simon Vieille 0f73ad42c4 fix SQL Exception InvalidFieldNameException (#93) 2022-02-07 14:28:34 +01:00
Simon Vieille 007ac2bb8e hide the scrollbar when mouse is out (menu always displayed) 2022-02-07 14:21:29 +01:00
Simon Vieille 4e21020600 Merge pull request 'develop' (#92) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/92
2022-01-14 17:03:28 +01:00
Simon Vieille 8c5b0e9834 update ci/cd conf 2022-01-14 16:52:36 +01:00
Simon Vieille 59e3b6b85e update ci/cd conf 2022-01-14 16:50:15 +01:00
Simon Vieille a913bd5ba2 update ci/cd conf 2022-01-14 16:49:14 +01:00
Simon Vieille 2d32e542cb update ci/cd conf 2022-01-14 16:46:47 +01:00
Simon Vieille 5d03fbaa49 update ci/cd conf 2022-01-14 16:44:54 +01:00
Simon Vieille 22011cb681 Merge pull request 'update the ci/cd config and screenshots' (#91) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/91
2022-01-13 00:47:43 +01:00
Simon Vieille 17a8137b4e Merge branch 'master' of gitnet.fr:deblan/side_menu 2022-01-13 00:20:11 +01:00
Simon Vieille 015493fc08 update ci/cd conf 2022-01-13 00:16:56 +01:00
Simon Vieille 992e54ac30 update ci/cd conf 2022-01-13 00:15:20 +01:00
Simon Vieille 67dfb7e833 update screenshots 2022-01-12 14:54:41 +01:00
Simon Vieille 1e68d6877d Merge pull request 'Quick fix' (#90) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/90
2022-01-12 14:13:08 +01:00
Simon Vieille 2ae08f7b77 release v2.3.2 2022-01-12 14:12:17 +01:00
Simon Vieille 489321081a fix hidden menu 2022-01-12 14:11:38 +01:00
Simon Vieille 68123ed45c Merge pull request 'Quick fix (#88)' (#89) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/89
2022-01-12 13:32:29 +01:00
Simon Vieille 66a1528341 release v2.3.1 2022-01-12 13:30:43 +01:00
Simon Vieille 64b7f3f534 fix #88 2022-01-12 13:29:44 +01:00
Simon Vieille fef936bef0 Merge pull request 'Issues #82 #83' (#87) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/87
2022-01-12 12:53:54 +01:00
Simon Vieille 715dae6ab4 release v2.3.0 2022-01-12 12:51:29 +01:00
Simon Vieille e2a9fecac9 fix typo 2022-01-12 12:48:50 +01:00
Simon Vieille e2d17022f9 fix incorrect html label 2022-01-12 12:46:41 +01:00
Simon Vieille 29d79ad589 update changelog 2022-01-12 12:43:11 +01:00
Simon Vieille 5a4294fad4 Merge branch 'feature/issue82' into develop 2022-01-12 12:41:29 +01:00
Simon Vieille d34b41ba94 add option to keep an app in the top and side menu 2022-01-12 12:40:17 +01:00
Simon Vieille a6016552c9 update changelog and readme 2022-01-12 11:44:45 +01:00
Simon Vieille 50c65811a6 add auto-reload when settings are saved 2022-01-11 22:23:13 +01:00
Simon Vieille f64436f0a3 Merge branch 'feature/issue83' into develop 2022-01-11 20:20:51 +01:00
Simon Vieille 34b1c2809b fix issue with custom categories and add experimental notice 2022-01-11 20:20:44 +01:00
Simon Vieille 5d9dc804f8 add bigger select 2022-01-11 20:02:02 +01:00
Simon Vieille 30072500bc add a way to create custom categories and manage application categories 2022-01-11 19:59:51 +01:00
Simon Vieille 9871cb93d8 Merge pull request 'develop' (#86) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/86
2022-01-10 15:07:07 +01:00
Simon Vieille a9ca55390d release v2.2.0 2022-01-10 15:02:05 +01:00
Simon Vieille 7230863d0a update icons (#84) 2022-01-10 14:59:17 +01:00
Simon Vieille d9046a205f update dependencies 2022-01-09 22:26:46 +01:00
Simon Vieille 0923a9107c fix categories order 2022-01-09 22:17:01 +01:00
Simon Vieille 1cbdca87df generate default colors using theming colors 2022-01-09 16:43:12 +01:00
Simon Vieille 2e8bed4531 Merge pull request 'update changelog' (#81) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/81
2021-12-03 14:15:36 +01:00
Simon Vieille 506fa22f4b update changelog 2021-12-03 14:14:03 +01:00
Simon Vieille 134148c6b2 Merge pull request 'release v2.1.0 (NC23 is compatible)' (#80) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/80
2021-12-03 14:03:10 +01:00
Simon Vieille a97e94e2e5 release v2.1.0 (NC23 is compatible) 2021-12-03 13:47:52 +01:00
Simon Vieille 8d287672e9 Merge branch 'master' of gitnet.fr:deblan/side_menu 2021-11-14 20:07:49 +01:00
Simon Vieille 7f33f7523f Merge pull request 'Release 2.0.1' (#79) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/79
2021-11-14 20:07:41 +01:00
Simon Vieille 0ecc706bad Merge branch 'develop' 2021-11-14 20:05:33 +01:00
Simon Vieille b6fb1783ba release v2.0.1 2021-11-14 20:05:22 +01:00
Simon Vieille 1b0418a466 fix js error on the personal settings page (undefined sortable) 2021-11-14 20:04:58 +01:00
Simon Vieille d37773cf5f fix js error on the personal settings page (undefined sortable) 2021-11-14 20:04:36 +01:00
Simon Vieille 1aea6ee4f4 fix #78: top menu is broken - invisible apps are shown 2021-11-14 20:01:43 +01:00
Simon Vieille a6dd6854e4 fix issue #77 2021-11-14 19:37:14 +01:00
Simon Vieille 70caa80af6 Merge pull request 'update makefile for assets build' (#75) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/75
2021-11-14 17:33:55 +01:00
Simon Vieille 48f403882a update makefile for assets build 2021-11-14 17:32:54 +01:00
Simon Vieille 6296c1c807 Merge pull request 'Release v2.0.0' (#74) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/74
2021-11-14 17:22:49 +01:00
Simon Vieille 71b9bc4766 release v2.0.0 2021-11-14 17:17:46 +01:00
Simon Vieille 228f07ea25 Merge branch 'feature/removing-jquery' into develop 2021-11-14 17:03:04 +01:00
Simon Vieille fd2ae59d16 remove background and border from opener (#73) 2021-11-14 16:44:52 +01:00
Simon Vieille 9124de3c81 fix the code of conduct 2021-11-06 20:11:53 +01:00
Simon Vieille 5e308b610d update the build task to include vendor/ 2021-11-05 20:20:42 +01:00
Simon Vieille db2220e745 replace the sortable jquery plugin with html5sortable 2021-11-05 20:19:08 +01:00
Simon Vieille 1143843a5b fix ci/cd conf 2021-11-03 23:02:57 +01:00
Simon Vieille 74d26106dc Merge pull request 'add ci/cd conf' (#72) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/72
2021-11-03 20:04:03 +01:00
Simon Vieille 539a81c07e add ci/cd conf 2021-11-03 20:01:54 +01:00
Simon Vieille d978da2c72 Merge branch 'develop' into feature/removing-jquery 2021-11-03 19:52:55 +01:00
Simon Vieille 544ed1a1fa add ci/cd conf (drone) 2021-11-03 19:52:24 +01:00
Simon Vieille ff5ba04217 Merge pull request 'add ci/cd conf (drone)' (#71) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/71
2021-11-03 19:20:36 +01:00
Simon Vieille 56e87d470d add ci/cd conf (drone) 2021-11-03 19:17:29 +01:00
Simon Vieille 9173ca37c7 add ci/cd conf (drone) 2021-11-02 20:48:54 +01:00
Simon Vieille 240b564e22 Merge pull request 'update documentation' (#70) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/70
2021-10-31 19:44:17 +01:00
Simon Vieille 11ccdceb98 update documentation 2021-10-31 19:43:25 +01:00
Simon Vieille 0608011d80 Merge pull request 'update metroline conf file' (#69) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/69
2021-10-31 18:45:36 +01:00
Simon Vieille 3d3da18322 update metroline conf file 2021-10-31 18:44:30 +01:00
Simon Vieille 3a999b22b0 Merge branch 'develop' into feature/removing-jquery 2021-10-31 17:48:06 +01:00
Simon Vieille 1544b28b57 Merge pull request 'add ci configuration' (#68) from develop into master
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/68
2021-10-31 17:47:47 +01:00
Simon Vieille e72d0555db update metroline conf file 2021-10-31 17:44:21 +01:00
Simon Vieille 7866089532 add metroline conf file 2021-10-31 17:42:22 +01:00
Simon Vieille ed2531db55 add fetch to make request 2021-10-31 17:27:08 +01:00
Simon Vieille c53221d112 fix indentation 2021-10-31 17:02:09 +01:00
Simon Vieille 9a95151156 remove console log 2021-10-31 16:56:52 +01:00
Simon Vieille 80369a39e1 remove jquery excepted for sorting categories 2021-10-31 16:55:43 +01:00
Simon Vieille 7471e93847 fix null setting update 2021-10-31 16:55:04 +01:00
Simon Vieille d1faf881da add timeout 2021-10-31 16:54:16 +01:00
Simon Vieille 96ffdf93ea remove useless vars 2021-10-29 15:30:22 +02:00
Simon Vieille 6f0c4e98e0 fix top menu generation; fix issue #66 by removing usage of setInterval 2021-10-29 13:56:48 +02:00
Simon Vieille c2e6d24b95 remove ';' on endline 2021-10-29 11:27:45 +02:00
Simon Vieille 5d93d02960 refactoring of alwaysDisplayed function 2021-10-29 11:24:01 +02:00
Simon Vieille a074d747c1 remove most of jquery from top menu 2021-10-29 11:14:27 +02:00
Simon Vieille cc7c9f6ed5 remove most of jquery 2021-10-28 15:47:03 +02:00
Simon Vieille f26adb6ac1 remove jquery from components 2021-10-28 13:50:16 +02:00
Simon Vieille 1e64b34cff Merge branch 'develop' 2021-10-28 13:17:04 +02:00
Simon Vieille 3b6b8ad54a add missing svg 2021-10-28 13:16:55 +02:00
Simon Vieille cc71fda3b0 Merge branch 'develop' 2021-10-21 21:43:51 +02:00
Simon Vieille 64c4d7a1e1 release v1.28.0 2021-10-21 21:43:30 +02:00
Simon Vieille fd367fe2d4 Merge branch 'develop' 2021-10-21 21:37:40 +02:00
Simon Vieille 3975f3be28 fix #63: add a new side menu with categories 2021-10-21 21:37:32 +02:00
Simon Vieille 3f590a97bc Merge branch 'develop' 2021-10-21 20:06:41 +02:00
Simon Vieille 1896bb399d fix #62: hide app notification icon 2021-10-21 20:06:17 +02:00
Simon Vieille d77c2ef9ae release v1.27.1 2021-08-11 14:43:52 +02:00
Simon Vieille db0fa60ce8 fix German translation render 2021-08-11 14:43:04 +02:00
Simon Vieille aac9f2cb16 Merge branch 'develop' 2021-08-11 11:58:25 +02:00
Simon Vieille 33d7c6a7f0 release v1.27.0 2021-08-11 11:58:15 +02:00
Simon Vieille a72bb87aa2 hide personal settings access when settings are forced by the administrator 2021-08-11 11:57:43 +02:00
Simon Vieille 5e4a7bcae4 improved German translations 2021-08-11 11:57:01 +02:00
Simon Vieille f7d4a8284b Merge branch 'develop' 2021-08-02 21:49:02 +02:00
Simon Vieille b900ed7a4d release v1.26.0 2021-08-02 21:48:58 +02:00
Simon Vieille 4a10338588 Merge pull request 'Add Czech localization' (#61) from Pavelb/side_menu:develop into develop
Reviewed-on: https://gitnet.fr/deblan/side_menu/pulls/61
2021-08-02 21:35:34 +02:00
Pavelb 88ecd2ceaf Add Czech localization 2021-07-23 14:45:45 +02:00
Simon Vieille 04d161ad9b Merge branch 'develop' 2021-07-09 12:55:07 +02:00
Simon Vieille 1dcf1b7938 update changelog 2021-07-09 12:55:05 +02:00
Simon Vieille dab5566be4 Merge branch 'develop' 2021-07-09 12:54:32 +02:00
Simon Vieille 143ece3be8 update changelog 2021-07-09 12:54:28 +02:00
Simon Vieille d735e1cfa6 Merge branch 'develop' 2021-07-09 12:43:01 +02:00
Simon Vieille f86ec1de52 update changelog 2021-07-09 12:42:51 +02:00
Simon Vieille b780f53e0b add PHP version as dependency 2021-07-09 12:42:43 +02:00
Simon Vieille 96a4235a10 Merge branch 'develop' 2021-07-09 11:52:28 +02:00
Simon Vieille 86be38af6c add translations: zh_CN 2021-07-09 11:52:05 +02:00
Simon Vieille 4413623618 merge develop 2021-07-07 21:36:02 +02:00
Simon Vieille 7887a441b3 add compatibility with Nextcloud 22, add CHANGELOG.md, update app icon 2021-07-07 21:35:25 +02:00
Simon Vieille 44478af3a2 release v1.24.0 2021-07-03 20:33:42 +02:00
Simon Vieille 7306a31a7d release v1.24.0 2021-07-03 20:32:39 +02:00
Simon Vieille d2a8b05772 add background opacity (fix #58) 2021-07-03 20:23:39 +02:00
Simon Vieille fba980416d fix translations 2021-03-02 19:16:53 +01:00
Simon Vieille 95c840ae83 release v1.23.1 2021-03-02 19:16:44 +01:00
Simon Vieille f021c9f0cd fix issue with opener selector 2021-03-02 19:16:37 +01:00
Simon Vieille 58e03e903c release v1.23.0 2021-02-27 14:28:02 +01:00
Simon Vieille 9747820cb8 add dark mode colors 2021-02-27 14:21:55 +01:00
Simon Vieille d8d6aededa add compatibility with nextcloud 21 2021-02-24 15:16:29 +01:00
Simon Vieille a27e723657 Merge branch 'feature/issue55' into develop 2021-02-09 16:51:29 +01:00
Simon Vieille c7db75cea3 release v1.22.2 2021-02-09 16:51:27 +01:00
Simon Vieille 4cd5421e53 fix regression: apps does not open in the tab 2021-02-09 16:50:16 +01:00
Simon Vieille f2d1de1cbe release v1.22.1 2021-02-05 17:57:46 +01:00
Simon Vieille 6be679c569 fix regression: apps does not open in the tab 2021-02-05 17:54:50 +01:00
134 changed files with 18508 additions and 5203 deletions
+12 -3
View File
@@ -1,5 +1,14 @@
module.exports = { module.exports = {
rules: { env: {
'no-console': 'off', node: true,
}, },
}; extends: [
"eslint:recommended",
"plugin:vue/vue3-recommended",
"prettier",
],
rules: {
// override/add rules settings here, such as:
// 'vue/no-unused-vars': 'error'
}
}
-16
View File
@@ -1,16 +0,0 @@
---
name: "New feature"
about: "Use this template if you want to request a feature"
title: "[FEATURE] "
labels:
- enhancement
---
## Feature
### Description
...
### Benefits
...
@@ -0,0 +1,34 @@
name: New feature
about: Use this template if you want to request a feature
title: "[FEATURE] "
labels:
- enhancement
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this feature request!
- type: textarea
id: description
attributes:
label: Description
description: Describe the feature.
validations:
required: true
- type: textarea
id: benefits
attributes:
label: Benefits
description: Describe the benefits of this feature.
validations:
required: true
- type: textarea
id: extra
attributes:
label: More informations
description: If you want to share more things, this is here!
validations:
required: false
-32
View File
@@ -1,32 +0,0 @@
---
name: "New issue"
about: "Use this template if you have a bug"
title: "[BUG] "
labels:
- bug
---
## Issue
### Environment
* Custom menu version:
* Nextcloud version:
* PHP version:
* Web server (Nginx, Apache2):
* Web browser and version (Firefox 80, Google Chrome 74, etc):
```
Insert your configuration here. You can export the configuration using the admin page.
```
### Steps to reproduce
...
### Observed Results
...
### Expected Results
...
+69
View File
@@ -0,0 +1,69 @@
name: New issue
about: Use this template if you have a bug
title: "[Bug] "
labels:
- bug
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: textarea
id: environment
attributes:
label: Environment
value: |
* Custom menu version:
* Nextcloud version:
* PHP version:
* Web server (Nginx, Apache2):
* Web browser and version (Firefox 80, Google Chrome 74, etc):
validations:
required: true
- type: textarea
id: configuration
attributes:
label: Configuration
description: Export the configuration using the admin page and copy/paste here ([documentation](https://deblan.gitnet.page/side_menu_doc/docs/FAQ/export-config/)).
value: |
```
{
...
}
```
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce
description: How reproduce the bug?
validations:
required: false
- type: textarea
id: resuts
attributes:
label: Observed Results
description: What happened?
validations:
required: false
- type: textarea
id: expected
attributes:
label: Expected Results
description: What should happen?
validations:
required: false
- type: textarea
id: extra
attributes:
label: More informations
description: If you want to share more things, this is here!
validations:
required: false
@@ -0,0 +1,30 @@
name: New question
about: Use this template when you don't know how to do something
title: "[Question] "
labels:
- question
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill information.
- type: textarea
id: environment
attributes:
label: Environment
value: |
* Custom menu version:
* Nextcloud version:
* PHP version:
* Web server (Nginx, Apache2):
* Web browser and version (Firefox 80, Google Chrome 74, etc):
validations:
required: true
- type: textarea
id: question
attributes:
label: Question
validations:
required: true
+8
View File
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Documentation
url: https://deblan.gitnet.page/side_menu_doc/
about: Official documentation web site
- name: Ask a question in our Matrix room
about: If you prefer a chat-like conversation or in need for quick help, this might be an alternative to opening an issue.
url: https://matrix.to/#/#custommenu:neutralnetwork.org
-1
View File
@@ -2,5 +2,4 @@
/node_modules /node_modules
/l10n/* /l10n/*
/releases /releases
/package-lock.json
!/l10n/.gitkeep !/l10n/.gitkeep
+8
View File
@@ -0,0 +1,8 @@
{
"bracketSpacing": true,
"bracketSameLine": false,
"semi": false,
"singleQuote": true,
"singleAttributePerLine": true,
"printWidth": 160
}
+5
View File
@@ -0,0 +1,5 @@
{
"rules": {
"indentation": 2
}
}
+22
View File
@@ -0,0 +1,22 @@
variables:
volumes: &volumes
- /data/${CI_REPO}:/builds
when:
event: [tag, push, pull_request, manual]
branch: [master, develop, feature/*, fix/*, bugfix/*, translations]
steps:
"Build JS":
image: node:20
commands:
- make build
"Build translations":
image: deblan/php:8.3
commands:
- php bin/generate_l10n.php
"Build cache":
image: gitnet.fr/deblan/woodpecker-cache
volumes: *volumes
+66
View File
@@ -0,0 +1,66 @@
variables:
volumes: &volumes
- /data/${CI_REPO}:/builds
- /var/www/html/artifacts:/var/www/html/artifacts
depends_on:
- build
when:
event: [tag]
steps:
"Verify tag and app version":
image: alpine
commands:
- TAG=${CI_COMMIT_TAG/v//}
- grep "<version>$TAG</version>" appinfo/info.xml
"Create signature":
image: nextcloud:25
volumes: *volumes
environment:
APP_CERTIFICATE:
from_secret: app_certificate
APP_PUBLIC_CERTIFICATE:
from_secret: app_public_certificate
SQLITE_DATABASE: /var/www/data/data.db
NEXTCLOUD_ADMIN_USER: admin
NEXTCLOUD_ADMIN_PASSWORD: admin
commands:
- cd "/builds/$CI_COMMIT_SHA"
- echo "$APP_CERTIFICATE" > "/tmp/side_menu.key"
- echo "$APP_PUBLIC_CERTIFICATE" > "/tmp/side_menu.crt"
- mkdir /tmp/app
- cp -r README.md CHANGELOG.md appinfo lib img l10n js src templates screenshots vendor /tmp/app
- /usr/src/nextcloud/occ integrity:sign-app
--privateKey=/tmp/side_menu.key
--certificate=/tmp/side_menu.crt
--path=/tmp/app
- mv /tmp/app/appinfo/signature.json appinfo/
"Create package":
image: deblan/php:8.3
volumes: *volumes
environment:
APP_CERTIFICATE:
from_secret: app_certificate
commands:
- cd "/builds/$CI_COMMIT_SHA"
- apt-get update
- apt-get install -y zip make
- mkdir -p "$HOME/.nextcloud/certificates"
- echo "$APP_CERTIFICATE" > "$HOME/.nextcloud/certificates/side_menu.key"
- export VERSION=$(grep "<version>" appinfo/info.xml | grep -o "[0-9]*\.[0-9]*\.[0-9]*" --color=never)
- export RELEASE_DIRECTORY="/var/www/html/artifacts/deblan/side_menu"
- make release
"Push release":
image: plugins/gitea-release
volumes: *volumes
settings:
api_key:
from_secret: gitnet_api_key
base_url: https://gitnet.fr
# note: ${CI_COMMIT_MESSAGE}
files: /var/www/html/artifacts/deblan/side_menu/${CI_COMMIT_TAG/v//}/*
+17
View File
@@ -0,0 +1,17 @@
variables:
volumes: &volumes
- /data/${CI_REPO}:/builds
depends_on:
- build
skip_clone: true
steps:
"Check dependencies":
image: gitnet.fr/deblan/osv-detector:v0.10
volumes: *volumes
commands:
- cd "/builds/$CI_COMMIT_SHA"
- osv-detector package-lock.json
failure: ignore
+1070
View File
File diff suppressed because it is too large Load Diff
+3 -1025
View File
File diff suppressed because one or more lines are too long
+19 -7
View File
@@ -1,20 +1,27 @@
npm-build: build: dep
npm run build npm run build
npm-watch: watch: dep
npm run watch npm run watch
dep:
npm i
.ONESHELL: .ONESHELL:
release: npm-build translations release:
if [ -z "$$VERSION" ]; then if [ -z "$$VERSION" ]; then
echo "VERSION required" echo "VERSION required"
exit 1 exit 1
fi fi
test -d releases/$$VERSION && rm -fr releases/$$VERSION if [ -z "$$RELEASE_DIRECTORY" ]; then
mkdir -p releases/$$VERSION/side_menu RELEASE_DIRECTORY=releases
cp -r README.md appinfo css lib img l10n js src templates screenshots releases/$$VERSION/side_menu fi
cd releases/$$VERSION
test -d $$RELEASE_DIRECTORY/$$VERSION && rm -fr $$RELEASE_DIRECTORY/$$VERSION
mkdir -p $$RELEASE_DIRECTORY/$$VERSION/side_menu
cp -r README.md CHANGELOG.md appinfo lib img l10n js src templates screenshots vendor $$RELEASE_DIRECTORY/$$VERSION/side_menu
cd $$RELEASE_DIRECTORY/$$VERSION
zip -r side_menu_v$$VERSION.zip side_menu zip -r side_menu_v$$VERSION.zip side_menu
tar cvzf side_menu_v$$VERSION.tar.gz side_menu tar cvzf side_menu_v$$VERSION.tar.gz side_menu
rm -fr side_menu rm -fr side_menu
@@ -22,3 +29,8 @@ release: npm-build translations
translations: translations:
php bin/generate_l10n.php php bin/generate_l10n.php
.ONESHELL:
run-code-quality-analysis:
export SONAR_TOKEN="$$SONAR_TOKEN_DEBLAN_SIDE_MENU"
sonar-scanner -Dsonar.projectKey=deblan-side_menu -Dsonar.sources=. -Dsonar.host.url=$$SONAR_SERVER -Dsonar.branch.name=$$(git branch --show-current)
+40 -8
View File
@@ -1,24 +1,30 @@
🤙 Nextcloud app / Custom menu 🎨 🤙 Nextcloud app / Custom menu 🎨
=============================== ===============================
[![Build Status](https://ci.gitnet.fr/api/badges/deblan/side_menu/status.svg)](https://ci.gitnet.fr/deblan/side_menu)
[![Translations](https://translate.codeberg.org/widgets/custom-menu/-/application/svg-badge.svg)](https://translate.codeberg.org/engage/custom-menu/)
![Downloads](https://img.shields.io/badge/dynamic/json?color=brightgreen&label=downloads&query=%24.K_downloads&suffix=K&url=https%3A%2F%2Fapi-side-menu.deblan.org%2Fdownloads.php)
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.
Comptatible with AppOrder. You can customize colors depending of the theme (Dark theme and Breeze Dark).
* [Installation and upgrade](#installation-and-upgrade) * [Installation and upgrade](#installation-and-upgrade)
* [How to contribute?](#how-to-contribute) * [How to contribute?](#how-to-contribute)
* [Support](#support)
* [Screenshots](https://gitnet.fr/deblan/side_menu/src/branch/master/screenshots/) * [Screenshots](https://gitnet.fr/deblan/side_menu/src/branch/master/screenshots/)
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)
## [📘 Read the documentation](https://deblan.gitnet.page/side_menu_doc/)
Requirements Requirements
------------ ------------
* PHP >= 7.3 * PHP >= 8.1
* App `theming` enabled
Installation and upgrade Installation and upgrade
------------------------ ------------------------
@@ -34,7 +40,7 @@ If you want to install it from source, go to https://gitnet.fr/deblan/side_menu/
``` ```
$ cd /path/to/nextcloud/apps $ cd /path/to/nextcloud/apps
$ curl -sS https://gitnet.fr/attachments/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx | tar xvfz - $ VERSION=x.y.z; curl -sS "https://gitnet.fr/deblan/side_menu/releases/download/${VERSION}/side_menu_v${VERSION}.tar.gz" | tar xvfz -
``` ```
Administrators can edit many settings using the administration page. Administrators can edit many settings using the administration page.
@@ -43,18 +49,44 @@ Users can disable the menu using the page of personal settings.
Use the shortcut `Ctrl`+`o` to open and to hide the side menu. Use `tab` to navigate. Use the shortcut `Ctrl`+`o` to open and to hide the side menu. Use `tab` to navigate.
### Use first top menu app as default app
You can easily let Custom Menu redirect to the first app in the top menu by changing the following parameter in your `config/config.php`:
```
'defaultapp' => 'side_menu',
```
If the top menu is empty then it redirects to files.
How to contribute? How to contribute?
------------------ ------------------
You can report a bug or request a feature by opening an issue: https://gitnet.fr/deblan/side_menu/issues You can report a bug or request a feature by opening an issue: https://gitnet.fr/deblan/side_menu/issues
If you are a developer: ### You are a translator
Translations are managed from [translate.codeberg.org](https://translate.codeberg.org/projects/custom-menu/application/).
### You are a developer
* fork the repository * fork the repository
* install an instance of Nextcloud * install an instance of Nextcloud
* go to `apps/` and clone your repository * go to `apps/` and clone your repository
* go to `apps/side_menu` and run `npm install` * go to `apps/side_menu` and run `make dep`
Build javascripts using `make npm-build` (or `make npm-watch` to build them in real time). Build javascripts using `make build` (or `make watch` to build them in real time).
Then commit and create a pull request. Then commit and create a pull request.
Support
-------
You can join the official room on Matrix: [#custommenu:neutralnetwork.org](https://matrix.to/#/#custommenu:neutralnetwork.org).
Notice
------
Because I believe in a free and decentralized Internet, [Gitnet](https://gitnet.fr) is **self-hosted at home**.
In case of downtime, you can download **Custom Menu** from [here](https://kim.deblan.fr/~side_menu/).
-10
View File
@@ -1,10 +0,0 @@
<?php
use OCA\SideMenu\AppInfo\Application;
$app = new Application();
if ($app->isEnabled()) {
$app->registerAssets();
$app->registerServices();
}
+25 -18
View File
@@ -1,6 +1,5 @@
<?xml version="1.0"?> <?xml version="1.0" encoding="UTF-8" ?>
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" <info xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd">
<id>side_menu</id> <id>side_menu</id>
<name>Custom menu</name> <name>Custom menu</name>
<summary>Modify the display of the menu.</summary> <summary>Modify the display of the menu.</summary>
@@ -11,42 +10,50 @@ This application is rather suitable for instances that activate a lot of applica
Use the shortcut `Ctrl`+`o` to open and to hide the side menu. Use `tab` to navigate. Use the shortcut `Ctrl`+`o` to open and to hide the side menu. Use `tab` to navigate.
Comptatible with AppOrder. You can customize colors depending of the theme.
You can report a bug or request a feature by opening an issue. To report a bug or request a feature, please open an issue.
Requirements: Requirements:
* PHP >= 7.3 * PHP >= 8.1
* 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:
* [Buy me a coffee](https://www.buymeacoffee.com/deblan) * [Buy me a coffee](https://www.buymeacoffee.com/deblan)
* [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)
Notice
------
Because I believe in a free and decentralized Internet, [Gitnet](https://gitnet.fr) is **self-hosted at home**.
In case of downtime, you can download **Custom Menu** from [here](https://kim.deblan.fr/~side_menu/).
]]></description> ]]></description>
<version>1.22.0</version> <version>6.2.0</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.fr/">Simon Vieille</author>
<namespace>SideMenu</namespace> <namespace>SideMenu</namespace>
<documentation> <documentation>
<admin>https://gitnet.fr/deblan/side_menu/src/branch/master/README.md</admin> <admin>https://deblan.gitnet.page/side_menu_doc/</admin>
<developer>https://gitnet.fr/deblan/side_menu/src/branch/master/README.md</developer> <developer>https://gitnet.fr/deblan/side_menu/src/branch/master/README.md</developer>
</documentation> </documentation>
<category>customization</category> <category>customization</category>
<website>https://gitnet.fr/deblan/side_menu</website> <website>https://gitnet.fr/deblan/side_menu</website>
<discussion>https://matrix.to/#/!TFPucDATKODpHNVAtu:neutralnetwork.org?via=neutralnetwork.org</discussion> <discussion><![CDATA[https://matrix.to/#/!TFPucDATKODpHNVAtu:neutralnetwork.org?via=neutralnetwork.org]]></discussion>
<bugs>https://gitnet.fr/deblan/side_menu/issues</bugs> <bugs>https://gitnet.fr/deblan/side_menu/issues</bugs>
<repository type="git">https://gitnet.fr/deblan/side_menu</repository> <repository type="git">https://gitnet.fr/deblan/side_menu</repository>
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc19_default_menu.png</screenshot> <screenshot><![CDATA[https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc19_default_menu.png]]></screenshot>
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/admin_settings.png</screenshot> <screenshot><![CDATA[https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/admin_settings.png]]></screenshot>
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/n19_big_menu.png</screenshot> <screenshot><![CDATA[https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/n19_big_menu.png]]></screenshot>
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc18_menu_always_displayed.png</screenshot> <screenshot><![CDATA[https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc18_menu_always_displayed.png]]></screenshot>
<screenshot>https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc20_big_menu_responsive.png</screenshot> <screenshot><![CDATA[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><![CDATA[https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/personal_settings.png]]></screenshot>
<screenshot><![CDATA[https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_big_menu.png]]></screenshot>
<screenshot><![CDATA[https://gitnet.fr/deblan/side_menu/raw/branch/master/screenshots/nc25_default_menu.png]]></screenshot>
<dependencies> <dependencies>
<nextcloud min-version="18" max-version="20"/> <php min-version="8.1" max-version="8.5" />
<nextcloud min-version="34" max-version="35"/>
</dependencies> </dependencies>
<settings> <settings>
<admin>OCA\SideMenu\Settings\Admin</admin> <admin>OCA\SideMenu\Settings\Admin</admin>
+1
View File
@@ -31,6 +31,7 @@ function generateJsonContent($translations)
chdir(__DIR__.'/../'); chdir(__DIR__.'/../');
foreach (glob('src/l10n/fixtures/*.yaml') as $file) { foreach (glob('src/l10n/fixtures/*.yaml') as $file) {
echo "$file\n";
$lang = str_replace('.yaml', '', basename($file)); $lang = str_replace('.yaml', '', basename($file));
$translations = yaml_parse(file_get_contents($file)); $translations = yaml_parse(file_get_contents($file));
+67 -13
View File
@@ -1,21 +1,75 @@
<?php <?php
/**
* Imports a json configuration into a sqlite database.
*
* Usage:
* php bin/import_config.php /path/to/config.json /path/to/owncloud.db
*/
$configFile = $argv[1]; function showUsageAndExit(int $code)
$databaseFile = $argv[2]; {
global $argv;
$content = file_get_contents($configFile); echo "${argv[0]} [--help] --config /path/to/config/config.php --file /path/to/config.json\n";
$config = json_decode($content, true);
$pdo = new \Pdo(sprintf('sqlite:%s', $databaseFile)); exit($code);
$stmt = $pdo->prepare('UPDATE oc_appconfig SET configvalue=:value WHERE configkey=:key and appid=:appId'); }
foreach ($config as $key => $value) { function value(string $shortName, string $longName, array $options, bool $required = true): ?string
{
$value = $options[$shortName] ?? $options[$longName] ?? null;
if (is_array($value)) {
echo "To much --{$longName}\n";
showUsageAndExit(1);
}
if (empty($value) && $required) {
echo "--{$longName} is missing\n";
showUsageAndExit(1);
}
return $value;
}
$options = getopt('t:f:c:h', [
'type:',
'file:',
'config:',
'help',
]);
$help = value('h', 'help', $options, false);
$config = value('c', 'config', $options);
$file = value('f', 'file', $options);
if (!is_readable($config) && !is_file($config)) {
echo "No such file: {$config}\n";
exit(1);
}
if (!is_readable($file) && !is_file($file)) {
echo "No such file: {$file}\n";
exit(1);
}
$appConfig = json_decode(file_get_contents($file), true);
require $config;
if ('mysql' === $CONFIG['dbtype']) {
$pdo = new \PDO(
'mysql:host='.$CONFIG['dbhost'].';dbname='.$CONFIG['dbname'],
$CONFIG['dbuser'],
$CONFIG['dbpassword']
);
} elseif ($CONFIG['dbtype']) {
$pdo = new \PDO(sprintf('sqlite:%s', $CONFIG['datadirectory'].'/owncloud.db'));
} else {
echo "dbtype is not valid\n";
exit(1);
}
$stmt = $pdo->prepare('UPDATE '.$CONFIG['dbtableprefix'].'appconfig SET configvalue=:value WHERE configkey=:key and appid=:appId');
foreach ($appConfig as $key => $value) {
$stmt->execute([ $stmt->execute([
'appId' => 'side_menu', 'appId' => 'side_menu',
'key' => $key, 'key' => $key,
-113
View File
@@ -1,113 +0,0 @@
/**
* @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/>.
*/
#side-menu-section input[type="color"] {
width: 100px;
margin: 10px 0 10px 0;
}
#side-menu-section input[type="checkbox"] {
vertical-align: middle;
}
#side-menu-section input[type="range"] {
vertical-align: middle;
}
#side-menu-section select {
margin: 10px 0 10px 0;
}
.keyboard-key {
padding: 1px 9px;
margin: 0 2px;
background: #eee;
border: 1px solid #aaa;
color: #555;
border-radius: 3px;
}
.side-menu-display {
padding: 10px;
border: 2px solid transparent;
max-width: 100%;
cursor: pointer;
}
.side-menu-display.is-active {
border: 2px solid #91cb7f;
}
.info {
margin-top: 8px;
padding: 5px;
background: #91cb7f;
color: #fff;
border-radius: var(--border-radius);
}
#side-menu-section h2 small {
font-size: 11px;
font-weight: normal;
}
.side-menu-toggler {
cursor: pointer;
}
.side-menu-setting-list {
margin: 10px 4px 4px 0px;
}
.side-menu-setting-list-item {
padding: 5px 10px;
border: 1px solid var(--color-border-dark);
max-width: 300px;
margin: -1px 0 0 0;
cursor: pointer;
}
.side-menu-setting.arrow {
color: #ccc;
padding-right: 5px;
}
.side-menu-setting-list-item input {
min-height: auto;
margin-top: -1px;
}
.side-menu-setting-table {
display: table;
width: 100%;
}
.side-menu-setting-row {
display: table;
}
.side-menu-setting-label {
display: table-cell;
width: 400px;
padding-right: 20px;
}
.side-menu-setting-form {
display: table-cell;
width: 300px;
}
-299
View File
@@ -1,299 +0,0 @@
/**
* @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/>.
*/
#side-menu {
position: fixed;
top: 0;
left: 0;
height: 100vh;
width: 100%;
max-width: 250px;
background: linear-gradient(90deg, var(--side-menu-background-color, #333) 0%, var(--side-menu-background-color-to, #333) 100%);
z-index: 3000;
color: var(--side-menu-text-color, #fff);
box-shadow: rgba(0, 0, 0, 0.22) 0px 25.6px 57.6px 0px, rgba(0, 0, 0, 0.18) 0px 4.8px 14.4px 0px;
display: none;
}
#side-menu.open {
display: block;
}
#header .side-menu-opener {
margin-left: 5px;
}
.side-menu-settings {
margin-right: 9px;
margin-top: 2px;
float: right;
line-height: 34px;
height: 28px;
display: none;
}
.side-menu-settings a {
color: var(--side-menu-text-color, #fff);
display: block;
padding: 4px 7px;
}
.side-menu-settings:hover a, .side-menu-settings a:active, .side-menu-settings a:focus {
background: var(--side-menu-current-app-background-color, #444);
}
.side-menu-settings img {
vertical-align: bottom;
margin-left: 3px;
}
#side-menu.open .side-menu-settings {
display: block;
}
.side-menu-opener {
background: var(--side-menu-opener, url('../img/side-menu-opener.svg'));
height: 40px;
width: 40px;
border-radius: 0;
border: 0;
}
.side-menu-closer {
background: url('../img/side-menu-opener-closer.svg');
display: none;
}
#side-menu.hide-opener .side-menu-opener, .side-menu-opener.hide, #side-menu.hide {
display: none !important;
}
.side-menu-apps-list {
height: calc(100vh - 150px);
z-index: 2200;
position: fixed;
top: 150px;
width: 100%;
max-width: 250px;
overflow: auto;
}
.side-menu-app-icon {
width: 20px;
vertical-align: top;
margin-right: 10px;
filter: invert(var(--side-menu-icon-invert-filter, 0%));
opacity: var(--side-menu-icon-opacity, 1);
}
.side-menu-app-icon svg {
vertical-align: middle;
margin-top: -3px;
}
.side-menu-app a {
line-height: 30px;
color: var(--side-menu-text-color, #fff);
display: block;
padding: 7px 0 5px 15px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.side-menu-app a:hover, .side-menu-app.active, .side-menu-app a:focus {
background: var(--side-menu-current-app-background-color, #444);
}
.side-menu-logo {
text-align: center;
}
.side-menu-logo img {
max-width: 60%;
max-height: 100px;
}
.side-menu-header {
height: 150px;
width: 100%;
z-index: 2300;
max-width: 250px;
position: fixed;
padding-top: 2px;
padding-left: 5px;
top: 0;
}
#side-menu.hide-opener .side-menu-logo {
margin-top: 20px;
}
#side-menu-loader {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 3001;
}
#side-menu-loader-bar {
height: 4px;
background: var(--side-menu-loader-color, #0e75ac);
width: 0;
transition-property: width;
}
#side-menu.side-menu-big {
max-width: 100%;
height: auto;
}
.side-menu-big .side-menu-header {
height: auto;
}
.side-menu-big .side-menu-apps-list {
height: auto;
position: static;
max-width: 100vw;
overflow: auto;
}
.side-menu-big .side-menu-app a {
padding: 7px 0 7px 7px;
}
.side-menu-categories-wrapper {
padding-bottom: 70px;
}
.side-menu-categories {
max-height: calc(100vh - 50px);
overflow: auto;
position: relative;
top: 50px;
display: flex;
flex-wrap: wrap;
justify-content: center;
padding: 0 10% 0 10%;
}
.side-menu-category {
padding: 10px 20px;
flex: 1 1 auto;
}
.side-menu-category-title {
padding-left: 10px;
color: var(--side-menu-text-color, #fff);
}
.side-menu-loader {
text-align: center;
}
.side-menu-loader svg {
width: 38px;
margin: auto;
stroke: var(--side-menu-text-color, #fff);
}
.side-menu-big .side-menu-app-icon {
vertical-align: middle;
margin-top: -2px;
}
.side-menu-always-displayed #header,
.side-menu-always-displayed body {
width: calc(100% - 50px) !important;
}
.side-menu-always-displayed body {
position: absolute;
left: 50px;
}
.side-menu-always-displayed #side-menu {
display: block;
}
.side-menu-always-displayed .side-menu-apps-list {
height: calc(100vh - 49px);
top: 49px;
}
.side-menu-always-displayed #side-menu,
.side-menu-always-displayed .side-menu-header,
.side-menu-always-displayed .side-menu-apps-list {
width: 50px;
}
.side-menu-always-displayed #side-menu .side-menu-app-text,
.side-menu-always-displayed #header .side-menu-opener,
.side-menu-always-displayed .side-menu-logo {
display: none;
}
.side-menu-always-displayed #side-menu .side-menu-header {
height: 49px;
}
.side-menu-always-displayed #side-menu.open,
.side-menu-always-displayed #side-menu.open .side-menu-apps-list,
.side-menu-always-displayed #side-menu.open .side-menu-header {
width: 100%;
}
.side-menu-always-displayed #side-menu.open .side-menu-app-text {
display: inline;
}
.side-menu-always-displayed .app-navigation--close {
transform: translateX(calc(-100% + 50px)) !important;
}
@media screen and (max-width: 1024px) {
#side-menu.side-menu-big {
max-width: 290px;
}
.side-menu-categories {
display: block;
padding: 0;
}
.side-menu-category {
padding: 10px 0;
}
#side-menu.side-menu-big {
height: 100vh;
}
}
@media screen and (min-width: 1024px) {
.side-menu-closer {
display: block;
float: right;
margin-right: 9px;
}
.side-menu-big .side-menu-header {
max-width: 100%;
}
}
@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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="571.907"
height="156.921"
viewBox="0 0 151.317 41.519"
version="1.1"
id="svg901"
sodipodi:docname="layout-side-menu-with-categories.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata907">
<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="defs905" />
<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="1036"
id="namedview903"
showgrid="false"
inkscape:zoom="1.6086532"
inkscape:cx="455.61054"
inkscape:cy="16.694081"
inkscape:window-x="0"
inkscape:window-y="21"
inkscape:window-maximized="0"
inkscape:current-layer="svg901"
showguides="false" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#fff"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M.18.18h58.532v41.16H.18zM62.735.18h58.532v41.16H62.735z"
id="path853" />
<g
fill="#b3b3b3"
stroke="#ccc"
fill-rule="evenodd"
stroke-width="1.465"
stroke-linecap="round"
id="g857">
<path
d="M84.066 21.35l5.055-5.056M82.925 29.835l18.152-18.151M95.893 25.225l3.585-3.586"
id="path855" />
</g>
<path
style="marker:none"
color="#000"
overflow="visible"
fill="none"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M62.735.18h58.532v41.16H62.735z"
id="path861" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#f9f9f9"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M.18.18h58.532v5.063H.18z"
id="path877" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="none"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M.18.18h58.532v41.16H.18z"
id="path879" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#666"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M1.357 1.034h3.496V4.39H1.357z"
id="path881" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#e6e6e6"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M6.068 1.034h6.102V4.39H6.068z"
id="path883" />
<g
fill="#b3b3b3"
stroke="#ccc"
fill-rule="evenodd"
stroke-width="1.465"
stroke-linecap="round"
id="g887">
<path
d="M21.51 21.35l5.056-5.056M20.37 29.835L38.52 11.684M33.337 25.225l3.586-3.586"
id="path885" />
</g>
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#fff"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M125.857.18h25.28v41.16h-25.28z"
id="path889" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#f9f9f9"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M125.857.18h25.257v5.063h-25.257z"
id="path891" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="none"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M125.857.18h25.257v41.16h-25.257z"
id="path893" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#4d4d4d"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M125.857.18h20.829v41.16h-20.83z"
id="path895" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#666"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M127.034 1.034h3.496V4.39h-3.496z"
id="path897" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#e6e6e6"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M127.569 10.155h1.893v1.81h-1.893zM130.498 10.486h12.463v1.148h-12.463zM127.569 13.696h1.893v1.81h-1.893zM130.498 14.027h10.592v1.148h-10.592zM127.569 17.104h1.893v1.81h-1.893zM130.498 17.435h12.997v1.148h-12.997zM127.569 24.708h1.893v1.81h-1.893zM130.498 25.04h7.585v1.147h-7.585zM127.569 28.116h1.893v1.81h-1.893zM130.498 28.447h11.46v1.148h-11.46zM127.569 31.657h1.893v1.81h-1.893zM130.498 31.988h9.322v1.148h-9.322zM127.569 35.065h1.893v1.81h-1.893zM130.498 35.396h11.126v1.148h-11.126zM127.616 6.848h11.518v1.148h-11.518zM127.569 21.311h9.344v1.148h-9.344z"
id="path899" />
<path
inkscape:connector-curvature="0"
style="color:#000000;overflow:visible;fill:#4d4d4d;stroke:#b3b3b3;stroke-width:0.359;stroke-linecap:square;marker:none;paint-order:fill markers stroke"
overflow="visible"
d="m 62.728587,0.17999881 h 20.829 V 41.34 h -20.83 z"
id="path895-5" />
<path
inkscape:connector-curvature="0"
style="color:#000000;overflow:visible;fill:#666666;stroke:#cccccc;stroke-width:0.359;stroke-linecap:square;marker:none;paint-order:fill markers stroke"
overflow="visible"
d="m 63.905587,1.0339988 h 3.496 V 4.389999 h -3.496 z"
id="path897-3" />
<path
inkscape:connector-curvature="0"
style="color:#000000;overflow:visible;fill:#e6e6e6;stroke:#cccccc;stroke-width:0.359;stroke-linecap:square;marker:none;paint-order:fill markers stroke"
overflow="visible"
d="m 64.440587,10.154999 h 1.893 v 1.81 h -1.893 z m 2.929,0.331 h 12.463 v 1.148 h -12.463 z m -2.929,3.21 h 1.893 v 1.81 h -1.893 z m 2.929,0.331 h 10.592 v 1.148 h -10.592 z m -2.929,3.077 h 1.893 v 1.81 h -1.893 z m 2.929,0.331 h 12.997 v 1.148 h -12.997 z m -2.929,7.273 h 1.893 V 26.518 h -1.893 z m 2.929,0.332 h 7.585 v 1.147 h -7.585 z m -2.929,3.076001 h 1.893 v 1.81 h -1.893 z m 2.929,0.330999 h 11.46 v 1.147999 h -11.46 z m -2.929,3.21 h 1.893 v 1.809999 h -1.893 z m 2.929,0.330999 h 9.322 v 1.148001 h -9.322 z m -2.929,3.077001 h 1.893 v 1.809999 h -1.893 z m 2.929,0.331001 h 11.126 v 1.147999 h -11.126 z m -2.882,-28.5480012 h 11.518 v 1.1480001 h -11.518 z m -0.047,14.4630002 h 9.344 v 1.148 h -9.344 z"
id="path899-5" />
</svg>

After

Width:  |  Height:  |  Size: 7.3 KiB

+223
View File
@@ -0,0 +1,223 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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="571.907"
height="156.921"
viewBox="0 0 151.317 41.519"
version="1.1"
id="svg901"
sodipodi:docname="layout-side-menu-with-categories.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<metadata
id="metadata907">
<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="defs905" />
<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="1036"
id="namedview903"
showgrid="false"
inkscape:zoom="1.6086532"
inkscape:cx="455.61054"
inkscape:cy="16.694081"
inkscape:window-x="0"
inkscape:window-y="21"
inkscape:window-maximized="0"
inkscape:current-layer="svg901" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#fff"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M.18.18h58.532v41.16H.18zM62.735.18h58.532v41.16H62.735z"
id="path853" />
<g
fill="#b3b3b3"
stroke="#ccc"
fill-rule="evenodd"
stroke-width="1.465"
stroke-linecap="round"
id="g857">
<path
d="M84.066 21.35l5.055-5.056M82.925 29.835l18.152-18.151M95.893 25.225l3.585-3.586"
id="path855" />
</g>
<path
style="marker:none"
color="#000"
overflow="visible"
fill="none"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M62.735.18h58.532v41.16H62.735z"
id="path861" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#f9f9f9"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M.18.18h58.532v5.063H.18z"
id="path877" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="none"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M.18.18h58.532v41.16H.18z"
id="path879" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#666"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M1.357 1.034h3.496V4.39H1.357z"
id="path881" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#e6e6e6"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M6.068 1.034h6.102V4.39H6.068z"
id="path883" />
<g
fill="#b3b3b3"
stroke="#ccc"
fill-rule="evenodd"
stroke-width="1.465"
stroke-linecap="round"
id="g887">
<path
d="M21.51 21.35l5.056-5.056M20.37 29.835L38.52 11.684M33.337 25.225l3.586-3.586"
id="path885" />
</g>
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#fff"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M125.857.18h25.28v41.16h-25.28z"
id="path889" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#f9f9f9"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M125.857.18h25.257v5.063h-25.257z"
id="path891" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="none"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M125.857.18h25.257v41.16h-25.257z"
id="path893" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#4d4d4d"
stroke="#b3b3b3"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M125.857.18h20.829v41.16h-20.83z"
id="path895" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#666"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M127.034 1.034h3.496V4.39h-3.496z"
id="path897" />
<path
style="marker:none"
color="#000"
overflow="visible"
fill="#e6e6e6"
stroke="#ccc"
stroke-width=".359"
stroke-linecap="square"
paint-order="fill markers stroke"
d="M127.569 10.155h1.893v1.81h-1.893zM130.498 10.486h12.463v1.148h-12.463zM127.569 13.696h1.893v1.81h-1.893zM130.498 14.027h10.592v1.148h-10.592zM127.569 17.104h1.893v1.81h-1.893zM130.498 17.435h12.997v1.148h-12.997zM127.569 24.708h1.893v1.81h-1.893zM130.498 25.04h7.585v1.147h-7.585zM127.569 28.116h1.893v1.81h-1.893zM130.498 28.447h11.46v1.148h-11.46zM127.569 31.657h1.893v1.81h-1.893zM130.498 31.988h9.322v1.148h-9.322zM127.569 35.065h1.893v1.81h-1.893zM130.498 35.396h11.126v1.148h-11.126zM127.616 6.848h11.518v1.148h-11.518zM127.569 21.311h9.344v1.148h-9.344z"
id="path899" />
<path
inkscape:connector-curvature="0"
style="color:#000000;overflow:visible;fill:#4d4d4d;stroke:#b3b3b3;stroke-width:0.359;stroke-linecap:square;marker:none;paint-order:fill markers stroke"
overflow="visible"
d="m 62.728587,0.17999881 h 20.829 V 41.34 h -20.83 z"
id="path895-5" />
<path
inkscape:connector-curvature="0"
style="color:#000000;overflow:visible;fill:#666666;stroke:#cccccc;stroke-width:0.359;stroke-linecap:square;marker:none;paint-order:fill markers stroke"
overflow="visible"
d="m 63.905587,1.0339988 h 3.496 V 4.389999 h -3.496 z"
id="path897-3" />
<path
inkscape:connector-curvature="0"
style="color:#000000;overflow:visible;fill:#e6e6e6;stroke:#cccccc;stroke-width:0.359;stroke-linecap:square;marker:none;paint-order:fill markers stroke"
overflow="visible"
d="m 64.440587,10.154999 h 1.893 v 1.81 h -1.893 z m 2.929,0.331 h 12.463 v 1.148 h -12.463 z m -2.929,3.21 h 1.893 v 1.81 h -1.893 z m 2.929,0.331 h 10.592 v 1.148 h -10.592 z m -2.929,3.077 h 1.893 v 1.81 h -1.893 z m 2.929,0.331 h 12.997 v 1.148 h -12.997 z m -2.929,7.273 h 1.893 V 26.518 h -1.893 z m 2.929,0.332 h 7.585 v 1.147 h -7.585 z m -2.929,3.076001 h 1.893 v 1.81 h -1.893 z m 2.929,0.330999 h 11.46 v 1.147999 h -11.46 z m -2.929,3.21 h 1.893 v 1.809999 h -1.893 z m 2.929,0.330999 h 9.322 v 1.148001 h -9.322 z m -2.929,3.077001 h 1.893 v 1.809999 h -1.893 z m 2.929,0.331001 h 11.126 v 1.147999 h -11.126 z m -2.882,-28.5480012 h 11.518 v 1.1480001 h -11.518 z m -0.047,14.4630002 h 9.344 v 1.148 h -9.344 z"
id="path899-5" />
</svg>

After

Width:  |  Height:  |  Size: 7.3 KiB

+1 -113
View File
@@ -1,113 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" width="145.889" height="145.889" viewBox="0 0 38.6 38.6"><g transform="translate(-59.172 -91.92)" stroke="#000" fill="none"><path d="M66.595 111.162h9.997M66.595 103.805h11.4m-11.4 14.714h11.4" stroke-width="3.165"/><rect width="34.535" height="34.535" x="61.205" y="93.952" overflow="visible" rx="5.481" ry="5.481" style="marker:none" color="#000" stroke-width="4.065" stroke-linecap="round" paint-order="fill markers stroke"/></g></svg>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<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="37.099998mm"
height="37.099998mm"
viewBox="0 0 37.099998 37.099998"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="icon.svg">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="242.1839"
inkscape:cy="32.026866"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1918"
inkscape:window-height="1027"
inkscape:window-x="1920"
inkscape:window-y="21"
inkscape:window-maximized="0"
inkscape:snap-nodes="false" />
<metadata
id="metadata5">
<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>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-59.922223,-92.669069)">
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1.46500015;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:accumulate"
id="rect815-6-2-7"
width="34.535"
height="34.535"
x="61.204723"
y="93.951569"
rx="5.4806547"
ry="5.4806547" />
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.46500015;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:accumulate"
id="rect815-6-7"
width="20.357224"
height="33.40107"
x="61.677193"
y="94.518532"
rx="0"
ry="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#333333;stroke-width:3.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 66.59458,111.16177 h 9.997359"
id="path873-5"
inkscape:connector-curvature="0" />
<g
id="g1018"
transform="translate(2.6458333)"
style="stroke:#333333;stroke-opacity:1">
<g
id="g1013"
style="stroke:#333333;stroke-opacity:1">
<path
style="fill:none;fill-rule:evenodd;stroke:#333333;stroke-width:3.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 63.948747,103.80467 H 75.349244"
id="path873"
inkscape:connector-curvature="0" />
<path
style="fill:none;fill-rule:evenodd;stroke:#333333;stroke-width:3.16499996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 63.948747,118.51887 H 75.349244"
id="path873-5-3"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#333333;stroke-width:2.56500006;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:fill markers stroke;enable-background:accumulate"
id="rect815-6-2"
width="34.535"
height="34.535"
x="61.204723"
y="93.951569"
rx="5.4806547"
ry="5.4806547" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 478 B

+1 -6
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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

+97 -80
View File
@@ -2,14 +2,29 @@
namespace OCA\SideMenu\AppInfo; namespace OCA\SideMenu\AppInfo;
use OC; use OC\AllConfig;
use OC\App\AppStore\Fetcher\CategoryFetcher;
use OC\AppFramework\Http\Request;
use OC\Security\CSP\ContentSecurityPolicyNonceManager; use OC\Security\CSP\ContentSecurityPolicyNonceManager;
use OC\Security\CSRF\CsrfTokenManager;
use OC\User\User; use OC\User\User;
use OCA\SideMenu\Service\AppRepository; use OCA\SideMenu\Service\AppRepository;
use OCA\SideMenu\Service\CategoryRepository; use OCA\SideMenu\Service\CategoryRepository;
use OCA\SideMenu\Service\Color;
use OCA\SideMenu\Service\ConfigProxy; use OCA\SideMenu\Service\ConfigProxy;
use OCA\Theming\ThemingDefaults;
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\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
use OCP\INavigationManager;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUserSession; use OCP\IUserSession;
use OCP\L10N\IFactory;
use OCP\Server;
use OCP\Util; use OCP\Util;
use Psr\Container\ContainerInterface; use Psr\Container\ContainerInterface;
@@ -18,43 +33,77 @@ 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';
public const APP_NAME = 'Custom menu'; public const APP_NAME = 'Custom menu';
/**
* @var OC\AllConfig
*/
protected $config;
/** protected IConfig $config;
* @var ContentSecurityPolicyNonceManager protected ContentSecurityPolicyNonceManager $cspnm;
*/ protected IRequest $request;
protected $cspnm; protected ?User $user = null;
/**
* @var User
*/
protected $user;
/**
* {@inheritdoc}
*/
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();
} }
/** public function register(IRegistrationContext $context): void
* Checks if this app is enabled.
*/
public function isEnabled(): bool
{ {
$context->registerService(CategoryRepository::class, function (ContainerInterface $c) {
return new CategoryRepository(
$c->get(CategoryFetcher::class),
$c->get(ConfigProxy::class),
$c->get(IConfig::class),
$c->get(IFactory::class),
$c->get(IUserSession::class)
);
});
$context->registerService(AppRepository::class, function (ContainerInterface $c) {
return new AppRepository(
$c->get(\OC_App::class),
$c->get(INavigationManager::class),
$c->get(IFactory::class),
$c->get(ConfigProxy::class),
$c->get(CategoryRepository::class),
$c->get(IEventDispatcher::class),
$c->get(IUserSession::class)
);
});
$context->registerService(ConfigProxy::class, function (ContainerInterface $c) {
return new ConfigProxy(
$c->get(IConfig::class),
);
});
$context->registerService(Color::class, function (ContainerInterface $c) {
return new Color(
$c->get(ThemingDefaults::class),
);
});
}
public function boot(IBootContext $context): void
{
$this->config = Server::get(IConfig::class);
$this->user = Server::get(IUserSession::class)->getUser();
$this->request = Server::get(IRequest::class);
if (!$this->isEnabled()) {
return;
}
$this->addAssets();
}
protected function isEnabled(): bool
{
if (isset($this->request->server['HTTP_USER_AGENT']) && preg_match('/MemoriesNative/', $this->request->server['HTTP_USER_AGENT'])) {
return false;
}
$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 +123,32 @@ class Application extends App
return $enabled; return $enabled;
} }
/** protected function addAssets()
* Registes services.
*/
public function registerServices()
{ {
$container = $this->getContainer(); Util::addScript(self::APP_ID, 'side_menu-menu');
$container->registerService('AppRepository', function (ContainerInterface $c) { $assets = [
return new AppRepository(); 'stylesheet' => [
}); 'route' => 'side_menu.Css.stylesheet',
'type' => 'link',
$container->registerService('CategoryRepository', function (ContainerInterface $c) { 'route_attr' => 'href',
return new CategoryRepository(); 'attr' => [
});
$container->registerService('ConfigProxy', function (ContainerInterface $c) {
return new ConfigProxy();
});
}
/**
* Registers assets.
*/
public function registerAssets()
{
Util::addScript(self::APP_ID, 'sideMenu');
Util::addStyle(self::APP_ID, 'sideMenu');
$stylesheet = OC::$server->getURLGenerator()->linkToRoute(
'side_menu.Css.stylesheet',
[
'v' => $this->config->getAppValue(self::APP_ID, 'cache', '0'),
]
);
$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',
], ],
'' ],
];
$cache = $this->config->getAppValue(self::APP_ID, 'cache', '0');
foreach ($assets as $value) {
$route = Server::get(IURLGenerator::class)->linkToRoute(
$value['route'],
['v' => $cache]
); );
Util::addHeader( $value['attr'][$value['route_attr']] = $route;
'script',
[ Util::addHeader($value['type'], $value['attr'], '');
'src' => $script, }
'nonce' => $this->cspnm->getNonce(),
],
''
);
} }
} }
+169 -31
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -19,40 +20,36 @@
namespace OCA\SideMenu\Controller; namespace OCA\SideMenu\Controller;
use OCA\SideMenu\AppInfo\Application; use OCA\SideMenu\AppInfo\Application;
use OCA\SideMenu\Service\Color;
use OCA\SideMenu\Service\ConfigProxy;
use OCA\SideMenu\Service\LangRepository;
use OCP\AppFramework\Controller; use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\DataDownloadResponse; use OCP\AppFramework\Http\DataDownloadResponse;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\Response;
use OCP\IConfig; use OCP\IConfig;
use OCP\IRequest; use OCP\IRequest;
use OCP\IURLGenerator; use OCP\IURLGenerator;
class AdminSettingController extends Controller class AdminSettingController extends Controller
{ {
/** public function __construct(
* @var IConfig $appName,
*/ IRequest $request,
protected $config; protected IConfig $config,
protected ConfigProxy $configProxy,
/** protected IURLGenerator $urlGenerator,
* @var IURLGenerator protected Color $color,
*/ protected LangRepository $langRepository,
protected $urlGenerator; ) {
public function __construct($appName, IRequest $request, IConfig $config, IURLGenerator $urlGenerator)
{
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->config = $config;
$this->urlGenerator = $urlGenerator;
} }
/** #[NoCSRFRequired]
* @NoCSRFRequired #[FrontpageRoute(verb: 'GET', url: '/admin/cache/remove')]
* public function removeCache(): RedirectResponse
* @return RedirectResponse
*/
public function removeCache()
{ {
$this->config->setAppValue(Application::APP_ID, 'cache-categories', '[]'); $this->config->setAppValue(Application::APP_ID, 'cache-categories', '[]');
@@ -61,18 +58,16 @@ class AdminSettingController extends Controller
]).'#more'); ]).'#more');
} }
/** #[NoCSRFRequired]
* @NoCSRFRequired #[FrontpageRoute(verb: 'GET', url: '/admin/config/export')]
* public function exportConfiguration(): DataDownloadResponse
* @return Response
*/
public function exportConfiguration()
{ {
$keys = $this->config->getAppKeys(Application::APP_ID); $keys = $this->config->getAppKeys(Application::APP_ID);
$config = []; $appConfig = [];
$excludedKeys = [ $excludedKeys = [
'cache', 'cache',
'cache-categories', 'cache-categories',
'langs',
]; ];
foreach ($keys as $key) { foreach ($keys as $key) {
@@ -80,13 +75,156 @@ class AdminSettingController extends Controller
continue; continue;
} }
$config[$key] = $this->config->getAppValue(Application::APP_ID, $key); $appConfig[$key] = $this->config->getAppValue(Application::APP_ID, $key);
} }
return new DataDownloadResponse( return new DataDownloadResponse(
json_encode($config, JSON_PRETTY_PRINT), json_encode($appConfig, JSON_PRETTY_PRINT),
'config.json', 'config.json',
'text/json' 'text/json'
); );
} }
#[NoCSRFRequired]
#[FrontpageRoute(verb: 'GET', url: '/admin/config')]
public function configuration(): JSONResponse
{
$keys = $this->config->getAppKeys(Application::APP_ID);
$booleans = [
'opener-only',
'opener-hover',
'display-logo',
'use-avatar',
'add-logo-link',
'show-settings',
'show-search-form',
'loader-enabled',
'always-displayed',
'enabled',
'force',
'big-menu',
'external-sites-in-top-menu',
'force-light-icon',
'side-with-categories',
'default-enabled',
];
$arrays = [
'apps-categories-custom',
'big-menu-hidden-apps',
'apps-order',
'categories-custom',
'categories-order',
'target-blank-apps',
'top-menu-apps',
'top-side-menu-apps',
];
$integers = [
'background-color-opacity',
'dark-mode-background-color-opacity',
'dark-mode-icon-invert-filter',
'dark-mode-icon-opacity',
'icon-invert-filter',
'icon-opacity',
'target-blank-mode',
'top-menu-mouse-over-hidden-label',
];
$defaults = [
'opener-only' => '0',
'opener-hover' => '0',
'display-logo' => '1',
'use-avatar' => '0',
'add-logo-link' => '1',
'show-settings' => '0',
'show-search-form' => '1',
'loader-enabled' => '1',
'always-displayed' => '0',
'enabled' => '1',
'force' => '0',
'big-menu' => '0',
'external-sites-in-top-menu' => '0',
'force-light-icon' => '0',
'side-with-categories' => '0',
'cache' => '1',
'default-enabled' => '1',
'apps-categories-custom' => '[]',
'big-menu-hidden-apps' => '[]',
'apps-order' => '[]',
'categories-custom' => '[]',
'categories-order' => '[]',
'target-blank-apps' => '[]',
'top-menu-apps' => '[]',
'top-side-menu-apps' => '[]',
'cache-categories' => '[]',
'background-color-opacity' => '100',
'dark-mode-background-color-opacity' => '100',
'dark-mode-icon-invert-filter' => '0',
'dark-mode-icon-opacity' => '100',
'icon-invert-filter' => '0',
'icon-opacity' => '100',
'top-menu-mouse-over-hidden-label' => '0',
'opener' => 'side-menu-opener',
'dark-mode-opener' => 'side-menu-opener',
'size-icon' => 'normal',
'size-text' => 'normal',
'opener-position' => 'before',
'background-color' => $this->color->getPrimaryColor(),
'background-color-to' => $this->color->getLightenPrimaryColor(),
'current-app-background-color' => $this->color->getDarkenPrimaryColor(),
'text-color' => $this->color->getTextColorPrimary(),
'loader-color' => $this->color->getLightenPrimaryColor(),
'dark-mode-background-color' => $this->color->getDarkenPrimaryColor(),
'dark-mode-background-color-to' => $this->color->getDarkenPrimaryColor(),
'dark-mode-current-app-background-color' => $this->color->getDarkenPrimaryColor2(),
'dark-mode-text-color' => $this->color->getTextColorPrimary(),
'dark-mode-loader-color' => $this->color->getLightenPrimaryColor(),
'categories-order-type' => 'default',
];
$config = [];
foreach ($keys as $key) {
if (!isset($defaults[$key])) {
continue;
}
if (in_array($key, $booleans)) {
$config[$key] = $this->configProxy->getAppValueBool($key, $defaults[$key]);
} elseif (in_array($key, $arrays)) {
$config[$key] = $this->configProxy->getAppValueArray($key, $defaults[$key]);
} elseif (in_array($key, $integers)) {
$config[$key] = $this->configProxy->getAppValueInt($key, $defaults[$key]);
} else {
$config[$key] = $this->configProxy->getAppValue($key, $defaults[$key]);
}
}
foreach ($defaults as $key => $default) {
if (array_key_exists($key, $config)) {
continue;
}
if (in_array($key, $booleans)) {
$config[$key] = $default === '1';
} elseif (in_array($key, $arrays)) {
$config[$key] = json_decode($default);
} elseif (in_array($key, $integers)) {
$config[$key] = (int) $default;
} else {
$config[$key] = $default;
}
}
$config['langs'] = $this->langRepository->getUsedLangs();
return new JSONResponse($config);
}
} }
+98
View File
@@ -0,0 +1,98 @@
<?php
/**
* @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/>.
*/
namespace OCA\SideMenu\Controller;
use OCA\SideMenu\Service\AppRepository;
use OCA\SideMenu\Service\ConfigProxy;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\RedirectResponse;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUserSession;
class AppController extends Controller
{
public function __construct(
string $appName,
IRequest $request,
protected AppRepository $appRepository,
protected IURLGenerator $urlGenerator,
protected ConfigProxy $config,
) {
parent::__construct($appName, $request);
}
#[NoCSRFRequired]
#[NoAdminRequired]
#[FrontpageRoute(verb: 'GET', url: '/')]
public function index(): RedirectResponse
{
$user = \OC::$server[IUserSession::class]->getUser();
$topMenuApps = $this->config->getAppValueArray('top-menu-apps', '[]');
$hiddenApps = $this->config->getAppValueArray('big-menu-hidden-apps', '[]');
$isForced = $this->config->getAppValueBool('force', '0');
$userTopMenuApps = $this->config->getUserValueArray($user, 'top-menu-apps', '[]');
$apps = $this->appRepository->getOrderedApps($user);
if (!$isForced && !empty($userTopMenuApps)) {
$topMenuApps = $userTopMenuApps;
}
foreach ($apps as $app) {
$inTopMenuApps = in_array($app['id'], $topMenuApps);
$inHiddenApps = in_array($app['id'], $hiddenApps);
if (!$inTopMenuApps && $inHiddenApps) {
continue;
}
return $this->redirectToApp($app, true);
}
return $this->redirectToApp('files');
}
protected function redirectToApp($app, bool $isHref = false): RedirectResponse
{
if (!$isHref) {
$isIgnoreFrontController = true === \OC::$server->getConfig()->getSystemValue(
'htaccess.IgnoreFrontController',
false
);
$isFrontControllerActive = 'true' === getenv('front_controller_active');
if ($isIgnoreFrontController || $isFrontControllerActive) {
$path = '/apps/%s/';
} else {
$path = '/index.php/apps/%s/';
}
$url = $this->urlGenerator->getAbsoluteURL(sprintf($path, $app));
} else {
$url = $app['href'];
}
return new RedirectResponse($url);
}
}
+74
View File
@@ -0,0 +1,74 @@
<?php
/**
* @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/>.
*/
namespace OCA\SideMenu\Controller;
use OCA\SideMenu\Service\AppRepository;
use OCA\SideMenu\Service\ConfigProxy;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest;
use OCP\IUserSession;
class CoreController extends Controller
{
public function __construct(
string $appName,
IRequest $request,
protected ConfigProxy $config,
protected AppRepository $appRepository,
) {
parent::__construct($appName, $request);
}
#[NoCSRFRequired]
#[NoAdminRequired]
#[PublicPage]
#[FrontpageRoute(verb: 'GET', url: '/core/apps')]
public function items(): JSONResponse
{
$user = \OC::$server[IUserSession::class]->getUser();
$items = [];
if (!$user) {
return new JSONResponse([
'items' => $items,
]);
}
$apps = $this->appRepository->getOrderedApps($user);
$keys = ['id', 'name', 'category', 'href', 'icon'];
foreach ($apps as &$app) {
foreach ($app as $key => $value) {
if (!in_array($key, $keys)) {
unset($app[$key]);
}
}
}
return new JSONResponse([
'items' => $apps,
]);
}
}
+68 -32
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -18,44 +19,40 @@
namespace OCA\SideMenu\Controller; namespace OCA\SideMenu\Controller;
use OC;
use OC\User\User; use OC\User\User;
use OCA\SideMenu\AppInfo\Application; use OCA\SideMenu\AppInfo\Application;
use OCA\SideMenu\Service\Color;
use OCA\SideMenu\Service\ConfigProxy; use OCA\SideMenu\Service\ConfigProxy;
use OCA\Theming\ThemingDefaults;
use OCP\AppFramework\Controller; use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\TemplateResponse;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession; use OCP\IUserSession;
class CssController extends Controller class CssController extends Controller
{ {
/** protected ?User $user;
* @var ConfigProxy
*/
protected $config;
/** public function __construct(
* @var User string $appName,
*/ IRequest $request,
protected $user; protected ConfigProxy $config,
protected ThemingDefaults $theming,
public function __construct(string $appName, IRequest $request, ConfigProxy $config) protected 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;
} }
/** #[NoCSRFRequired]
* @NoAdminRequired #[NoAdminRequired]
* @NoCSRFRequired #[PublicPage]
* @PublicPage #[FrontpageRoute(verb: 'GET', url: '/css/stylesheet')]
* public function stylesheet(): TemplateResponse
* @return Response
*/
public function stylesheet()
{ {
$response = new TemplateResponse(Application::APP_ID, 'css/stylesheet', $this->getConfig(), 'blank'); $response = new TemplateResponse(Application::APP_ID, 'css/stylesheet', $this->getConfig(), 'blank');
$response->addHeader('Content-Type', 'text/css'); $response->addHeader('Content-Type', 'text/css');
@@ -65,38 +62,77 @@ class CssController extends Controller
protected function getConfig(): array protected function getConfig(): array
{ {
$backgroundColor = $this->config->getAppValue('background-color', '#333333');
$backgroundColorTo = $this->config->getAppValue('background-color-to', $backgroundColor);
$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', '[]');
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;
} }
}
$lightenPrimaryColor = $this->color->getLightenPrimaryColor();
$darkenPrimaryColor = $this->color->getDarkenPrimaryColor();
$darkenPrimaryColor2 = $this->color->getDarkenPrimaryColor2();
$textColor = $this->color->getTextColorPrimary();
$backgroundColor = $this->config->getAppValue('background-color', $darkenPrimaryColor);
$backgroundColorTo = $this->config->getAppValue('background-color-to', $darkenPrimaryColor);
$opacity = $this->config->getAppValueInt('background-color-opacity', '100');
$backgroundOpacity = dechex($opacity * 255 / 100);
$backgroundColor .= $backgroundOpacity;
$backgroundColorTo .= $backgroundOpacity;
$darkBackgroundColor = $this->config->getAppValue('dark-mode-background-color', $darkenPrimaryColor);
$darkBackgroundColorTo = $this->config->getAppValue('dark-mode-background-color-to', $darkenPrimaryColor);
$darkOpacity = $this->config->getAppValueInt('dark-mode-background-color-opacity', '100');
$darkBackgroundOpacity = dechex($opacity * 255 / 100);
$darkBackgroundColor .= $darkBackgroundOpacity;
$darkBackgroundColorTo .= $darkBackgroundOpacity;
return [ return [
'vars' => [ 'vars' => [
'light' => [
'background-color' => $backgroundColor, 'background-color' => $backgroundColor,
'background-color-to' => $backgroundColorTo, 'background-color-to' => $backgroundColorTo,
'current-app-background-color' => $this->config->getAppValue('current-app-background-color', '#444444'), 'current-app-background-color' => $this->config->getAppValue(
'loader-color' => $this->config->getAppValue('loader-color', '#0e75ac'), 'current-app-background-color',
'text-color' => $this->config->getAppValue('text-color', '#FFFFFF'), $darkenPrimaryColor2
),
'loader-color' => $this->config->getAppValue('loader-color', $lightenPrimaryColor),
'text-color' => $this->config->getAppValue('text-color', $textColor),
'opener' => $this->config->getAppValue('opener', 'side-menu-opener'), 'opener' => $this->config->getAppValue('opener', 'side-menu-opener'),
'icon-invert-filter' => abs($this->config->getAppValueInt('icon-invert-filter', '0')).'%', 'icon-invert-filter' => abs($this->config->getAppValueInt('icon-invert-filter', '0')).'%',
'icon-opacity' => abs($this->config->getAppValueInt('icon-opacity', '100') / 100), 'icon-opacity' => abs($this->config->getAppValueInt('icon-opacity', '100') / 100),
], ],
'display-logo' => $this->config->getAppValueBool('display-logo', '1'), 'dark' => [
'background-color' => $darkBackgroundColor,
'background-color-to' => $darkBackgroundColorTo,
'current-app-background-color' => $this->config->getAppValue(
'dark-mode-current-app-background-color',
$darkenPrimaryColor2
),
'loader-color' => $this->config->getAppValue('dark-mode-loader-color', $lightenPrimaryColor),
'text-color' => $this->config->getAppValue('dark-mode-text-color', $textColor),
'opener' => $this->config->getAppValue('dark-mode-opener', 'side-menu-opener'),
'icon-invert-filter' => abs($this->config->getAppValueInt('dark-mode-icon-invert-filter', '0')).'%',
'icon-opacity' => abs($this->config->getAppValueInt('dark-mode-icon-opacity', '100') / 100),
]
],
'opener-only' => $this->config->getAppValueBool('opener-only', '0'), 'opener-only' => $this->config->getAppValueBool('opener-only', '0'),
'external-sites-in-top-menu' => $this->config->getAppValueBool('external-sites-in-top-menu', '0'),
'size-icon' => $this->config->getAppValue('size-icon', 'normal'), 'size-icon' => $this->config->getAppValue('size-icon', 'normal'),
'size-text' => $this->config->getAppValue('size-text', 'normal'), 'size-text' => $this->config->getAppValue('size-text', 'normal'),
'always-displayed' => $this->config->getAppValueBool('always-displayed', '0'), 'always-displayed' => $this->config->getAppValueBool('always-displayed', '0'),
'big-menu' => $this->config->getAppValueBool('big-menu', '0'),
'top-menu-apps' => $topMenuApps,
]; ];
} }
} }
+50 -56
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -18,74 +19,45 @@
namespace OCA\SideMenu\Controller; namespace OCA\SideMenu\Controller;
use OC;
use OC\User\User; use OC\User\User;
use OCA\SideMenu\AppInfo\Application;
use OCA\SideMenu\Service\ConfigProxy; use OCA\SideMenu\Service\ConfigProxy;
use OCA\Theming\ThemingDefaults; use OCA\Theming\ThemingDefaults;
use OCP\AppFramework\Controller; use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession; use OCP\IUserSession;
use OCP\L10N\IFactory; use OCP\L10N\IFactory;
use OCP\IAvatarManager;
use OCP\INavigationManager;
use OCP\IURLGenerator;
class JsController extends Controller class JsController extends Controller
{ {
/** protected ?User $user;
* @var ConfigProxy
*/
protected $config;
/**
* @var User
*/
protected $user;
/**
* @var ThemingDefaults
*/
protected $themingDefaults;
/**
* @var IFactory
*/
protected $l10nFactory;
public function __construct( public function __construct(
string $appName, string $appName,
IRequest $request, IRequest $request,
ConfigProxy $config, protected ConfigProxy $config,
ThemingDefaults $themingDefaults, protected ThemingDefaults $themingDefaults,
IFactory $l10nFactory protected IFactory $l10nFactory,
protected IAvatarManager $avatarManager,
protected IUserSession $userSession,
protected INavigationManager $navigationManager,
protected IURLGenerator $urlGenerator,
) { ) {
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->user = $this->userSession->getUser();
$this->themingDefaults = $themingDefaults;
$this->user = OC::$server[IUserSession::class]->getUser();
$this->config = $config;
$this->l10nFactory = $l10nFactory;
} }
/** #[NoCSRFRequired]
* @NoAdminRequired #[NoAdminRequired]
* @NoCSRFRequired #[PublicPage]
* @PublicPage #[FrontpageRoute(verb: 'GET', url: '/js/config')]
*/
public function script(): TemplateResponse
{
$response = new TemplateResponse(Application::APP_ID, 'js/script', $this->getConfig(), 'blank');
$response->addHeader('Content-Type', 'text/javascript');
return $response;
}
/**
* @NoAdminRequired
* @NoCSRFRequired
* @PublicPage
*/
public function config(): JSONResponse public function config(): JSONResponse
{ {
return new JSONResponse($this->getConfig()); return new JSONResponse($this->getConfig());
@@ -94,20 +66,32 @@ 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');
$addLogoLink = $this->config->getAppValueBool('add-logo-link', '1'); $addLogoLink = $this->config->getAppValueBool('add-logo-link', '1');
$appsOrder = $this->config->getAppValueArray('apps-order', '[]');
$avatar = null; $avatar = null;
$settings = null; $settings = null;
if ($this->user) { if ($this->user) {
$userAppsOrder = $this->config->getUserValueArray($this->user, 'apps-order', '[]');
$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;
}
if (!empty($userAppsOrder) && !$isForced) {
$appsOrder = $userAppsOrder;
}
$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', '[]');
@@ -115,25 +99,25 @@ class JsController extends Controller
$targetBlankApps = $userTargetBlankApps; $targetBlankApps = $userTargetBlankApps;
} }
$isAvatarSet = OC::$server->getAvatarManager()->getAvatar($this->user->getUid())->exists(); $isAvatarSet = $this->avatarManager->getAvatar($this->user->getUID())->exists();
if ($useAvatar && $isAvatarSet) { if ($useAvatar && $isAvatarSet) {
$avatar = OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', [ $avatar = $this->urlGenerator->linkToRoute('core.avatar.getAvatar', [
'userId' => $this->user->getUid(), 'userId' => $this->user->getUID(),
'size' => 128, 'size' => 128,
'v' => $this->config->getUserValueInt($this->user, 'avatar', 'version', 0), 'v' => $this->config->getUserValueInt($this->user, 'avatar', 'version', 0),
]); ]);
} }
if ($this->config->getAppValueBool('show-settings', '0')) { if ($this->config->getAppValueBool('show-settings', '0')) {
$settingsNav = OC::$server->getNavigationManager()->getAll('settings'); $settingsNav = $this->navigationManager->getAll('settings');
if (isset($settingsNav['settings'])) { if (isset($settingsNav['settings'])) {
$settings = [ $settings = [
'href' => $settingsNav['settings']['href'], 'href' => $settingsNav['settings']['href'],
'name' => $settingsNav['settings']['name'], 'name' => $settingsNav['settings']['name'],
'avatar' => OC::$server->getURLGenerator()->linkToRoute('core.avatar.getAvatar', [ 'avatar' => $this->urlGenerator->linkToRoute('core.avatar.getAvatar', [
'userId' => $this->user->getUid(), 'userId' => $this->user->getUID(),
'size' => 32, 'size' => 32,
'v' => $this->config->getUserValueInt($this->user, 'avatar', 'version', 0), 'v' => $this->config->getUserValueInt($this->user, 'avatar', 'version', 0),
]), ]),
@@ -142,20 +126,30 @@ class JsController extends Controller
} }
} }
$indexUrl = OC::$server->getURLGenerator()->linkTo('', 'index.php'); $indexUrl = $this->urlGenerator->linkTo('', 'index.php');
return [ return [
'opener-position' => $this->config->getAppValue('opener-position', 'before'), 'opener-position' => $this->config->getAppValue('opener-position', 'before'),
'opener-hover' => $this->config->getAppValueBool('opener-hover', '0'), 'opener-hover' => $this->config->getAppValueBool('opener-hover', '0'),
'external-sites-in-top-menu' => $this->config->getAppValueBool('external-sites-in-top-menu', '0'), 'external-sites-in-top-menu' => $this->config->getAppValueBool('external-sites-in-top-menu', '0'),
'force-light-icon' => $this->config->getAppValueBool('force-light-icon', '0'), 'force-light-icon' => $this->config->getAppValueBool('force-light-icon', '0'),
'display-logo' => $this->config->getAppValueBool('display-logo', '1'),
'use-avatar' => $this->config->getAppValueBool('use-avatar', '0'),
'show-search-form' => $this->config->getAppValueBool('show-search-form', '1'),
'hide-when-no-apps' => $this->config->getAppValueBool('hide-when-no-apps', '0'), 'hide-when-no-apps' => $this->config->getAppValueBool('hide-when-no-apps', '0'),
'loader-enabled' => $this->config->getAppValueBool('loader-enabled', '1'), 'loader-enabled' => $this->config->getAppValueBool('loader-enabled', '1'),
'always-displayed' => $this->config->getAppValueBool('always-displayed', '0'), 'always-displayed' => $this->config->getAppValueBool('always-displayed', '0'),
'side-with-categories' => $this->config->getAppValueBool('side-with-categories', '0'),
'big-menu' => $this->config->getAppValueBool('big-menu', '0'), 'big-menu' => $this->config->getAppValueBool('big-menu', '0'),
'big-menu-hidden-apps' => $this->config->getAppValueArray('big-menu-hidden-apps', '[]'), 'big-menu-hidden-apps' => $this->config->getAppValueArray('big-menu-hidden-apps', '[]'),
'apps-order' => $appsOrder,
'avatar' => $avatar, 'avatar' => $avatar,
'top-menu-apps' => $topMenuApps, 'top-menu-apps' => $topMenuApps,
'top-side-menu-apps' => $topSideMenuApps,
'top-menu-mouse-over-hidden-label' => $this->config->getAppValueInt(
'top-menu-mouse-over-hidden-label',
'0'
),
'target-blank-apps' => $targetBlankApps, 'target-blank-apps' => $targetBlankApps,
'settings' => $settings, 'settings' => $settings,
'logo' => $this->themingDefaults->getLogo(), 'logo' => $this->themingDefaults->getLogo(),
+37 -56
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -18,13 +19,15 @@
namespace OCA\SideMenu\Controller; namespace OCA\SideMenu\Controller;
use OC;
use OC\App\AppStore\Fetcher\CategoryFetcher;
use OC\URLGenerator; use OC\URLGenerator;
use OCA\SideMenu\Service\AppRepository; 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\Controller; use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\Attribute\PublicPage;
use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Http\JSONResponse;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession; use OCP\IUserSession;
@@ -32,59 +35,25 @@ use OCP\L10N\IFactory;
class NavController extends Controller class NavController extends Controller
{ {
/**
* @var ConfigProxy
*/
protected $config;
/**
* @var AppRepository
*/
protected $appRepository;
/**
* @var IFactory
*/
protected $l10nFactory;
/**
* @var CategoryFetcher
*/
protected $categoryFetcher;
/**
* @var URLGenerator
*/
protected $router;
public function __construct( public function __construct(
string $appName, string $appName,
IRequest $request, IRequest $request,
ConfigProxy $config, protected ConfigProxy $config,
AppRepository $appRepository, protected AppRepository $appRepository,
CategoryRepository $categoryRepository, protected CategoryRepository $categoryRepository,
URLGenerator $router, protected URLGenerator $router,
IFactory $l10nFactory protected IFactory $l10nFactory,
) { ) {
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->config = $config;
$this->appRepository = $appRepository;
$this->categoryRepository = $categoryRepository;
$this->l10nFactory = $l10nFactory;
$this->router = $router;
} }
/** #[NoCSRFRequired]
* @NoAdminRequired #[NoAdminRequired]
* @NoCSRFRequired #[PublicPage]
* @PublicPage #[FrontpageRoute(verb: 'GET', url: '/nav/items')]
* public function items(): JSONResponse
* @return JSONResponse
*/
public function items()
{ {
$user = OC::$server[IUserSession::class]->getUser(); $user = \OC::$server[IUserSession::class]->getUser();
$items = []; $items = [];
if (!$user) { if (!$user) {
@@ -93,11 +62,13 @@ class NavController extends Controller
]); ]);
} }
$apps = $this->appRepository->getVisibleApps(); $apps = $this->appRepository->getOrderedApps($user);
$categoriesLabels = $this->categoryRepository->getOrderedCategories(); $categoriesLabels = $this->categoryRepository->getOrderedCategories();
$hiddenApps = $this->config->getAppValueArray('big-menu-hidden-apps', '[]'); $hiddenApps = $this->config->getAppValueArray('big-menu-hidden-apps', '[]');
$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', '[]');
$userTopSideMenuApps = $this->config->getUserValueArray($user, 'top-side-menu-apps', '[]');
$userTopMenuApps = $this->config->getUserValueArray($user, 'top-menu-apps', '[]'); $userTopMenuApps = $this->config->getUserValueArray($user, 'top-menu-apps', '[]');
$appsCategories = []; $appsCategories = [];
$categoriesAppsCount = []; $categoriesAppsCount = [];
@@ -106,12 +77,16 @@ class NavController extends Controller
$topMenuApps = $userTopMenuApps; $topMenuApps = $userTopMenuApps;
} }
foreach ($apps as $app) { if (!$isForced && !empty($userTopSideMenuApps)) {
if (in_array($app['id'], $topMenuApps)) { $topSideMenuApps = $userTopSideMenuApps;
continue;
} }
if (in_array($app['id'], $hiddenApps)) { foreach ($apps as $app) {
$inTopMenuApps = in_array($app['id'], $topMenuApps);
$inTopSideMenuApps = in_array($app['id'], $topSideMenuApps);
$inHiddenApps = in_array($app['id'], $hiddenApps);
if (($inTopMenuApps && !$inTopSideMenuApps) || $inHiddenApps) {
continue; continue;
} }
@@ -140,6 +115,7 @@ class NavController extends Controller
$appsCategories[$app['id']][] = $category; $appsCategories[$app['id']][] = $category;
$items[$category]['apps'][$app['id']] = [ $items[$category]['apps'][$app['id']] = [
'id' => $app['id'],
'name' => $app['name'], 'name' => $app['name'],
'href' => $app['href'], 'href' => $app['href'],
'icon' => $app['icon'], 'icon' => $app['icon'],
@@ -178,18 +154,23 @@ class NavController extends Controller
foreach ($items as $category => $value) { foreach ($items as $category => $value) {
if (empty($items[$category]['apps'])) { if (empty($items[$category]['apps'])) {
unset($items[$category]); unset($items[$category]);
} else {
uasort($items[$category]['apps'], function ($a, $b) {
return ($a['name'] < $b['name']) ? -1 : 1;
});
} }
} }
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 ('other' === $a['categoryId']) {
return -1;
}
if ('other' === $b['categoryId']) {
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;
} }
+76 -47
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -21,46 +22,30 @@ namespace OCA\SideMenu\Controller;
use OCA\SideMenu\AppInfo\Application; use OCA\SideMenu\AppInfo\Application;
use OCA\SideMenu\Service\ConfigProxy; use OCA\SideMenu\Service\ConfigProxy;
use OCP\AppFramework\Controller; use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\Attribute\FrontpageRoute;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\JSONResponse;
use OCP\IConfig; use OCP\IConfig;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession; use OCP\IUserSession;
class PersonalSettingController extends Controller class PersonalSettingController extends Controller
{ {
/** public function __construct(
* @var IConfig $appName,
*/ IRequest $request,
protected $config; protected IConfig $config,
protected ConfigProxy $configProxy,
/** protected IUserSession $userSession,
* @var ConfigProxy ) {
*/
protected $configProxy;
/**
* @var IUserSession
*/
protected $userSession;
public function __construct($appName, IRequest $request, IConfig $config, ConfigProxy $configProxy, IUserSession $userSession)
{
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->config = $config;
$this->configProxy = $configProxy;
$this->userSession = $userSession;
} }
/** #[NoCSRFRequired]
* @NoAdminRequired #[NoAdminRequired]
* #[FrontpageRoute(verb: 'POST', url: '/user/valueSet')]
* @param mixed $name public function valueSet($name, $value): array
* @param mixed $value
*
* @return Response
*/
public function valueSet($name, $value)
{ {
$doSave = false; $doSave = false;
$user = $this->userSession->getUser(); $user = $this->userSession->getUser();
@@ -81,22 +66,7 @@ class PersonalSettingController extends Controller
} }
} }
if ('target-blank-apps' === $name) { if (in_array($name, ['target-blank-apps', 'top-menu-apps', 'top-side-menu-apps', 'apps-order'])) {
$doSave = true;
$data = json_decode($value, true);
if (!is_array($data)) {
$doSave = false;
} else {
foreach ($data as $v) {
if (!is_string($v)) {
$doSave = false;
}
}
}
}
if ('top-menu-apps' === $name) {
$doSave = true; $doSave = true;
$data = json_decode($value, true); $data = json_decode($value, true);
@@ -126,4 +96,63 @@ class PersonalSettingController extends Controller
return []; return [];
} }
#[NoCSRFRequired]
#[NoAdminRequired]
#[FrontpageRoute(verb: 'GET', url: '/user/config')]
public function configuration(): JSONResponse
{
$user = $this->userSession->getUser();
$keys = $this->config->getUserKeys($user->getUid(), Application::APP_ID);
$booleans = [
'enabled',
];
$arrays = [
'apps-order',
'target-blank-apps',
'top-menu-apps',
'top-side-menu-apps',
];
$integers = [
'target-blank-mode',
];
$defaults = [
'enabled' => '1',
'target-blank-mode' => '1',
'apps-order' => '[]',
'target-blank-apps' => '[]',
'top-menu-apps' => '[]',
'top-side-menu-apps' => '[]',
];
$config = [];
foreach ($keys as $key) {
if (!isset($defaults[$key])) {
continue;
}
if (in_array($key, $booleans)) {
$config[$key] = $this->configProxy->getUserValueBool($user, $key, $defaults[$key]);
} elseif (in_array($key, $arrays)) {
$config[$key] = $this->configProxy->getUserValueArray($user, $key, $defaults[$key]);
} elseif (in_array($key, $integers)) {
$config[$key] = $this->configProxy->getUserValueInt($user, $key, $defaults[$key]);
} else {
$config[$key] = $this->configProxy->getUserValue($user, $key, $defaults[$key]);
}
}
foreach ($defaults as $key => $default) {
if (!array_key_exists($key, $config)) {
$config[$key] = $default;
}
}
return new JSONResponse($config);
}
} }
+76 -24
View File
@@ -2,6 +2,13 @@
namespace OCA\SideMenu\Service; namespace OCA\SideMenu\Service;
use OC\User\User;
use OCA\SideMenu\AppInfo\Application;
use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\INavigationManager;
use OCP\IUserSession;
use OCP\L10N\IFactory; use OCP\L10N\IFactory;
/** /**
@@ -11,30 +18,29 @@ use OCP\L10N\IFactory;
*/ */
class AppRepository class AppRepository
{ {
/** public function __construct(
* @var \OC_App protected \OC_App $ocApp,
*/ protected INavigationManager $navigationManager,
protected $ocApp; protected IFactory $l10nFactory,
protected ConfigProxy $config,
/** protected CategoryRepository $categoryRepository,
* @var IFactory protected IEventDispatcher $dispatcher,
*/ protected IUserSession $userSession,
protected $l10nFactory; ) {
$this->dispatcher->dispatchTyped(new BeforeTemplateRenderedEvent(
public function __construct(\OC_App $ocApp, IFactory $l10nFactory) $this->userSession->isLoggedIn(),
{ new TemplateResponse(Application::APP_NAME, '')
$this->ocApp = $ocApp; ));
$this->l10nFactory = $l10nFactory;
} }
/** /**
* Retrieves visibles apps. * Retrieves visibles apps.
*
* @return array
*/ */
public function getVisibleApps() public function getVisibleApps(): array
{ {
$navigation = $this->ocApp->getNavigation(); $navigation = $this->navigationManager->getAll();
$appCategoriesCustom = $this->config->getAppValueArray('apps-categories-custom', '[]');
$categories = $this->categoryRepository->getOrderedCategories();
$apps = $this->ocApp->listAllApps(); $apps = $this->ocApp->listAllApps();
$visibleApps = []; $visibleApps = [];
@@ -43,7 +49,7 @@ class AppRepository
foreach ([$app['id'], $app['id'].'_index'] as $id) { foreach ([$app['id'], $app['id'].'_index'] as $id) {
if (isset($navigation[$id])) { if (isset($navigation[$id])) {
$app['name'] = $this->l10nFactory->get($id)->t($app['name']); $app['name'] = $this->getAppName($app);
$app['href'] = $navigation[$id]['href']; $app['href'] = $navigation[$id]['href'];
$app['icon'] = $navigation[$id]['icon']; $app['icon'] = $navigation[$id]['icon'];
@@ -56,17 +62,25 @@ class AppRepository
if ('external_index' === substr($app['id'], 0, 14)) { if ('external_index' === substr($app['id'], 0, 14)) {
$visibleApps[$app['id']] = [ $visibleApps[$app['id']] = [
'id' => $app['id'], 'id' => $app['id'],
'name' => $this->l10nFactory->get($app['id'])->t($app['name']), 'name' => $this->getAppName($app),
'href' => $app['href'], 'href' => $app['href'],
'icon' => $app['icon'], 'icon' => $app['icon'],
'category' => [ 'category' => [
'external_links', 'external_links',
], ],
]; ];
} elseif ('tables_application' === substr($app['id'], 0, 18)) {
$visibleApps[$app['id']] = [
'id' => $app['id'],
'name' => $this->getAppName($app),
'href' => $app['href'],
'icon' => $app['icon'],
'category' => [],
];
} elseif ('files' === $app['id']) { } elseif ('files' === $app['id']) {
$visibleApps[$app['id']] = [ $visibleApps[$app['id']] = [
'id' => $app['id'], 'id' => $app['id'],
'name' => $this->l10nFactory->get($app['id'])->t($app['name']), 'name' => $this->getAppName($app),
'href' => $app['href'], 'href' => $app['href'],
'icon' => $app['icon'], 'icon' => $app['icon'],
'category' => [], 'category' => [],
@@ -74,10 +88,48 @@ class AppRepository
} }
} }
usort($visibleApps, function ($a, $b) { foreach ($visibleApps as $id => $app) {
return ($a['name'] < $b['name']) ? -1 : 1; if (isset($appCategoriesCustom[$id], $categories[$appCategoriesCustom[$id]])) {
}); $visibleApps[$id]['category'] = [$appCategoriesCustom[$id]];
}
}
return $visibleApps; return $visibleApps;
} }
public function getAppName($app): string
{
return $this->config->getAppValue(
'app.navigation.name',
$this->l10nFactory->get($app['id'])->t($app['name']),
$app['id']
);
}
public function getOrderedApps(?User $user = null): array
{
$apps = $this->getVisibleApps();
$orders = $this->config->getAppValueArray('apps-order', '[]');
if (null !== $user && !$this->config->getAppValueBool('force', '0')) {
$userOrders = $this->config->getUserValueArray($user, 'apps-order', '[]');
if (!empty($userOrders)) {
$orders = $userOrders;
}
}
usort($apps, function ($a, $b) use ($orders) {
$ak = array_keys($orders, $a['id'])[0] ?? null;
$bk = array_keys($orders, $b['id'])[0] ?? null;
if (null === $ak || null === $bk) {
return ($a['name'] < $b['name']) ? -1 : 1;
}
return $ak < $bk ? -1 : 1;
});
return $apps;
}
} }
+22 -33
View File
@@ -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;
/** /**
@@ -14,50 +15,25 @@ use OCP\L10N\IFactory;
*/ */
class CategoryRepository class CategoryRepository
{ {
/**
* @var CategoryFetcher
*/
protected $categoryFetcher;
/**
* @var IFactory
*/
protected $l10nFactory;
/**
* @var ConfigProxy
*/
protected $config;
/**
* @var IConfig
*/
protected $iConfig;
public function __construct( public function __construct(
CategoryFetcher $categoryFetcher, protected CategoryFetcher $categoryFetcher,
ConfigProxy $config, protected ConfigProxy $config,
IConfig $iConfig, protected IConfig $iConfig,
IFactory $l10nFactory protected IFactory $l10nFactory,
protected IUserSession $userSession,
) { ) {
$this->categoryFetcher = $categoryFetcher;
$this->l10nFactory = $l10nFactory;
$this->config = $config;
$this->iConfig = $iConfig;
} }
/** /**
* Retrieves categories. * Retrieves categories.
*
* @return array
*/ */
public function getOrderedCategories() public function getOrderedCategories(): array
{ {
$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();
@@ -66,7 +42,8 @@ class CategoryRepository
} }
foreach ($categoriesLabels as $k => $category) { foreach ($categoriesLabels as $k => $category) {
$categoriesLabels[$category['id']] = $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name']; $categoriesLabels[$category['id']] = $category['translations'][$currentLanguage]['name'] ??
$category['translations']['en']['name'];
unset($categoriesLabels[$k]); unset($categoriesLabels[$k]);
} }
@@ -74,6 +51,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) {
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace OCA\SideMenu\Service;
use OCA\Theming\ThemingDefaults;
/**
* class Color.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class Color
{
public function __construct(protected ThemingDefaults $theming)
{
}
/**
* @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);
}
public function getPrimaryColor()
{
return $this->theming->getColorPrimary();
}
public function getLightenPrimaryColor()
{
return $this->adjustBrightness($this->getPrimaryColor(), 0.2);
}
public function getDarkenPrimaryColor()
{
return $this->adjustBrightness($this->getPrimaryColor(), -0.2);
}
public function getDarkenPrimaryColor2()
{
return $this->adjustBrightness($this->getPrimaryColor(), -0.3);
}
public function getTextColorPrimary()
{
return $this->theming->getTextColorPrimary();
}
}
+21 -22
View File
@@ -13,53 +13,52 @@ use OCP\IConfig;
*/ */
class ConfigProxy class ConfigProxy
{ {
/** public function __construct(protected IConfig $config)
* @var IConfig
*/
protected $config;
public function __construct(IConfig $config)
{ {
$this->config = $config; $this->config = $config;
} }
public function getAppValue(string $name, string $default): string public function getAppValue(string $name, string $default, $appId = null): string
{ {
return (string) $this->config->getAppValue(Application::APP_ID, $name, $default); return (string) $this->config->getAppValue($appId ?? Application::APP_ID, $name, $default);
} }
public function getUserValue(User $user, string $name, string $default): string public function getUserValue(User $user, string $name, string $default, $appId = null): string
{ {
return (string) $this->config->getUserValue($user->getUid(), Application::APP_ID, $name, $default); return (string) $this->config->getUserValue($user->getUid(), $appId ?? Application::APP_ID, $name, $default);
} }
public function getAppValueBool(string $name, string $default): bool public function getAppValueBool(string $name, string $default, $appId = null): bool
{ {
return (bool) $this->getAppValue($name, $default); return (bool) $this->getAppValue($name, $default, $appId);
} }
public function getAppValueArray(string $name, string $default): array public function getAppValueArray(string $name, string $default, $appId = null): array
{ {
return (array) json_decode($this->getAppValue($name, $default), true); return (array) json_decode($this->getAppValue($name, $default, $appId), true);
} }
public function getAppValueInt(string $name, string $default): int public function getAppValueInt(string $name, string $default, $appId = null): int
{ {
return (int) $this->getAppValue($name, $default); return (int) $this->getAppValue($name, $default, $appId);
} }
public function getUserValueBool(User $user, string $name, string $default): bool public function getUserValueBool(User $user, string $name, string $default, $appId = null): bool
{ {
return (bool) $this->getUserValue($user, $name, $default); return (bool) str_replace(
['yes', 'no'],
['1', '0'],
$this->getUserValue($user, $name, $default, $appId)
);
} }
public function getUserValueArray(User $user, string $name, string $default): array public function getUserValueArray(User $user, string $name, string $default, $appId = null): array
{ {
return (array) json_decode($this->getUserValue($user, $name, $default), true); return (array) json_decode($this->getUserValue($user, $name, $default, $appId), true);
} }
public function getUserValueInt(User $user, string $name, string $default): int public function getUserValueInt(User $user, string $name, string $default, $appId = null): int
{ {
return (int) $this->getUserValue($user, $name, $default); return (int) $this->getUserValue($user, $name, $default, $appId);
} }
} }
+48
View File
@@ -0,0 +1,48 @@
<?php
namespace OCA\SideMenu\Service;
use OCP\IDBConnection;
/**
* class LangRepository.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class LangRepository
{
public function __construct(protected 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')
;
// Nextcloud >=33+
if (method_exists($qb, 'executeQuery')) {
$stmt = $qb->executeQuery();
} else {
$stmt = $qb->execute();
}
$langs = ['en'];
foreach ($stmt->fetchAll() as $result) {
$langs[] = $result['configvalue'];
}
return $langs;
}
}
+70 -44
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -21,51 +22,25 @@ namespace OCA\SideMenu\Settings;
use OCA\SideMenu\AppInfo\Application; use OCA\SideMenu\AppInfo\Application;
use OCA\SideMenu\Service\AppRepository; use OCA\SideMenu\Service\AppRepository;
use OCA\SideMenu\Service\CategoryRepository; use OCA\SideMenu\Service\CategoryRepository;
use OCA\SideMenu\Service\Color;
use OCA\SideMenu\Service\ConfigProxy; use OCA\SideMenu\Service\ConfigProxy;
use OCA\SideMenu\Service\LangRepository;
use OCA\Theming\ThemingDefaults;
use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\TemplateResponse;
use OCP\IL10N; use OCP\IL10N;
use OCP\ILogger;
use OCP\Settings\ISettings; use OCP\Settings\ISettings;
class Admin implements ISettings class Admin implements ISettings
{ {
/**
* @var IL10N
*/
private $l;
/**
* @var ILogger
*/
private $logger;
/**
* @var ConfigProxy
*/
private $config;
/**
* @var AppRepository
*/
private $appRepository;
/**
* @var CategoryRepository
*/
private $categoryRepository;
public function __construct( public function __construct(
IL10N $l, protected IL10N $l,
ILogger $logger, protected ConfigProxy $config,
ConfigProxy $config, protected AppRepository $appRepository,
AppRepository $appRepository, protected CategoryRepository $categoryRepository,
CategoryRepository $categoryRepository protected ThemingDefaults $theming,
protected Color $color,
protected LangRepository $langRepository,
) { ) {
$this->l = $l;
$this->logger = $logger;
$this->config = $config;
$this->appRepository = $appRepository;
$this->categoryRepository = $categoryRepository;
} }
/** /**
@@ -73,22 +48,63 @@ 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();
$backgroundColor = $this->config->getAppValue('background-color', $darkenPrimaryColor);
$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,
'current-app-background-color' => $this->config->getAppValue('current-app-background-color', '#444444'), 'background-color-opacity' => $this->config->getAppValueInt('background-color-opacity', '100'),
'loader-color' => $this->config->getAppValue('loader-color', '#0e75ac'), 'current-app-background-color' => $this->config->getAppValue(
'current-app-background-color',
$darkenPrimaryColor2
),
'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'),
'loader-enabled' => $this->config->getAppValue('loader-enabled', '1'), 'text-color' => $this->config->getAppValue('text-color', $textColor),
'text-color' => $this->config->getAppValue('text-color', '#FFFFFF'), 'dark-mode-background-color' => $darkModeBackgroundColor,
'cache' => $this->config->getAppValue('cache', '0'), 'dark-mode-background-color-to' => $darkModeBackgroundColorTo,
'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',
$darkenPrimaryColor2
),
'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-opacity' => $this->config->getAppValueInt('dark-mode-icon-opacity', '100'),
'dark-mode-text-color' => $this->config->getAppValue('dark-mode-text-color', $textColor),
'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'),
'cache' => $this->config->getAppValue('cache', '0'),
'always-displayed' => $this->config->getAppValue('always-displayed', '0'), 'always-displayed' => $this->config->getAppValue('always-displayed', '0'),
'big-menu' => $this->config->getAppValue('big-menu', '0'), 'big-menu' => $this->config->getAppValue('big-menu', '0'),
'side-with-categories' => $this->config->getAppValue('side-with-categories', '0'),
'big-menu-hidden-apps' => $this->config->getAppValueArray('big-menu-hidden-apps', '[]'), 'big-menu-hidden-apps' => $this->config->getAppValueArray('big-menu-hidden-apps', '[]'),
'display-logo' => $this->config->getAppValue('display-logo', '1'), 'display-logo' => $this->config->getAppValue('display-logo', '1'),
'add-logo-link' => $this->config->getAppValue('add-logo-link', '1'), 'add-logo-link' => $this->config->getAppValue('add-logo-link', '1'),
@@ -103,11 +119,21 @@ 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-menu-mouse-over-hidden-label' => $this->config->getAppValue(
'top-menu-mouse-over-hidden-label',
'0'
),
'apps-order' => $this->config->getAppValueArray('apps-order', '[]'),
'ordered-apps' => $this->appRepository->getOrderedApps(),
'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, '');
+5 -36
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -25,59 +26,27 @@ use OCP\Settings\IIconSection;
class AdminSection implements IIconSection class AdminSection implements IIconSection
{ {
/** public function __construct(
* @var IL10N protected IURLGenerator $url,
*/ protected IL10N $l,
private $l; ) {
/**
* @var IURLGenerator
*/
private $url;
public function __construct(IURLGenerator $url, IL10N $l)
{
$this->url = $url;
$this->l = $l;
} }
/**
* returns the ID of the section. It is supposed to be a lower case string,
* e.g. 'ldap'.
*
* @returns string
*/
public function getID() public function getID()
{ {
return Application::APP_ID; return Application::APP_ID;
} }
/**
* returns the translated name as it should be displayed, e.g. 'LDAP / AD
* integration'. Use the L10N service to translate it.
*
* @return string
*/
public function getName() public function getName()
{ {
return $this->l->t(Application::APP_NAME); return $this->l->t(Application::APP_NAME);
} }
/**
* @return int whether the form should be rather on the top or bottom of
* the settings navigation. The sections are arranged in ascending order of
* the priority values. It is required to return a value between 0 and 99.
*
* E.g.: 70
*/
public function getPriority() public function getPriority()
{ {
return 70; return 70;
} }
/**
* {@inheritdoc}
*/
public function getIcon() public function getIcon()
{ {
return $this->url->imagePath(Application::APP_ID, 'icon.svg'); return $this->url->imagePath(Application::APP_ID, 'icon.svg');
+10 -33
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -23,44 +24,17 @@ use OCA\SideMenu\Service\AppRepository;
use OCA\SideMenu\Service\ConfigProxy; use OCA\SideMenu\Service\ConfigProxy;
use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\TemplateResponse;
use OCP\IL10N; use OCP\IL10N;
use OCP\ILogger;
use OCP\IUserSession; use OCP\IUserSession;
use OCP\Settings\ISettings; use OCP\Settings\ISettings;
class Personal implements ISettings class Personal implements ISettings
{ {
/** public function __construct(
* @var IL10N protected IL10N $l,
*/ protected ConfigProxy $config,
private $l; protected IUserSession $userSession,
protected AppRepository $appRepository,
/** ) {
* @var ILogger
*/
private $logger;
/**
* @var ConfigProxy
*/
private $config;
/**
* @var IUserSession
*/
private $userSession;
/**
* @var AppRepository
*/
private $appRepository;
public function __construct(IL10N $l, ILogger $logger, ConfigProxy $config, IUserSession $userSession, AppRepository $appRepository)
{
$this->l = $l;
$this->logger = $logger;
$this->config = $config;
$this->userSession = $userSession;
$this->appRepository = $appRepository;
} }
/** /**
@@ -78,9 +52,12 @@ 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-order' => $this->config->getUserValueArray($user, 'apps-order', '[]'),
'apps' => $this->appRepository->getVisibleApps(), 'apps' => $this->appRepository->getVisibleApps(),
'ordered-apps' => $this->appRepository->getOrderedApps($user),
]; ];
return new TemplateResponse(Application::APP_ID, 'settings/personal-form', $parameters, ''); return new TemplateResponse(Application::APP_ID, 'settings/personal-form', $parameters, '');
+19 -36
View File
@@ -1,4 +1,5 @@
<?php <?php
/** /**
* @license GNU AGPL version 3 or any later version * @license GNU AGPL version 3 or any later version
* *
@@ -19,65 +20,47 @@
namespace OCA\SideMenu\Settings; namespace OCA\SideMenu\Settings;
use OCA\SideMenu\AppInfo\Application; use OCA\SideMenu\AppInfo\Application;
use OCA\SideMenu\Service\ConfigProxy;
use OCP\IL10N; use OCP\IL10N;
use OCP\IURLGenerator; use OCP\IURLGenerator;
use OCP\Settings\IIconSection; use OCP\Settings\IIconSection;
class PersonalSection implements IIconSection class PersonalSection implements IIconSection
{ {
/** public function __construct(
* @var IL10N protected IURLGenerator $url,
*/ protected IL10N $l,
private $l; protected ConfigProxy $configProxy,
) {
/**
* @var IURLGenerator
*/
private $url;
public function __construct(IURLGenerator $url, IL10N $l)
{
$this->url = $url;
$this->l = $l;
} }
/**
* returns the ID of the section. It is supposed to be a lower case string,
* e.g. 'ldap'.
*
* @returns string
*/
public function getID() public function getID()
{ {
if ($this->configProxy->getAppValueBool('force', '0')) {
return '';
}
return Application::APP_ID; return Application::APP_ID;
} }
/**
* returns the translated name as it should be displayed, e.g. 'LDAP / AD
* integration'. Use the L10N service to translate it.
*
* @return string
*/
public function getName() public function getName()
{ {
if ($this->configProxy->getAppValueBool('force', '0')) {
return '';
}
return $this->l->t(Application::APP_NAME); return $this->l->t(Application::APP_NAME);
} }
/**
* @return int whether the form should be rather on the top or bottom of
* the settings navigation. The sections are arranged in ascending order of
* the priority values. It is required to return a value between 0 and 99.
*
* E.g.: 70
*/
public function getPriority() public function getPriority()
{ {
if ($this->configProxy->getAppValueBool('force', '0')) {
return null;
}
return 70; return 70;
} }
/**
* {@inheritdoc}
*/
public function getIcon() public function getIcon()
{ {
return $this->url->imagePath(Application::APP_ID, 'icon.svg'); return $this->url->imagePath(Application::APP_ID, 'icon.svg');
+9300
View File
File diff suppressed because it is too large Load Diff
+39 -44
View File
@@ -1,60 +1,55 @@
{ {
"license": "agpl", "license": "agpl",
"private": true, "private": true,
"module": true,
"scripts": { "scripts": {
"build": "NODE_ENV=production webpack --progress --hide-modules --config webpack.js", "build": "NODE_ENV=production ./node_modules/.bin/webpack-cli --progress --config webpack.config.js",
"dev": "NODE_ENV=development webpack --progress --config webpack.js", "dev": "NODE_ENV=development ./node_modules/.bin/webpack-cli --progress --config webpack.config.js",
"watch": "NODE_ENV=development webpack --progress --watch --config webpack.js", "watch": "NODE_ENV=development ./node_modules/.bin/webpack-cli --progress --watch --config webpack.config.js",
"lint": "eslint --ext .js,.vue src", "lint": "ESLINT_USE_FLAT_CONFIG=false ./node_modules/.bin/eslint --ext .js,.vue --ignore-path .gitignore --fix src",
"lint:fix": "eslint --ext .js,.vue src --fix", "format": "./node_modules/.bin/prettier src --write"
"stylelint": "stylelint src",
"stylelint:fix": "stylelint src --fix"
}, },
"dependencies": { "dependencies": {
"@nextcloud/axios": "^1.3.2", "@babel/core": ">=7.12.0 <8.0.0",
"@nextcloud/vue": "^1.4.0", "@formatjs/intl-segmenter": "^12.0.8",
"axios": "^0.19.2", "@nextcloud/router": "^3.0.1",
"trim": "0.0.1", "@nextcloud/vue": "^9.9.0",
"vue": "^2.6.11" "node-polyfill-webpack-plugin": "^4.1.0",
"pinia": "^3.0.1",
"postcss": "^7.0.0 || ^8.0.1",
"vue": "^3.5.13",
"vuedraggable": "^4.1.0"
}, },
"browserslist": [ "browserslist": [
"extends @nextcloud/browserslist-config" "extends @nextcloud/browserslist-config"
], ],
"engines": { "engines": {
"node": ">=10.0.0" "node": ">=16.0.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "^7.9.0",
"@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3",
"@babel/preset-env": "^7.9.0", "@nextcloud/axios": "^2.5.1",
"@nextcloud/browserslist-config": "^1.0.0", "@nextcloud/browserslist-config": "^3.0.1",
"babel-eslint": "^10.1.0", "@nextcloud/event-bus": "^3.3.1",
"babel-loader": "^8.1.0", "@nextcloud/initial-state": "^2.2.0",
"css-loader": "^3.4.2", "@nextcloud/l10n": "^3.2.0",
"eslint": "^5.16.0", "babel-loader": "^9.1.3",
"eslint-config-nextcloud": "0.1.1", "css-loader": "^7.1.2",
"eslint-config-standard": "^12.0.0", "eslint": "^9.19.0",
"eslint-import-resolver-webpack": "^0.12.1", "eslint-config-prettier": "^10.0.1",
"eslint-loader": "^3.0.3", "eslint-plugin-vue": "^9.32.0",
"eslint-plugin-import": "^2.20.0", "file-loader": "^6.2.0",
"eslint-plugin-nextcloud": "^0.3.0", "mini-css-extract-plugin": "^2.9.1",
"eslint-plugin-node": "^10.0.0", "postcss-loader": "^8.1.1",
"eslint-plugin-promise": "^4.2.1", "prettier": "3.4.2",
"eslint-plugin-standard": "^4.0.1", "sass": "^1.78.0",
"eslint-plugin-vue": "^5.2.3", "sass-loader": "^16.0.1",
"file-loader": "^6.0.0", "source-map-loader": "^5.0.0",
"node-sass": "^4.13.1", "style-loader": "^4.0.0",
"sass-loader": "^8.0.2", "vue-loader": "^17.4.2",
"stylelint": "^8.4.0", "vue-router": "^4.4.5",
"stylelint-config-recommended-scss": "^3.3.0", "webpack": "^5.94.0",
"stylelint-scss": "^3.16.0", "webpack-cli": "^5.1.4",
"stylelint-webpack-plugin": "^0.10.5", "webpack-notifier": "^1.15.0"
"url-loader": "^4.0.0",
"vue-loader": "^15.9.1",
"vue-template-compiler": "^2.6.11",
"webpack": "^4.42.0",
"webpack-cli": "^3.3.11",
"webpack-merge": "^4.2.2",
"webpack-node-externals": "^1.7.2"
} }
} }
+3
View File
@@ -0,0 +1,3 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json"
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 KiB

After

Width:  |  Height:  |  Size: 223 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 313 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 246 KiB

-42
View File
@@ -1,42 +0,0 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="side-menu-loader">
<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg">
<g fill="none" fill-rule="evenodd">
<g transform="translate(1 1)" stroke-width="2">
<circle stroke-opacity=".5" cx="18" cy="18" r="18"/>
<path d="M36 18c0-9.94-8.06-18-18-18">
<animateTransform
attributeName="transform"
type="rotate"
from="0 18 18"
to="360 18 18"
dur="1s"
repeatCount="indefinite"/>
</path>
</g>
</g>
</svg>
</div>
</template>
<script>
export default {
name: 'Loader',
}
</script>
-50
View File
@@ -1,50 +0,0 @@
/**
* @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/>.
*/
import Vue from 'vue'
import SideMenu from './SideMenu.vue'
import SideMenuBig from './SideMenuBig.vue'
// Vue.prototype.t = t
Vue.prototype.OC = OC
// Vue.prototype.OC = OCP
const mountSideMenuComponent = () => {
const sideMenuContainer = document.querySelector('#side-menu')
if (sideMenuContainer) {
let component
if (sideMenuContainer.getAttribute('data-bigmenu')) {
component = SideMenuBig
} else {
component = SideMenu
}
const View = Vue.extend(component)
const sideMenu = new View({})
sideMenu.$mount('#side-menu')
$('body').trigger('side-menu.ready')
} else {
window.setTimeout(mountSideMenuComponent, 50)
}
}
mountSideMenuComponent()
-166
View File
@@ -1,166 +0,0 @@
<!--
@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 id="side-menu">
<div class="side-menu-header">
<SettingsButton
v-if="settings"
v-bind:href="settings.href"
v-bind:label="settings.name"
v-bind:avatar="settings.avatar" />
<OpenerButton />
<Logo
v-if="!avatar && logo" v-bind:classes="{'side-menu-logo': true, 'avatardiv': false}"
v-bind:image="logo"
v-bind:link="logoLink"
/>
<Logo
v-if="avatar" v-bind:classes="{'side-menu-logo': true, 'avatardiv': true}"
v-bind:image="avatar"
v-bind:link="logoLink"
/>
</div>
<ul class="side-menu-apps-list">
<SideMenuApp
v-for="app in apps"
v-bind:classes="{'side-menu-app': true, 'active': app.active}"
v-bind:icon="app.icon"
v-bind:label="app.name"
v-bind:href="app.href"
v-bind:target="targetBlankApps.indexOf(app.id) !== -1 ? '_blank' : undefined"
/>
</ul>
</div>
</template>
<script>
import trim from 'trim'
import axios from 'axios'
import OpenerButton from './OpenerButton'
import SettingsButton from './SettingsButton'
import SideMenuApp from './SideMenuApp'
import Logo from './Logo'
export default {
name: 'SideMenu',
components: {
SettingsButton,
OpenerButton,
SideMenuApp,
Logo,
},
data() {
return {
apps: [],
logo: null,
logoLink: null,
avatar: null,
forceLightIcon: false,
targetBlankApps: [],
settings: null,
}
},
methods: {
retrieveApps() {
this.apps = []
const links = document.querySelectorAll('#appmenu a')
const menu = document.querySelector('#appmenu')
let menuIsHidden = true
if (menu) {
menuIsHidden = window.getComputedStyle(menu, null).getPropertyValue('display') === 'none'
}
for (let element of links) {
let href = element.getAttribute('href')
var parent = element.parentNode
if (!parent) {
continue
}
var dataId = parent.getAttribute('data-id')
dataId = dataId !== null ? dataId : ''
if (!parent.classList.contains('app-hidden') && !menuIsHidden) {
continue
}
if (href !== '#') {
let svg = element.querySelector('svg').outerHTML
svg = svg
.replace(/(height|width)="20"/, '')
.replace('id="invertMenuMain', 'id="invertSideMenu')
.replace('url(#invertMenuMain', 'url(#invertSideMenu')
if (this.forceLightIcon) {
svg = svg.replace(/filter="url[^"]+"/, '')
}
this.apps.push({
id: dataId,
href: href,
name: trim(element.querySelector('span').innerHTML),
icon: svg,
active: element.classList.contains('active')
});
}
}
(function(apps) {
window.setTimeout(function() {
jQuery('body').trigger('side-menu.apps', [apps])
}, 1000)
})(this.apps)
},
retrieveConfig() {
let that = this
axios
.get(OC.generateUrl('/apps/side_menu/js/config'))
.then(function(response) {
const config = response.data
that.targetBlankApps = config['target-blank-apps']
that.forceLightIcon = config['force-light-icon']
that.avatar = config['avatar']
that.logo = config['logo']
that.logoLink = config['logo-link']
that.settings = config['settings']
});
},
},
mounted() {
this.retrieveConfig()
this.retrieveApps()
const menu = document.querySelector('#appmenu')
if (menu) {
const config = {attributes: true, childList: true, subtree: true}
const observer = new MutationObserver(this.retrieveApps)
observer.observe(menu, config)
}
}
}
</script>
-52
View File
@@ -1,52 +0,0 @@
<!--
@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>
<li v-bind:class="classes">
<a v-bind:href="href" :target="target" v-bind:title="label">
<span class="side-menu-app-icon" v-html="icon"></span>
<span class="side-menu-app-text" v-html="label"></span>
</a>
</li>
</template>
<script>
export default {
name: 'SideMenuApp',
props: {
label: {
type: String,
required: true
},
icon: {
type: String,
required: true
},
href: {
type: String,
required: true
},
classes: {
type: Object,
required: true
},
target: {
type: String,
required: false
},
},
}
</script>
-128
View File
@@ -1,128 +0,0 @@
<!--
@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 id="side-menu" class="side-menu-big">
<div class="side-menu-header">
<CloserButton />
<SettingsButton
v-if="settings"
v-bind:href="settings.href"
v-bind:label="settings.name"
v-bind:avatar="settings.avatar"
/>
<OpenerButton />
</div>
<div class="side-menu-categories-wrapper">
<div class="side-menu-categories">
<Loader v-if="!items.length" />
<div class="side-menu-category" v-for="category in items">
<h2 class="side-menu-category-title" v-if="category.name != ''" v-html="category.name"></h2>
<ul class="side-menu-apps-list">
<SideMenuBigApp
v-for="(app, appId) in category.apps"
v-bind:classes="{'side-menu-app': true, 'active': activeApp === appId}"
v-bind:icon="app.icon"
v-bind:label="app.name"
v-bind:href="app.href"
v-bind:target="targetBlankApps.indexOf(app.id) !== -1 ? '_blank' : undefined"
/>
</ul>
</div>
</div>
</div>
</div>
</template>
<script>
import trim from 'trim'
import axios from 'axios'
import OpenerButton from './OpenerButton'
import CloserButton from './CloserButton'
import SettingsButton from './SettingsButton'
import Loader from './Loader'
import SideMenuBigApp from './SideMenuBigApp'
export default {
name: 'SideMenuBig',
components: {
SettingsButton,
OpenerButton,
CloserButton,
Loader,
SideMenuBigApp,
},
data() {
return {
items: [],
activeApp: null,
targetBlank: false,
targetBlankApps: [],
settings: null,
}
},
methods: {
retrieveApps() {
this.apps = []
let that = this
axios
.get(OC.generateUrl('/apps/side_menu/nav/items'))
.then(function(response) {
that.items = response.data.items
let apps = []
for (let category of that.items) {
for (let a in category.apps) {
apps.push(category.apps[a])
}
}
jQuery('body').trigger('side-menu.apps', [apps])
});
},
retrieveActiveApp() {
let activeAppLink = document.querySelector('#appmenu a.active')
this.activeApp = activeAppLink ? activeAppLink.parentNode.getAttribute('data-id') : null
},
retrieveConfig() {
let that = this
axios
.get(OC.generateUrl('/apps/side_menu/js/config'))
.then(function(response) {
const config = response.data
that.targetBlankApps = config['target-blank-apps']
that.settings = config['settings']
});
},
},
mounted() {
this.retrieveConfig()
this.retrieveApps()
this.retrieveActiveApp()
}
}
</script>
-52
View File
@@ -1,52 +0,0 @@
<!--
@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>
<li v-bind:class="classes">
<a v-bind:href="href" :target="target" v-bind:title="label">
<img class="side-menu-app-icon" v-bind:src="icon"></span>
<span class="side-menu-app-text" v-html="label"></span>
</a>
</li>
</template>
<script>
export default {
name: 'SideMenuBigApp',
props: {
label: {
type: String,
required: true
},
icon: {
type: String,
required: true
},
href: {
type: String,
required: true
},
classes: {
type: Object,
required: true
},
target: {
type: String,
required: false
},
},
}
</script>
+13 -127
View File
@@ -15,134 +15,20 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
let elements = [] import './scss/admin.scss'
const selector = '#side-menu-message'; import '@formatjs/intl-segmenter/polyfill.js'
const userConfig = (name, value, callbacks) => { import { createApp } from 'vue'
const url = OC.generateUrl('/apps/side_menu/personalSetting/valueSet') import { createPinia } from 'pinia'
import { waitContainer } from './lib/dom.js'
$.post(url, {name: name, value: value}, callbacks.success) import AdminSettings from './pages/AdminSettings'
.fail(callbacks.error)
}
const appConfig = (name, value, callbacks) => { waitContainer('#side-menu-admin-settings').then((selector) => {
OCP.AppConfig.setValue('side_menu', name, value, callbacks) const pinia = createPinia()
} const app = createApp(AdminSettings)
app.use(pinia)
const saveSettings = (key) => { app.mixin({ methods: { t, n } })
const element = elements.get(key) app.mount(selector)
let value })
let name
if (jQuery(element).is('[data-checkbox]')) {
name = jQuery(element).attr('data-name')
const inputs = jQuery('input[name="' + name + '[]"]:checked')
value = []
inputs.each((i, v) => {
value.push(v.value)
})
value = JSON.stringify(value)
} else {
name = jQuery(element).attr('name')
value = jQuery(element).val()
}
const size = elements.length
if (name === 'cache') {
++value
}
const callbacks = {
success: () => {
OC.msg.finishedSuccess(
selector,
t('side_menu', (key + 1) + '/' + size)
)
if (key < size - 1) {
saveSettings(++key)
} else {
OC.msg.finishedSuccess(selector, t('side_menu', 'Saved'))
}
},
error: () => {
OC.msg.finishedError(selector, t('side_menu', 'Error while saving "' + element + '"'))
}
}
if (jQuery(element).is('[data-personal]')) {
userConfig(name, value, callbacks)
} else {
appConfig(name, value, callbacks)
}
}
const elementToggler = (element) => {
jQuery(element).toggle()
}
jQuery(document).ready(() => {
elements = jQuery('.side-menu-setting')
jQuery('#side-menu-save').on('click', (event) => {
event.preventDefault()
OC.msg.startSaving(selector)
saveSettings(0)
});
jQuery('.side-menu-display').on('click', (event) => {
var target = jQuery(event.target)
jQuery('.side-menu-display').removeClass('is-active')
target.addClass('is-active')
jQuery('#side-menu-always-displayed').val(target.attr('data-alwaysdiplayed'))
jQuery('#side-menu-big-menu').val(target.attr('data-bigmenu'))
})
jQuery('.side-menu-setting-live').on('change', (event) => {
var target = jQuery(event.target)
var name = target.attr('name')
var value = target.val()
if (name === 'opener') {
var url = OC.generateUrl(`/apps/side_menu/img/${value}.svg`).replace('/index.php', '')
value = `url(${url})`;
}
if (name === 'icon-invert-filter' || name === 'icon-opacity') {
value/=100;
}
document.documentElement.style.setProperty('--side-menu-' + name, value)
})
jQuery('.side-menu-toggler').on('click', (event) => {
var target = jQuery(event.target)
var element = target.attr('data-target')
elementToggler(element)
})
jQuery("#categories-list .side-menu-setting-list").sortable({
forcePlaceholderSize: true,
placeholder: 'placeholder',
stop: function (event, ui) {
let value = []
jQuery('#categories-list .side-menu-setting-list-item').each(function() {
value.push(jQuery(this).attr('data-id'))
});
value = JSON.stringify(value)
jQuery('input[name="categories-order"]').val(value)
}
});
});
+29
View File
@@ -0,0 +1,29 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-search">
<input
v-model="model"
type="text"
:placeholder="t('side_menu', 'Search')"
/>
</div>
</template>
<script setup>
const model = defineModel({ type: String })
</script>
@@ -15,11 +15,15 @@ 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/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<template> <template>
<button class="side-menu-opener side-menu-closer"></button> <button
class="cm-opener cm-closer"
:arial-label="t('side_menu', 'Close the menu')"
@click="$emit('click')"
>
<span>{{ t('side_menu', 'Close the menu') }}</span>
</button>
</template> </template>
<script> <script setup>
export default { defineEmits(['click'])
name: 'CloserButton',
}
</script> </script>
+52
View File
@@ -0,0 +1,52 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div :class="classes">
<a
v-if="link !== null"
:href="link"
>
<img
:src="image"
alt="Logo"
/>
</a>
<img
v-else
:src="image"
alt="Logo"
/>
</div>
</template>
<script setup>
const { image, link, classes } = defineProps({
image: {
type: String,
required: true,
},
link: {
type: String,
required: false,
default: null,
},
classes: {
type: Object,
required: true,
},
})
</script>
@@ -15,11 +15,15 @@ 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/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<template> <template>
<button class="side-menu-opener"></button> <button
class="cm-opener"
:arial-label="label"
@click="$emit('click')"
>
<span>{{ t('side_menu', 'Toggle the menu') }}</span>
</button>
</template> </template>
<script> <script setup>
export default { defineEmits(['click'])
name: 'OpenerButton',
}
</script> </script>
+49
View File
@@ -0,0 +1,49 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-loader">
<div
class="cm-loader-bar"
:style="createStyle(width)"
></div>
</div>
</template>
<script setup>
import { onMounted, ref } from 'vue'
const width = ref(0)
const createStyle = (size) => {
return {
width: `${size}%`,
}
}
let interval = null
onMounted(() => {
window.addEventListener('beforeunload', () => {
interval = setInterval(() => {
width.value = Math.min(width.value + 0.2, 100)
if (width.value === 100) {
clearInterval(interval)
window.setTimeout(() => (width.value = 0), 2000)
}
}, 25)
})
})
</script>
+49
View File
@@ -0,0 +1,49 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-setting">
<a :href="href">
<!--
{{ label }}
-->
<span class="avatardiv avatardiv-shown">
<img
:src="avatar"
:alt="label"
/>
</span>
</a>
</div>
</template>
<script setup>
const { label, href, avatar } = defineProps({
label: {
type: String,
required: true,
},
href: {
type: String,
required: true,
},
avatar: {
type: String,
required: true,
},
})
</script>
+58
View File
@@ -0,0 +1,58 @@
<!--
@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>
<li :class="classes">
<a
:href="href"
:target="target"
:title="label"
>
<img
class="cm-app-icon"
:src="icon"
:alt="label"
/>
<span class="cm-app-text">{{ label }}</span>
</a>
</li>
</template>
<script setup>
const { label, icon, href, classes, target } = defineProps({
label: {
type: String,
required: true,
},
icon: {
type: String,
required: true,
},
href: {
type: String,
required: true,
},
classes: {
type: Object,
required: true,
},
target: {
type: String,
required: false,
default: null,
},
})
</script>
+58
View File
@@ -0,0 +1,58 @@
<!--
@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>
<li :class="classes">
<a
:href="href"
:target="target"
:title="label"
>
<img
class="cm-app-icon"
:src="icon"
:alt="label"
/>
<span class="cm-app-text">{{ label }}</span>
</a>
</li>
</template>
<script setup>
const { label, icon, href, classes, target } = defineProps({
label: {
type: String,
required: true,
},
icon: {
type: String,
required: true,
},
href: {
type: String,
required: true,
},
classes: {
type: Object,
required: true,
},
target: {
type: String,
required: false,
default: null,
},
})
</script>
+103
View File
@@ -0,0 +1,103 @@
<template>
<div class="cm-settings-btn cm-settings-btn--save">
<NcButton
variant="success"
@click="save"
>
<template v-if="!loading">
{{ t('side_menu', 'Save') }}
</template>
<NcLoadingIcon v-else />
</NcButton>
<div
v-if="error"
id="error"
>
{{ error }}
</div>
</div>
</template>
<script setup>
import { NcButton, NcLoadingIcon } from '@nextcloud/vue'
import { ref } from 'vue'
import { waitPasswordConfirmation } from '../../lib/setting.js'
const loading = ref(false)
const error = ref(null)
const { config } = defineProps({
config: {
type: Object,
required: true,
},
})
const filterConfig = (value) => {
const result = {}
for (let key in value) {
if (['cache-categories', 'cache', 'langs', 'enabled'].includes(key) === false) {
result[key] = value[key]
}
}
return result
}
const save = async () => {
const data = filterConfig(config)
const size = Object.keys(data).length
let counter = 0
loading.value = true
error.value = null
const update = () => {
++counter
if (counter === size) {
loading.value = false
if (!error.value) {
location.reload()
}
}
}
waitPasswordConfirmation()
.then(() => {
for (let key in data) {
let value = data[key]
if (Array.isArray(value) || typeof value === 'object') {
value = JSON.stringify(value)
} else if (typeof value === 'boolean') {
value = value ? '1' : '0'
}
OCP.AppConfig.setValue('side_menu', key, value.toString(), {
success() {
update()
},
error() {
error.value = `Error while saving ${key}`
update()
},
})
}
})
.catch(() => {
counter = 0
loading.value = false
error.value = null
})
}
</script>
<style scoped>
#error {
padding-top: 10px;
color: red;
}
</style>
+18
View File
@@ -0,0 +1,18 @@
<template>
<a
:href="href"
rel="noopener"
target="_blank"
>
<slot></slot>
</a>
</template>
<script setup>
defineProps({
href: {
type: String,
required: true,
},
})
</script>
@@ -15,30 +15,21 @@ 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/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<template> <template>
<div v-bind:class="classes"> <h2>{{ t('side_menu', label) }}</h2>
<a v-if="link !== null" v-bind:href="link">
<img v-bind:src="image">
</a>
<img v-else v-bind:src="image">
</div>
</template> </template>
<script> <script setup>
export default { const { label } = defineProps({
name: 'Logo', label: {
props: {
image: {
type: String, type: String,
required: true required: true,
}, },
link: { })
type: String,
required: false
},
classes: {
type: Object,
required: true
},
},
}
</script> </script>
<style scoped>
h2 {
font-size: 1.3em;
margin: 0 0 12px 0;
}
</style>
@@ -15,33 +15,26 @@ 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/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
--> -->
<template> <template>
<div class="side-menu-settings"> <div
<a v-bind:href="href"> class="cm-settings-item"
{{ label }} :class="{ 'cm-settings-item--disabled': disabled }"
>
<span class="avatardiv avatardiv-shown"> <slot></slot>
<img v-bind:src="avatar" v-bind:alt="name" v-bind:title="name">
</span>
</a>
</div> </div>
</template> </template>
<script> <script setup>
export default { const { disabled } = defineProps({
name: 'SettingsButton', disabled: {
props: { type: Boolean,
label: { required: false,
type: String, default: false,
required: true
}, },
href: { })
type: String,
required: true
},
avatar: {
type: String,
required: true
},
},
}
</script> </script>
<style scoped>
.disabled {
display: block;
}
</style>
+71
View File
@@ -0,0 +1,71 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div
class="cm-settings-item-label"
:class="{
'cm-settings-item-label--short': short,
'cm-settings-item-label--top': top,
'cm-settings-item-label--middle': middle,
}"
>
{{ t('side_menu', label) }}
<template v-if="help">
<br />
<em>{{ t('side_menu', help) }}</em>
</template>
<template v-if="help2">
<br />
<em>{{ t('side_menu', help2) }}</em>
</template>
</div>
</template>
<script setup>
const { short, label } = defineProps({
short: {
type: Boolean,
required: false,
default: false,
},
label: {
type: String,
required: true,
},
middle: {
type: Boolean,
required: false,
default: false,
},
top: {
type: Boolean,
required: false,
default: true,
},
help: {
type: [String, null],
required: false,
default: null,
},
help2: {
type: [String, null],
required: false,
default: null,
},
})
</script>
+34
View File
@@ -0,0 +1,34 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div
class="side-menu-setting-form"
:class="{ 'side-menu-setting-form-long': long }"
>
<slot></slot>
</div>
</template>
<script setup>
const { long } = defineProps({
long: {
type: Boolean,
required: false,
default: false,
},
})
</script>
@@ -0,0 +1,34 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div
class="cm-settings-section"
:class="{ 'cm-settings-section--hidden': hidden }"
>
<slot></slot>
</div>
</template>
<script setup>
defineProps({
hidden: {
type: Boolean,
required: false,
default: false,
},
})
</script>
@@ -0,0 +1,99 @@
<template>
<div class="cm-settings-btn cm-settings-btn--save">
<NcButton
variant="success"
@click="save"
>
<template v-if="!loading">
{{ t('side_menu', 'Save') }}
</template>
<NcLoadingIcon v-else />
</NcButton>
<div
v-if="error"
id="error"
></div>
</div>
</template>
<script setup>
import { NcButton, NcLoadingIcon } from '@nextcloud/vue'
import { ref } from 'vue'
const loading = ref(false)
const error = ref(null)
const { config } = defineProps({
config: {
type: Object,
required: true,
},
})
const filterConfig = (value) => {
const result = {}
for (let key in value) {
result[key] = value[key]
}
return result
}
const save = async () => {
const data = filterConfig(config)
const size = Object.keys(data).length
const url = OC.generateUrl('/apps/side_menu/user/valueSet')
let counter = 0
loading.value = true
error.value = null
const update = () => {
++counter
if (counter === size) {
loading.value = false
if (!error.value) {
location.reload()
}
}
}
for (let key in data) {
let value = data[key]
let formData = []
if (Array.isArray(value) || typeof value === 'object') {
value = JSON.stringify(value)
} else if (typeof value === 'boolean') {
value = value ? '1' : '0'
}
formData.push('name=' + encodeURIComponent(key))
formData.push('value=' + encodeURIComponent(value.toString()))
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: formData.join('&'),
})
.then(update)
.catch(() => {
error.value = `Error while saving ${key}`
update()
})
}
}
</script>
<style scoped>
#error {
padding-top: 10px;
color: red;
}
</style>
@@ -0,0 +1,292 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-settings-form-appcategory">
<NcButton
aria-label="t('side_menu', 'Customize')"
variant="primary"
@click="openModal"
>
{{ t('side_menu', 'Customize') }}
</NcButton>
<NcModal
v-if="modal"
class="cm-settings-form-appcategory-modal"
@close="closeModal"
>
<div class="modal__content">
<div class="menu">
<NcButton
aria-label="t('side_menu', 'Categories')"
:variant="section === 'cats' ? 'primary' : 'secondary'"
@click="setSection('cats')"
>
{{ t('side_menu', 'Categories') }}
</NcButton>
<NcButton
aria-label="t('side_menu', 'Applications')"
:variant="section === 'apps' ? 'primary' : 'secondary'"
@click="setSection('apps')"
>
{{ t('side_menu', 'Applications') }}
</NcButton>
</div>
<div v-if="section === 'cats'">
<table
v-if="!newCustomCategory && editCustomCategoryKey === null"
width="100%"
>
<tbody>
<tr
v-for="(item, key) in categoriesCustom"
:key="key"
>
<td>{{ item[langs[0]] }}</td>
<td width="50px">
<NcActions>
<NcActionButton
icon="icon-edit"
@click="editCustomCategory(key)"
></NcActionButton>
<NcActionButton
icon="icon-delete"
@click="removeCustomCategory(key)"
></NcActionButton>
</NcActions>
</td>
</tr>
</tbody>
</table>
<div
v-else
class="form"
>
<template v-if="newCustomCategory">
<NcTextField
v-for="lang in langs"
:key="lang"
v-model="newCustomCategory[lang]"
:label="lang"
/>
</template>
<template v-if="editCustomCategoryKey !== null">
<NcTextField
v-for="lang in langs"
:key="lang"
v-model="categoriesCustom[editCustomCategoryKey][lang]"
:label="lang"
/>
</template>
</div>
</div>
<div v-if="section === 'apps'">
<table width="100%">
<tbody>
<tr
v-for="item in apps"
:key="item.id"
>
<td>
<img
:src="item.icon"
:alt="item.name"
/>
{{ item.name }}
</td>
<td width="50%">
<FormSelect
v-model="appsCategoriesCustom[item.id]"
:options="getOptions(categoriesCustom)"
:required="false"
/>
</td>
</tr>
</tbody>
</table>
</div>
<div class="modal__footer">
<template v-if="section === 'cats'">
<template v-if="newCustomCategory">
<NcActions>
<NcActionButton
icon="icon-close"
@click="cancelCustomCategory"
></NcActionButton>
</NcActions>
<NcActions>
<NcActionButton
icon="icon-checkmark"
@click="saveCustomCategory"
></NcActionButton>
</NcActions>
</template>
<template v-if="editCustomCategoryKey !== null">
<NcActions>
<NcActionButton
icon="icon-close"
@click="cancelCustomCategory"
></NcActionButton>
</NcActions>
</template>
<template v-else>
<NcActions>
<NcActionButton
v-if="!newCustomCategory && editCustomCategoryKey === null"
icon="icon-add"
@click="addCustomCategory"
></NcActionButton>
<NcActionButton
v-if="editCustomCategoryKey !== null"
icon="icon-checkmark"
@click="saveCustomCategory"
></NcActionButton>
</NcActions>
</template>
</template>
<NcButton
variant="primary"
class="btn-close"
@click="closeModal"
>
{{ t('side_menu', 'Close') }}
</NcButton>
</div>
</div>
</NcModal>
</div>
</template>
<script setup>
import { NcButton, NcModal, NcActions, NcActionButton, NcTextField } from '@nextcloud/vue'
import { useNavStore } from '../../../store/nav.js'
import { ref, onMounted, watch } from 'vue'
import FormSelect from './FormSelect'
const emit = defineEmits(['update:categoriesCustom', 'update:appsCategoriesCustom'])
const { categoriesCustom, appsCategoriesCustom, langs } = defineProps({
categoriesCustom: {
type: Array,
required: true,
},
appsCategoriesCustom: {
type: [Object, Array],
required: true,
},
langs: {
type: Array,
required: true,
},
})
const navStore = useNavStore()
const modal = ref(false)
const apps = ref([])
const categories = ref([])
const section = ref('apps')
const newCustomCategory = ref(null)
const editCustomCategoryKey = ref(null)
const openModal = () => {
modal.value = true
}
const closeModal = () => {
modal.value = false
}
const setSection = (value) => {
section.value = value
}
const addCustomCategory = () => {
let data = {
id: 'cat' + Math.random().toString().replace('0.', ''),
}
langs.forEach((lang) => {
data[lang] = ''
})
newCustomCategory.value = data
}
const cancelCustomCategory = () => {
newCustomCategory.value = null
editCustomCategoryKey.value = null
}
const saveCustomCategory = () => {
const data = categoriesCustom
if (editCustomCategoryKey.value === null) {
data.push({ ...newCustomCategory.value })
}
emit('update:categoriesCustom', data)
newCustomCategory.value = null
editCustomCategoryKey.value = null
}
const removeCustomCategory = (key) => {
const data = categoriesCustom
delete data[key]
emit('update:categoriesCustom', Object.values(data))
}
const editCustomCategory = (key) => {
editCustomCategoryKey.value = key
}
const getOptions = (custom) => {
const data = []
custom.forEach((item) => {
data.push({ id: item.id, label: item[langs[0]] })
})
categories.value.forEach((item) => {
data.push({ id: item.categoryId, label: item.name !== '' ? item.name : t('side_menu', 'Other') })
})
data.sort((a, b) => (a.label < b.label ? -1 : 1))
return data
}
onMounted(async () => {
apps.value = await navStore.getApps()
categories.value = await navStore.getCategories()
let value = {}
apps.value.forEach((app) => {
if (!appsCategoriesCustom[app.id]) {
value[app.id] = null
} else {
value[app.id] = appsCategoriesCustom[app.id]
}
})
emit('update:appsCategoriesCustom', value)
})
</script>
@@ -0,0 +1,82 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-settings-form-apppicker">
<NcButton
aria-label="t('side_menu', 'Select apps')"
variant="primary"
@click="openModal"
>
{{ t('side_menu', 'Select apps') }} ({{ model.length }})
</NcButton>
<NcModal
v-if="modal"
size="small"
class="cm-settings-form-apppicker-modal"
@close="closeModal"
>
<div class="modal__content">
<NcCheckboxRadioSwitch
v-for="(item, key) in apps"
:key="key"
v-model="model"
name="value"
:value="item.id"
>
<img
:src="item.icon"
:alt="item.name"
/>
{{ item.name }}
</NcCheckboxRadioSwitch>
<div class="modal__footer">
<NcButton
variant="primary"
@click="closeModal"
>
{{ t('side_menu', 'Close') }}
</NcButton>
</div>
</div>
</NcModal>
</div>
</template>
<script setup>
import { NcButton, NcModal, NcCheckboxRadioSwitch } from '@nextcloud/vue'
import { useNavStore } from '../../../store/nav.js'
import { ref, onMounted } from 'vue'
const model = defineModel({ type: Array })
const navStore = useNavStore()
const modal = ref(false)
const apps = ref([])
const openModal = () => {
modal.value = true
}
const closeModal = () => {
modal.value = false
}
onMounted(async () => {
apps.value = await navStore.getCoreApps()
})
</script>
@@ -0,0 +1,116 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-settings-form-appsort">
<NcButton
aria-label="t('side_menu', 'Sort')"
variant="primary"
@click="openModal"
>
{{ t('side_menu', 'Sort') }}
</NcButton>
<NcModal
v-if="modal"
size="small"
class="cm-settings-form-appsort-modal"
@close="closeModal"
>
<div class="modal__content">
<draggable
v-model="apps"
item-key="id"
@end="update"
>
<template #item="{ element }">
<div class="cm-settings-form-draggable">
<span class="cm-settings-form-arrow">⇅</span>
{{ element.name }}
</div>
</template>
</draggable>
<div class="modal__footer">
<NcButton
variant="primary"
@click="closeModal"
>
{{ t('side_menu', 'Close') }}
</NcButton>
</div>
</div>
</NcModal>
</div>
</template>
<script setup>
import { NcButton, NcModal } from '@nextcloud/vue'
import { useNavStore } from '../../../store/nav.js'
import { ref, onMounted } from 'vue'
import draggable from 'vuedraggable'
const model = defineModel({ type: Array })
const emit = defineEmits(['update:modelValue'])
const navStore = useNavStore()
const modal = ref(false)
const apps = ref([])
const openModal = () => {
modal.value = true
}
const closeModal = () => {
modal.value = false
}
const setApps = (items) => {
apps.value = []
model.value.forEach((id) => {
items.forEach((app) => {
if (app.id === id) {
apps.value.push(app)
}
})
})
items.forEach((app) => {
if (!apps.value.find((element) => element.id === app.id)) {
apps.value.push(app)
}
})
}
const update = () => {
const value = []
apps.value.forEach((app) => {
value.push(app.id)
})
emit('update:modelValue', value)
}
onMounted(async () => {
const items = await navStore.getCoreApps()
window.setTimeout(() => {
setApps(items)
}, 500)
})
</script>
@@ -0,0 +1,119 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-settings-form-catsort">
<NcButton
aria-label="t('side_menu', 'Sort')"
variant="primary"
@click="openModal"
>
{{ t('side_menu', 'Sort') }}
</NcButton>
<NcModal
v-if="modal"
size="small"
class="cm-settings-form-catsort-modal"
@close="closeModal"
>
<div class="modal__content">
<draggable
v-model="apps"
item-key="categoryId"
@end="update"
>
<template #item="{ element }">
<div
v-if="element.name !== ''"
class="cm-settings-form-draggable"
>
<span class="cm-settings-form-arrow">⇅</span>
{{ element.name }}
</div>
</template>
</draggable>
<div class="modal__footer">
<NcButton
variant="primary"
@click="closeModal"
>
{{ t('side_menu', 'Close') }}
</NcButton>
</div>
</div>
</NcModal>
</div>
</template>
<script setup>
import { NcButton, NcModal } from '@nextcloud/vue'
import { useNavStore } from '../../../store/nav.js'
import { ref, onMounted } from 'vue'
import draggable from 'vuedraggable'
const model = defineModel({ type: Array })
const emit = defineEmits(['update:modelValue'])
const navStore = useNavStore()
const modal = ref(false)
const apps = ref([])
const openModal = () => {
modal.value = true
}
const closeModal = () => {
modal.value = false
}
const setApps = (items) => {
apps.value = []
model.value.forEach((id) => {
items.forEach((app) => {
if (app.categoryId === id) {
apps.value.push(app)
}
})
})
items.forEach((app) => {
if (!apps.value.find((element) => element.categoryId === app.categoryId)) {
apps.value.push(app)
}
})
}
const update = () => {
const value = []
apps.value.forEach((app) => {
value.push(app.categoryId)
})
emit('update:modelValue', value)
}
onMounted(async () => {
const items = await navStore.getCategories()
window.setTimeout(() => {
setApps(items)
}, 500)
})
</script>
@@ -0,0 +1,34 @@
<!--
@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>
<NcColorPicker
v-model="model"
:advancedFields="true"
class="cm-settings-form-colorpicker"
>
<div
:style="{ 'background-color': model }"
class="cm-settings-form-colorpicker-value"
/>
</NcColorPicker>
</template>
<script setup>
import { NcColorPicker } from '@nextcloud/vue'
const model = defineModel({ type: String })
</script>
@@ -0,0 +1,85 @@
<template>
<div class="cm-settings-form-displaypicker">
<div class="cm-settings-button-inline">
<NcButton
:variant="is(false, false, false) ? 'primary' : 'seconday'"
@click="update(false, false, false)"
>
{{ t('side_menu', 'Default') }}
</NcButton>
<NcButton
:variant="is(true, false, false) ? 'primary' : 'seconday'"
@click="update(true, false, false)"
>
{{ t('side_menu', 'Always displayed') }}
</NcButton>
<NcButton
:variant="is(false, true, false) ? 'primary' : 'seconday'"
@click="update(false, true, false)"
>
{{ t('side_menu', 'Big menu') }}
</NcButton>
<NcButton
:variant="is(false, false, true) ? 'primary' : 'seconday'"
@click="update(false, false, true)"
>
{{ t('side_menu', 'With categories') }}
</NcButton>
</div>
<p>
<img
v-if="is(false, false, false)"
:src="DefaultImg"
/>
<img
v-if="is(true, false, false)"
:src="AlwaysDisplayedImg"
/>
<img
v-if="is(false, true, false)"
class="side-menu-display"
:src="TopWideImg"
/>
<img
v-if="is(false, false, true)"
:src="SideMenuWithCategoriesImg"
/>
</p>
</div>
</template>
<script setup>
import { NcButton } from '@nextcloud/vue'
import AlwaysDisplayedImg from '../../../../img/admin/layout-always-displayed.svg'
import TopWideImg from '../../../../img/admin/layout-big-menu.svg'
import SideMenuWithCategoriesImg from '../../../../img/admin/layout-side-menu-with-categories.svg'
import DefaultImg from '../../../../img/admin/layout-default.svg'
const emit = defineEmits(['update:alwaysDisplayed', 'update:topWideMenu', 'update:sideMenuWithCategories'])
const { alwaysDisplayed, topWideMenu, sideMenuWithCategories } = defineProps({
alwaysDisplayed: {
type: Boolean,
required: true,
},
topWideMenu: {
type: Boolean,
required: true,
},
sideMenuWithCategories: {
type: Boolean,
required: true,
},
})
const update = (isAlwayDisplayed, isTopWideMenu, isSideMenuWithCategories) => {
emit('update:alwaysDisplayed', isAlwayDisplayed)
emit('update:topWideMenu', isTopWideMenu)
emit('update:sideMenuWithCategories', isSideMenuWithCategories)
}
const is = (isAlwayDisplayed, isTopWideMenu, isSideMenuWithCategories) => {
return isAlwayDisplayed === alwaysDisplayed && isTopWideMenu === topWideMenu && isSideMenuWithCategories === sideMenuWithCategories
}
</script>
@@ -0,0 +1,37 @@
<!--
@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>
<FormSelect
v-model="model"
class="cm-settings-form-opener"
:options="options"
/>
</template>
<script setup>
import FormSelect from './FormSelect'
const model = defineModel({ type: String })
const options = [
{ id: 'side-menu-opener', label: 'Default' },
{ id: 'side-menu-opener-dark', label: 'Default (dark)' },
{ id: 'side-menu-opener-hamburger', label: 'Hamburger' },
{ id: 'side-menu-opener-hamburger-dark', label: 'Hamburger (dark)' },
{ id: 'side-menu-opener-hamburger-2', label: 'Hamburger 2' },
{ id: 'side-menu-opener-hamburger-2-dark', label: 'Hamburger 2 (dark)' },
]
</script>
@@ -0,0 +1,65 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-settings-form-range">
<em
v-if="prepend"
class="cm-settings-form-range-prepend"
>{{ t('side_menu', prepend) }}</em
>
<input
v-model="model"
type="range"
:min="min"
:max="max"
/>
<em
v-if="append"
class="cm-settings-form-range-append"
>{{ t('side_menu', append) }}</em
>
</div>
</template>
<script setup>
const model = defineModel({ type: Number })
defineProps({
prepend: {
type: [String, null],
required: false,
default: null,
},
append: {
type: [String, null],
required: false,
default: null,
},
min: {
type: Number,
required: false,
default: 0,
},
max: {
type: Number,
required: false,
default: 100,
},
})
</script>
@@ -0,0 +1,78 @@
<!--
@license GNU AGPL version 3 or any later version
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
-->
<template>
<div class="cm-settings-form-select">
<template v-if="!expanded">
<select
v-if="!expanded"
v-model="model"
:multiple="multiple"
>
<option
v-if="!required"
:value="null"
></option>
<option
v-for="option in options"
:key="option.id"
:value="option.id"
>
{{ t('side_menu', option.label) }}
</option>
</select>
</template>
<template v-else>
<NcCheckboxRadioSwitch
v-for="option in options"
:key="option.id"
v-model="model"
:value="option.id"
:type="multiple ? 'checkbox' : 'radio'"
name="value"
>
{{ t('side_menu', option.label) }}
</NcCheckboxRadioSwitch>
</template>
</div>
</template>
<script setup>
import { NcCheckboxRadioSwitch } from '@nextcloud/vue'
const model = defineModel({ type: [Number, String, Array, null] })
const { options, expanded } = defineProps({
options: {
type: Array,
required: true,
},
required: {
type: Boolean,
required: false,
default: true,
},
expanded: {
type: Boolean,
required: false,
default: false,
},
multiple: {
type: Boolean,
required: false,
default: false,
},
})
</script>
+35
View File
@@ -0,0 +1,35 @@
<!--
@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>
<FormSelect
v-model="model"
class="cm-settings-form-size"
:options="options"
/>
</template>
<script setup>
import FormSelect from './FormSelect'
const model = defineModel({ type: String })
const options = [
{ id: 'hidden', label: 'Hidden' },
{ id: 'small', label: 'Small' },
{ id: 'normal', label: 'Normal' },
{ id: 'big', label: 'Big' },
]
</script>
@@ -0,0 +1,29 @@
<!--
@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>
<NcCheckboxRadioSwitch
v-model="model"
class="cm-settings-form-yesno"
type="switch"
/>
</template>
<script setup>
import { NcCheckboxRadioSwitch } from '@nextcloud/vue'
const model = defineModel({ type: Boolean })
</script>
+13
View File
@@ -0,0 +1,13 @@
import FormRange from './FormRange'
import FormColorPicker from './FormColorPicker'
import FormOpener from './FormOpener'
import FormSelect from './FormSelect'
import FormYesNo from './FormYesNo'
import FormSize from './FormSize'
import FormAppPicker from './FormAppPicker'
import FormAppSort from './FormAppSort'
import FormCatSort from './FormCatSort'
import FormDisplayPicker from './FormDisplayPicker'
import FormAppCategory from './FormAppCategory'
export { FormRange, FormColorPicker, FormOpener, FormSelect, FormYesNo, FormSize, FormAppPicker, FormAppSort, FormCatSort, FormDisplayPicker, FormAppCategory }
+10
View File
@@ -0,0 +1,10 @@
import SettingsSection from './SettingsSection'
import SettingItem from './SettingItem'
import SettingLabel from './SettingLabel'
import SettingValue from './SettingValue'
import SectionTitle from './SectionTitle'
import ExternalLink from './ExternalLink'
import AdminSaveButton from './AdminSaveButton'
import UserSaveButton from './UserSaveButton'
export { SettingsSection, SettingItem, SettingLabel, SettingValue, SectionTitle, ExternalLink, AdminSaveButton, UserSaveButton }
+112
View File
@@ -0,0 +1,112 @@
'Custom menu': 'Uživatelsky určená nabídka'
'Enable the custom menu': 'Zapnout uživatelsky určenou nabídku'
'No': 'Ne'
'Yes': 'Ano'
'Menu': 'Nabídka'
'Use the shortcut Ctrl+o to open and to hide the side menu. Use tab key to navigate.': 'Pro otevření/skrytí postranní nabídky použijte zkratku Ctrl+o („O“ jako otevřít). Pro pohyb po použijte klávesu tab key.'
'Top menu': 'Horní nabídka'
'Apps that not must be moved in the side menu': 'Aplikace, které nepřesouvat do postranní nabídky'
'If there is no selection then the global configuration is applied.': 'Pokud neexistuje žádný výběr, je uplatněno globální nastavení.'
'Experimental': 'Experimentální'
'Save': 'Uložit'
'You like this app and you want to support me?': 'Líbí se vám tato aplikace a chcete podpořit její vývoj?'
'Buy me a coffee ☕': 'Kupte mi kafe ☕'
'Hidden': 'Skryté'
'Small': 'Malé'
'Normal': 'Normální'
'Big': 'Velké'
'Colors': 'Barvy'
'Background color': 'Barva pozadí'
'Background color of current app': 'Barva pozadí stávající aplikace'
'Text color': 'Barva textu'
'Loader': 'Nástroj pro načítání'
'Icon': 'Ikona'
'Same color': 'Stejná barva'
'Opposite color': 'Doplňková barva'
'Transparent': 'Průhledné'
'Opaque': 'Neprůhledné'
'Opener': 'Tlačítko pro otevření'
'Default': 'Výchozí'
'Default (dark)': 'Výchozí (tmavé)'
'Hamburger': 'Hamburger'
'Hamburger (dark)': 'Hamburger (tmavé)'
'Hamburger 2': 'Hamburger 2'
'Hamburger 2 (dark)': 'Hamburger 2 (tmavé)'
'Before the logo': 'Před logem'
'After the logo': 'Za logem'
'Position': 'Pozice'
'Show only the opener (hidden logo)': 'Zobrazovat pouze otevírací tlačítko (logo skryto)'
'Do not display the side menu and the opener if there is no application (eg: public pages).': 'Nezobrazovat postranní nabídku a její otevírací tlačítko pokud nejsou dostupné žádné aplikace (např. na veřejných stránkách).'
'Panel': 'Panel'
'Open the menu when the mouse is hover the opener (automatically disabled on touch screens)': 'Otevřít nabídku při najetím ukazatelem na tlačítko nabídky (automaticky vypnuto pro dotykové obrazovky)'
'Display the big menu': 'Zobrazit velkou nabídku'
'Display the logo': 'Zobrazit logo'
'Icons and texts': 'Ikony a texty'
'Loader enabled': 'Načítání zapnuto'
'Tips': 'Tipy'
'Always displayed': 'Vždy zobrazeno'
'This is the automatic behavior when the menu is always displayed.': 'Toto je automatické chování, kdy je nabídka vždy zobrazena.'
'Not compatible with touch screens.': 'Nekompatibilní s dotykovými obrazovkami.'
'Big menu': 'Velká nabídka'
'Live preview': 'Živý náhled'
'Open apps in new tab': 'Otevírat aplikace v novém panelu'
'Use the global setting': 'Použít globální nastavení'
'Use my selection': 'Použít můj výběr'
'Show and hide the list of applications': 'Zobrazit/skrýt seznam aplikací'
'Use the avatar instead of the logo': 'Použít namísto loga profilový obrázek uživatele'
'You do not have permission to change the settings.': 'Nemáte oprávnění měnit nastavení.'
'Force this configuration to users': 'Vynutit uplatnění těchto nastavení uživatelům'
'Export the configuration': 'Exportovat nastavení'
'Purge the cache': 'Vyprázdnit mezipaměť'
'Show the link to settings': 'Zobrazit odkaz na nastavení'
'The menu is enabled by default for users': 'Nabídka je ve výchozím stavu pro uživatele zapnutá'
'Except when the configuration is forced.': 'S výjimkou, kdy je nastavení vynuceno.'
'Apps that should not be displayed in the menu': 'Aplikace, které by neměly být v nabídce zobrazeny'
'This feature is only compatible with the <code>big menu</code> display.': 'Tato funkce je kompatibilní pouze s <code>velkou nabídkou</code>.'
'The logo is a link to the default app': 'Logo je odkaz na výchozí aplikaci'
'Others': 'Ostatní'
'Categories': 'Kategorie'
'Customize sorting': 'Přizpůsobit si řazení'
'Order by': 'Řadit podle'
'Name': 'Název'
'Customed': 'Přizpůsobeno'
'Show and hide the list of categories': 'Zobrazit/skrýt seznam kategorií'
'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'
'With categories': 'S kategoriemi'
'Custom categories': 'Vlastní kategorie'
'Customize application categories': 'Přizpůsobte kategorie aplikací'
'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'
'Applications': 'Aplikace'
'Applications kept in the top menu': 'Aplikace ponechané v horní nabídce'
'Applications kept in the top menu but also shown in side menu': 'Aplikace ponechané v horní nabídce ale také zobrazené v té boční'
'These applications must be selected in the previous option.': 'Tyto aplikace je třeba vybrat v předchozí volbě.'
'Hide labels on mouse over': 'Skrýt popisky při najetím ukazatele myši'
'Except the hovered app': 'S výjimkou nadnášené aplikace'
'Search': 'Hledat'
'Toggle the menu': 'Vyp/zap nabídku'
'Open the documentation': 'Open the documentation'
'Ask the developer': 'Zeptejte se vývojáře'
'New request': 'Nový požadavek'
'Report a bug': 'Nahlásit chybu'
'Show the configuration': 'Zobrazit nastavení'
'Configuration:': 'Configuration:'
'Done!': 'Hotovo!'
'Copy': 'Zkopírovat'
'Need help': 'Potřebuji pomoc'
'I would like a new feature': 'Rád bych novou funkci v aplikaci'
'Something went wrong': 'Něco se pokazilo'
'Select apps': 'Vyberte aplikace'
'Sort': 'Seřadit'
'Customize': 'Přizpůsobit'
'Custom': 'Custom'
'Close': 'Zavřít'
'Show the search form': 'Show the search form'
+112 -76
View File
@@ -1,76 +1,112 @@
"Custom menu": "Benutzerdefiniertes Menü" 'Custom menu': 'Benutzerdefiniertes Menü'
"Enable the custom menu": "Aktiviere das Benutzerdefiniertes Menü" 'Enable the custom menu': 'Benutzerdefiniertes Menü aktivieren'
"No": "Nein" 'No': 'Nein'
"Yes": "Ja" 'Yes': 'Ja'
"Menu": "Menü" 'Menu': 'Menü'
'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.': 'Verwende die Tastenkombination <span class="keyboard-key">Strg</span>+<span class="keyboard-key">o</span>, um das Seitenmenü ein- und auszublenden. Verwende <span class="keyboard-key">tab</span> zum Navigieren.' 'Use the shortcut Ctrl+o to open and to hide the side menu. Use tab key to navigate.': 'Verwende die Tastenkombination <span class="keyboard-key">Strg</span>+o, um das Seitenmenü ein- und auszublenden. Verwende tab key zum Navigieren.'
"Top menu": "Hauptmenü" 'Top menu': 'Obere Navigationsleiste'
"Apps that not must be moved in the side menu": "Apps, die nicht ins Seitenmenü verschoben werden müssen" 'Apps that not must be moved in the side menu': 'Apps, die nicht ins Seitenmenü verschoben werden sollen'
"If there is no selection then the global configuration is applied.": "Wenn keine Auswahl vorhanden ist, wird die globale Konfiguration angewendet." 'If there is no selection then the global configuration is applied.': 'Wenn keine Auswahl vorhanden ist, wird die globale Konfiguration angewendet.'
"Experimental": "Experimentell" 'Experimental': 'Experimentell'
"Save": "Speichern" 'Save': 'Speichern'
"You like this app and you want to support me?": "Du magst diese App und möchtest mich unterstützen?" 'You like this app and you want to support me?': 'Du magst diese App und möchtest mich unterstützen?'
"Buy me a coffee ☕": "Gib mir einen Kaffee ☕" 'Buy me a coffee ☕': 'Gib mir einen Kaffee aus ☕'
"Hidden": "Versteckt" 'Hidden': 'Ausblenden'
"Small": "Klein" 'Small': 'Klein'
"Normal": "Normal" 'Normal': 'Normal'
"Big": "Groß" 'Big': 'Groß'
"Colors": "Farben" 'Colors': 'Farben'
"Background color": "Hintergrundfarbe" 'Background color': 'Hintergrundfarbe'
"Background color of current app": "Hintergrundfarbe der aktuellen App" 'Background color of current app': 'Hintergrundfarbe der aktuellen App'
"Text color": "Textfarbe" 'Text color': 'Textfarbe'
"Loader": "Ladestandanzeige" 'Loader': 'Fortschrittsbalken'
"Icon": "Symbol" 'Icon': 'Symbol'
"Same color": "Selbe Farbe" 'Same color': 'Selbe Farbe'
"Opposite color": "Gegenfarbe" 'Opposite color': 'Gegenfarbe'
"Transparent": "Transparent" 'Transparent': 'Transparent'
"Opaque": "Undurchsichtig" 'Opaque': 'Nicht transparent'
"Opener": "Öffner" 'Opener': 'Menü-Symbol'
"Default": "Standard" 'Default': 'Standard'
"Default (dark)": "Standard (dunkel)" 'Default (dark)': 'Standard (dunkel)'
"Hamburger": "Hamburger" 'Hamburger': 'Hamburger'
"Hamburger (dark)": "Hamburger (dunkel)" 'Hamburger (dark)': 'Hamburger (dunkel)'
"Hamburger 2": "Hamburger 2" 'Hamburger 2': 'Hamburger 2'
"Hamburger 2 (dark)": "Hamburger 2 (dunkel)" 'Hamburger 2 (dark)': 'Hamburger 2 (dunkel)'
"Before the logo": "Vor dem Logo" 'Before the logo': 'Vor dem Logo'
"After the logo": "Nach dem Logo" 'After the logo': 'Nach dem Logo'
"Position": "Position" 'Position': 'Position'
"Show only the opener (hidden logo)": "Nur den Öffner anzeigen (verstecktes Logo)" 'Show only the opener (hidden logo)': 'Nur das Menü-Symbol anzeigen (Logo wird ausgeblendet)'
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Zeige das Seitenmenü und den Öffner nicht an, wenn keine Anwendung vorhanden ist (z.B. bei öffentlichen Seiten)." 'Do not display the side menu and the opener if there is no application (eg: public pages).': 'Zeige das Seitenmenü und das Menü-Symbol nicht an, wenn keine App vorhanden ist (z.B. bei öffentlichen Seiten).'
"Panel": "Panel" 'Panel': 'Panel'
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Öffne das Menü, wenn die Maus über den Öffner bewegt wird (auf Touchscreens automatisch deaktiviert)." 'Open the menu when the mouse is hover the opener (automatically disabled on touch screens)': 'Öffne das Menü, wenn die Maus über das Menü-Symbol bewegt wird (auf Touchscreens automatisch deaktiviert)'
"Display the big menu": "Großes Menü anzeigen" 'Display the big menu': 'Großes Menü anzeigen'
"The big menu is not compatible with AppOrder.": "Das große Menü ist nicht mit AppOrder kompatibel." 'Display the logo': 'Logo anzeigen'
"Display the logo": "Logo anzeigen" 'Icons and texts': 'Symbole und Texte'
"This feature is not compatible with the <code>big menu</code> display.": "Diese Funktion ist nicht mit <code>großes Menü</code> kompatibel." 'Loader enabled': 'Fortschrittsbalken anzeigen'
"Icons and texts": "Symbole und Texte" 'Tips': 'Tipps'
"Loader enabled": "Loader aktiviert" 'Always displayed': 'Immer anzeigen'
"Tips": "Tipps" 'This is the automatic behavior when the menu is always displayed.': 'Dies ist das automatische Verhalten, wenn das Menü immer angezeigt wird.'
"Always displayed": "Wird immer angezeigt" 'Not compatible with touch screens.': 'Nicht kompatibel mit Touchscreens.'
"The logo will be hidden when the menu is always displayed.": "Das Logo wird ausgeblendet, wenn das Menü immer angezeigt wird." 'Big menu': 'Großes Menü'
"This is the automatic behavior when the menu is always displayed.": "Dies ist das automatische Verhalten, wenn das Menü immer angezeigt wird." 'Live preview': 'Live-Vorschau'
"Not compatible with touch screens.": "Nicht kompatibel mit Touchscreens." 'Open apps in new tab': 'Öffne Apps in einem neuen Tab'
"Big menu": "Großes Menü" 'Use the global setting': 'Verwende die globale Einstellung'
"Live preview": "Live Vorschau" 'Use my selection': 'Verwende meine Auswahl'
"Open apps in new tab": "Öffne Apps in einem neuen Tab" 'Show and hide the list of applications': 'Ein- und Ausblenden der Appliste'
"Use the global setting": "Verwende die globale Einstellung" 'Use the avatar instead of the logo': 'Avatar anstelle des Logos anzeigen'
"Use my selection": "Verwende meine Auswahl" 'You do not have permission to change the settings.': 'Du hast keine Berechtigung, die Einstellungen dieser App zu ändern.'
"Show and hide the list of applications": "Ein- und Ausblenden der Anwendungsliste" 'Force this configuration to users': 'Konfiguration für alle Benutzer erzwingen'
"Use the avatar instead of the logo": "Verwenden Sie den Avatar anstelle des Logos" 'Export the configuration': 'Konfiguration exportieren'
"You do not have permission to change the settings.": "Sie haben keine Berechtigung zum Ändern der Einstellungen." 'Purge the cache': 'Cache leeren'
"Force this configuration to users": "Erzwingen Sie diese Konfiguration für Benutzer" 'Show the link to settings': 'Link zu den Einstellungen anzeigen'
"Export the configuration": "Exportieren Sie die Konfiguration" 'The menu is enabled by default for users': 'Das Menü ist standardmäßig für alle Benutzer aktiviert'
"Purge the cache": "Leeren Sie den Cache" 'Except when the configuration is forced.': 'Gilt nicht, wenn die Konfiguration erzwungen wird.'
"Show the link to settings": "Zeigen Sie den Link zu den Einstellungen an" 'Apps that should not be displayed in the menu': 'Apps, die nicht im Menü angezeigt werden sollen'
"The menu is enabled by default for users": "Das Menü ist standardmäßig für Benutzer aktiviert" 'This feature is only compatible with the <code>big menu</code> display.': 'Kompatibel mit dem <code>großen Menü</code>.'
"Except when the configuration is forced.": "Außer wenn die Konfiguration erzwungen wird." 'The logo is a link to the default app': 'Das Logo ist ein Link zur Standard-App'
"Apps that should not be displayed in the menu": "Apps, die nicht im Menü angezeigt werden sollen" 'Others': 'Andere'
"This feature is only compatible with the <code>big menu</code> display.": "Kompatibel mit der Anzeige <code> Großes Menü </ code>." 'Categories': 'Kategorien'
"The logo is a link to the default app": "Das Logo ist ein Link zur Standard-App" 'Customize sorting': 'Sortierung anpassen'
"Others": "Andere" 'Order by': 'Sortieren nach'
"Categories": "Kategorien" 'Name': 'Name'
"Customize sorting": "Sortierung anpassen" 'Customed': 'Benutzerdefiniert'
"Order by": "Sortieren nach" 'Show and hide the list of categories': 'Liste der Kategorien ein- und ausblenden'
"Name": "Name" '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.'
"Customed": "Kundenspezifisch" 'Dark mode colors': 'Farben für den dunklen Modus'
"Show and hide the list of categories": "Liste der Kategorien ein- und ausblenden" 'With categories': 'Mit Kategorien'
'Custom categories': 'Benutzerdefinierte Kategorien'
'Customize application categories': 'App-Kategorien anpassen'
'Reset to default': 'Auf Standard zurücksetzen'
'Hidden icon': 'Verstecktes Symbol'
'Small icon': 'Kleines Symbol'
'Normal icon': 'Normales Symbol'
'Big icon': 'Großes Icon'
'Hidden text': 'Versteckter Text'
'Small text': 'Kleiner Text'
'Normal text': 'Normaler Text'
'Big text': 'Großer Text'
'Applications': 'Apps'
'Applications kept in the top menu': 'Apps in der oberen Navigationsleiste'
'Applications kept in the top menu but also shown in side menu': 'Apps in der oberen Navigationsleiste, die auch im Seitenmenü angezeigt werden sollen'
'These applications must be selected in the previous option.': 'Diese Apps müssen auch in der vorherigen Einstellung ausgewählt werden.'
'Hide labels on mouse over': 'Labels ausblenden, wenn sich die Maus darüber befindet (Hover)'
'Except the hovered app': 'Außer die markierte App'
'Search': 'Suche'
'Toggle the menu': 'Menü ein- und ausblenden'
'Open the documentation': 'Open the documentation'
'Ask the developer': 'Ask the developer'
'New request': 'New request'
'Report a bug': 'Report a bug'
'Show the configuration': 'Show the configuration'
'Configuration:': 'Configuration:'
'Done!': 'Done!'
'Copy': 'Copy'
'Need help': 'Need help'
'I would like a new feature': 'I would like a new feature'
'Something went wrong': 'Something went wrong'
'Select apps': 'Select apps'
'Sort': 'Sort'
'Customize': 'Customize'
'Custom': 'Custom'
'Close': 'Close'
'Show the search form': 'Show the search form'
+112
View File
@@ -0,0 +1,112 @@
'Custom menu': 'Menú personalizado'
'Enable the custom menu': 'Activar el menú personalizado'
'No': 'No'
'Yes': 'Sí'
'Menu': 'Menú'
'Use the shortcut Ctrl+o to open and to hide the side menu. Use tab key to navigate.': 'Usa la combinación de teclas Ctrl+o para activar y desactivar el menú lateral. Use tab key para navegar.'
'Top menu': 'Menu principal'
'Apps that not must be moved in the side menu': 'Aplicaciones que no se deben mover al menú lateral'
'If there is no selection then the global configuration is applied.': 'Si no hay selección, se aplica la configuración global.'
'Experimental': 'En pruebas'
'Save': 'Guardar'
'You like this app and you want to support me?': '¿Te gusta esta aplicación y quieres apoyarme?'
'Buy me a coffee ☕': 'Cómprame un café ☕'
'Hidden': 'Oculto'
'Small': 'Pequeño'
'Normal': 'Normal'
'Big': 'Grande'
'Hidden icon': 'Ocultar Icono'
'Small icon': 'Icono pequeño'
'Normal icon': 'Icono normal'
'Big icon': 'Icono grande'
'Hidden text': 'Texto oculto'
'Small text': 'Texto pequeño'
'Normal text': 'Texto normal'
'Big text': 'Texto grande'
'Colors': 'Colores'
'Background color': 'Color de fondo'
'Background color of current app': 'Color de fondo de la aplicación actual'
'Text color': 'Color del texto'
'Loader': 'Cargador'
'Icon': 'Icono'
'Same color': 'El mismo color'
'Opposite color': 'Color opuesto'
'Transparent': 'Transparente'
'Opaque': 'Opaco'
'Opener': 'Abrir'
'Default': 'Por defecto'
'Default (dark)': 'Por defecto (oscuro)'
'Hamburger': 'Hamburguesa'
'Hamburger (dark)': 'Hamburger (negro)'
'Hamburger 2': 'Hamburguesa 2'
'Hamburger 2 (dark)': 'Hamburger 2 (negro)'
'Before the logo': 'Antes del logotipo'
'After the logo': 'Después del logotipo'
'Position': 'Posición'
'Show only the opener (hidden logo)': 'Mostrar solo abrir (ocultar logotipo)'
'Do not display the side menu and the opener if there is no application (eg: public pages).': 'No mostrar el menú lateral y el abridor si no hay aplicación (por ejemplo: páginas públicas).'
'Panel': 'Panel'
'Open the menu when the mouse is hover the opener (automatically disabled on touch screens)': 'Abra el menú cuando el ratón esté sobre el icono (se desactiva automáticamente en las pantallas táctiles)'
'Display the big menu': 'Mostrar el menú grande'
'Display the logo': 'Mostrar el logotipo'
'Icons and texts': 'Iconos y textos'
'Loader enabled': 'Cargador activado'
'Tips': 'Consejos'
'Always displayed': 'Siempre se muestra'
'This is the automatic behavior when the menu is always displayed.': 'Este es el comportamiento automático cuando aún se muestra el menú.'
'Not compatible with touch screens.': 'No es compatible con las pantallas táctiles.'
'Big menu': 'Menú grande'
'Live preview': 'Previsualización en directo'
'Open apps in new tab': 'Abrir las aplicaciones en una nueva pestaña'
'Use the global setting': 'Utilizar la configuración global'
'Use my selection': 'Utilizar mi selección'
'Show and hide the list of applications': 'Mostrar y ocultar la lista de aplicaciones'
'Use the avatar instead of the logo': 'Utilizar un avatar en lugar de un logotipo'
'You do not have permission to change the settings.': 'No tienes permiso para cambiar la configuración.'
'Force this configuration to users': 'Forzar esta configuración a todos los usuarios'
'Export the configuration': 'Exportar la configuración'
'Purge the cache': 'Vaciar la caché'
'Show the link to settings': 'Mostrar un enlace a la configuración'
'The menu is enabled by default for users': 'El menú está activado por defecto para los usuarios'
'Except when the configuration is forced.': 'Excepto cuando la configuración es forzada.'
'Apps that should not be displayed in the menu': 'Aplicaciones que no deben aparecer en el menú'
'This feature is only compatible with the <code>big menu</code> display.': 'Esta función sólo es compatible con la pantalla del <code>menú grande</code>.'
'The logo is a link to the default app': 'El logotipo es un enlace a la aplicación por defecto'
'Others': 'Otros'
'Categories': 'Categorías'
'Customize sorting': 'Personalizar la clasificación'
'Order by': 'Ordenar por'
'Name': 'Nombre'
'Customed': 'Personalizado'
'Show and hide the list of categories': 'Mostrar y ocultar la lista de categorías'
'This parameters are used when Dark theme or Breeze Dark Theme are enabled.': 'Estos parámetros se utilizan cuando el tema oscuro o el tema oscuro de Breeze están activados.'
'Dark mode colors': 'Colores del modo oscuro'
'With categories': 'Con categorías'
'Custom categories': 'Categorías personalizadas'
'Customize application categories': 'Personalizar las categorías de las aplicaciones'
'Reset to default': 'Restablecer los valores por defecto'
'Applications': 'Aplicaciones'
'Applications kept in the top menu': 'Aplicaciones guardadas en el menú superior'
'Applications kept in the top menu but also shown in side menu': 'Las aplicaciones se mantienen en el menú superior pero también se muestran en el menú lateral'
'These applications must be selected in the previous option.': 'Estas aplicaciones deben ser seleccionadas en las opciones anteriores.'
'Hide labels on mouse over': 'Ocultar las etiquetas al pasar el ratón'
'Except the hovered app': 'Excepto la aplicación sobre la que se pasa el cursor'
'Search': 'Buscar'
'Toggle the menu': 'Alternar el menú'
'Open the documentation': 'Open the documentation'
'Ask the developer': 'Pregúntale al desarrollador'
'New request': 'Nueva solicitud'
'Report a bug': 'Informar de un fallo'
'Show the configuration': 'Mostrar los ajustes'
'Configuration:': 'Configuration:'
'Done!': '¡Realizado!'
'Copy': 'Copiar'
'Need help': 'Ayudame'
'I would like a new feature': 'Me gustaría una nueva función'
'Something went wrong': 'Algo salió mal'
'Select apps': 'Selecciona las aplicaciones'
'Sort': 'Ordenar'
'Customize': 'Personalizar'
'Custom': 'Custom'
'Close': 'Cerrar'
'Show the search form': 'Show the search form'
+131 -76
View File
@@ -1,76 +1,131 @@
"Custom menu": "Menu personnalisé" 'Custom menu': 'Menu personnalisé'
"Enable the custom menu": "Activer le menu personnalisé" 'Enable the custom menu': 'Activer le menu personnalisé'
"No": "Non" 'No': 'Non'
"Yes": "Oui" 'Yes': 'Oui'
"Menu": "Menu" 'Menu': 'Menu'
'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.': 'Utiliser le raccourcis clavier <span class="keyboard-key">Ctrl</span>+<span class="keyboard-key">o</span> pour ouvrir et fermer le menu latéral. Utiliser <span class="keyboard-key">tab</span> pour naviguer.' 'Use the shortcut Ctrl+o to open and to hide the side menu. Use tab key to navigate.': 'Utiliser
"Top menu": "Menu supérieur" le raccourcis clavier Ctrl+o pour ouvrir et fermer le menu latéral. Utiliser tab
"Apps that not must be moved in the side menu": "Les applications qui ne doivent pas être affichées dans le menu latéral" key pour naviguer.'
"If there is no selection then the global configuration is applied.": "Si il n'y a aucune sélection alors la configuration globale sera appliquée" 'Top menu': 'Menu supérieur'
"Experimental": "Expérimental" 'Apps that not must be moved in the side menu': 'Les applications qui ne doivent pas
"Save": "Sauvegarder" être affichées dans le menu latéral'
"You like this app and you want to support me?": "Vous aimer cette application et vous souhaitez m'aider ?" 'If there is no selection then the global configuration is applied.': "Si il n'y a
"Buy me a coffee ☕": "Offrez moi un café ☕" aucune sélection alors la configuration globale sera appliquée."
"Hidden": "Caché" 'Experimental': 'Expérimental'
"Small": "Petit" 'Save': 'Sauvegarder'
"Normal": "Normal" 'You like this app and you want to support me?': "Vous aimer cette application et
"Big": "Gros" vous souhaitez m'aider ?"
"Colors": "Couleurs" 'Buy me a coffee ☕': 'Offrez moi un café ☕'
"Background color": "Couleur de fond" 'Hidden': 'Caché'
"Background color of current app": "Couleur de fond de l'application en cours" 'Small': 'Petit'
"Text color": "Couleur du texte" 'Normal': 'Normal'
"Loader": "Indicateur de chargement" 'Big': 'Gros'
"Icon": "Icône" 'Hidden icon': 'Icône masqué'
"Same color": "Même couleur" 'Small icon': 'Petit icône'
"Opposite color": "Couleur opposée" 'Normal icon': 'Icône normal'
"Transparent": "Transparent" 'Big icon': 'Gros icône'
"Opaque": "Opaque" 'Hidden text': 'Text masqué'
"Opener": "Bouton d'ouverture" 'Small text': 'Texte petit'
"Default": "Par défaut" 'Normal text': 'Texte normal'
"Default (dark)": "Par défaut (sombre)" 'Big text': 'Gros texte'
"Hamburger": "Hamburger" 'Colors': 'Couleurs'
"Hamburger (dark)": "Hamburger (sombre)" 'Background color': 'Couleur de fond'
"Hamburger 2": "Hamburger 2" 'Background color of current app': "Couleur de fond de l'application en cours"
"Hamburger 2 (dark)": "Hamburger 2 (sombre)" 'Text color': 'Couleur du texte'
"Before the logo": "Avant le logo" 'Loader': 'Indicateur de chargement'
"After the logo": "Après le logo" 'Icon': 'Icône'
"Position": "Position" 'Same color': 'Même couleur'
"Show only the opener (hidden logo)": "Afficher uniquement le bouton d'ouverture (masquer le logo)" 'Opposite color': 'Couleur opposée'
"Do not display the side menu and the opener if there is no application (eg: public pages).": "Ne pas afficher le menu latéral et le bouton d'ouverture s'il n'y a aucune application (exemple : page publiques)." 'Transparent': 'Transparent'
"Panel": "Panneau" 'Opaque': 'Opaque'
"Open the menu when the mouse is hover the opener (automatically disabled on touch screens)": "Ouvrir le menu au passage de la souris (automatiquement désactivé sur les écrans tactiles)" 'Opener': "Bouton d'ouverture"
"Display the big menu": "Afficher le menu large" 'Default': 'Par défaut'
"The big menu is not compatible with AppOrder.": "Le menu large n'est pas compatible avec l'application AppOrder" 'Default (dark)': 'Par défaut (sombre)'
"Display the logo": "Afficher le logo" 'Hamburger': 'Hamburger'
"This feature is not compatible with the <code>big menu</code> display.": "Cette fonctionnalité n'est pas compatible avec l'affichage du menu large." 'Hamburger (dark)': 'Hamburger (sombre)'
"Icons and texts": "Icônes et textes" 'Hamburger 2': 'Hamburger 2'
"Loader enabled": "Activation de l'indicateur de chargement" 'Hamburger 2 (dark)': 'Hamburger 2 (sombre)'
"Tips": "Astuces" 'Before the logo': 'Avant le logo'
"Always displayed": "Toujours affiché" 'After the logo': 'Après le logo'
"The logo will be hidden when the menu is always displayed.": "Le logo sera masque si le menu est toujours affiché." 'Position': 'Position'
"This is the automatic behavior when the menu is always displayed.": "C'est le comportement automatique lorsque le menu est toujours affiché." 'Show only the opener (hidden logo)': "Afficher uniquement le bouton d'ouverture (masquer
"Not compatible with touch screens.": "Incompatible avec les écrans tactiles." le logo)"
"Big menu": "Menu large" 'Do not display the side menu and the opener if there is no application (eg: public pages).': "Ne
"Live preview": "Aperçu en direct" pas afficher le menu latéral et le bouton d'ouverture s'il n'y a aucune application
"Open apps in new tab": "Ouvrir les applications dans un nouvel onglet" (exemple : page publiques)."
"Use the global setting": "Utiliser la configuration globale" 'Panel': 'Panneau'
"Use my selection": "Utiliser ma sélection" 'Open the menu when the mouse is hover the opener (automatically disabled on touch screens)': 'Ouvrir
"Show and hide the list of applications": "Afficher et masquer la liste des applications" le menu au passage de la souris (automatiquement désactivé sur les écrans tactiles)'
"Use the avatar instead of the logo": "Utiliser l'avatar à la place du logo" 'Display the big menu': 'Afficher le menu large'
"You do not have permission to change the settings.": "Vous n'avez pas la permission de changer les paramètres." 'Display the logo': 'Afficher le logo'
"Force this configuration to users": "Forcer cette configuration aux utilisateurs" 'Icons and texts': 'Icônes et textes'
"Export the configuration": "Exporter la configuration" 'Loader enabled': "Activation de l'indicateur de chargement"
"Purge the cache": "Purger le cache" 'Tips': 'Astuces'
"Show the link to settings": "Afficher le lien vers les paramètres" 'Always displayed': 'Toujours affiché'
"The menu is enabled by default for users": "Le menu est activé par défaut pour les utilisateurs" 'This is the automatic behavior when the menu is always displayed.': "C'est le comportement
"Except when the configuration is forced.": "Sauf lorsque la configuration est forcée." automatique lorsque le menu est toujours affiché."
"Apps that should not be displayed in the menu": "Applications qui ne doivent pas être affichées dans le menu" 'Not compatible with touch screens.': 'Incompatible avec les écrans tactiles.'
"This feature is only compatible with the <code>big menu</code> display.": "Compatible avec l'affichage <code>Menu large</code>." 'Big menu': 'Menu large'
"The logo is a link to the default app": "Le logo est un lien vers l'application par défaut" 'Live preview': 'Aperçu en direct'
"Others": "Autres" 'Open apps in new tab': 'Ouvrir les applications dans un nouvel onglet'
"Categories": "Catégories" 'Use the global setting': 'Utiliser la configuration globale'
"Customize sorting": "Personnaliser le tri" 'Use my selection': 'Utiliser ma sélection'
"Order by": "Trier par" 'Show and hide the list of applications': 'Afficher et masquer la liste des applications'
"Name": "Nom" 'Use the avatar instead of the logo': "Utiliser l'avatar à la place du logo"
"Customed": "Personnalisé" 'You do not have permission to change the settings.': "Vous n'avez pas la permission
"Show and hide the list of categories": "Afficher et masquer la liste des catégories" de changer les paramètres."
'Force this configuration to users': 'Forcer cette configuration aux utilisateurs'
'Export the configuration': 'Exporter la configuration'
'Purge the cache': 'Purger le cache'
'Show the link to settings': 'Afficher le lien vers les paramètres'
'The menu is enabled by default for users': 'Le menu est activé par défaut pour les
utilisateurs'
'Except when the configuration is forced.': 'Sauf lorsque la configuration est forcée.'
'Apps that should not be displayed in the menu': 'Applications qui ne doivent pas
être affichées dans le menu'
'This feature is only compatible with the <code>big menu</code> display.': "Compatible
avec l'affichage <code>Menu large</code>."
'The logo is a link to the default app': "Le logo est un lien vers l'application par
défaut"
'Others': 'Autres'
'Categories': 'Catégories'
'Customize sorting': 'Personnaliser le tri'
'Order by': 'Trier par'
'Name': 'Nom'
'Customed': 'Personnalisé'
'Show and hide the list of categories': 'Afficher et masquer la liste des catégories'
'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'
'With categories': 'Avec les catégories'
'Custom categories': 'Catégories personnalisées'
'Customize application categories': 'Personnaliser les catégories des applications'
'Reset to default': 'Restaurer les valeurs par défaut'
'Applications': 'Applications'
'Applications kept in the top menu': 'Applications conservées dans le menu supérieur'
'Applications kept in the top menu but also shown in side menu': 'Applications conservées
dans le menu supérieur mais également affichées dans le menu latéral'
'These applications must be selected in the previous option.': "Ces applications doivent
également être sélectionnées dans l'option précédente."
'Hide labels on mouse over': 'Masquer le libellé des applications au passage de la
souris'
'Except the hovered app': "À l'exception de l'application survolée"
'Search': 'Rechercher'
'Toggle the menu': 'Basculer le menu'
'Open the documentation': 'Afficher la documentation'
'Ask the developer': 'Demander au(x) développeurs⋅euses'
'New request': 'Nouvelle requête'
'Report a bug': 'Rapporter un bug'
'Show the configuration': 'Afficher la configuration'
'Configuration:': 'Configuration :'
'Done!': 'Fait !'
'Copy': 'Copié'
'Need help': "Besoin d'aide"
'I would like a new feature': 'Je souhaiterais une fonctionnalité'
'Something went wrong': "Quelque chose s'est mal passé"
'Select apps': 'Selection des apps'
'Sort': 'Ordonner'
'Customize': 'Personnaliser'
'Custom': 'Personnalisé'
'Close': 'Fermer'
'Show the search form': 'Afficher le formulaire de recherche'
+112
View File
@@ -0,0 +1,112 @@
'Custom menu': 'Menú personalizado'
'Enable the custom menu': 'Activar o menú personalizado'
'No': 'Non'
'Yes': 'Si'
'Menu': 'Menú'
'Use the shortcut Ctrl+o to open and to hide the side menu. Use tab key to navigate.': 'Use o atallo Ctrl+o para abrir e agochar o menú lateral. Use a tecla Tab para navegar.'
'Top menu': 'Top menu'
'Apps that not must be moved in the side menu': 'As aplicacións que non deben moverse no menú lateral'
'If there is no selection then the global configuration is applied.': 'Se non hai selección, aplícase a configuración global.'
'Experimental': 'Experimental'
'Save': 'Gardar'
'You like this app and you want to support me?': 'Gústalle esta aplicación e quere axudarme?'
'Buy me a coffee ☕': 'Convídeme a un café ☕'
'Hidden': 'Agochado'
'Small': 'Pequeno'
'Normal': 'Normal'
'Big': 'Grande'
'Hidden icon': 'Icona agochada'
'Small icon': 'Icona pequena'
'Normal icon': 'Icona normal'
'Big icon': 'Icona grande'
'Hidden text': 'Texto agochado'
'Small text': 'Texto pequeno'
'Normal text': 'Texto normal'
'Big text': 'Texto grande'
'Colors': 'Cores'
'Background color': 'Cor do fondo'
'Background color of current app': 'Cor do fondo da aplicación actual'
'Text color': 'Cor do texto'
'Loader': 'Cargador'
'Icon': 'Icona'
'Same color': 'A mesma cor'
'Opposite color': 'A cor oposta'
'Transparent': 'Transparente'
'Opaque': 'Opaco'
'Opener': 'Abrir'
'Default': 'Predeterminado'
'Default (dark)': 'Predeterminado (escuro)'
'Hamburger': 'Hamburguesa'
'Hamburger (dark)': 'Hamburguesa (escuro)'
'Hamburger 2': 'Hamburguesa 2'
'Hamburger 2 (dark)': 'Hamburguesa 2 (escuro)'
'Before the logo': 'Antes do logotipo'
'After the logo': 'Após o logotipo'
'Position': 'Posición'
'Show only the opener (hidden logo)': 'Amosar só a icona de abrir (agochar o logotipo)'
'Do not display the side menu and the opener if there is no application (eg: public pages).': 'Non amosar o menú lateral e a icona de abrir se non hai ningunha aplicación (por exemplo: páxinas públicas).'
'Panel': 'Panel'
'Open the menu when the mouse is hover the opener (automatically disabled on touch screens)': 'Abre o menú cando o rato está sobre a icona de abrir (desactivado automaticamente nas pantallas táctiles)'
'Display the big menu': 'Amosar o menú en grande'
'Display the logo': 'Amosar o logotipo'
'Icons and texts': 'Iconas e textos'
'Loader enabled': 'Cargador activado'
'Tips': 'Consellos'
'Always displayed': 'Amosado sempre'
'This is the automatic behavior when the menu is always displayed.': 'Este é o comportamento automático cando se amosa sempre o menú.'
'Not compatible with touch screens.': 'Non é compatíbel coas pantallas táctiles.'
'Big menu': 'Menú grande'
'Live preview': 'Vista previa en directo'
'Open apps in new tab': 'Abrir as aplicacións nunha nova lapela'
'Use the global setting': 'Usar o axuste global'
'Use my selection': 'Usar a miña selección'
'Show and hide the list of applications': 'Amosar e agochar a lista de aplicacións'
'Use the avatar instead of the logo': 'Usar o avatar no canto do logotipo'
'You do not have permission to change the settings.': 'Non ten permiso para cambiar os axustes.'
'Force this configuration to users': 'Forzar esta configuración para os usuarios'
'Export the configuration': 'Exportar a configuración'
'Purge the cache': 'Limpar a caché'
'Show the link to settings': 'Amosar a ligazón aos axustes'
'The menu is enabled by default for users': 'De xeito predeterminado o menú está activado para os usuarios'
'Except when the configuration is forced.': 'Agás cando a configuración é forzada.'
'Apps that should not be displayed in the menu': 'Aplicacións que non deben amosarse no menú'
'This feature is only compatible with the <code>big menu</code> display.': 'Esta función só é compatíbel coa presentación do <code>menú grande</code>.'
'The logo is a link to the default app': 'O logotipo é unha ligazón á aplicación predeterminada'
'Others': 'Outros'
'Categories': 'Categorías'
'Customize sorting': 'Personalizar a ordenación'
'Order by': 'Ordenar por'
'Name': 'Nome'
'Customed': 'Personalizado'
'Show and hide the list of categories': 'Amosar e agochar a lista de categorías'
'This parameters are used when Dark theme or Breeze Dark Theme are enabled.': 'Estes parámetros úsanse cando o tema escuro ou o tema escuro de Breeze están activados.'
'Dark mode colors': 'Cores do modo escuro'
'With categories': 'Con categorías'
'Custom categories': 'Categorías personalizadas'
'Customize application categories': 'Personalizar as categorías das aplicacións'
'Reset to default': 'Restabelecer os valores predeterminados'
'Applications': 'Aplicacións'
'Applications kept in the top menu': 'As aplicacións mantéñense no menú superior'
'Applications kept in the top menu but also shown in side menu': 'As aplicacións mantéñense no menú superior mais tamén aparecen no menú lateral'
'These applications must be selected in the previous option.': 'Estas aplicacións deben ser seleccionadas na opción anterior.'
'Hide labels on mouse over': 'Agochar as etiquetas ao pasar o rato'
'Except the hovered app': 'Agás a aplicación que pasa o rato'
'Search': 'Buscar'
'Toggle the menu': 'Alternar o menú'
'Open the documentation': 'Open the documentation'
'Ask the developer': 'Preguntar ao desenvolvedor'
'New request': 'Nova solicitude'
'Report a bug': 'Informar dun fallo'
'Show the configuration': 'Amosar a configuración'
'Configuration:': 'Configuración:'
'Done!': 'Feito!'
'Copy': 'Copiar'
'Need help': 'Necesito axuda'
'I would like a new feature': 'Gustaríame unha nova característica'
'Something went wrong': 'Algo foi mal'
'Select apps': 'Seleccionar as aplicacións'
'Sort': 'Ordenar'
'Customize': 'Personalizar'
'Custom': 'Personalizado'
'Close': 'Pechar'
'Show the search form': 'Show the search form'
+112
View File
@@ -0,0 +1,112 @@
'Custom menu': 'Aangepast menu'
'Enable the custom menu': 'Het aangepaste menu inschakelen'
'No': 'Nee'
'Yes': 'Ja'
'Menu': 'Menu'
'Use the shortcut Ctrl+o to open and to hide the side menu. Use tab key to navigate.': 'Gebruik de snelkoppeling Ctrl+o om het zijmenu te openen en te verbergen. Gebruik tab key om te navigeren.'
'Top menu': 'Bovenste menu'
'Apps that not must be moved in the side menu': 'Apps die niet moeten worden verplaatst in het zijmenu'
'If there is no selection then the global configuration is applied.': 'Als er geen keuze is, wordt de globale configuratie toegepast.'
'Experimental': 'Experimenteel'
'Save': 'Opslaan'
'You like this app and you want to support me?': 'Vind je deze app leuk en wil je me steunen?'
'Buy me a coffee ☕': 'Koop een koffie voor me ☕'
'Hidden': 'Verborgen'
'Small': 'Klein'
'Normal': 'Normaal'
'Big': 'Groot'
'Hidden icon': 'Verborgen icoon'
'Small icon': 'Klein icoon'
'Normal icon': 'Normaal icoon'
'Big icon': 'Groot icoon'
'Hidden text': 'Verborgen tekst'
'Small text': 'Kleine tekst'
'Normal text': 'Normale tekst'
'Big text': 'Grote tekst'
'Colors': 'Kleuren'
'Background color': 'Achtergrond kleur'
'Background color of current app': 'Achtergrondkleur van huidige app'
'Text color': 'Tekst kleur'
'Loader': 'Lader'
'Icon': 'Icoon'
'Same color': 'Zelfde kleur'
'Opposite color': 'Tegenovergestelde kleur'
'Transparent': 'Transparant'
'Opaque': 'Ondoorzichtig'
'Opener': 'Opener'
'Default': 'Standaard'
'Default (dark)': 'Standaard (donker)'
'Hamburger': 'Hamburger'
'Hamburger (dark)': 'Hamburger (donker)'
'Hamburger 2': 'Hamburger 2'
'Hamburger 2 (dark)': 'Hamburger 2 (donker)'
'Before the logo': 'Voor het logo'
'After the logo': 'Na het logo'
'Position': 'Positie'
'Show only the opener (hidden logo)': 'Toon alleen de opener (verborgen logo)'
'Do not display the side menu and the opener if there is no application (eg: public pages).': 'Geef het zijmenu en de opener niet weer als er geen toepassing is (bijv. openbare pagina''s).'
'Panel': 'Paneel'
'Open the menu when the mouse is hover the opener (automatically disabled on touch screens)': 'Open het menu wanneer de muis over de opener gaat (automatisch uitgeschakeld op aanraakschermen)'
'Display the big menu': 'Toon het grote menu'
'Display the logo': 'Toon het logo'
'Icons and texts': 'Iconen en teksten'
'Loader enabled': 'Lader ingeschakeld'
'Tips': 'Tips'
'Always displayed': 'Altijd weergegeven'
'This is the automatic behavior when the menu is always displayed.': 'Dit is het automatische gedrag wanneer het menu altijd wordt weergegeven.'
'Not compatible with touch screens.': 'Niet compatibel met aanraakschermen.'
'Big menu': 'Groot menu'
'Live preview': 'Live voorbeeld'
'Open apps in new tab': 'Open apps in nieuwe tab'
'Use the global setting': 'Gebruik de globale instellingen'
'Use my selection': 'Gebruik mijn selectie'
'Show and hide the list of applications': 'De lijst met toepassingen tonen en verbergen'
'Use the avatar instead of the logo': 'Gebruik avatar in plaats van het logo'
'You do not have permission to change the settings.': 'Je hebt geen toestemming om de instellingen te veranderen.'
'Force this configuration to users': 'Forceer deze configuratie aan gebruikers'
'Export the configuration': 'Exporteer de configuratie'
'Purge the cache': 'De cache wissen'
'Show the link to settings': 'Toon de link naar de instellingen'
'The menu is enabled by default for users': 'Het menu is standaard ingeschakeld voor gebruikers'
'Except when the configuration is forced.': 'Behalve als de configuratie geforceerd is.'
'Apps that should not be displayed in the menu': 'Apps die niet in het menu weergegeven mogen worden'
'This feature is only compatible with the <code>big menu</code> display.': 'Deze functie is alleen compatibel met het <code>grote menu</code> scherm.'
'The logo is a link to the default app': 'Het logo is een link naar de standaard app'
'Others': 'Overige'
'Categories': 'Categorieën'
'Customize sorting': 'Sortering aanpassen'
'Order by': 'Sorteer op'
'Name': 'Naam'
'Customed': 'Aangepast'
'Show and hide the list of categories': 'De lijst met categorieën tonen en verbergen'
'This parameters are used when Dark theme or Breeze Dark Theme are enabled.': 'Deze parameters worden gebruikt wanneer Dark theme of Breeze Dark Theme zijn ingeschakeld.'
'Dark mode colors': 'Donkere modus kleuren'
'With categories': 'Met categorieën'
'Custom categories': 'Aangepaste categorieën'
'Customize application categories': 'Toepassingscategorieën aanpassen'
'Reset to default': 'Terugzetten naar standaard'
'Applications': 'Applicaties'
'Applications kept in the top menu': 'Applicaties bewaard in het bovenste menu'
'Applications kept in the top menu but also shown in side menu': 'Applicaties blijven in het topmenu maar worden ook in het zijmenu getoond'
'These applications must be selected in the previous option.': 'Deze toepassingen moeten bij de vorige optie zijn geselecteerd.'
'Hide labels on mouse over': 'Hide labels on mouse over'
'Except the hovered app': 'Except the hovered app'
'Search': 'Search'
'Toggle the menu': 'Toggle the menu'
'Open the documentation': 'Open the documentation'
'Ask the developer': 'Ask the developer'
'New request': 'New request'
'Report a bug': 'Report a bug'
'Show the configuration': 'Show the configuration'
'Configuration:': 'Configuration:'
'Done!': 'Done!'
'Copy': 'Copy'
'Need help': 'Need help'
'I would like a new feature': 'I would like a new feature'
'Something went wrong': 'Something went wrong'
'Select apps': 'Select apps'
'Sort': 'Sort'
'Customize': 'Customize'
'Custom': 'Custom'
'Close': 'Close'
'Show the search form': 'Show the search form'
+110
View File
@@ -0,0 +1,110 @@
'Custom menu': 'Menú personalizado'
'Enable the custom menu': 'Activar o menu personalizado'
'No': 'Não'
'Yes': 'Sim'
'Menu': 'Menu'
'Use the shortcut Ctrl+o to open and to hide the side menu. Use tab key to navigate.': 'Use o atalho Ctrl+o para exibir e para esconder o menu lateral. Use tab key para navegar.'
'Top menu': 'Menu superior'
'Apps that not must be moved in the side menu': 'Apps que não devem ser movidos para o menu lateral'
'If there is no selection then the global configuration is applied.': 'Se não houver seleção, a configuração global será aplicada.'
'Experimental': 'Experimental'
'Save': 'Salvar'
'You like this app and you want to support me?': 'Você gosta deste aplicativo e quer me apoiar?'
'Buy me a coffee ☕': 'Me pague um café ☕'
'Hidden': 'Oculto'
'Small': 'Pequeno'
'Normal': 'Normal'
'Big': 'Grande'
'Hidden icon': 'Ícone oculto'
'Small icon': 'Ícone pequeno'
'Normal icon': 'Ícone normal'
'Big icon': 'Ícone grance'
'Hidden text': 'Texto oculto'
'Small text': 'Texto pequeno'
'Normal text': 'Texto normal'
'Big text': 'Texto grande'
'Colors': 'Cores'
'Background color': 'Cor de fundo'
'Background color of current app': 'Cor de fundo do app atual'
'Text color': 'Cor do texto'
'Loader': 'Progresso'
'Icon': 'Ícone'
'Same color': 'Mesma cor'
'Opposite color': 'Cor oposta'
'Transparent': 'Transparente'
'Opaque': 'Opaco'
'Opener': 'Abrir'
'Default': 'Padrão'
'Default (dark)': 'Padrão (escuro)'
'Hamburger': 'Hamburger'
'Hamburger (dark)': 'Hamburger (escuro)'
'Hamburger 2': 'Hamburger 2'
'Hamburger 2 (dark)': 'Hamburger 2 (escuro)'
'Before the logo': 'Antes da logo'
'After the logo': 'Depois da logo'
'Position': 'Posição'
'Show only the opener (hidden logo)': 'Mostrar apenas o Abrir (ocultar logo)'
'Do not display the side menu and the opener if there is no application (eg: public pages).': 'Não mostrar o menu lateral e o Abrir se não houver aplicação (p.ex. páginas públicas).'
'Panel': 'Painel'
'Open the menu when the mouse is hover the opener (automatically disabled on touch screens)': 'Abrir o menu quando o mouse passar sobre o Abrir (desativado automaticamente em telas de toque)'
'Display the big menu': 'Mostrar o menu grande'
'Display the logo': 'Mostrar a logo'
'Icons and texts': 'Ícones e textos'
'Loader enabled': 'Progresso ativado'
'Tips': 'Dicas'
'Always displayed': 'Sempre visível'
'This is the automatic behavior when the menu is always displayed.': 'Este é o comportamento automático quando o menu está sempre visível.'
'Not compatible with touch screens.': 'Não compatível com telas de toque.'
'Big menu': 'Menu grande'
'Live preview': 'Visualização ao vivo'
'Open apps in new tab': 'Abrir apps em nova aba'
'Use the global setting': 'Usar configurações globais'
'Use my selection': 'Usar minha seleção'
'Show and hide the list of applications': 'Mostrar e ocultar a lista de aplicativos'
'Use the avatar instead of the logo': 'Use o avatar ao invés da logo'
'You do not have permission to change the settings.': 'Você não tem permissão para alterar as configurações.'
'Force this configuration to users': 'Forçar esta configuração para os usuários'
'Export the configuration': 'Exportar a configuração'
'Purge the cache': 'Limpar o cache'
'Show the link to settings': 'Mostrar o link para configurações'
'The menu is enabled by default for users': 'O menu é habilitado por padrão para os usuários'
'Except when the configuration is forced.': 'Exceto quando a configuração é forçada.'
'Apps that should not be displayed in the menu': 'Apps que não devem ser mostrados no menu'
'This feature is only compatible with the <code>big menu</code> display.': 'Este recurso só é compatível com a exibição do <code>menu grande</code>.'
'The logo is a link to the default app': 'A logo é um link para o app padrão'
'Others': 'Outros'
'Categories': 'Categorias'
'Customize sorting': 'Personalizar classificação'
'Order by': 'Ordenar por'
'Name': 'Nome'
'Customed': 'Personalizado'
'Show and hide the list of categories': 'Mostrar e esconder a lista de categorias'
'This parameters are used when Dark theme or Breeze Dark Theme are enabled.': 'Estes parâmetros são usados quando o tema escuro ou o tema Dark Breeze está ativo.'
'Dark mode colors': 'Cores do modo escuro'
'With categories': 'Com categorias'
'Custom categories': 'Categorias personalizadas'
'Customize application categories': 'Personalizar categorias de apps'
'Reset to default': 'Restaurar padrão'
'Applications': 'Aplicativos'
'Applications kept in the top menu': 'Aplicativos mantidos no menu superior'
'Applications kept in the top menu but also shown in side menu': 'Aplicativos mantidos no menu superior, mas também mostrados no menu lateral'
'These applications must be selected in the previous option.': 'Estes aplicativos devem ser selecionados na opção anterior.'
'Hide labels on mouse over': 'Ocultar descrição ao passar o mouse'
'Toggle the menu': 'Toggle the menu'
'Open the documentation': 'Open the documentation'
'Ask the developer': 'Ask the developer'
'New request': 'New request'
'Report a bug': 'Report a bug'
'Show the configuration': 'Show the configuration'
'Configuration:': 'Configuration:'
'Done!': 'Done!'
'Copy': 'Copy'
'Need help': 'Need help'
'I would like a new feature': 'I would like a new feature'
'Something went wrong': 'Something went wrong'
'Select apps': 'Select apps'
'Sort': 'Sort'
'Customize': 'Customize'
'Custom': 'Custom'
'Close': 'Close'
'Show the search form': 'Show the search form'

Some files were not shown because too many files have changed in this diff Show More