[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorProjectProfileController 4 extends PhabricatorProjectController { 5 6 private $id; 7 private $slug; 8 9 public function shouldAllowPublic() { 10 return true; 11 } 12 13 public function willProcessRequest(array $data) { 14 // via /project/view/$id/ 15 $this->id = idx($data, 'id'); 16 // via /tag/$slug/ 17 $this->slug = idx($data, 'slug'); 18 } 19 20 public function processRequest() { 21 $request = $this->getRequest(); 22 $user = $request->getUser(); 23 24 $query = id(new PhabricatorProjectQuery()) 25 ->setViewer($user) 26 ->needMembers(true) 27 ->needWatchers(true) 28 ->needImages(true) 29 ->needSlugs(true); 30 if ($this->slug) { 31 $query->withSlugs(array($this->slug)); 32 } else { 33 $query->withIDs(array($this->id)); 34 } 35 $project = $query->executeOne(); 36 if (!$project) { 37 return new Aphront404Response(); 38 } 39 if ($this->slug && $this->slug != $project->getPrimarySlug()) { 40 return id(new AphrontRedirectResponse()) 41 ->setURI('/tag/'.$project->getPrimarySlug().'/'); 42 } 43 44 $picture = $project->getProfileImageURI(); 45 46 require_celerity_resource('phabricator-profile-css'); 47 48 $tasks = $this->renderTasksPage($project); 49 50 $query = new PhabricatorFeedQuery(); 51 $query->setFilterPHIDs( 52 array( 53 $project->getPHID(), 54 )); 55 $query->setLimit(50); 56 $query->setViewer($this->getRequest()->getUser()); 57 $stories = $query->execute(); 58 $feed = $this->renderStories($stories); 59 60 $content = phutil_tag_div( 61 'phabricator-project-layout', 62 array($tasks, $feed)); 63 64 $id = $project->getID(); 65 $icon = id(new PHUIIconView()) 66 ->setIconFont('fa-columns'); 67 $board_btn = id(new PHUIButtonView()) 68 ->setTag('a') 69 ->setText(pht('Workboard')) 70 ->setHref($this->getApplicationURI("board/{$id}/")) 71 ->setIcon($icon); 72 73 $header = id(new PHUIHeaderView()) 74 ->setHeader($project->getName()) 75 ->setUser($user) 76 ->setPolicyObject($project) 77 ->setImage($picture) 78 ->addActionLink($board_btn); 79 80 if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) { 81 $header->setStatus('fa-check', 'bluegrey', pht('Active')); 82 } else { 83 $header->setStatus('fa-ban', 'dark', pht('Archived')); 84 } 85 86 $actions = $this->buildActionListView($project); 87 $properties = $this->buildPropertyListView($project, $actions); 88 89 $crumbs = $this->buildApplicationCrumbs(); 90 $crumbs->addTextCrumb($project->getName()) 91 ->setActionList($actions); 92 93 $object_box = id(new PHUIObjectBoxView()) 94 ->setHeader($header) 95 ->addPropertyList($properties); 96 97 return $this->buildApplicationPage( 98 array( 99 $crumbs, 100 $object_box, 101 $content, 102 ), 103 array( 104 'title' => $project->getName(), 105 )); 106 } 107 108 private function renderFeedPage(PhabricatorProject $project) { 109 110 $query = new PhabricatorFeedQuery(); 111 $query->setFilterPHIDs(array($project->getPHID())); 112 $query->setViewer($this->getRequest()->getUser()); 113 $query->setLimit(100); 114 $stories = $query->execute(); 115 116 if (!$stories) { 117 return pht('There are no stories about this project.'); 118 } 119 120 return $this->renderStories($stories); 121 } 122 123 private function renderStories(array $stories) { 124 assert_instances_of($stories, 'PhabricatorFeedStory'); 125 126 $builder = new PhabricatorFeedBuilder($stories); 127 $builder->setUser($this->getRequest()->getUser()); 128 $builder->setShowHovercards(true); 129 $view = $builder->buildView(); 130 131 return phutil_tag_div( 132 'profile-feed', 133 $view->render()); 134 } 135 136 137 private function renderTasksPage(PhabricatorProject $project) { 138 139 $user = $this->getRequest()->getUser(); 140 141 $query = id(new ManiphestTaskQuery()) 142 ->setViewer($user) 143 ->withAnyProjects(array($project->getPHID())) 144 ->withStatuses(ManiphestTaskStatus::getOpenStatusConstants()) 145 ->setOrderBy(ManiphestTaskQuery::ORDER_PRIORITY) 146 ->setLimit(10); 147 $tasks = $query->execute(); 148 149 $phids = mpull($tasks, 'getOwnerPHID'); 150 $phids = array_merge( 151 $phids, 152 array_mergev(mpull($tasks, 'getProjectPHIDs'))); 153 $phids = array_filter($phids); 154 $handles = $this->loadViewerHandles($phids); 155 156 $task_list = new ManiphestTaskListView(); 157 $task_list->setUser($user); 158 $task_list->setTasks($tasks); 159 $task_list->setHandles($handles); 160 161 $phid = $project->getPHID(); 162 $view_uri = urisprintf( 163 '/maniphest/?statuses=%s&allProjects=%s#R', 164 implode(',', ManiphestTaskStatus::getOpenStatusConstants()), 165 $phid); 166 $create_uri = '/maniphest/task/create/?projects='.$phid; 167 $icon = id(new PHUIIconView()) 168 ->setIconFont('fa-list'); 169 $button_view = id(new PHUIButtonView()) 170 ->setTag('a') 171 ->setText(pht('View All')) 172 ->setHref($view_uri) 173 ->setIcon($icon); 174 $icon_new = id(new PHUIIconView()) 175 ->setIconFont('fa-plus'); 176 $button_add = id(new PHUIButtonView()) 177 ->setTag('a') 178 ->setText(pht('New Task')) 179 ->setHref($create_uri) 180 ->setIcon($icon_new); 181 182 $header = id(new PHUIHeaderView()) 183 ->setHeader(pht('Open Tasks')) 184 ->addActionLink($button_add) 185 ->addActionLink($button_view); 186 187 $content = id(new PHUIObjectBoxView()) 188 ->setHeader($header) 189 ->appendChild($task_list); 190 191 return $content; 192 } 193 194 private function buildActionListView(PhabricatorProject $project) { 195 $request = $this->getRequest(); 196 $viewer = $request->getUser(); 197 198 $id = $project->getID(); 199 200 $view = id(new PhabricatorActionListView()) 201 ->setUser($viewer) 202 ->setObject($project) 203 ->setObjectURI($request->getRequestURI()); 204 205 $can_edit = PhabricatorPolicyFilter::hasCapability( 206 $viewer, 207 $project, 208 PhabricatorPolicyCapability::CAN_EDIT); 209 210 $view->addAction( 211 id(new PhabricatorActionView()) 212 ->setName(pht('Edit Project')) 213 ->setIcon('fa-pencil') 214 ->setHref($this->getApplicationURI("edit/{$id}/"))); 215 216 $view->addAction( 217 id(new PhabricatorActionView()) 218 ->setName(pht('Edit Members')) 219 ->setIcon('fa-users') 220 ->setHref($this->getApplicationURI("members/{$id}/")) 221 ->setDisabled(!$can_edit) 222 ->setWorkflow(!$can_edit)); 223 224 $action = null; 225 if (!$project->isUserMember($viewer->getPHID())) { 226 $can_join = PhabricatorPolicyFilter::hasCapability( 227 $viewer, 228 $project, 229 PhabricatorPolicyCapability::CAN_JOIN); 230 231 $action = id(new PhabricatorActionView()) 232 ->setUser($viewer) 233 ->setRenderAsForm(true) 234 ->setHref('/project/update/'.$project->getID().'/join/') 235 ->setIcon('fa-plus') 236 ->setDisabled(!$can_join) 237 ->setName(pht('Join Project')); 238 $view->addAction($action); 239 } else { 240 $action = id(new PhabricatorActionView()) 241 ->setWorkflow(true) 242 ->setHref('/project/update/'.$project->getID().'/leave/') 243 ->setIcon('fa-times') 244 ->setName(pht('Leave Project...')); 245 $view->addAction($action); 246 247 if (!$project->isUserWatcher($viewer->getPHID())) { 248 $action = id(new PhabricatorActionView()) 249 ->setWorkflow(true) 250 ->setHref('/project/watch/'.$project->getID().'/') 251 ->setIcon('fa-eye') 252 ->setName(pht('Watch Project')); 253 $view->addAction($action); 254 } else { 255 $action = id(new PhabricatorActionView()) 256 ->setWorkflow(true) 257 ->setHref('/project/unwatch/'.$project->getID().'/') 258 ->setIcon('fa-eye-slash') 259 ->setName(pht('Unwatch Project')); 260 $view->addAction($action); 261 } 262 } 263 264 $have_phriction = PhabricatorApplication::isClassInstalledForViewer( 265 'PhabricatorPhrictionApplication', 266 $viewer); 267 if ($have_phriction) { 268 $view->addAction( 269 id(new PhabricatorActionView()) 270 ->setIcon('fa-book grey') 271 ->setName(pht('View Wiki')) 272 ->setWorkflow(true) 273 ->setHref('/project/wiki/')); 274 } 275 276 return $view; 277 } 278 279 private function buildPropertyListView( 280 PhabricatorProject $project, 281 PhabricatorActionListView $actions) { 282 $request = $this->getRequest(); 283 $viewer = $request->getUser(); 284 285 $this->loadHandles( 286 array_merge( 287 $project->getMemberPHIDs(), 288 $project->getWatcherPHIDs())); 289 290 $view = id(new PHUIPropertyListView()) 291 ->setUser($viewer) 292 ->setObject($project) 293 ->setActionList($actions); 294 295 $hashtags = array(); 296 foreach ($project->getSlugs() as $slug) { 297 $hashtags[] = id(new PHUITagView()) 298 ->setType(PHUITagView::TYPE_OBJECT) 299 ->setName('#'.$slug->getSlug()); 300 } 301 302 $view->addProperty(pht('Hashtags'), phutil_implode_html(' ', $hashtags)); 303 304 $view->addProperty( 305 pht('Members'), 306 $project->getMemberPHIDs() 307 ? $this->renderHandlesForPHIDs($project->getMemberPHIDs(), ',') 308 : phutil_tag('em', array(), pht('None'))); 309 310 $view->addProperty( 311 pht('Watchers'), 312 $project->getWatcherPHIDs() 313 ? $this->renderHandlesForPHIDs($project->getWatcherPHIDs(), ',') 314 : phutil_tag('em', array(), pht('None'))); 315 316 $field_list = PhabricatorCustomField::getObjectFields( 317 $project, 318 PhabricatorCustomField::ROLE_VIEW); 319 $field_list->appendFieldsToPropertyList($project, $viewer, $view); 320 321 return $view; 322 } 323 324 325 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |