diff --git a/src/applications/project/controller/PhabricatorProjectBoardController.php b/src/applications/project/controller/PhabricatorProjectBoardController.php --- a/src/applications/project/controller/PhabricatorProjectBoardController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardController.php @@ -3,11 +3,12 @@ abstract class PhabricatorProjectBoardController extends PhabricatorProjectController { - public function buildIconNavView(PhabricatorProject $project) { - $id = $project->getID(); - $nav = parent::buildIconNavView($project); - $nav->selectFilter(PhabricatorProject::PANEL_WORKBOARD); - $nav->addClass('project-board-nav'); - return $nav; + protected function getProfileMenu() { + $menu = parent::getProfileMenu(); + + $menu->selectFilter(PhabricatorProject::PANEL_WORKBOARD); + $menu->addClass('project-board-nav'); + + return $menu; } } 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 @@ -384,7 +384,7 @@ ->appendChild($board) ->addClass('project-board-wrapper'); - $nav = $this->buildIconNavView($project); + $nav = $this->getProfileMenu(); return $this->newPage() ->setTitle(pht('%s Board', $project->getName())) diff --git a/src/applications/project/controller/PhabricatorProjectColumnDetailController.php b/src/applications/project/controller/PhabricatorProjectColumnDetailController.php --- a/src/applications/project/controller/PhabricatorProjectColumnDetailController.php +++ b/src/applications/project/controller/PhabricatorProjectColumnDetailController.php @@ -49,15 +49,16 @@ ->setHeader($header) ->addPropertyList($properties); - $nav = $this->buildIconNavView($project); - $nav->appendChild($box); - $nav->appendChild($timeline); - - return $this->buildApplicationPage( - $nav, - array( - 'title' => $title, - )); + $nav = $this->getProfileMenu(); + + return $this->newPage() + ->setTitle($title) + ->setNavigation($nav) + ->appendChild( + array( + $box, + $timeline, + )); } private function buildHeaderView(PhabricatorProjectColumn $column) { diff --git a/src/applications/project/controller/PhabricatorProjectColumnEditController.php b/src/applications/project/controller/PhabricatorProjectColumnEditController.php --- a/src/applications/project/controller/PhabricatorProjectColumnEditController.php +++ b/src/applications/project/controller/PhabricatorProjectColumnEditController.php @@ -144,13 +144,11 @@ ->setValidationException($validation_exception) ->setForm($form); - $nav = $this->buildIconNavView($project); - $nav->appendChild($form_box); - - return $this->buildApplicationPage( - $nav, - array( - 'title' => $title, - )); + $nav = $this->getProfileMenu(); + + return $this->newPage() + ->setTitle($title) + ->setNavigation($nav) + ->appendChild($form_box); } } 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 @@ -3,6 +3,7 @@ abstract class PhabricatorProjectController extends PhabricatorController { private $project; + private $profileMenu; protected function setProject(PhabricatorProject $project) { $this->project = $project; @@ -80,50 +81,33 @@ } public function buildApplicationMenu() { - return $this->buildSideNavView(true)->getMenu(); - } + $menu = $this->newApplicationMenu(); - public function buildSideNavView($for_app = false) { - $project = $this->getProject(); + $profile_menu = $this->getProfileMenu(); + if ($profile_menu) { + $menu->setProfileMenu($profile_menu); + } + $menu->setSearchEngine(new PhabricatorProjectSearchEngine()); + return $menu; + } - $nav = new AphrontSideNavFilterView(); - $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); + protected function getProfileMenu() { + if (!$this->profileMenu) { + $project = $this->getProject(); + if ($project) { + $viewer = $this->getViewer(); - $viewer = $this->getViewer(); + $engine = id(new PhabricatorProfilePanelEngine()) + ->setViewer($viewer) + ->setProfileObject($project); - $id = null; - if ($for_app) { - if ($project) { - $id = $project->getID(); - $nav->addFilter("profile/{$id}/", pht('Profile')); - $nav->addFilter("board/{$id}/", pht('Workboard')); - $nav->addFilter("members/{$id}/", pht('Members')); - $nav->addFilter("feed/{$id}/", pht('Feed')); + $this->profileMenu = $engine->buildNavigation(); } - $nav->addFilter('create', pht('Create Project')); - } - - if (!$id) { - id(new PhabricatorProjectSearchEngine()) - ->setViewer($viewer) - ->addNavigationItems($nav->getMenu()); } - $nav->selectFilter(null); - - return $nav; - } - - public function buildIconNavView(PhabricatorProject $project) { - $viewer = $this->getViewer(); - - $engine = id(new PhabricatorProfilePanelEngine()) - ->setViewer($viewer) - ->setProfileObject($project); - - return $engine->buildNavigation(); + return $this->profileMenu; } protected function buildApplicationCrumbs() { diff --git a/src/applications/project/controller/PhabricatorProjectEditPictureController.php b/src/applications/project/controller/PhabricatorProjectEditPictureController.php --- a/src/applications/project/controller/PhabricatorProjectEditPictureController.php +++ b/src/applications/project/controller/PhabricatorProjectEditPictureController.php @@ -21,6 +21,8 @@ return new Aphront404Response(); } + $this->setProject($project); + $edit_uri = $this->getApplicationURI('profile/'.$project->getID().'/'); $view_uri = $this->getApplicationURI('profile/'.$project->getID().'/'); @@ -280,15 +282,16 @@ ->setHeaderText(pht('Upload New Picture')) ->setForm($upload_form); - $nav = $this->buildIconNavView($project); + $nav = $this->getProfileMenu(); $nav->selectFilter(PhabricatorProject::PANEL_PROFILE); - $nav->appendChild($form_box); - $nav->appendChild($upload_box); - return $this->buildApplicationPage( - $nav, - array( - 'title' => $title, - )); + return $this->newPage() + ->setTitle($title) + ->setNavigation($nav) + ->appendChild( + array( + $form_box, + $upload_box, + )); } } diff --git a/src/applications/project/controller/PhabricatorProjectFeedController.php b/src/applications/project/controller/PhabricatorProjectFeedController.php --- a/src/applications/project/controller/PhabricatorProjectFeedController.php +++ b/src/applications/project/controller/PhabricatorProjectFeedController.php @@ -33,7 +33,7 @@ ->setHeaderText(pht('Project Activity')) ->appendChild($feed); - $nav = $this->buildIconNavView($project); + $nav = $this->getProfileMenu(); $nav->selectFilter('feed'); $crumbs = $this->buildApplicationCrumbs(); diff --git a/src/applications/project/controller/PhabricatorProjectListController.php b/src/applications/project/controller/PhabricatorProjectListController.php --- a/src/applications/project/controller/PhabricatorProjectListController.php +++ b/src/applications/project/controller/PhabricatorProjectListController.php @@ -8,19 +8,9 @@ } public function handleRequest(AphrontRequest $request) { - $viewer = $request->getViewer(); - $query_key = $request->getURIData('queryKey'); - - $controller = id(new PhabricatorApplicationSearchController()) - ->setQueryKey($query_key) - ->setSearchEngine(new PhabricatorProjectSearchEngine()) - ->setNavigation($this->buildSideNavView()); - - return $this->delegateToController($controller); - } - - public function buildApplicationMenu() { - return $this->buildSideNavView(true)->getMenu(); + return id(new PhabricatorProjectSearchEngine()) + ->setController($this) + ->buildResponse(); } protected function buildApplicationCrumbs() { diff --git a/src/applications/project/controller/PhabricatorProjectMembersEditController.php b/src/applications/project/controller/PhabricatorProjectMembersEditController.php --- a/src/applications/project/controller/PhabricatorProjectMembersEditController.php +++ b/src/applications/project/controller/PhabricatorProjectMembersEditController.php @@ -17,6 +17,8 @@ return new Aphront404Response(); } + $this->setProject($project); + $member_phids = $project->getMemberPHIDs(); if ($request->isFormPost()) { @@ -95,7 +97,7 @@ $member_list = $this->renderMemberList($project, $handles); - $nav = $this->buildIconNavView($project); + $nav = $this->getProfileMenu(); $nav->selectFilter(PhabricatorProject::PANEL_MEMBERS); $crumbs = $this->buildApplicationCrumbs(); diff --git a/src/applications/project/controller/PhabricatorProjectMilestonesController.php b/src/applications/project/controller/PhabricatorProjectMilestonesController.php --- a/src/applications/project/controller/PhabricatorProjectMilestonesController.php +++ b/src/applications/project/controller/PhabricatorProjectMilestonesController.php @@ -76,7 +76,7 @@ ->setProjects($milestones) ->renderList()); - $nav = $this->buildIconNavView($project); + $nav = $this->getProfileMenu(); $nav->selectFilter(PhabricatorProject::PANEL_MILESTONES); $crumbs = $this->buildApplicationCrumbs(); 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 @@ -43,7 +43,7 @@ new PhabricatorProjectTransactionQuery()); $timeline->setShouldTerminate(true); - $nav = $this->buildIconNavView($project); + $nav = $this->getProfileMenu(); $nav->selectFilter(PhabricatorProject::PANEL_PROFILE); $crumbs = $this->buildApplicationCrumbs(); 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 @@ -75,7 +75,7 @@ ->setProjects($subprojects) ->renderList()); - $nav = $this->buildIconNavView($project); + $nav = $this->getProfileMenu(); $nav->selectFilter(PhabricatorProject::PANEL_SUBPROJECTS); $crumbs = $this->buildApplicationCrumbs(); diff --git a/src/view/layout/PHUIApplicationMenuView.php b/src/view/layout/PHUIApplicationMenuView.php --- a/src/view/layout/PHUIApplicationMenuView.php +++ b/src/view/layout/PHUIApplicationMenuView.php @@ -5,6 +5,7 @@ private $viewer; private $crumbs; private $searchEngine; + private $profileMenu; private $items = array(); @@ -32,6 +33,16 @@ return $this->addItem($item); } + public function setProfileMenu( + AphrontSideNavFilterView $nav) { + $this->profileMenu = $nav; + return $this; + } + + public function getProfileMenu() { + return $this->profileMenu; + } + public function addItem(PHUIListItemView $item) { $this->items[] = $item; return $this; @@ -61,6 +72,15 @@ $view = id(new PHUIListView()) ->setUser($viewer); + $profile_menu = $this->getProfileMenu(); + if ($profile_menu) { + foreach ($profile_menu->getMenu()->getItems() as $item) { + $item = clone $item; + $item->setRenderNameAsTooltip(false); + $view->addMenuItem($item); + } + } + $crumbs = $this->getCrumbs(); if ($crumbs) { $actions = $crumbs->getActions();