diff --git a/src/applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php b/src/applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php --- a/src/applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php +++ b/src/applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php @@ -20,7 +20,7 @@ $dropdown = $this->newDropdown($viewer); if (!$dropdown) { - return null; + return array(); } $favorites_menu = id(new PHUIButtonView()) @@ -59,7 +59,8 @@ $menu_engine->setController($controller); } - $filter_view = $menu_engine->buildNavigation(); + $filter_view = $menu_engine->newProfileMenuItemViewList() + ->newNavigationView(); $menu_view = $filter_view->getMenu(); $item_views = $menu_view->getItems(); diff --git a/src/applications/home/controller/PhabricatorHomeController.php b/src/applications/home/controller/PhabricatorHomeController.php --- a/src/applications/home/controller/PhabricatorHomeController.php +++ b/src/applications/home/controller/PhabricatorHomeController.php @@ -1,44 +1,4 @@ newApplicationMenu(); - - $profile_menu = $this->getProfileMenu(); - if ($profile_menu) { - $menu->setProfileMenu($profile_menu); - } - - return $menu; - } - - protected function getProfileMenu() { - if (!$this->profileMenu) { - $viewer = $this->getViewer(); - $applications = id(new PhabricatorApplicationQuery()) - ->setViewer($viewer) - ->withClasses(array('PhabricatorHomeApplication')) - ->withInstalled(true) - ->execute(); - $home = head($applications); - if (!$home) { - return null; - } - - $engine = id(new PhabricatorHomeProfileMenuEngine()) - ->setViewer($viewer) - ->setController($this) - ->setProfileObject($home) - ->setCustomPHID($viewer->getPHID()); - - $this->profileMenu = $engine->buildNavigation(); - } - - return $this->profileMenu; - } - -} +abstract class PhabricatorHomeController + extends PhabricatorController {} diff --git a/src/applications/people/controller/PhabricatorPeopleProfileBadgesController.php b/src/applications/people/controller/PhabricatorPeopleProfileBadgesController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileBadgesController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileBadgesController.php @@ -30,8 +30,9 @@ $crumbs->addTextCrumb(pht('Badges')); $crumbs->setBorder(true); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorPeopleProfileMenuEngine::ITEM_BADGES); + $nav = $this->newNavigation( + $user, + PhabricatorPeopleProfileMenuEngine::ITEM_BADGES); // Best option? $badges = id(new PhabricatorBadgesQuery()) diff --git a/src/applications/people/controller/PhabricatorPeopleProfileCommitsController.php b/src/applications/people/controller/PhabricatorPeopleProfileCommitsController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileCommitsController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileCommitsController.php @@ -32,8 +32,9 @@ $crumbs->addTextCrumb(pht('Recent Commits')); $crumbs->setBorder(true); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorPeopleProfileMenuEngine::ITEM_COMMITS); + $nav = $this->newNavigation( + $user, + PhabricatorPeopleProfileMenuEngine::ITEM_COMMITS); $view = id(new PHUITwoColumnView()) ->setHeader($header) diff --git a/src/applications/people/controller/PhabricatorPeopleProfileController.php b/src/applications/people/controller/PhabricatorPeopleProfileController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileController.php @@ -4,7 +4,6 @@ extends PhabricatorPeopleController { private $user; - private $profileMenu; public function shouldRequireAdmin() { return false; @@ -19,34 +18,6 @@ return $this->user; } - public function buildApplicationMenu() { - $menu = $this->newApplicationMenu(); - - $profile_menu = $this->getProfileMenu(); - if ($profile_menu) { - $menu->setProfileMenu($profile_menu); - } - - return $menu; - } - - protected function getProfileMenu() { - if (!$this->profileMenu) { - $user = $this->getUser(); - if ($user) { - $viewer = $this->getViewer(); - - $engine = id(new PhabricatorPeopleProfileMenuEngine()) - ->setViewer($viewer) - ->setProfileObject($user); - - $this->profileMenu = $engine->buildNavigation(); - } - } - - return $this->profileMenu; - } - protected function buildApplicationCrumbs() { $crumbs = parent::buildApplicationCrumbs(); @@ -138,4 +109,24 @@ return $header; } + final protected function newNavigation( + PhabricatorUser $user, + $item_identifier) { + + $viewer = $this->getViewer(); + + $engine = id(new PhabricatorPeopleProfileMenuEngine()) + ->setViewer($viewer) + ->setController($this) + ->setProfileObject($user); + + $view_list = $engine->newProfileMenuItemViewList(); + + $view_list->setSelectedViewWithItemIdentifier($item_identifier); + + $navigation = $view_list->newNavigationView(); + + return $navigation; + } + } diff --git a/src/applications/people/controller/PhabricatorPeopleProfileManageController.php b/src/applications/people/controller/PhabricatorPeopleProfileManageController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileManageController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileManageController.php @@ -29,8 +29,9 @@ $properties = $this->buildPropertyView($user); $name = $user->getUsername(); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorPeopleProfileMenuEngine::ITEM_MANAGE); + $nav = $this->newNavigation( + $user, + PhabricatorPeopleProfileMenuEngine::ITEM_MANAGE); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Manage')); diff --git a/src/applications/people/controller/PhabricatorPeopleProfileRevisionsController.php b/src/applications/people/controller/PhabricatorPeopleProfileRevisionsController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileRevisionsController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileRevisionsController.php @@ -32,8 +32,9 @@ $crumbs->addTextCrumb(pht('Recent Revisions')); $crumbs->setBorder(true); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorPeopleProfileMenuEngine::ITEM_REVISIONS); + $nav = $this->newNavigation( + $user, + PhabricatorPeopleProfileMenuEngine::ITEM_REVISIONS); $view = id(new PHUITwoColumnView()) ->setHeader($header) diff --git a/src/applications/people/controller/PhabricatorPeopleProfileTasksController.php b/src/applications/people/controller/PhabricatorPeopleProfileTasksController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileTasksController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileTasksController.php @@ -32,8 +32,9 @@ $crumbs->addTextCrumb(pht('Assigned Tasks')); $crumbs->setBorder(true); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorPeopleProfileMenuEngine::ITEM_TASKS); + $nav = $this->newNavigation( + $user, + PhabricatorPeopleProfileMenuEngine::ITEM_TASKS); $view = id(new PHUITwoColumnView()) ->setHeader($header) diff --git a/src/applications/people/controller/PhabricatorPeopleProfileViewController.php b/src/applications/people/controller/PhabricatorPeopleProfileViewController.php --- a/src/applications/people/controller/PhabricatorPeopleProfileViewController.php +++ b/src/applications/people/controller/PhabricatorPeopleProfileViewController.php @@ -64,15 +64,16 @@ $calendar, )); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorPeopleProfileMenuEngine::ITEM_PROFILE); + $navigation = $this->newNavigation( + $user, + PhabricatorPeopleProfileMenuEngine::ITEM_PROFILE); $crumbs = $this->buildApplicationCrumbs(); $crumbs->setBorder(true); return $this->newPage() ->setTitle($user->getUsername()) - ->setNavigation($nav) + ->setNavigation($navigation) ->setCrumbs($crumbs) ->setPageObjectPHIDs( array( diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php --- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php @@ -172,7 +172,9 @@ return $content; } - $nav = $this->newWorkboardProfileMenu(); + $nav = $this->newNavigation( + $project, + PhabricatorProject::ITEM_WORKBOARD); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Workboard')); @@ -719,7 +721,9 @@ ->appendChild($board) ->addClass('project-board-wrapper'); - $nav = $this->newWorkboardProfileMenu(); + $nav = $this->newNavigation( + $project, + PhabricatorProject::ITEM_WORKBOARD); $divider = id(new PHUIListItemView()) ->setType(PHUIListItemView::TYPE_DIVIDER); @@ -1503,15 +1507,4 @@ ->addCancelButton($profile_uri); } - private function newWorkboardProfileMenu() { - $default_item = id(new PhabricatorProfileMenuItemConfiguration()) - ->setBuiltinKey(PhabricatorProject::ITEM_WORKBOARD); - - $menu = parent::getProfileMenu($default_item); - - $menu->addClass('project-board-nav'); - - return $menu; - } - } diff --git a/src/applications/project/controller/PhabricatorProjectController.php b/src/applications/project/controller/PhabricatorProjectController.php --- a/src/applications/project/controller/PhabricatorProjectController.php +++ b/src/applications/project/controller/PhabricatorProjectController.php @@ -84,30 +84,6 @@ return null; } - public function buildApplicationMenu() { - $menu = $this->newApplicationMenu(); - - $profile_menu = $this->getProfileMenu(); - if ($profile_menu) { - $menu->setProfileMenu($profile_menu); - } - - $menu->setSearchEngine(new PhabricatorProjectSearchEngine()); - - return $menu; - } - - protected function getProfileMenu($default_item = null) { - if (!$this->profileMenu) { - $engine = $this->getProfileMenuEngine(); - if ($engine) { - $this->profileMenu = $engine->buildNavigation($default_item); - } - } - - return $this->profileMenu; - } - protected function buildApplicationCrumbs() { return $this->newApplicationCrumbs('profile'); } @@ -207,4 +183,23 @@ return implode(', ', $result); } + final protected function newNavigation( + PhabricatorProject $project, + $item_identifier) { + + $engine = $this->getProfileMenuEngine(); + + $view_list = $engine->newProfileMenuItemViewList(); + + $view_list->setSelectedViewWithItemIdentifier($item_identifier); + + $navigation = $view_list->newNavigationView(); + + if ($item_identifier === PhabricatorProject::ITEM_WORKBOARD) { + $navigation->addClass('project-board-nav'); + } + + return $navigation; + } + } diff --git a/src/applications/project/controller/PhabricatorProjectManageController.php b/src/applications/project/controller/PhabricatorProjectManageController.php --- a/src/applications/project/controller/PhabricatorProjectManageController.php +++ b/src/applications/project/controller/PhabricatorProjectManageController.php @@ -37,8 +37,9 @@ new PhabricatorProjectTransactionQuery()); $timeline->setShouldTerminate(true); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorProject::ITEM_MANAGE); + $nav = $this->newNavigation( + $project, + PhabricatorProject::ITEM_MANAGE); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Manage')); diff --git a/src/applications/project/controller/PhabricatorProjectMembersViewController.php b/src/applications/project/controller/PhabricatorProjectMembersViewController.php --- a/src/applications/project/controller/PhabricatorProjectMembersViewController.php +++ b/src/applications/project/controller/PhabricatorProjectMembersViewController.php @@ -36,8 +36,9 @@ ->setUserPHIDs($project->getWatcherPHIDs()) ->setShowNote(true); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorProject::ITEM_MEMBERS); + $nav = $this->newNavigation( + $project, + PhabricatorProject::ITEM_MEMBERS); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Members')); diff --git a/src/applications/project/controller/PhabricatorProjectProfileController.php b/src/applications/project/controller/PhabricatorProjectProfileController.php --- a/src/applications/project/controller/PhabricatorProjectProfileController.php +++ b/src/applications/project/controller/PhabricatorProjectProfileController.php @@ -74,8 +74,9 @@ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) ->setUserPHIDs($project->getWatcherPHIDs()); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorProject::ITEM_PROFILE); + $nav = $this->newNavigation( + $project, + PhabricatorProject::ITEM_PROFILE); $stories = id(new PhabricatorFeedQuery()) ->setViewer($viewer) diff --git a/src/applications/project/controller/PhabricatorProjectSubprojectsController.php b/src/applications/project/controller/PhabricatorProjectSubprojectsController.php --- a/src/applications/project/controller/PhabricatorProjectSubprojectsController.php +++ b/src/applications/project/controller/PhabricatorProjectSubprojectsController.php @@ -77,8 +77,9 @@ $milestones, $subprojects); - $nav = $this->getProfileMenu(); - $nav->selectFilter(PhabricatorProject::ITEM_SUBPROJECTS); + $nav = $this->newNavigation( + $project, + PhabricatorProject::ITEM_SUBPROJECTS); $crumbs = $this->buildApplicationCrumbs(); $crumbs->addTextCrumb(pht('Subprojects')); diff --git a/src/applications/project/controller/PhabricatorProjectViewController.php b/src/applications/project/controller/PhabricatorProjectViewController.php --- a/src/applications/project/controller/PhabricatorProjectViewController.php +++ b/src/applications/project/controller/PhabricatorProjectViewController.php @@ -18,7 +18,7 @@ $project = $this->getProject(); $engine = $this->getProfileMenuEngine(); - $default = $engine->getDefaultItem(); + $default = $engine->getDefaultMenuItemConfiguration(); // If defaults are broken somehow, serve the manage page. See T13033 for // discussion. diff --git a/src/applications/search/controller/PhabricatorApplicationSearchController.php b/src/applications/search/controller/PhabricatorApplicationSearchController.php --- a/src/applications/search/controller/PhabricatorApplicationSearchController.php +++ b/src/applications/search/controller/PhabricatorApplicationSearchController.php @@ -387,7 +387,6 @@ require_celerity_resource('application-search-view-css'); return $this->newPage() - ->setApplicationMenu($this->buildApplicationMenu()) ->setTitle(pht('Query: %s', $title)) ->setCrumbs($crumbs) ->setNavigation($nav) @@ -611,7 +610,6 @@ ->setFooter($lists); return $this->newPage() - ->setApplicationMenu($this->buildApplicationMenu()) ->setTitle(pht('Saved Queries')) ->setCrumbs($crumbs) ->setNavigation($nav) diff --git a/src/view/page/PhabricatorStandardPageView.php b/src/view/page/PhabricatorStandardPageView.php --- a/src/view/page/PhabricatorStandardPageView.php +++ b/src/view/page/PhabricatorStandardPageView.php @@ -32,18 +32,6 @@ return $this->showFooter; } - public function setApplicationMenu($application_menu) { - // NOTE: For now, this can either be a PHUIListView or a - // PHUIApplicationMenuView. - - $this->applicationMenu = $application_menu; - return $this; - } - - public function getApplicationMenu() { - return $this->applicationMenu; - } - public function setApplicationName($application_name) { $this->applicationName = $application_name; return $this; @@ -345,7 +333,7 @@ $menu->setController($this->getController()); } - $application_menu = $this->getApplicationMenu(); + $application_menu = $this->applicationMenu; if ($application_menu) { if ($application_menu instanceof PHUIApplicationMenuView) { $crumbs = $this->getCrumbs(); @@ -865,13 +853,6 @@ public function produceAphrontResponse() { $controller = $this->getController(); - if (!$this->getApplicationMenu()) { - $application_menu = $controller->buildApplicationMenu(); - if ($application_menu) { - $this->setApplicationMenu($application_menu); - } - } - $viewer = $this->getUser(); if ($viewer && $viewer->getPHID()) { $object_phids = $this->pageObjects; @@ -887,6 +868,14 @@ $response = id(new AphrontAjaxResponse()) ->setContent($content); } else { + // See T13247. Try to find some navigational menu items to create a + // mobile navigation menu from. + $application_menu = $controller->buildApplicationMenu(); + if (!$application_menu) { + $application_menu = $this->getNavigation()->getMenu(); + } + $this->applicationMenu = $application_menu; + $content = $this->render(); $response = id(new AphrontWebpageResponse())