diff --git a/src/applications/config/application/PhabricatorConfigApplication.php b/src/applications/config/application/PhabricatorConfigApplication.php index e7540ad9de..a8c7f2ff5b 100644 --- a/src/applications/config/application/PhabricatorConfigApplication.php +++ b/src/applications/config/application/PhabricatorConfigApplication.php @@ -1,78 +1,78 @@ getIsAdmin(); } public function getTitleGlyph() { return "\xE2\x9C\xA8"; } public function getApplicationGroup() { return self::GROUP_ADMIN; } public function canUninstall() { return false; } public function getName() { return pht('Config'); } public function getShortDescription() { return pht('Configure Phabricator'); } public function getRoutes() { return array( '/config/' => array( '' => 'PhabricatorConfigListController', 'application/' => 'PhabricatorConfigApplicationController', 'all/' => 'PhabricatorConfigAllController', 'history/' => 'PhabricatorConfigHistoryController', 'edit/(?P[\w\.\-]+)/' => 'PhabricatorConfigEditController', 'group/(?P[^/]+)/' => 'PhabricatorConfigGroupController', 'version/' => 'PhabricatorConfigVersionController', 'database/'. '(?:(?P[^/]+)/'. '(?:(?P[^/]+)/'. '(?:(?P[^/]+)/'. '(?:(?:col/(?P[^/]+)|key/(?P[^/]+))/)?)?)?)?' => 'PhabricatorConfigDatabaseStatusController', 'dbissue/' => 'PhabricatorConfigDatabaseIssueController', '(?Pignore|unignore)/(?P[^/]+)/' => 'PhabricatorConfigIgnoreController', 'issue/' => array( '' => 'PhabricatorConfigIssueListController', 'panel/' => 'PhabricatorConfigIssuePanelController', '(?P[^/]+)/' => 'PhabricatorConfigIssueViewController', ), 'cache/' => array( '' => 'PhabricatorConfigCacheController', 'purge/' => 'PhabricatorConfigPurgeCacheController', ), 'module/' => array( - '(?P[^/]+)/' => 'PhabricatorConfigModuleController', + '(?:(?P[^/]+)/)?' => 'PhabricatorConfigModuleController', ), 'cluster/' => array( 'databases/' => 'PhabricatorConfigClusterDatabasesController', 'notifications/' => 'PhabricatorConfigClusterNotificationsController', 'repositories/' => 'PhabricatorConfigClusterRepositoriesController', 'search/' => 'PhabricatorConfigClusterSearchController', ), ), ); } } diff --git a/src/applications/config/controller/PhabricatorConfigController.php b/src/applications/config/controller/PhabricatorConfigController.php index 1b6a5af8b5..0b2a67a17f 100644 --- a/src/applications/config/controller/PhabricatorConfigController.php +++ b/src/applications/config/controller/PhabricatorConfigController.php @@ -1,93 +1,86 @@ setBaseURI(new PhutilURI($this->getApplicationURI())); $nav->addFilter('/', pht('Core Settings'), null, 'fa-gear'); $nav->addFilter('application/', pht('Application Settings'), null, 'fa-globe'); $nav->addFilter('history/', pht('Settings History'), null, 'fa-history'); $nav->addFilter('version/', pht('Version Information'), null, 'fa-download'); $nav->addFilter('all/', pht('All Settings'), null, 'fa-list-ul'); $nav->addLabel(pht('Setup')); $nav->addFilter('issue/', pht('Setup Issues'), null, 'fa-warning'); $nav->addFilter(null, pht('Installation Guide'), $guide_href, 'fa-book'); $nav->addLabel(pht('Database')); $nav->addFilter('database/', pht('Database Status'), null, 'fa-heartbeat'); $nav->addFilter('dbissue/', pht('Database Issues'), null, 'fa-exclamation-circle'); $nav->addLabel(pht('Cache')); $nav->addFilter('cache/', pht('Cache Status'), null, 'fa-home'); $nav->addLabel(pht('Cluster')); $nav->addFilter('cluster/databases/', pht('Database Servers'), null, 'fa-database'); $nav->addFilter('cluster/notifications/', pht('Notification Servers'), null, 'fa-bell-o'); $nav->addFilter('cluster/repositories/', pht('Repository Servers'), null, 'fa-code'); $nav->addFilter('cluster/search/', pht('Search Servers'), null, 'fa-search'); - $nav->addLabel(pht('Modules')); - - $modules = PhabricatorConfigModule::getAllModules(); - foreach ($modules as $key => $module) { - $nav->addFilter('module/'.$key.'/', - $module->getModuleName(), null, 'fa-puzzle-piece'); - } return $nav; } public function buildApplicationMenu() { return $this->buildSideNavView(null, true)->getMenu(); } public function buildHeaderView($text, $action = null) { $viewer = $this->getViewer(); $file = PhabricatorFile::loadBuiltin($viewer, 'projects/v3/manage.png'); $image = $file->getBestURI($file); $header = id(new PHUIHeaderView()) ->setHeader($text) ->setProfileHeader(true) ->setImage($image); if ($action) { $header->addActionLink($action); } return $header; } public function buildConfigBoxView($title, $content, $action = null) { $header = id(new PHUIHeaderView()) ->setHeader($title); if ($action) { $header->addActionItem($action); } $view = id(new PHUIObjectBoxView()) ->setHeader($header) ->appendChild($content) ->setBackground(PHUIObjectBoxView::WHITE_CONFIG); return $view; } } diff --git a/src/applications/config/controller/PhabricatorConfigModuleController.php b/src/applications/config/controller/PhabricatorConfigModuleController.php index fe919c57e4..aaa873f5d2 100644 --- a/src/applications/config/controller/PhabricatorConfigModuleController.php +++ b/src/applications/config/controller/PhabricatorConfigModuleController.php @@ -1,40 +1,59 @@ getViewer(); $key = $request->getURIData('module'); $all_modules = PhabricatorConfigModule::getAllModules(); + + if (!strlen($key)) { + $key = head_key($all_modules); + } + if (empty($all_modules[$key])) { return new Aphront404Response(); } $module = $all_modules[$key]; $content = $module->renderModuleStatus($request); $title = $module->getModuleName(); - $nav = $this->buildSideNavView(); - $nav->selectFilter('module/'.$key.'/'); + $nav = new AphrontSideNavFilterView(); + $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); + + $modules_uri = $this->getApplicationURI('module/'); + + $modules = PhabricatorConfigModule::getAllModules(); + + foreach ($modules as $module_key => $module) { + $nav->newLink($module_key) + ->setName($module->getModuleName()) + ->setHref(urisprintf('%s%s/', $modules_uri, $module_key)) + ->setIcon('fa-puzzle-piece'); + } + + $nav->selectFilter($key); $header = $this->buildHeaderView($title); $view = $this->buildConfigBoxView($title, $content); $crumbs = $this->buildApplicationCrumbs() + ->addTextCrumb(pht('Extensions/Modules'), $modules_uri) ->addTextCrumb($title) ->setBorder(true); $content = id(new PHUITwoColumnView()) ->setHeader($header) ->setFooter($view); return $this->newPage() ->setTitle($title) ->setCrumbs($crumbs) ->setNavigation($nav) ->appendChild($content); } }