@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.

Update Milestone/Subproject page

Summary: Cleans up the UI, moves details over to curtain, adds some fallback no data strings.

Test Plan: Review with and without subprojects, milestones.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

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

+76 -99
+63 -98
src/applications/project/controller/PhabricatorProjectSubprojectsController.php
··· 26 26 $allows_subprojects = $project->supportsSubprojects(); 27 27 $allows_milestones = $project->supportsMilestones(); 28 28 29 + $subproject_list = null; 30 + $milestone_list = null; 31 + 29 32 if ($allows_subprojects) { 30 33 $subprojects = id(new PhabricatorProjectQuery()) 31 34 ->setViewer($viewer) ··· 33 36 ->needImages(true) 34 37 ->withIsMilestone(false) 35 38 ->execute(); 39 + 40 + $subproject_list = id(new PHUIObjectBoxView()) 41 + ->setHeaderText(pht('%s Subprojects', $project->getName())) 42 + ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 43 + ->setObjectList( 44 + id(new PhabricatorProjectListView()) 45 + ->setUser($viewer) 46 + ->setProjects($subprojects) 47 + ->setNoDataString(pht('This project has no subprojects.')) 48 + ->renderList()); 36 49 } else { 37 50 $subprojects = array(); 38 51 } ··· 45 58 ->withIsMilestone(true) 46 59 ->setOrderVector(array('milestoneNumber', 'id')) 47 60 ->execute(); 48 - } else { 49 - $milestones = array(); 50 - } 51 61 52 - if ($milestones) { 53 62 $milestone_list = id(new PHUIObjectBoxView()) 54 - ->setHeaderText(pht('Milestones')) 63 + ->setHeaderText(pht('%s Milestones', $project->getName())) 55 64 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 56 65 ->setObjectList( 57 66 id(new PhabricatorProjectListView()) 58 67 ->setUser($viewer) 59 68 ->setProjects($milestones) 69 + ->setNoDataString(pht('This project has no milestones.')) 60 70 ->renderList()); 61 71 } else { 62 - $milestone_list = null; 72 + $milestones = array(); 63 73 } 64 74 65 - if ($subprojects) { 66 - $subproject_list = id(new PHUIObjectBoxView()) 67 - ->setHeaderText(pht('Subprojects')) 68 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 69 - ->setObjectList( 70 - id(new PhabricatorProjectListView()) 71 - ->setUser($viewer) 72 - ->setProjects($subprojects) 73 - ->renderList()); 74 - } else { 75 - $subproject_list = null; 76 - } 77 - 78 - $property_list = $this->buildPropertyList( 79 - $project, 80 - $milestones, 81 - $subprojects); 82 - 83 75 $curtain = $this->buildCurtainView( 84 76 $project, 85 77 $milestones, 86 78 $subprojects); 87 79 88 - 89 - $details = id(new PHUIObjectBoxView()) 90 - ->setHeaderText(pht('Details')) 91 - ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 92 - ->addPropertyList($property_list); 93 - 94 80 $nav = $this->getProfileMenu(); 95 81 $nav->selectFilter(PhabricatorProject::ITEM_SUBPROJECTS); 96 82 ··· 102 88 ->setHeader(pht('Subprojects and Milestones')) 103 89 ->setHeaderIcon('fa-sitemap'); 104 90 91 + require_celerity_resource('project-view-css'); 92 + 93 + // This page isn't reachable via UI, but make it pretty anyways. 94 + $info_view = null; 95 + if (!$milestone_list && !$subproject_list) { 96 + $info_view = id(new PHUIInfoView()) 97 + ->setSeverity(PHUIInfoView::SEVERITY_NOTICE) 98 + ->appendChild(pht('Milestone projects do not support subprojects '. 99 + 'or milestones.')); 100 + } 101 + 105 102 $view = id(new PHUITwoColumnView()) 106 103 ->setHeader($header) 107 104 ->setCurtain($curtain) 105 + ->addClass('project-view-home') 106 + ->addClass('project-view-people-home') 108 107 ->setMainColumn(array( 109 - $details, 108 + $info_view, 110 109 $milestone_list, 111 110 $subproject_list, 112 111 )); ··· 118 117 ->appendChild($view); 119 118 } 120 119 121 - private function buildPropertyList( 122 - PhabricatorProject $project, 123 - array $milestones, 124 - array $subprojects) { 125 - $viewer = $this->getViewer(); 126 - 127 - $view = id(new PHUIPropertyListView()) 128 - ->setUser($viewer); 129 - 130 - $view->addProperty( 131 - pht('Prototype'), 132 - $this->renderStatus( 133 - 'fa-exclamation-triangle red', 134 - pht('Warning'), 135 - pht('Subprojects and milestones are only partially implemented.'))); 136 - 137 - if (!$project->supportsMilestones()) { 138 - $milestone_status = $this->renderStatus( 139 - 'fa-times grey', 140 - pht('Already Milestone'), 141 - pht( 142 - 'This project is already a milestone, and milestones may not '. 143 - 'have their own milestones.')); 144 - } else { 145 - if (!$milestones) { 146 - $milestone_status = $this->renderStatus( 147 - 'fa-check grey', 148 - pht('None Created'), 149 - pht( 150 - 'You can create milestones for this project.')); 151 - } else { 152 - $milestone_status = $this->renderStatus( 153 - 'fa-check green', 154 - pht('Has Milestones'), 155 - pht('This project has milestones.')); 156 - } 157 - } 158 - 159 - $view->addProperty(pht('Milestones'), $milestone_status); 160 - 161 - if (!$project->supportsSubprojects()) { 162 - $subproject_status = $this->renderStatus( 163 - 'fa-times grey', 164 - pht('Milestone'), 165 - pht( 166 - 'This project is a milestone, and milestones may not have '. 167 - 'subprojects.')); 168 - } else { 169 - if (!$subprojects) { 170 - $subproject_status = $this->renderStatus( 171 - 'fa-check grey', 172 - pht('None Created'), 173 - pht('You can create subprojects for this project.')); 174 - } else { 175 - $subproject_status = $this->renderStatus( 176 - 'fa-check green', 177 - pht('Has Subprojects'), 178 - pht( 179 - 'This project has subprojects.')); 180 - } 181 - } 182 - 183 - $view->addProperty(pht('Subprojects'), $subproject_status); 184 - 185 - return $view; 186 - } 187 - 188 120 private function buildCurtainView( 189 121 PhabricatorProject $project, 190 122 array $milestones, ··· 243 175 ->setHref($subproject_href) 244 176 ->setDisabled($subproject_disabled) 245 177 ->setWorkflow($subproject_workflow)); 178 + 179 + 180 + if (!$project->supportsMilestones()) { 181 + $note = pht( 182 + 'This project is already a milestone, and milestones may not '. 183 + 'have their own milestones.'); 184 + } else { 185 + if (!$milestones) { 186 + $note = pht('You can create milestones for this project.'); 187 + } else { 188 + $note = pht('This project has milestones.'); 189 + } 190 + } 191 + 192 + $curtain->newPanel() 193 + ->setHeaderText(pht('Milestones')) 194 + ->appendChild($note); 195 + 196 + if (!$project->supportsSubprojects()) { 197 + $note = pht( 198 + 'This project is a milestone, and milestones may not have '. 199 + 'subprojects.'); 200 + } else { 201 + if (!$subprojects) { 202 + $note = pht('You can create subprojects for this project.'); 203 + } else { 204 + $note = pht('This project has subprojects.'); 205 + } 206 + } 207 + 208 + $curtain->newPanel() 209 + ->setHeaderText(pht('Subprojects')) 210 + ->appendChild($note); 246 211 247 212 return $curtain; 248 213 }
+13 -1
src/applications/project/view/PhabricatorProjectListView.php
··· 5 5 private $projects; 6 6 private $showMember; 7 7 private $showWatching; 8 + private $noDataString; 8 9 9 10 public function setProjects(array $projects) { 10 11 $this->projects = $projects; ··· 25 26 return $this; 26 27 } 27 28 29 + public function setNoDataString($text) { 30 + $this->noDataString = $text; 31 + return $this; 32 + } 33 + 28 34 public function renderList() { 29 35 $viewer = $this->getUser(); 30 36 $viewer_phid = $viewer->getPHID(); ··· 32 38 33 39 $handles = $viewer->loadHandles(mpull($projects, 'getPHID')); 34 40 41 + $no_data = pht('No projects found.'); 42 + if ($this->noDataString) { 43 + $no_data = $this->noDataString; 44 + } 45 + 35 46 $list = id(new PHUIObjectItemListView()) 36 - ->setUser($viewer); 47 + ->setUser($viewer) 48 + ->setNoDataString($no_data); 37 49 38 50 foreach ($projects as $key => $project) { 39 51 $id = $project->getID();