diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1785,6 +1785,7 @@ 'PeopleBrowseUserDirectoryCapability' => 'applications/people/capability/PeopleBrowseUserDirectoryCapability.php', 'PeopleCreateUsersCapability' => 'applications/people/capability/PeopleCreateUsersCapability.php', 'PeopleHovercardEngineExtension' => 'applications/people/engineextension/PeopleHovercardEngineExtension.php', + 'PeopleMainMenuBarExtension' => 'applications/people/engineextension/PeopleMainMenuBarExtension.php', 'PeopleUserLogGarbageCollector' => 'applications/people/garbagecollector/PeopleUserLogGarbageCollector.php', 'Phabricator404Controller' => 'applications/base/controller/Phabricator404Controller.php', 'PhabricatorAWSConfigOptions' => 'applications/config/option/PhabricatorAWSConfigOptions.php', @@ -2671,6 +2672,7 @@ 'PhabricatorFavoritesApplication' => 'applications/favorites/application/PhabricatorFavoritesApplication.php', 'PhabricatorFavoritesController' => 'applications/favorites/controller/PhabricatorFavoritesController.php', 'PhabricatorFavoritesMainController' => 'applications/favorites/controller/PhabricatorFavoritesMainController.php', + 'PhabricatorFavoritesMainMenuBarExtension' => 'applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php', 'PhabricatorFavoritesMenuItemController' => 'applications/favorites/controller/PhabricatorFavoritesMenuItemController.php', 'PhabricatorFavoritesProfileMenuEngine' => 'applications/favorites/engine/PhabricatorFavoritesProfileMenuEngine.php', 'PhabricatorFaxContentSource' => 'infrastructure/contentsource/PhabricatorFaxContentSource.php', @@ -6662,6 +6664,7 @@ 'PeopleBrowseUserDirectoryCapability' => 'PhabricatorPolicyCapability', 'PeopleCreateUsersCapability' => 'PhabricatorPolicyCapability', 'PeopleHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension', + 'PeopleMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension', 'PeopleUserLogGarbageCollector' => 'PhabricatorGarbageCollector', 'Phabricator404Controller' => 'PhabricatorController', 'PhabricatorAWSConfigOptions' => 'PhabricatorApplicationConfigOptions', @@ -7685,6 +7688,7 @@ 'PhabricatorFavoritesApplication' => 'PhabricatorApplication', 'PhabricatorFavoritesController' => 'PhabricatorController', 'PhabricatorFavoritesMainController' => 'PhabricatorFavoritesController', + 'PhabricatorFavoritesMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension', 'PhabricatorFavoritesMenuItemController' => 'PhabricatorFavoritesController', 'PhabricatorFavoritesProfileMenuEngine' => 'PhabricatorProfileMenuEngine', 'PhabricatorFaxContentSource' => 'PhabricatorContentSource', diff --git a/src/applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php b/src/applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php --- a/src/applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php +++ b/src/applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php @@ -9,6 +9,10 @@ return true; } + public function getExtensionOrder() { + return 900; + } + public function buildMainMenus() { $viewer = $this->getViewer(); diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php --- a/src/applications/base/PhabricatorApplication.php +++ b/src/applications/base/PhabricatorApplication.php @@ -315,23 +315,6 @@ } - /** - * Build extra items for the main menu. Generally, this is used to render - * static dropdowns. - * - * @param PhabricatorUser The viewing user. - * @param AphrontController The current controller. May be null for special - * pages like 404, exception handlers, etc. - * @return view List of menu items. - * @task ui - */ - public function buildMainMenuExtraNodes( - PhabricatorUser $viewer, - PhabricatorController $controller = null) { - return array(); - } - - /* -( Application Management )--------------------------------------------- */ diff --git a/src/applications/favorites/application/PhabricatorFavoritesApplication.php b/src/applications/favorites/application/PhabricatorFavoritesApplication.php --- a/src/applications/favorites/application/PhabricatorFavoritesApplication.php +++ b/src/applications/favorites/application/PhabricatorFavoritesApplication.php @@ -32,82 +32,4 @@ return false; } - public function buildMainMenuExtraNodes( - PhabricatorUser $viewer, - PhabricatorController $controller = null) { - - $dropdown = $this->renderFavoritesDropdown($viewer); - if (!$dropdown) { - return null; - } - - return id(new PHUIButtonView()) - ->setTag('a') - ->setHref('#') - ->setIcon('fa-star') - ->addClass('phabricator-core-user-menu') - ->setNoCSS(true) - ->setDropdown(true) - ->setDropdownMenu($dropdown); - } - - private function renderFavoritesDropdown(PhabricatorUser $viewer) { - $application = __CLASS__; - - $applications = id(new PhabricatorApplicationQuery()) - ->setViewer($viewer) - ->withClasses(array($application)) - ->withInstalled(true) - ->execute(); - $favorites = head($applications); - if (!$favorites) { - return null; - } - - $menu_engine = id(new PhabricatorFavoritesProfileMenuEngine()) - ->setViewer($viewer) - ->setProfileObject($favorites); - - if ($viewer->getPHID()) { - $menu_engine - ->setCustomPHID($viewer->getPHID()) - ->setMenuType(PhabricatorProfileMenuEngine::MENU_COMBINED); - } else { - $menu_engine - ->setMenuType(PhabricatorProfileMenuEngine::MENU_GLOBAL); - } - - $filter_view = $menu_engine->buildNavigation(); - - $menu_view = $filter_view->getMenu(); - $item_views = $menu_view->getItems(); - - $view = id(new PhabricatorActionListView()) - ->setViewer($viewer); - foreach ($item_views as $item) { - $type = null; - if (!strlen($item->getName())) { - $type = PhabricatorActionView::TYPE_DIVIDER; - } - $action = id(new PhabricatorActionView()) - ->setName($item->getName()) - ->setHref($item->getHref()) - ->setType($type); - $view->addAction($action); - } - - // Build out edit interface - if ($viewer->isLoggedIn()) { - $view->addAction( - id(new PhabricatorActionView()) - ->setType(PhabricatorActionView::TYPE_DIVIDER)); - $view->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Edit Favorites')) - ->setHref('/favorites/')); - } - - return $view; - } - } diff --git a/src/applications/favorites/application/PhabricatorFavoritesApplication.php b/src/applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php copy from src/applications/favorites/application/PhabricatorFavoritesApplication.php copy to src/applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php --- a/src/applications/favorites/application/PhabricatorFavoritesApplication.php +++ b/src/applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php @@ -1,47 +1,29 @@ getViewer(); - public function getRoutes() { - return array( - '/favorites/' => array( - '' => 'PhabricatorFavoritesMainController', - '(?Pglobal|personal)/item/' => $this->getProfileMenuRouting( - 'PhabricatorFavoritesMenuItemController'), - ), - ); - } - - public function isLaunchable() { - return false; - } - - public function buildMainMenuExtraNodes( - PhabricatorUser $viewer, - PhabricatorController $controller = null) { - - $dropdown = $this->renderFavoritesDropdown($viewer); + $dropdown = $this->newDropdown($viewer); if (!$dropdown) { return null; } - return id(new PHUIButtonView()) + $favorites_menu = id(new PHUIButtonView()) ->setTag('a') ->setHref('#') ->setIcon('fa-star') @@ -49,14 +31,16 @@ ->setNoCSS(true) ->setDropdown(true) ->setDropdownMenu($dropdown); - } - private function renderFavoritesDropdown(PhabricatorUser $viewer) { - $application = __CLASS__; + return array( + $favorites_menu, + ); + } + private function newDropdown(PhabricatorUser $viewer) { $applications = id(new PhabricatorApplicationQuery()) ->setViewer($viewer) - ->withClasses(array($application)) + ->withClasses(array('PhabricatorFavoritesApplication')) ->withInstalled(true) ->execute(); $favorites = head($applications); @@ -96,7 +80,6 @@ $view->addAction($action); } - // Build out edit interface if ($viewer->isLoggedIn()) { $view->addAction( id(new PhabricatorActionView()) diff --git a/src/applications/home/application/PhabricatorHomeApplication.php b/src/applications/home/application/PhabricatorHomeApplication.php --- a/src/applications/home/application/PhabricatorHomeApplication.php +++ b/src/applications/home/application/PhabricatorHomeApplication.php @@ -42,114 +42,4 @@ return 9; } - public function buildMainMenuExtraNodes( - PhabricatorUser $viewer, - PhabricatorController $controller = null) { - - if (!$viewer->isLoggedIn()) { - return; - } - - $image = $viewer->getProfileImageURI(); - - $profile_image = id(new PHUIIconView()) - ->setImage($image) - ->setHeadSize(PHUIIconView::HEAD_SMALL); - - if ($controller) { - $application = $controller->getCurrentApplication(); - } else { - $application = null; - } - $dropdown_menu = $this->renderUserDropdown($viewer, $application); - - $menu_id = celerity_generate_unique_node_id(); - - Javelin::initBehavior( - 'user-menu', - array( - 'menuID' => $menu_id, - 'menu' => $dropdown_menu->getDropdownMenuMetadata(), - )); - - return id(new PHUIButtonView()) - ->setID($menu_id) - ->setTag('a') - ->setHref('/p/'.$viewer->getUsername().'/') - ->setIcon($profile_image) - ->addClass('phabricator-core-user-menu') - ->setHasCaret(true) - ->setNoCSS(true); - } - - private function renderUserDropdown( - PhabricatorUser $viewer, - $application) { - - $person_to_show = id(new PHUIObjectItemView()) - ->setObjectName($viewer->getRealName()) - ->setSubHead($viewer->getUsername()) - ->setImageURI($viewer->getProfileImageURI()); - - $user_view = id(new PHUIObjectItemListView()) - ->setViewer($viewer) - ->setFlush(true) - ->setSimple(true) - ->addItem($person_to_show) - ->addClass('phabricator-core-user-profile-object'); - - $view = id(new PhabricatorActionListView()) - ->setViewer($viewer); - - // User Menu - $view->addAction( - id(new PhabricatorActionView()) - ->appendChild($user_view)); - - $view->addAction( - id(new PhabricatorActionView()) - ->setType(PhabricatorActionView::TYPE_DIVIDER)); - - $view->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Profile')) - ->setHref('/p/'.$viewer->getUsername().'/')); - - $view->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Settings')) - ->setHref('/settings/user/'.$viewer->getUsername().'/')); - - $view->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Manage')) - ->setHref('/people/manage/'.$viewer->getID().'/')); - - // Help Menus - if ($application) { - $help_links = $application->getHelpMenuItems($viewer); - if ($help_links) { - foreach ($help_links as $link) { - $view->addAction($link); - } - } - } - - // Logout Menu - $view->addAction( - id(new PhabricatorActionView()) - ->addSigil('logout-item') - ->setType(PhabricatorActionView::TYPE_DIVIDER)); - - $view->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Log Out %s', $viewer->getUsername())) - ->addSigil('logout-item') - ->setHref('/logout/') - ->setColor(PhabricatorActionView::RED) - ->setWorkflow(true)); - - return $view; - } - } diff --git a/src/applications/home/application/PhabricatorHomeApplication.php b/src/applications/people/engineextension/PeopleMainMenuBarExtension.php copy from src/applications/home/application/PhabricatorHomeApplication.php copy to src/applications/people/engineextension/PeopleMainMenuBarExtension.php --- a/src/applications/home/application/PhabricatorHomeApplication.php +++ b/src/applications/people/engineextension/PeopleMainMenuBarExtension.php @@ -1,67 +1,22 @@ isLoggedIn(); } - public function getName() { - return pht('Home'); + public function getExtensionOrder() { + return 1200; } - public function getShortDescription() { - return pht('Command Center'); - } - - public function getIcon() { - return 'fa-home'; - } - - public function getRoutes() { - return array( - '/' => 'PhabricatorHomeMainController', - '/(?Phome)/' => 'PhabricatorHomeMainController', - '/home/' => array( - 'menu/' => array( - '' => 'PhabricatorHomeMenuController', - '(?Pglobal|personal)/item/' => $this->getProfileMenuRouting( - 'PhabricatorHomeMenuItemController'), - ), - ), - ); - } - - public function isLaunchable() { - return false; - } - - public function getApplicationOrder() { - return 9; - } - - public function buildMainMenuExtraNodes( - PhabricatorUser $viewer, - PhabricatorController $controller = null) { - - if (!$viewer->isLoggedIn()) { - return; - } - - $image = $viewer->getProfileImageURI(); - - $profile_image = id(new PHUIIconView()) - ->setImage($image) - ->setHeadSize(PHUIIconView::HEAD_SMALL); - - if ($controller) { - $application = $controller->getCurrentApplication(); - } else { - $application = null; - } - $dropdown_menu = $this->renderUserDropdown($viewer, $application); + public function buildMainMenus() { + $viewer = $this->getViewer(); + $application = $this->getApplication(); + $dropdown_menu = $this->newDropdown($viewer, $application); $menu_id = celerity_generate_unique_node_id(); @@ -72,7 +27,12 @@ 'menu' => $dropdown_menu->getDropdownMenuMetadata(), )); - return id(new PHUIButtonView()) + $image = $viewer->getProfileImageURI(); + $profile_image = id(new PHUIIconView()) + ->setImage($image) + ->setHeadSize(PHUIIconView::HEAD_SMALL); + + $user_menu = id(new PHUIButtonView()) ->setID($menu_id) ->setTag('a') ->setHref('/p/'.$viewer->getUsername().'/') @@ -80,9 +40,13 @@ ->addClass('phabricator-core-user-menu') ->setHasCaret(true) ->setNoCSS(true); + + return array( + $user_menu, + ); } - private function renderUserDropdown( + private function newDropdown( PhabricatorUser $viewer, $application) { @@ -101,7 +65,6 @@ $view = id(new PhabricatorActionListView()) ->setViewer($viewer); - // User Menu $view->addAction( id(new PhabricatorActionView()) ->appendChild($user_view)); @@ -125,7 +88,6 @@ ->setName(pht('Manage')) ->setHref('/people/manage/'.$viewer->getID().'/')); - // Help Menus if ($application) { $help_links = $application->getHelpMenuItems($viewer); if ($help_links) { @@ -135,7 +97,6 @@ } } - // Logout Menu $view->addAction( id(new PhabricatorActionView()) ->addSigil('logout-item') diff --git a/src/view/page/menu/PhabricatorMainMenuBarExtension.php b/src/view/page/menu/PhabricatorMainMenuBarExtension.php --- a/src/view/page/menu/PhabricatorMainMenuBarExtension.php +++ b/src/view/page/menu/PhabricatorMainMenuBarExtension.php @@ -64,12 +64,17 @@ return true; } + public function getExtensionOrder() { + return 1000; + } + abstract public function buildMainMenus(); final public static function getAllExtensions() { return id(new PhutilClassMapQuery()) ->setAncestorClass(__CLASS__) ->setUniqueMethod('getExtensionKey') + ->setSortMethod('getExtensionOrder') ->execute(); } diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php --- a/src/view/page/menu/PhabricatorMainMenuView.php +++ b/src/view/page/menu/PhabricatorMainMenuView.php @@ -82,20 +82,6 @@ phutil_implode_html(' ', $aural)); } - // Build out Header Menus - $applications = PhabricatorApplication::getAllInstalledApplications(); - - $menus = array(); - $controller = $this->getController(); - foreach ($applications as $application) { - $app_extra = $application->buildMainMenuExtraNodes( - $viewer, - $controller); - if ($app_extra !== null) { - $menus[] = $app_extra; - } - } - $extensions = PhabricatorMainMenuBarExtension::getAllEnabledExtensions(); foreach ($extensions as $extension) { $extension->setViewer($viewer); @@ -116,13 +102,18 @@ } } - // Builds out "login" button + $menus = array(); foreach ($extensions as $extension) { foreach ($extension->buildMainMenus() as $menu) { $menus[] = $menu; } } + // Because we display these with "float: right", reverse their order before + // rendering them into the document so that the extension order and display + // order are the same. + $menus = array_reverse($menus); + foreach ($menus as $menu) { $menu_bar[] = $menu; }