[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/people/controller/ -> PhabricatorPeopleProfileController.php (source)

   1  <?php
   2  
   3  final class PhabricatorPeopleProfileController
   4    extends PhabricatorPeopleController {
   5  
   6    private $username;
   7  
   8    public function shouldRequireAdmin() {
   9      return false;
  10    }
  11  
  12    public function willProcessRequest(array $data) {
  13      $this->username = idx($data, 'username');
  14    }
  15  
  16    public function processRequest() {
  17      $viewer = $this->getRequest()->getUser();
  18  
  19      $user = id(new PhabricatorPeopleQuery())
  20        ->setViewer($viewer)
  21        ->withUsernames(array($this->username))
  22        ->needProfileImage(true)
  23        ->executeOne();
  24      if (!$user) {
  25        return new Aphront404Response();
  26      }
  27  
  28      require_celerity_resource('phabricator-profile-css');
  29  
  30      $profile = $user->loadUserProfile();
  31      $username = phutil_escape_uri($user->getUserName());
  32  
  33      $picture = $user->loadProfileImageURI();
  34  
  35      $header = id(new PHUIHeaderView())
  36        ->setHeader($user->getFullName())
  37        ->setSubheader($profile->getTitle())
  38        ->setImage($picture);
  39  
  40      $actions = id(new PhabricatorActionListView())
  41        ->setObject($user)
  42        ->setObjectURI($this->getRequest()->getRequestURI())
  43        ->setUser($viewer);
  44  
  45      $can_edit = PhabricatorPolicyFilter::hasCapability(
  46        $viewer,
  47        $user,
  48        PhabricatorPolicyCapability::CAN_EDIT);
  49  
  50      $actions->addAction(
  51        id(new PhabricatorActionView())
  52          ->setIcon('fa-pencil')
  53          ->setName(pht('Edit Profile'))
  54          ->setHref($this->getApplicationURI('editprofile/'.$user->getID().'/'))
  55          ->setDisabled(!$can_edit)
  56          ->setWorkflow(!$can_edit));
  57  
  58      $actions->addAction(
  59        id(new PhabricatorActionView())
  60          ->setIcon('fa-picture-o')
  61          ->setName(pht('Edit Profile Picture'))
  62          ->setHref($this->getApplicationURI('picture/'.$user->getID().'/'))
  63          ->setDisabled(!$can_edit)
  64          ->setWorkflow(!$can_edit));
  65  
  66      if ($viewer->getIsAdmin()) {
  67        $actions->addAction(
  68          id(new PhabricatorActionView())
  69            ->setIcon('fa-wrench')
  70            ->setName(pht('Edit Settings'))
  71            ->setDisabled(!$can_edit)
  72            ->setWorkflow(!$can_edit)
  73            ->setHref('/settings/'.$user->getID().'/'));
  74  
  75        if ($user->getIsAdmin()) {
  76          $empower_icon = 'fa-arrow-circle-o-down';
  77          $empower_name = pht('Remove Administrator');
  78        } else {
  79          $empower_icon = 'fa-arrow-circle-o-up';
  80          $empower_name = pht('Make Administrator');
  81        }
  82  
  83        $actions->addAction(
  84          id(new PhabricatorActionView())
  85            ->setIcon($empower_icon)
  86            ->setName($empower_name)
  87            ->setDisabled(($user->getPHID() == $viewer->getPHID()))
  88            ->setWorkflow(true)
  89            ->setHref($this->getApplicationURI('empower/'.$user->getID().'/')));
  90  
  91        $actions->addAction(
  92          id(new PhabricatorActionView())
  93            ->setIcon('fa-tag')
  94            ->setName(pht('Change Username'))
  95            ->setWorkflow(true)
  96            ->setHref($this->getApplicationURI('rename/'.$user->getID().'/')));
  97  
  98        if ($user->getIsDisabled()) {
  99          $disable_icon = 'fa-check-circle-o';
 100          $disable_name = pht('Enable User');
 101        } else {
 102          $disable_icon = 'fa-ban';
 103          $disable_name = pht('Disable User');
 104        }
 105  
 106        $actions->addAction(
 107          id(new PhabricatorActionView())
 108            ->setIcon($disable_icon)
 109            ->setName($disable_name)
 110            ->setDisabled(($user->getPHID() == $viewer->getPHID()))
 111            ->setWorkflow(true)
 112            ->setHref($this->getApplicationURI('disable/'.$user->getID().'/')));
 113  
 114        $actions->addAction(
 115          id(new PhabricatorActionView())
 116            ->setIcon('fa-times')
 117            ->setName(pht('Delete User'))
 118            ->setDisabled(($user->getPHID() == $viewer->getPHID()))
 119            ->setWorkflow(true)
 120            ->setHref($this->getApplicationURI('delete/'.$user->getID().'/')));
 121  
 122        $actions->addAction(
 123          id(new PhabricatorActionView())
 124            ->setIcon('fa-envelope')
 125            ->setName(pht('Send Welcome Email'))
 126            ->setWorkflow(true)
 127            ->setHref($this->getApplicationURI('welcome/'.$user->getID().'/')));
 128      }
 129  
 130      $properties = $this->buildPropertyView($user, $actions);
 131  
 132      $crumbs = $this->buildApplicationCrumbs();
 133      $crumbs->addTextCrumb($user->getUsername());
 134      $crumbs->setActionList($actions);
 135      $feed = $this->renderUserFeed($user);
 136      $cal_class = 'PhabricatorCalendarApplication';
 137      $classes = array();
 138      $classes[] = 'profile-activity-view';
 139      if (PhabricatorApplication::isClassInstalledForViewer($cal_class, $user)) {
 140        $calendar = $this->renderUserCalendar($user);
 141        $classes[] = 'profile-has-calendar';
 142        $classes[] = 'grouped';
 143      } else {
 144        $calendar = null;
 145      }
 146      $activity = phutil_tag(
 147        'div',
 148        array(
 149          'class' => implode($classes, ' '),
 150        ),
 151        array(
 152          $calendar,
 153          $feed,
 154        ));
 155  
 156      $object_box = id(new PHUIObjectBoxView())
 157        ->setHeader($header)
 158        ->addPropertyList($properties);
 159  
 160      return $this->buildApplicationPage(
 161        array(
 162          $crumbs,
 163          $object_box,
 164          $activity,
 165        ),
 166        array(
 167          'title' => $user->getUsername(),
 168        ));
 169    }
 170  
 171    private function buildPropertyView(
 172      PhabricatorUser $user,
 173      PhabricatorActionListView $actions) {
 174  
 175      $viewer = $this->getRequest()->getUser();
 176      $view = id(new PHUIPropertyListView())
 177        ->setUser($viewer)
 178        ->setObject($user)
 179        ->setActionList($actions);
 180  
 181      $field_list = PhabricatorCustomField::getObjectFields(
 182        $user,
 183        PhabricatorCustomField::ROLE_VIEW);
 184      $field_list->appendFieldsToPropertyList($user, $viewer, $view);
 185  
 186      return $view;
 187    }
 188  
 189    private function renderUserFeed(PhabricatorUser $user) {
 190      $viewer = $this->getRequest()->getUser();
 191  
 192      $query = new PhabricatorFeedQuery();
 193      $query->setFilterPHIDs(
 194        array(
 195          $user->getPHID(),
 196        ));
 197      $query->setLimit(100);
 198      $query->setViewer($viewer);
 199      $stories = $query->execute();
 200  
 201      $builder = new PhabricatorFeedBuilder($stories);
 202      $builder->setUser($viewer);
 203      $builder->setShowHovercards(true);
 204      $view = $builder->buildView();
 205  
 206      return phutil_tag_div(
 207        'profile-feed',
 208        $view->render());
 209    }
 210  
 211    private function renderUserCalendar(PhabricatorUser $user) {
 212      $viewer = $this->getRequest()->getUser();
 213      $epochs = CalendarTimeUtil::getCalendarEventEpochs(
 214        $viewer,
 215        'today',
 216         7);
 217      $start_epoch = $epochs['start_epoch'];
 218      $end_epoch = $epochs['end_epoch'];
 219      $statuses = id(new PhabricatorCalendarEventQuery())
 220        ->setViewer($viewer)
 221        ->withInvitedPHIDs(array($user->getPHID()))
 222        ->withDateRange($start_epoch, $end_epoch)
 223        ->execute();
 224  
 225      $timestamps = CalendarTimeUtil::getCalendarWeekTimestamps(
 226        $viewer);
 227      $today = $timestamps['today'];
 228      $epoch_stamps = $timestamps['epoch_stamps'];
 229      $events = array();
 230  
 231      foreach ($epoch_stamps as $day) {
 232        $epoch_start = $day->format('U');
 233        $next_day = clone $day;
 234        $next_day->modify('+1 day');
 235        $epoch_end = $next_day->format('U');
 236  
 237        foreach ($statuses as $status) {
 238          if ($status->getDateTo() < $epoch_start) {
 239            continue;
 240          }
 241          if ($status->getDateFrom() >= $epoch_end) {
 242            continue;
 243          }
 244  
 245          $event = new AphrontCalendarEventView();
 246          $event->setEpochRange($status->getDateFrom(), $status->getDateTo());
 247  
 248          $status_text = $status->getHumanStatus();
 249          $event->setUserPHID($status->getUserPHID());
 250          $event->setName($status_text);
 251          $event->setDescription($status->getDescription());
 252          $event->setEventID($status->getID());
 253          $events[$epoch_start][] = $event;
 254        }
 255      }
 256  
 257      $week = array();
 258      foreach ($epoch_stamps as $day) {
 259        $epoch = $day->format('U');
 260        $headertext = phabricator_format_local_time($epoch, $user, 'l, M d');
 261  
 262        $list = new PHUICalendarListView();
 263        $list->setUser($viewer);
 264        $list->showBlankState(true);
 265        if (isset($events[$epoch])) {
 266          foreach ($events[$epoch] as $event) {
 267            $list->addEvent($event);
 268          }
 269        }
 270  
 271        $header = phutil_tag(
 272          'a',
 273          array(
 274            'href' => $this->getRequest()->getRequestURI().'calendar/',
 275          ),
 276          $headertext);
 277  
 278        $calendar = new PHUICalendarWidgetView();
 279        $calendar->setHeader($header);
 280        $calendar->setCalendarList($list);
 281        $week[] = $calendar;
 282      }
 283  
 284      return phutil_tag_div(
 285        'profile-calendar',
 286        $week);
 287    }
 288  }


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