Path: blob/master/src/applications/people/controller/PhabricatorPeopleProfileViewController.php
12256 views
<?php12final class PhabricatorPeopleProfileViewController3extends PhabricatorPeopleProfileController {45public function shouldAllowPublic() {6return true;7}89public function handleRequest(AphrontRequest $request) {10$viewer = $this->getViewer();11$username = $request->getURIData('username');1213$user = id(new PhabricatorPeopleQuery())14->setViewer($viewer)15->withUsernames(array($username))16->needProfileImage(true)17->needAvailability(true)18->executeOne();19if (!$user) {20return new Aphront404Response();21}2223$this->setUser($user);24$header = $this->buildProfileHeader();2526$properties = $this->buildPropertyView($user);27$name = $user->getUsername();2829$feed = $this->buildPeopleFeed($user, $viewer);3031$view_all = id(new PHUIButtonView())32->setTag('a')33->setIcon(34id(new PHUIIconView())35->setIcon('fa-list-ul'))36->setText(pht('View All'))37->setHref('/feed/?userPHIDs='.$user->getPHID());3839$feed_header = id(new PHUIHeaderView())40->setHeader(pht('Recent Activity'))41->addActionLink($view_all);4243$feed = id(new PHUIObjectBoxView())44->setHeader($feed_header)45->addClass('project-view-feed')46->appendChild($feed);4748$projects = $this->buildProjectsView($user);49$calendar = $this->buildCalendarDayView($user);5051$home = id(new PHUITwoColumnView())52->setHeader($header)53->addClass('project-view-home')54->addClass('project-view-people-home')55->setMainColumn(56array(57$properties,58$feed,59))60->setSideColumn(61array(62$projects,63$calendar,64));6566$navigation = $this->newNavigation(67$user,68PhabricatorPeopleProfileMenuEngine::ITEM_PROFILE);6970$crumbs = $this->buildApplicationCrumbs();71$crumbs->setBorder(true);7273return $this->newPage()74->setTitle($user->getUsername())75->setNavigation($navigation)76->setCrumbs($crumbs)77->setPageObjectPHIDs(78array(79$user->getPHID(),80))81->appendChild(82array(83$home,84));85}8687private function buildPropertyView(88PhabricatorUser $user) {8990$viewer = $this->getRequest()->getUser();91$view = id(new PHUIPropertyListView())92->setUser($viewer)93->setObject($user);9495$field_list = PhabricatorCustomField::getObjectFields(96$user,97PhabricatorCustomField::ROLE_VIEW);98$field_list->appendFieldsToPropertyList($user, $viewer, $view);99100if (!$view->hasAnyProperties()) {101return null;102}103104$header = id(new PHUIHeaderView())105->setHeader(pht('User Details'));106107$view = id(new PHUIObjectBoxView())108->appendChild($view)109->setHeader($header)110->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)111->addClass('project-view-properties');112113return $view;114}115116private function buildProjectsView(117PhabricatorUser $user) {118119$viewer = $this->getViewer();120$projects = id(new PhabricatorProjectQuery())121->setViewer($viewer)122->withMemberPHIDs(array($user->getPHID()))123->needImages(true)124->withStatuses(125array(126PhabricatorProjectStatus::STATUS_ACTIVE,127))128->execute();129130$header = id(new PHUIHeaderView())131->setHeader(pht('Projects'));132133if (!empty($projects)) {134$limit = 5;135$render_phids = array_slice($projects, 0, $limit);136$list = id(new PhabricatorProjectListView())137->setUser($viewer)138->setProjects($render_phids);139140if (count($projects) > $limit) {141$header_text = pht(142'Projects (%s)',143phutil_count($projects));144145$header = id(new PHUIHeaderView())146->setHeader($header_text)147->addActionLink(148id(new PHUIButtonView())149->setTag('a')150->setIcon('fa-list-ul')151->setText(pht('View All'))152->setHref('/project/?member='.$user->getPHID()));153154}155156} else {157$list = id(new PHUIInfoView())158->setSeverity(PHUIInfoView::SEVERITY_NODATA)159->appendChild(pht('User does not belong to any projects.'));160}161162$box = id(new PHUIObjectBoxView())163->setHeader($header)164->appendChild($list)165->setBackground(PHUIObjectBoxView::BLUE_PROPERTY);166167return $box;168}169170private function buildCalendarDayView(PhabricatorUser $user) {171$viewer = $this->getViewer();172$class = 'PhabricatorCalendarApplication';173174if (!PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) {175return null;176}177178// Don't show calendar information for disabled users, since it's probably179// not useful or accurate and may be misleading.180if ($user->getIsDisabled()) {181return null;182}183184$midnight = PhabricatorTime::getTodayMidnightDateTime($viewer);185$week_end = clone $midnight;186$week_end = $week_end->modify('+3 days');187188$range_start = $midnight->format('U');189$range_end = $week_end->format('U');190191$events = id(new PhabricatorCalendarEventQuery())192->setViewer($viewer)193->withDateRange($range_start, $range_end)194->withInvitedPHIDs(array($user->getPHID()))195->withIsCancelled(false)196->needRSVPs(array($viewer->getPHID()))197->execute();198199$event_views = array();200foreach ($events as $event) {201$viewer_is_invited = $event->isRSVPInvited($viewer->getPHID());202203$can_edit = PhabricatorPolicyFilter::hasCapability(204$viewer,205$event,206PhabricatorPolicyCapability::CAN_EDIT);207208$epoch_min = $event->getStartDateTimeEpoch();209$epoch_max = $event->getEndDateTimeEpoch();210211$event_view = id(new AphrontCalendarEventView())212->setCanEdit($can_edit)213->setEventID($event->getID())214->setEpochRange($epoch_min, $epoch_max)215->setIsAllDay($event->getIsAllDay())216->setIcon($event->getIcon())217->setViewerIsInvited($viewer_is_invited)218->setName($event->getName())219->setDatetimeSummary($event->renderEventDate($viewer, true))220->setURI($event->getURI());221222$event_views[] = $event_view;223}224225$event_views = msort($event_views, 'getEpochStart');226227$day_view = id(new PHUICalendarWeekView())228->setViewer($viewer)229->setView('week')230->setEvents($event_views)231->setWeekLength(3)232->render();233234$header = id(new PHUIHeaderView())235->setHeader(pht('Calendar'))236->setHref(237urisprintf(238'/calendar/?invited=%s#R',239$user->getUsername()));240241$box = id(new PHUIObjectBoxView())242->setHeader($header)243->appendChild($day_view)244->addClass('calendar-profile-box')245->setBackground(PHUIObjectBoxView::BLUE_PROPERTY);246247return $box;248}249250private function buildPeopleFeed(251PhabricatorUser $user,252$viewer) {253254$query = id(new PhabricatorFeedQuery())255->setViewer($viewer)256->withFilterPHIDs(array($user->getPHID()))257->setLimit(100)258->setReturnPartialResultsOnOverheat(true);259260$stories = $query->execute();261262$overheated_view = null;263$is_overheated = $query->getIsOverheated();264if ($is_overheated) {265$overheated_message =266PhabricatorApplicationSearchController::newOverheatedError(267(bool)$stories);268269$overheated_view = id(new PHUIInfoView())270->setSeverity(PHUIInfoView::SEVERITY_WARNING)271->setTitle(pht('Query Overheated'))272->setErrors(273array(274$overheated_message,275));276}277278$builder = new PhabricatorFeedBuilder($stories);279$builder->setUser($viewer);280$builder->setShowHovercards(true);281$builder->setNoDataString(pht('To begin on such a grand journey, '.282'requires but just a single step.'));283$view = $builder->buildView();284285return array(286$overheated_view,287$view->render(),288);289}290291}292293294