[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/project/controller/ -> PhabricatorProjectProfileController.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1