@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Make project page/navigation construction more consistent, particularly on mobile

Summary: Ref T10054. This mostly makes sure that mobile gets to have the same profile menu that Desktop does.

Test Plan:
- Viewed menus on mobile, saw all profile menu actions available.
- Viewed/used changed pages (column detail, edit column, edit picture).

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10054

Differential Revision: https://secure.phabricator.com/D15008

+82 -83
+7 -6
src/applications/project/controller/PhabricatorProjectBoardController.php
··· 3 3 abstract class PhabricatorProjectBoardController 4 4 extends PhabricatorProjectController { 5 5 6 - public function buildIconNavView(PhabricatorProject $project) { 7 - $id = $project->getID(); 8 - $nav = parent::buildIconNavView($project); 9 - $nav->selectFilter(PhabricatorProject::PANEL_WORKBOARD); 10 - $nav->addClass('project-board-nav'); 11 - return $nav; 6 + protected function getProfileMenu() { 7 + $menu = parent::getProfileMenu(); 8 + 9 + $menu->selectFilter(PhabricatorProject::PANEL_WORKBOARD); 10 + $menu->addClass('project-board-nav'); 11 + 12 + return $menu; 12 13 } 13 14 }
+1 -1
src/applications/project/controller/PhabricatorProjectBoardViewController.php
··· 384 384 ->appendChild($board) 385 385 ->addClass('project-board-wrapper'); 386 386 387 - $nav = $this->buildIconNavView($project); 387 + $nav = $this->getProfileMenu(); 388 388 389 389 return $this->newPage() 390 390 ->setTitle(pht('%s Board', $project->getName()))
+9 -8
src/applications/project/controller/PhabricatorProjectColumnDetailController.php
··· 49 49 ->setHeader($header) 50 50 ->addPropertyList($properties); 51 51 52 - $nav = $this->buildIconNavView($project); 53 - $nav->appendChild($box); 54 - $nav->appendChild($timeline); 52 + $nav = $this->getProfileMenu(); 55 53 56 - return $this->buildApplicationPage( 57 - $nav, 58 - array( 59 - 'title' => $title, 60 - )); 54 + return $this->newPage() 55 + ->setTitle($title) 56 + ->setNavigation($nav) 57 + ->appendChild( 58 + array( 59 + $box, 60 + $timeline, 61 + )); 61 62 } 62 63 63 64 private function buildHeaderView(PhabricatorProjectColumn $column) {
+5 -7
src/applications/project/controller/PhabricatorProjectColumnEditController.php
··· 144 144 ->setValidationException($validation_exception) 145 145 ->setForm($form); 146 146 147 - $nav = $this->buildIconNavView($project); 148 - $nav->appendChild($form_box); 147 + $nav = $this->getProfileMenu(); 149 148 150 - return $this->buildApplicationPage( 151 - $nav, 152 - array( 153 - 'title' => $title, 154 - )); 149 + return $this->newPage() 150 + ->setTitle($title) 151 + ->setNavigation($nav) 152 + ->appendChild($form_box); 155 153 } 156 154 }
+19 -35
src/applications/project/controller/PhabricatorProjectController.php
··· 3 3 abstract class PhabricatorProjectController extends PhabricatorController { 4 4 5 5 private $project; 6 + private $profileMenu; 6 7 7 8 protected function setProject(PhabricatorProject $project) { 8 9 $this->project = $project; ··· 80 81 } 81 82 82 83 public function buildApplicationMenu() { 83 - return $this->buildSideNavView(true)->getMenu(); 84 - } 84 + $menu = $this->newApplicationMenu(); 85 85 86 - public function buildSideNavView($for_app = false) { 87 - $project = $this->getProject(); 86 + $profile_menu = $this->getProfileMenu(); 87 + if ($profile_menu) { 88 + $menu->setProfileMenu($profile_menu); 89 + } 88 90 91 + $menu->setSearchEngine(new PhabricatorProjectSearchEngine()); 89 92 93 + return $menu; 94 + } 90 95 91 - $nav = new AphrontSideNavFilterView(); 92 - $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); 96 + protected function getProfileMenu() { 97 + if (!$this->profileMenu) { 98 + $project = $this->getProject(); 99 + if ($project) { 100 + $viewer = $this->getViewer(); 93 101 94 - $viewer = $this->getViewer(); 102 + $engine = id(new PhabricatorProfilePanelEngine()) 103 + ->setViewer($viewer) 104 + ->setProfileObject($project); 95 105 96 - $id = null; 97 - if ($for_app) { 98 - if ($project) { 99 - $id = $project->getID(); 100 - $nav->addFilter("profile/{$id}/", pht('Profile')); 101 - $nav->addFilter("board/{$id}/", pht('Workboard')); 102 - $nav->addFilter("members/{$id}/", pht('Members')); 103 - $nav->addFilter("feed/{$id}/", pht('Feed')); 106 + $this->profileMenu = $engine->buildNavigation(); 104 107 } 105 - $nav->addFilter('create', pht('Create Project')); 106 108 } 107 109 108 - if (!$id) { 109 - id(new PhabricatorProjectSearchEngine()) 110 - ->setViewer($viewer) 111 - ->addNavigationItems($nav->getMenu()); 112 - } 113 - 114 - $nav->selectFilter(null); 115 - 116 - return $nav; 117 - } 118 - 119 - public function buildIconNavView(PhabricatorProject $project) { 120 - $viewer = $this->getViewer(); 121 - 122 - $engine = id(new PhabricatorProfilePanelEngine()) 123 - ->setViewer($viewer) 124 - ->setProfileObject($project); 125 - 126 - return $engine->buildNavigation(); 110 + return $this->profileMenu; 127 111 } 128 112 129 113 protected function buildApplicationCrumbs() {
+11 -8
src/applications/project/controller/PhabricatorProjectEditPictureController.php
··· 21 21 return new Aphront404Response(); 22 22 } 23 23 24 + $this->setProject($project); 25 + 24 26 $edit_uri = $this->getApplicationURI('profile/'.$project->getID().'/'); 25 27 $view_uri = $this->getApplicationURI('profile/'.$project->getID().'/'); 26 28 ··· 280 282 ->setHeaderText(pht('Upload New Picture')) 281 283 ->setForm($upload_form); 282 284 283 - $nav = $this->buildIconNavView($project); 285 + $nav = $this->getProfileMenu(); 284 286 $nav->selectFilter(PhabricatorProject::PANEL_PROFILE); 285 - $nav->appendChild($form_box); 286 - $nav->appendChild($upload_box); 287 287 288 - return $this->buildApplicationPage( 289 - $nav, 290 - array( 291 - 'title' => $title, 292 - )); 288 + return $this->newPage() 289 + ->setTitle($title) 290 + ->setNavigation($nav) 291 + ->appendChild( 292 + array( 293 + $form_box, 294 + $upload_box, 295 + )); 293 296 } 294 297 }
+1 -1
src/applications/project/controller/PhabricatorProjectFeedController.php
··· 33 33 ->setHeaderText(pht('Project Activity')) 34 34 ->appendChild($feed); 35 35 36 - $nav = $this->buildIconNavView($project); 36 + $nav = $this->getProfileMenu(); 37 37 $nav->selectFilter('feed'); 38 38 39 39 $crumbs = $this->buildApplicationCrumbs();
+3 -13
src/applications/project/controller/PhabricatorProjectListController.php
··· 8 8 } 9 9 10 10 public function handleRequest(AphrontRequest $request) { 11 - $viewer = $request->getViewer(); 12 - $query_key = $request->getURIData('queryKey'); 13 - 14 - $controller = id(new PhabricatorApplicationSearchController()) 15 - ->setQueryKey($query_key) 16 - ->setSearchEngine(new PhabricatorProjectSearchEngine()) 17 - ->setNavigation($this->buildSideNavView()); 18 - 19 - return $this->delegateToController($controller); 20 - } 21 - 22 - public function buildApplicationMenu() { 23 - return $this->buildSideNavView(true)->getMenu(); 11 + return id(new PhabricatorProjectSearchEngine()) 12 + ->setController($this) 13 + ->buildResponse(); 24 14 } 25 15 26 16 protected function buildApplicationCrumbs() {
+3 -1
src/applications/project/controller/PhabricatorProjectMembersEditController.php
··· 17 17 return new Aphront404Response(); 18 18 } 19 19 20 + $this->setProject($project); 21 + 20 22 $member_phids = $project->getMemberPHIDs(); 21 23 22 24 if ($request->isFormPost()) { ··· 95 97 96 98 $member_list = $this->renderMemberList($project, $handles); 97 99 98 - $nav = $this->buildIconNavView($project); 100 + $nav = $this->getProfileMenu(); 99 101 $nav->selectFilter(PhabricatorProject::PANEL_MEMBERS); 100 102 101 103 $crumbs = $this->buildApplicationCrumbs();
+1 -1
src/applications/project/controller/PhabricatorProjectMilestonesController.php
··· 76 76 ->setProjects($milestones) 77 77 ->renderList()); 78 78 79 - $nav = $this->buildIconNavView($project); 79 + $nav = $this->getProfileMenu(); 80 80 $nav->selectFilter(PhabricatorProject::PANEL_MILESTONES); 81 81 82 82 $crumbs = $this->buildApplicationCrumbs();
+1 -1
src/applications/project/controller/PhabricatorProjectProfileController.php
··· 43 43 new PhabricatorProjectTransactionQuery()); 44 44 $timeline->setShouldTerminate(true); 45 45 46 - $nav = $this->buildIconNavView($project); 46 + $nav = $this->getProfileMenu(); 47 47 $nav->selectFilter(PhabricatorProject::PANEL_PROFILE); 48 48 49 49 $crumbs = $this->buildApplicationCrumbs();
+1 -1
src/applications/project/controller/PhabricatorProjectSubprojectsController.php
··· 75 75 ->setProjects($subprojects) 76 76 ->renderList()); 77 77 78 - $nav = $this->buildIconNavView($project); 78 + $nav = $this->getProfileMenu(); 79 79 $nav->selectFilter(PhabricatorProject::PANEL_SUBPROJECTS); 80 80 81 81 $crumbs = $this->buildApplicationCrumbs();
+20
src/view/layout/PHUIApplicationMenuView.php
··· 5 5 private $viewer; 6 6 private $crumbs; 7 7 private $searchEngine; 8 + private $profileMenu; 8 9 9 10 private $items = array(); 10 11 ··· 32 33 return $this->addItem($item); 33 34 } 34 35 36 + public function setProfileMenu( 37 + AphrontSideNavFilterView $nav) { 38 + $this->profileMenu = $nav; 39 + return $this; 40 + } 41 + 42 + public function getProfileMenu() { 43 + return $this->profileMenu; 44 + } 45 + 35 46 public function addItem(PHUIListItemView $item) { 36 47 $this->items[] = $item; 37 48 return $this; ··· 60 71 61 72 $view = id(new PHUIListView()) 62 73 ->setUser($viewer); 74 + 75 + $profile_menu = $this->getProfileMenu(); 76 + if ($profile_menu) { 77 + foreach ($profile_menu->getMenu()->getItems() as $item) { 78 + $item = clone $item; 79 + $item->setRenderNameAsTooltip(false); 80 + $view->addMenuItem($item); 81 + } 82 + } 63 83 64 84 $crumbs = $this->getCrumbs(); 65 85 if ($crumbs) {