diff options
-rw-r--r-- | apps/files/appinfo/info.xml | 12 | ||||
-rw-r--r-- | apps/files/lib/App.php | 10 | ||||
-rw-r--r-- | apps/files/tests/Controller/ViewControllerTest.php | 10 | ||||
-rw-r--r-- | core/css/header.scss | 22 | ||||
-rw-r--r-- | core/templates/layout.user.php | 38 | ||||
-rw-r--r-- | lib/private/NavigationManager.php | 190 | ||||
-rw-r--r-- | lib/private/Server.php | 8 | ||||
-rw-r--r-- | lib/private/TemplateLayout.php | 6 | ||||
-rw-r--r-- | lib/private/legacy/app.php | 110 | ||||
-rw-r--r-- | settings/img/apps.svg | 5 | ||||
-rw-r--r-- | settings/js/apps.js | 8 | ||||
-rw-r--r-- | tests/lib/NavigationManagerTest.php | 110 |
12 files changed, 279 insertions, 250 deletions
diff --git a/apps/files/appinfo/info.xml b/apps/files/appinfo/info.xml index 8b5678b331a..c49ec7aa407 100644 --- a/apps/files/appinfo/info.xml +++ b/apps/files/appinfo/info.xml @@ -55,10 +55,12 @@ <command>OCA\Files\Command\ScanAppData</command> </commands> - <navigation> - <name>Files</name> - <route>files.view.index</route> - <order>0</order> - </navigation> + <navigations> + <navigation> + <name>Files</name> + <route>files.view.index</route> + <order>0</order> + </navigation> + </navigations> </info> diff --git a/apps/files/lib/App.php b/apps/files/lib/App.php index add27a2d2df..34d3ab4384c 100644 --- a/apps/files/lib/App.php +++ b/apps/files/lib/App.php @@ -40,7 +40,15 @@ class App { public static function getNavigationManager() { // TODO: move this into a service in the Application class if (self::$navigationManager === null) { - self::$navigationManager = new \OC\NavigationManager(); + self::$navigationManager = new \OC\NavigationManager( + \OC::$server->getAppManager(), + \OC::$server->getURLGenerator(), + \OC::$server->getL10NFactory(), + \OC::$server->getUserSession(), + \OC::$server->getGroupManager(), + \OC::$server->getConfig() + ); + self::$navigationManager->clear(false); } return self::$navigationManager; } diff --git a/apps/files/tests/Controller/ViewControllerTest.php b/apps/files/tests/Controller/ViewControllerTest.php index 1d8c2956551..2e497405a4d 100644 --- a/apps/files/tests/Controller/ViewControllerTest.php +++ b/apps/files/tests/Controller/ViewControllerTest.php @@ -134,6 +134,7 @@ class ViewControllerTest extends TestCase { 'name' => \OC::$server->getL10N('files')->t('All files'), 'active' => false, 'icon' => '', + 'type' => 'link', ], [ 'id' => 'recent', @@ -143,6 +144,7 @@ class ViewControllerTest extends TestCase { 'name' => \OC::$server->getL10N('files')->t('Recent'), 'active' => false, 'icon' => '', + 'type' => 'link', ], [ 'id' => 'favorites', @@ -152,6 +154,7 @@ class ViewControllerTest extends TestCase { 'name' => null, 'active' => false, 'icon' => '', + 'type' => 'link', ], [ 'id' => 'sharingin', @@ -161,6 +164,7 @@ class ViewControllerTest extends TestCase { 'name' => \OC::$server->getL10N('files_sharing')->t('Shared with you'), 'active' => false, 'icon' => '', + 'type' => 'link', ], [ 'id' => 'sharingout', @@ -170,6 +174,7 @@ class ViewControllerTest extends TestCase { 'name' => \OC::$server->getL10N('files_sharing')->t('Shared with others'), 'active' => false, 'icon' => '', + 'type' => 'link', ], [ 'id' => 'sharinglinks', @@ -179,6 +184,7 @@ class ViewControllerTest extends TestCase { 'name' => \OC::$server->getL10N('files_sharing')->t('Shared by link', []), 'active' => false, 'icon' => '', + 'type' => 'link', ], [ 'id' => 'systemtagsfilter', @@ -188,6 +194,7 @@ class ViewControllerTest extends TestCase { 'name' => \OC::$server->getL10N('systemtags')->t('Tags'), 'active' => false, 'icon' => '', + 'type' => 'link', ], [ 'id' => 'trashbin', @@ -197,7 +204,8 @@ class ViewControllerTest extends TestCase { 'name' => \OC::$server->getL10N('files_trashbin')->t('Deleted files'), 'active' => false, 'icon' => '', - ], + 'type' => 'link', + ], ]); $expected = new Http\TemplateResponse( diff --git a/core/css/header.scss b/core/css/header.scss index 3de0c50bcd3..6f41dd8154f 100644 --- a/core/css/header.scss +++ b/core/css/header.scss @@ -318,28 +318,6 @@ nav { } /* Apps management */ -.apps-management { - min-height: initial; - height: initial; - margin: 0; - a { - svg, - span { - -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=30)'; - opacity: .3; - } - /* icon opacity and hover effect */ - &:hover svg, - &:focus svg, - &.active svg, - &:hover span, - &:focus span, - &.active span { - -ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=100)'; - opacity: 1; - } - } -} #apps { max-height: calc(100vh - 100px); diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index a7da4a39dd7..46a5c0211a5 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -61,7 +61,6 @@ <div id="appmenu"> <ul> - <?php $headerIconCount = 8; ?> <?php foreach($_['headernavigation'] as $entry): ?> <li data-id="<?php p($entry['id']); ?>"> <a href="<?php print_unescaped($entry['href']); ?>" tabindex="3" @@ -74,22 +73,12 @@ </a> </li> <?php endforeach; ?> - <li id="more-apps" class="menutoggle<?php if (!(count($_['navigation']) > $headerIconCount || (OC_User::isAdminUser(OC_User::getUser()) && count($_['navigation'])>=$headerIconCount))): ?> hidden<?php endif; ?>"> + <li id="more-apps" class="menutoggle<?php if (count($_['navigation']) <= 8): ?> hidden<?php endif; ?>"> <a href="#"> <div class="icon-more-white"></div> <span><?php p($l->t('More apps')); ?></span> </a> </li> - <?php if(OC_User::isAdminUser(OC_User::getUser())): ?> - <li <?php if(count($_['navigation'])>$headerIconCount-1): ?> class="hidden apps-management"<?php else: ?> class="apps-management" <?php endif; ?>> - <a href="<?php print_unescaped(\OC::$server->getURLGenerator()->linkToRoute('settings.AppSettings.viewApps')); ?>" tabindex="4" - <?php if( $_['appsmanagement_active'] ): ?> class="active"<?php endif; ?>> - <img src="<?php print_unescaped(image_path('settings', 'apps.svg') . '?v=' . $_['versionHash']); ?>" /> - <div class="icon-loading-dark" style="display:none;"></div> - <span><?php p($l->t('Apps')); ?></span> - </a> - </li> - <?php endif; ?> </ul> </div> @@ -115,25 +104,6 @@ </a> </li> <?php endforeach; ?> - <?php - /* show "More apps" link to app administration directly in app navigation, as last entry */ - if(OC_User::isAdminUser(OC_User::getUser())): - ?> - <li class="apps-management"> - <a href="<?php print_unescaped(\OC::$server->getURLGenerator()->linkToRoute('settings.AppSettings.viewApps')); ?>" tabindex="4" - <?php if( $_['appsmanagement_active'] ): ?> class="active"<?php endif; ?>> - <svg width="32" height="32" viewBox="0 0 32 32" class="app-icon"> - <defs><filter id="invert-appsmanagement"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0"></feColorMatrix></filter></defs> - <image x="0" y="0" width="32" height="32" preserveAspectRatio="xMinYMin meet" filter="url(#invert-appsmanagement)" xlink:href="<?php print_unescaped(image_path('settings', 'apps.svg') . '?v=' . $_['versionHash']); ?>"></image> - </svg> - <div class="icon-loading-dark" style="display:none;"></div> - <span> - <?php p($l->t('Apps')); ?> - </span> - </a> - </li> - <?php endif; ?> - </ul> </div> </div></nav> @@ -173,12 +143,6 @@ </a> </li> <?php endforeach; ?> - <li> - <a id="logout" <?php print_unescaped(OC_User::getLogoutAttribute()); ?>> - <img alt="" src="<?php print_unescaped(image_path('', 'actions/logout.svg') . '?v=' . $_['versionHash']); ?>"> - <?php p($l->t('Log out'));?> - </a> - </li> </ul> </div> diff --git a/lib/private/NavigationManager.php b/lib/private/NavigationManager.php index f7bc02943a3..300c24ff940 100644 --- a/lib/private/NavigationManager.php +++ b/lib/private/NavigationManager.php @@ -27,7 +27,9 @@ namespace OC; use OC\App\AppManager; +use OC\Group\Manager; use OCP\App\IAppManager; +use OCP\IConfig; use OCP\IGroupManager; use OCP\INavigationManager; use OCP\IURLGenerator; @@ -52,19 +54,23 @@ class NavigationManager implements INavigationManager { private $l10nFac; /** @var IUserSession */ private $userSession; - /** @var IGroupManager */ + /** @var IGroupManager|Manager */ private $groupManager; + /** @var IConfig */ + private $config; - public function __construct(IAppManager $appManager = null, - IURLGenerator $urlGenerator = null, - IFactory $l10nFac = null, - IUserSession $userSession = null, - IGroupManager$groupManager = null) { + public function __construct(IAppManager $appManager, + IURLGenerator $urlGenerator, + IFactory $l10nFac, + IUserSession $userSession, + IGroupManager $groupManager, + IConfig $config) { $this->appManager = $appManager; $this->urlGenerator = $urlGenerator; $this->l10nFac = $l10nFac; $this->userSession = $userSession; $this->groupManager = $groupManager; + $this->config = $config; } /** @@ -85,29 +91,40 @@ class NavigationManager implements INavigationManager { if(!isset($entry['icon'])) { $entry['icon'] = ''; } + if(!isset($entry['type'])) { + $entry['type'] = 'link'; + } $this->entries[] = $entry; } /** * returns all the added Menu entries + * @param string $type * @return array an array of the added entries */ - public function getAll() { + public function getAll($type = 'link') { $this->init(); foreach ($this->closureEntries as $c) { $this->add($c()); } $this->closureEntries = array(); - return $this->entries; + + if ($type === 'all') { + return $this->entries; + } + + return array_filter($this->entries, function($entry) use ($type) { + return $entry['type'] === $type; + }); } /** * removes all the entries */ - public function clear() { + public function clear($loadDefaultLinks = true) { $this->entries = []; $this->closureEntries = []; - $this->init = false; + $this->init = !$loadDefaultLinks; } /** @@ -134,49 +151,127 @@ class NavigationManager implements INavigationManager { return; } $this->init = true; - if (is_null($this->appManager)) { + + $l = $this->l10nFac->get('lib'); + if ($this->config->getSystemValue('knowledgebaseenabled', true)) { + $this->add([ + 'type' => 'settings', + 'id' => 'help', + 'order' => 5, + 'href' => $this->urlGenerator->linkToRoute('settings_help'), + 'name' => $l->t('Help'), + 'icon' => $this->urlGenerator->imagePath('settings', 'help.svg'), + ]); + } + + if ($this->userSession->isLoggedIn()) { + if ($this->isAdmin()) { + // App management + $this->add([ + 'type' => 'settings', + 'id' => 'core_apps', + 'order' => 3, + 'href' => $this->urlGenerator->linkToRoute('settings.AppSettings.viewApps'), + 'icon' => $this->urlGenerator->imagePath('settings', 'apps.svg'), + 'name' => $l->t('Apps'), + ]); + } + + // Personal settings + $this->add([ + 'type' => 'settings', + 'id' => 'personal', + 'order' => 1, + 'href' => $this->urlGenerator->linkToRoute('settings_personal'), + 'name' => $l->t('Personal'), + 'icon' => $this->urlGenerator->imagePath('settings', 'personal.svg'), + ]); + + // Logout + $this->add([ + 'type' => 'settings', + 'id' => 'logout', + 'order' => 99999, + 'href' => $this->urlGenerator->linkToRouteAbsolute( + 'core.login.logout', + ['requesttoken' => \OCP\Util::callRegister()] + ), + 'name' => $l->t('Log out'), + 'icon' => $this->urlGenerator->imagePath('core', 'actions/logout.svg'), + ]); + + if ($this->isSubadmin()) { + // User management + $this->add([ + 'type' => 'settings', + 'id' => 'core_users', + 'order' => 4, + 'href' => $this->urlGenerator->linkToRoute('settings_users'), + 'name' => $l->t('Users'), + 'icon' => $this->urlGenerator->imagePath('settings', 'users.svg'), + ]); + } + + if ($this->isAdmin()) { + // Admin settings + $this->add([ + 'type' => 'settings', + 'id' => 'admin', + 'order' => 2, + 'href' => $this->urlGenerator->linkToRoute('settings.AdminSettings.index'), + 'name' => $l->t('Admin'), + 'icon' => $this->urlGenerator->imagePath('settings', 'admin.svg'), + ]); + } + } + + if ($this->appManager === 'null') { return; } foreach ($this->appManager->getInstalledApps() as $app) { // load plugins and collections from info.xml $info = $this->appManager->getAppInfo($app); - if (!isset($info['navigation'])) { - continue; - } - $nav = $info['navigation']; - if (!isset($nav['name'])) { + if (empty($info['navigations'])) { continue; } - if (!isset($nav['route'])) { - continue; - } - $role = isset($nav['@attributes']['role']) ? $nav['@attributes']['role'] : 'all'; - if ($role === 'admin' && !$this->isAdmin()) { - continue; - } - $l = $this->l10nFac->get($app); - $order = isset($nav['order']) ? $nav['order'] : 100; - $route = $this->urlGenerator->linkToRoute($nav['route']); - $icon = isset($nav['icon']) ? $nav['icon'] : 'app.svg'; - foreach ([$icon, "$app.svg"] as $i) { - try { - $icon = $this->urlGenerator->imagePath($app, $i); - break; - } catch (\RuntimeException $ex) { - // no icon? - ignore it then + foreach ($info['navigations'] as $nav) { + if (!isset($nav['name'])) { + continue; + } + if (!isset($nav['route'])) { + continue; + } + $role = isset($nav['@attributes']['role']) ? $nav['@attributes']['role'] : 'all'; + if ($role === 'admin' && !$this->isAdmin()) { + continue; + } + $l = $this->l10nFac->get($app); + $id = isset($nav['id']) ? $nav['id'] : $app; + $order = isset($nav['order']) ? $nav['order'] : 100; + $type = isset($nav['type']) ? $nav['type'] : 'link'; + $route = $this->urlGenerator->linkToRoute($nav['route']); + $icon = isset($nav['icon']) ? $nav['icon'] : 'app.svg'; + foreach ([$icon, "$app.svg"] as $i) { + try { + $icon = $this->urlGenerator->imagePath($app, $i); + break; + } catch (\RuntimeException $ex) { + // no icon? - ignore it then + } + } + if ($icon === null) { + $icon = $this->urlGenerator->imagePath('core', 'default-app-icon'); } - } - if (is_null($icon)) { - $icon = $this->urlGenerator->imagePath('core', 'default-app-icon'); - } - $this->add([ - 'id' => $app, - 'order' => $order, - 'href' => $route, - 'icon' => $icon, - 'name' => $l->t($nav['name']), - ]); + $this->add([ + 'id' => $id, + 'order' => $order, + 'href' => $route, + 'icon' => $icon, + 'type' => $type, + 'name' => $l->t($nav['name']), + ]); + } } } @@ -188,4 +283,11 @@ class NavigationManager implements INavigationManager { return false; } + private function isSubadmin() { + $user = $this->userSession->getUser(); + if ($user !== null) { + return $this->groupManager->getSubAdmin()->isSubAdmin($user); + } + return false; + } } diff --git a/lib/private/Server.php b/lib/private/Server.php index c21ff650b24..10f9a810de9 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -353,13 +353,7 @@ class Server extends ServerContainer implements IServerContainer { return new \OC\Authentication\TwoFactorAuth\Manager($c->getAppManager(), $c->getSession(), $c->getConfig(), $c->getActivityManager(), $c->getLogger()); }); - $this->registerService(\OCP\INavigationManager::class, function (Server $c) { - return new \OC\NavigationManager($c->getAppManager(), - $c->getURLGenerator(), - $c->getL10NFactory(), - $c->getUserSession(), - $c->getGroupManager()); - }); + $this->registerAlias(\OCP\INavigationManager::class, \OC\NavigationManager::class); $this->registerAlias('NavigationManager', \OCP\INavigationManager::class); $this->registerService(\OC\AllConfig::class, function (Server $c) { diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php index 956cba40086..6dc925f8f8c 100644 --- a/lib/private/TemplateLayout.php +++ b/lib/private/TemplateLayout.php @@ -95,14 +95,8 @@ class TemplateLayout extends \OC_Template { } } $userDisplayName = \OC_User::getDisplayName(); - $appsMgmtActive = strpos(\OC::$server->getRequest()->getRequestUri(), \OC::$server->getURLGenerator()->linkToRoute('settings.AppSettings.viewApps')) === 0; - if ($appsMgmtActive) { - $l = \OC::$server->getL10N('lib'); - $this->assign('application', $l->t('Apps')); - } $this->assign('user_displayname', $userDisplayName); $this->assign('user_uid', \OC_User::getUser()); - $this->assign('appsmanagement_active', $appsMgmtActive); if (\OC_User::getUser() === false) { $this->assign('userAvatarSet', false); diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php index 5343e7ad172..68a8383afbf 100644 --- a/lib/private/legacy/app.php +++ b/lib/private/legacy/app.php @@ -457,83 +457,8 @@ class OC_App { $appManager->disableApp($app); } - /** - * Returns the Settings Navigation - * - * @return string[] - * - * This function returns an array containing all settings pages added. The - * entries are sorted by the key 'order' ascending. - */ - public static function getSettingsNavigation() { - $l = \OC::$server->getL10N('lib'); - $urlGenerator = \OC::$server->getURLGenerator(); - - $settings = array(); - // by default, settings only contain the help menu - if (\OC::$server->getSystemConfig()->getValue('knowledgebaseenabled', true)) { - $settings = array( - array( - "id" => "help", - "order" => 4, - "href" => $urlGenerator->linkToRoute('settings_help'), - "name" => $l->t("Help"), - "icon" => $urlGenerator->imagePath("settings", "help.svg") - ) - ); - } - - // if the user is logged-in - if (\OC::$server->getUserSession()->isLoggedIn()) { - // personal menu - $settings[] = array( - "id" => "personal", - "order" => 1, - "href" => $urlGenerator->linkToRoute('settings_personal'), - "name" => $l->t("Personal"), - "icon" => $urlGenerator->imagePath("settings", "personal.svg") - ); - - //SubAdmins are also allowed to access user management - $userObject = \OC::$server->getUserSession()->getUser(); - $isSubAdmin = false; - if($userObject !== null) { - $isSubAdmin = \OC::$server->getGroupManager()->getSubAdmin()->isSubAdmin($userObject); - } - if ($isSubAdmin) { - // admin users menu - $settings[] = array( - "id" => "core_users", - "order" => 3, - "href" => $urlGenerator->linkToRoute('settings_users'), - "name" => $l->t("Users"), - "icon" => $urlGenerator->imagePath("settings", "users.svg") - ); - } - - // if the user is an admin - if (OC_User::isAdminUser(OC_User::getUser())) { - // admin settings - $settings[] = array( - "id" => "admin", - "order" => 2, - "href" => $urlGenerator->linkToRoute('settings.AdminSettings.index'), - "name" => $l->t("Admin"), - "icon" => $urlGenerator->imagePath("settings", "admin.svg") - ); - } - } - - $navigation = self::proceedNavigation($settings); - return $navigation; - } - // This is private as well. It simply works, so don't ask for more details private static function proceedNavigation($list) { - $headerIconCount = 8; - if(OC_User::isAdminUser(OC_User::getUser())) { - $headerIconCount--; - } usort($list, function($a, $b) { if (isset($a['order']) && isset($b['order'])) { return ($a['order'] < $b['order']) ? -1 : 1; @@ -556,6 +481,11 @@ class OC_App { } unset($navEntry); + if (count($list) <= 8) { + return $list; + } + + $headerIconCount = 7; if($activeAppIndex > ($headerIconCount-1)) { $active = $list[$activeAppIndex]; $lastInHeader = $list[$headerIconCount-1]; @@ -576,10 +506,6 @@ class OC_App { } public static function proceedAppNavigation($entries) { - $headerIconCount = 8; - if(OC_User::isAdminUser(OC_User::getUser())) { - $headerIconCount--; - } $activeAppIndex = -1; $list = self::proceedNavigation($entries); @@ -592,6 +518,13 @@ class OC_App { $navEntry['active'] = false; } } + + + if (count($list) <= 8) { + return $list; + } + + $headerIconCount = 7; // move active item to last position if($activeAppIndex > ($headerIconCount-1)) { $active = $list[$activeAppIndex]; @@ -789,8 +722,7 @@ class OC_App { */ public static function getNavigation() { $entries = OC::$server->getNavigationManager()->getAll(); - $navigation = self::proceedNavigation($entries); - return $navigation; + return self::proceedNavigation($entries); } /** @@ -805,8 +737,20 @@ class OC_App { */ public static function getHeaderNavigation() { $entries = OC::$server->getNavigationManager()->getAll(); - $navigation = self::proceedAppNavigation($entries); - return $navigation; + return self::proceedAppNavigation($entries); + } + + /** + * Returns the Settings Navigation + * + * @return string[] + * + * This function returns an array containing all settings pages added. The + * entries are sorted by the key 'order' ascending. + */ + public static function getSettingsNavigation() { + $entries = OC::$server->getNavigationManager()->getAll('settings'); + return self::proceedNavigation($entries); } /** diff --git a/settings/img/apps.svg b/settings/img/apps.svg index d1509ea3a37..b6e545799a3 100644 --- a/settings/img/apps.svg +++ b/settings/img/apps.svg @@ -1 +1,4 @@ -<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1"><path d="M14 6v8H6v4h8v8h4v-8h8v-4h-8V6h-4z" fill="#FFF"/></svg>
\ No newline at end of file +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1"> + <path d="m7 2v5h-5v2h5v5h2v-5h5v-2h-5v-5z"/> +</svg> diff --git a/settings/js/apps.js b/settings/js/apps.js index d2f26578a7c..215b3c2c92e 100644 --- a/settings/js/apps.js +++ b/settings/js/apps.js @@ -530,21 +530,17 @@ OC.Settings.Apps = OC.Settings.Apps || { } previousEntry = entry; // do not show apps from #appmenu in #navigation - if(i < 7) { + if(i <= 7) { $('#navigation li').eq(i).addClass('in-header'); } else { $('#navigation li').eq(i).removeClass('in-header'); } } - - - if (navEntries.length > 7) { + if (navEntries.length > 8) { $('#more-apps').show(); - $('.apps-management').hide(); } else { $('#more-apps').hide(); - $('.apps-management').show(); } } }); diff --git a/tests/lib/NavigationManagerTest.php b/tests/lib/NavigationManagerTest.php index 64fec802eca..0871a9a0910 100644 --- a/tests/lib/NavigationManagerTest.php +++ b/tests/lib/NavigationManagerTest.php @@ -14,7 +14,7 @@ namespace Test; use OC\App\AppManager; use OC\NavigationManager; -use OCP\App\IAppManager; +use OCP\IConfig; use OCP\IGroupManager; use OCP\IL10N; use OCP\IURLGenerator; @@ -23,13 +23,41 @@ use OCP\IUserSession; use OCP\L10N\IFactory; class NavigationManagerTest extends TestCase { + /** @var AppManager|\PHPUnit_Framework_MockObject_MockObject */ + protected $appManager; + /** @var IURLGenerator|\PHPUnit_Framework_MockObject_MockObject */ + protected $urlGenerator; + /** @var IFactory|\PHPUnit_Framework_MockObject_MockObject */ + protected $l10nFac; + /** @var IUserSession|\PHPUnit_Framework_MockObject_MockObject */ + protected $userSession; + /** @var IGroupManager|\PHPUnit_Framework_MockObject_MockObject */ + protected $groupManager; + /** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */ + protected $config; + /** @var \OC\NavigationManager */ protected $navigationManager; protected function setUp() { parent::setUp(); - $this->navigationManager = new NavigationManager(); + $this->appManager = $this->createMock(AppManager::class); + $this->urlGenerator = $this->createMock(IURLGenerator::class); + $this->l10nFac = $this->createMock(IFactory::class); + $this->userSession = $this->createMock(IUserSession::class); + $this->groupManager = $this->createMock(IGroupManager::class); + $this->config = $this->createMock(IConfig::class); + $this->navigationManager = new NavigationManager( + $this->appManager, + $this->urlGenerator, + $this->l10nFac, + $this->userSession, + $this->groupManager, + $this->config + ); + + $this->navigationManager->clear(false); } public function addArrayData() { @@ -41,6 +69,7 @@ class NavigationManagerTest extends TestCase { 'order' => 1, 'icon' => 'optional', 'href' => 'url', + 'type' => 'settings', ], [ 'id' => 'entry id', @@ -49,6 +78,7 @@ class NavigationManagerTest extends TestCase { 'icon' => 'optional', 'href' => 'url', 'active' => false, + 'type' => 'settings', ], ], [ @@ -67,6 +97,7 @@ class NavigationManagerTest extends TestCase { 'icon' => '', 'href' => 'url', 'active' => false, + 'type' => 'link', ], ], ]; @@ -79,15 +110,15 @@ class NavigationManagerTest extends TestCase { * @param array $expectedEntry */ public function testAddArray(array $entry, array $expectedEntry) { - $this->assertEmpty($this->navigationManager->getAll(), 'Expected no navigation entry exists'); + $this->assertEmpty($this->navigationManager->getAll('all'), 'Expected no navigation entry exists'); $this->navigationManager->add($entry); - $navigationEntries = $this->navigationManager->getAll(); - $this->assertEquals(1, sizeof($navigationEntries), 'Expected that 1 navigation entry exists'); + $navigationEntries = $this->navigationManager->getAll('all'); + $this->assertCount(1, $navigationEntries, 'Expected that 1 navigation entry exists'); $this->assertEquals($expectedEntry, $navigationEntries[0]); - $this->navigationManager->clear(); - $this->assertEmpty($this->navigationManager->getAll(), 'Expected no navigation entry exists after clear()'); + $this->navigationManager->clear(false); + $this->assertEmpty($this->navigationManager->getAll('all'), 'Expected no navigation entry exists after clear()'); } /** @@ -109,18 +140,18 @@ class NavigationManagerTest extends TestCase { $this->assertEquals(0, $testAddClosureNumberOfCalls, 'Expected that the closure is not called by add()'); - $navigationEntries = $this->navigationManager->getAll(); + $navigationEntries = $this->navigationManager->getAll('all'); $this->assertEquals(1, $testAddClosureNumberOfCalls, 'Expected that the closure is called by getAll()'); - $this->assertEquals(1, sizeof($navigationEntries), 'Expected that 1 navigation entry exists'); + $this->assertCount(1, $navigationEntries, 'Expected that 1 navigation entry exists'); $this->assertEquals($expectedEntry, $navigationEntries[0]); - $navigationEntries = $this->navigationManager->getAll(); + $navigationEntries = $this->navigationManager->getAll('all'); $this->assertEquals(1, $testAddClosureNumberOfCalls, 'Expected that the closure is only called once for getAll()'); - $this->assertEquals(1, sizeof($navigationEntries), 'Expected that 1 navigation entry exists'); + $this->assertCount(1, $navigationEntries, 'Expected that 1 navigation entry exists'); $this->assertEquals($expectedEntry, $navigationEntries[0]); - $this->navigationManager->clear(); - $this->assertEmpty($this->navigationManager->getAll(), 'Expected no navigation entry exists after clear()'); + $this->navigationManager->clear(false); + $this->assertEmpty($this->navigationManager->getAll('all'), 'Expected no navigation entry exists after clear()'); } public function testAddArrayClearGetAll() { @@ -134,7 +165,7 @@ class NavigationManagerTest extends TestCase { $this->assertEmpty($this->navigationManager->getAll(), 'Expected no navigation entry exists'); $this->navigationManager->add($entry); - $this->navigationManager->clear(); + $this->navigationManager->clear(false); $this->assertEmpty($this->navigationManager->getAll(), 'Expected no navigation entry exists after clear()'); } @@ -160,7 +191,7 @@ class NavigationManagerTest extends TestCase { }); $this->assertEquals(0, $testAddClosureNumberOfCalls, 'Expected that the closure is not called by add()'); - $this->navigationManager->clear(); + $this->navigationManager->clear(false); $this->assertEquals(0, $testAddClosureNumberOfCalls, 'Expected that the closure is not called by clear()'); $this->assertEmpty($this->navigationManager->getAll(), 'Expected no navigation entry exists after clear()'); $this->assertEquals(0, $testAddClosureNumberOfCalls, 'Expected that the closure is not called by getAll()'); @@ -169,35 +200,29 @@ class NavigationManagerTest extends TestCase { /** * @dataProvider providesNavigationConfig */ - public function testWithAppManager($expected, $config, $isAdmin = false) { + public function testWithAppManager($expected, $navigation, $isAdmin = false) { - $appManager = $this->createMock(AppManager::class); - $urlGenerator = $this->createMock(IURLGenerator::class); - $l10nFac = $this->createMock(IFactory::class); - $userSession = $this->createMock(IUserSession::class); - $groupManager = $this->createMock(IGroupManager::class); $l = $this->createMock(IL10N::class); $l->expects($this->any())->method('t')->willReturnCallback(function($text, $parameters = []) { return vsprintf($text, $parameters); }); - $appManager->expects($this->once())->method('getInstalledApps')->willReturn(['test']); - $appManager->expects($this->once())->method('getAppInfo')->with('test')->willReturn($config); - $l10nFac->expects($this->exactly(count($expected)))->method('get')->with('test')->willReturn($l); - $urlGenerator->expects($this->any())->method('imagePath')->willReturnCallback(function($appName, $file) { + $this->appManager->expects($this->once())->method('getInstalledApps')->willReturn(['test']); + $this->appManager->expects($this->once())->method('getAppInfo')->with('test')->willReturn($navigation); + $this->l10nFac->expects($this->exactly(count($expected) + 1))->method('get')->willReturn($l); + $this->urlGenerator->expects($this->any())->method('imagePath')->willReturnCallback(function($appName, $file) { return "/apps/$appName/img/$file"; }); - $urlGenerator->expects($this->exactly(count($expected)))->method('linkToRoute')->willReturnCallback(function($route) { + $this->urlGenerator->expects($this->exactly(count($expected)))->method('linkToRoute')->willReturnCallback(function() { return "/apps/test/"; }); $user = $this->createMock(IUser::class); $user->expects($this->any())->method('getUID')->willReturn('user001'); - $userSession->expects($this->any())->method('getUser')->willReturn($user); - $groupManager->expects($this->any())->method('isAdmin')->willReturn($isAdmin); - - $navigationManager = new NavigationManager($appManager, $urlGenerator, $l10nFac, $userSession, $groupManager); + $this->userSession->expects($this->any())->method('getUser')->willReturn($user); + $this->groupManager->expects($this->any())->method('isAdmin')->willReturn($isAdmin); - $entries = $navigationManager->getAll(); + $this->navigationManager->clear(); + $entries = $this->navigationManager->getAll('all'); $this->assertEquals($expected, $entries); } @@ -209,18 +234,29 @@ class NavigationManagerTest extends TestCase { 'href' => '/apps/test/', 'icon' => '/apps/test/img/app.svg', 'name' => 'Test', - 'active' => false - ]], ['navigation' => ['route' => 'test.page.index', 'name' => 'Test']]], + 'active' => false, + 'type' => 'link', + ]], ['navigations' => [['route' => 'test.page.index', 'name' => 'Test']]]], + 'minimalistic-settings' => [[[ + 'id' => 'test', + 'order' => 100, + 'href' => '/apps/test/', + 'icon' => '/apps/test/img/app.svg', + 'name' => 'Test', + 'active' => false, + 'type' => 'settings', + ]], ['navigations' => [['route' => 'test.page.index', 'name' => 'Test', 'type' => 'settings']]]], 'no admin' => [[[ 'id' => 'test', 'order' => 100, 'href' => '/apps/test/', 'icon' => '/apps/test/img/app.svg', 'name' => 'Test', - 'active' => false - ]], ['navigation' => ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']], true], - 'no name' => [[], ['navigation' => ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index']], true], - 'admin' => [[], ['navigation' => ['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']]] + 'active' => false, + 'type' => 'link', + ]], ['navigations' => [['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']]], true], + 'no name' => [[], ['navigations' => [['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index']]], true], + 'admin' => [[], ['navigations' => [['@attributes' => ['role' => 'admin'], 'route' => 'test.page.index', 'name' => 'Test']]]] ]; } } |