Merge pull request #4077 from nextcloud/better-navigation-management
Register the app management in the normal way
This commit is contained in:
commit
12c5c336ad
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'])) {
|
||||
if (empty($info['navigations'])) {
|
||||
continue;
|
||||
}
|
||||
$nav = $info['navigation'];
|
||||
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);
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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>
|
||||
<?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>
|
||||
|
|
Before Width: | Height: | Size: 139 B After Width: | Height: | Size: 184 B |
|
@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -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);
|
||||
$this->userSession->expects($this->any())->method('getUser')->willReturn($user);
|
||||
$this->groupManager->expects($this->any())->method('isAdmin')->willReturn($isAdmin);
|
||||
|
||||
$navigationManager = new NavigationManager($appManager, $urlGenerator, $l10nFac, $userSession, $groupManager);
|
||||
|
||||
$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']]]]
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue