From a1b1396b6369f53bcd0531897c28a3724efd12c9 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Wed, 12 Aug 2020 15:59:51 +0200 Subject: [PATCH] add add top-menu-apps option in the personal settings --- lib/Controller/JsController.php | 15 +++++++- lib/Controller/NavController.php | 14 ++++++-- lib/Controller/PersonalSettingController.php | 20 +++++++++++ lib/Settings/Personal.php | 11 +++++- templates/settings/admin-form.php | 2 -- templates/settings/personal-form.php | 36 ++++++++++++++++++++ 6 files changed, 91 insertions(+), 7 deletions(-) diff --git a/lib/Controller/JsController.php b/lib/Controller/JsController.php index 9258ad4..bcab75b 100644 --- a/lib/Controller/JsController.php +++ b/lib/Controller/JsController.php @@ -23,6 +23,8 @@ use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\Response; use OCP\IConfig; use OCP\IRequest; +use OCP\IUserSession; +use OC; class JsController extends Controller { @@ -53,6 +55,17 @@ class JsController extends Controller */ public function script() { + $user = OC::$server[IUserSession::class]->getUser(); + $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true); + + if ($user) { + $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true); + + if (!empty($userTopMenuApps)) { + $topMenuApps = $userTopMenuApps; + } + } + $parameters = [ 'opener-position' => $this->config->getAppValue('side_menu', 'opener-position', 'before'), 'opener-hover' => (bool) $this->config->getAppValue('side_menu', 'opener-hover', '0'), @@ -61,7 +74,7 @@ class JsController extends Controller 'hide-when-no-apps' => (bool) $this->config->getAppValue('side_menu', 'hide-when-no-apps', '0'), 'loader-enabled' => (bool) $this->config->getAppValue('side_menu', 'loader-enabled', '1'), 'big-menu' => (bool) $this->config->getAppValue('side_menu', 'big-menu', '0'), - 'top-menu-apps' => (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true), + 'top-menu-apps' => $topMenuApps, ]; $response = new TemplateResponse('side_menu', 'js/script', $parameters, 'blank'); diff --git a/lib/Controller/NavController.php b/lib/Controller/NavController.php index 1d30ec9..4f58086 100644 --- a/lib/Controller/NavController.php +++ b/lib/Controller/NavController.php @@ -109,6 +109,13 @@ class NavController extends Controller ]); } + $topMenuApps = (array) json_decode($this->config->getAppValue('side_menu', 'top-menu-apps', '[]'), true); + $userTopMenuApps = (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true); + + if (!empty($userTopMenuApps)) { + $topMenuApps = $userTopMenuApps; + } + foreach ($categoriesLabels as $k => $category) { $categoriesLabels[$category['id']] = $category['translations'][$currentLanguage]['name'] ?? $category['translations']['en']['name']; @@ -118,13 +125,14 @@ class NavController extends Controller $categoriesLabels['external_links'] = $this->trans->t('External sites'); foreach ($apps as $app) { + if (in_array($app['id'], $topMenuApps)) { + continue; + } + $categories = (array) $app['category']; $appsCategories[$app['id']] = []; foreach ($categories as $category) { - if ($externalSitesInTopMenu && $category === 'external_links') { - continue; - } if (!isset($items[$category])) { $items[$category] = [ diff --git a/lib/Controller/PersonalSettingController.php b/lib/Controller/PersonalSettingController.php index a55a524..458e47a 100644 --- a/lib/Controller/PersonalSettingController.php +++ b/lib/Controller/PersonalSettingController.php @@ -63,8 +63,28 @@ class PersonalSettingController extends Controller } } + if ($name === 'top-menu-apps') { + $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 ($doSave) { $this->config->setUserValue($user->getUid(), 'side_menu', $name, $value); + + return [ + 'name' => $name, + 'value' => $value, + ]; } return []; diff --git a/lib/Settings/Personal.php b/lib/Settings/Personal.php index beef491..4a80bfb 100644 --- a/lib/Settings/Personal.php +++ b/lib/Settings/Personal.php @@ -24,6 +24,7 @@ use OCP\ILogger; use OCP\Settings\ISettings; use OCP\IConfig; use OCP\IUserSession; +use OCA\SideMenu\Service\AppRepository; class Personal implements ISettings { @@ -47,12 +48,18 @@ class Personal implements ISettings */ private $userSession; - public function __construct(IL10N $l, ILogger $logger, IConfig $config, IUserSession $userSession) + /** + * @var AppRepository + */ + private $appRepository; + + public function __construct(IL10N $l, ILogger $logger, IConfig $config, IUserSession $userSession, AppRepository $appRepository) { $this->l = $l; $this->logger = $logger; $this->config = $config; $this->userSession = $userSession; + $this->appRepository = $appRepository; } /** @@ -64,6 +71,8 @@ class Personal implements ISettings $parameters = [ 'enabled' => $this->config->getUserValue($user->getUid(), 'side_menu', 'enabled', '1'), + 'top-menu-apps' => (array) json_decode($this->config->getUserValue($user->getUid(), 'side_menu', 'top-menu-apps', '[]'), true), + 'apps' => $this->appRepository->getVisibleApps(), ]; return new TemplateResponse('side_menu', 'settings/personal-form', $parameters, ''); diff --git a/templates/settings/admin-form.php b/templates/settings/admin-form.php index 764db04..7794602 100644 --- a/templates/settings/admin-form.php +++ b/templates/settings/admin-form.php @@ -322,8 +322,6 @@ $choicesSizes = [ -

Selected apps will be displayed in the big menu display and in the top menu.

-
diff --git a/templates/settings/personal-form.php b/templates/settings/personal-form.php index 2eac0f6..0ca163d 100644 --- a/templates/settings/personal-form.php +++ b/templates/settings/personal-form.php @@ -53,6 +53,42 @@ $choicesYesNo = [
+
+

+ t('Top menu')); ?> +

+
+ +
+ +

+ + If there is no selection then the global configuration is applied. + +

+ +
+ +
+ checked + /> + + +
+ +
+
+