Differential D17410 Diff 41866 src/applications/people/controller/PhabricatorPeopleProfileViewController.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/people/controller/PhabricatorPeopleProfileViewController.php
<?php | <?php | ||||
final class PhabricatorPeopleProfileViewController | final class PhabricatorPeopleProfileViewController | ||||
extends PhabricatorPeopleProfileController { | extends PhabricatorPeopleProfileController { | ||||
public function shouldAllowPublic() { | public function shouldAllowPublic() { | ||||
return true; | return true; | ||||
} | } | ||||
public function handleRequest(AphrontRequest $request) { | public function handleRequest(AphrontRequest $request) { | ||||
$viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
$username = $request->getURIData('username'); | $username = $request->getURIData('username'); | ||||
$user = id(new PhabricatorPeopleQuery()) | $user = id(new PhabricatorPeopleQuery()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->withUsernames(array($username)) | ->withUsernames(array($username)) | ||||
->needBadges(true) | |||||
->needProfileImage(true) | ->needProfileImage(true) | ||||
->needAvailability(true) | ->needAvailability(true) | ||||
->executeOne(); | ->executeOne(); | ||||
if (!$user) { | if (!$user) { | ||||
return new Aphront404Response(); | return new Aphront404Response(); | ||||
} | } | ||||
$this->setUser($user); | $this->setUser($user); | ||||
$header = $this->buildProfileHeader(); | $header = $this->buildProfileHeader(); | ||||
$properties = $this->buildPropertyView($user); | $properties = $this->buildPropertyView($user); | ||||
$name = $user->getUsername(); | $name = $user->getUsername(); | ||||
$feed = $this->buildPeopleFeed($user, $viewer); | $feed = $this->buildPeopleFeed($user, $viewer); | ||||
$feed = id(new PHUIObjectBoxView()) | $feed = id(new PHUIObjectBoxView()) | ||||
->setHeaderText(pht('Recent Activity')) | ->setHeaderText(pht('Recent Activity')) | ||||
->addClass('project-view-feed') | ->addClass('project-view-feed') | ||||
->appendChild($feed); | ->appendChild($feed); | ||||
$projects = $this->buildProjectsView($user); | $projects = $this->buildProjectsView($user); | ||||
$calendar = $this->buildCalendarDayView($user); | $calendar = $this->buildCalendarDayView($user); | ||||
$badges = $this->buildBadgesView($user); | |||||
require_celerity_resource('project-view-css'); | |||||
$home = id(new PHUITwoColumnView()) | $home = id(new PHUITwoColumnView()) | ||||
->setHeader($header) | ->setHeader($header) | ||||
->addClass('project-view-home') | ->addClass('project-view-home') | ||||
->addClass('project-view-people-home') | ->addClass('project-view-people-home') | ||||
->setMainColumn( | ->setMainColumn( | ||||
array( | array( | ||||
$properties, | $properties, | ||||
$feed, | $feed, | ||||
)) | )) | ||||
->setSideColumn( | ->setSideColumn( | ||||
array( | array( | ||||
$projects, | $projects, | ||||
$calendar, | $calendar, | ||||
$badges, | |||||
)); | )); | ||||
$nav = $this->getProfileMenu(); | $nav = $this->getProfileMenu(); | ||||
$nav->selectFilter(PhabricatorPeopleProfileMenuEngine::ITEM_PROFILE); | $nav->selectFilter(PhabricatorPeopleProfileMenuEngine::ITEM_PROFILE); | ||||
$crumbs = $this->buildApplicationCrumbs(); | $crumbs = $this->buildApplicationCrumbs(); | ||||
$crumbs->setBorder(true); | $crumbs->setBorder(true); | ||||
▲ Show 20 Lines • Show All 159 Lines • ▼ Show 20 Lines | $box = id(new PHUIObjectBoxView()) | ||||
->setHeader($header) | ->setHeader($header) | ||||
->appendChild($day_view) | ->appendChild($day_view) | ||||
->addClass('calendar-profile-box') | ->addClass('calendar-profile-box') | ||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); | ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); | ||||
return $box; | return $box; | ||||
} | } | ||||
private function buildBadgesView(PhabricatorUser $user) { | |||||
$viewer = $this->getViewer(); | |||||
$class = 'PhabricatorBadgesApplication'; | |||||
if (!PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) { | |||||
return null; | |||||
} | |||||
$awards = array(); | |||||
$badges = array(); | |||||
if ($user->getBadgePHIDs()) { | |||||
$awards = id(new PhabricatorBadgesAwardQuery()) | |||||
->setViewer($viewer) | |||||
->withRecipientPHIDs(array($user->getPHID())) | |||||
->execute(); | |||||
$awards = mpull($awards, null, 'getBadgePHID'); | |||||
$badges = array(); | |||||
foreach ($awards as $award) { | |||||
$badge = $award->getBadge(); | |||||
if ($badge->getStatus() == PhabricatorBadgesBadge::STATUS_ACTIVE) { | |||||
$badges[$award->getBadgePHID()] = $badge; | |||||
} | |||||
} | |||||
} | |||||
if (count($badges)) { | |||||
$flex = new PHUIBadgeBoxView(); | |||||
foreach ($badges as $badge) { | |||||
if ($badge) { | |||||
$awarder_info = array(); | |||||
$award = idx($awards, $badge->getPHID(), null); | |||||
$awarder_phid = $award->getAwarderPHID(); | |||||
$awarder_handle = $viewer->renderHandle($awarder_phid); | |||||
$awarder_info = pht( | |||||
'Awarded by %s', | |||||
$awarder_handle->render()); | |||||
$item = id(new PHUIBadgeView()) | |||||
->setIcon($badge->getIcon()) | |||||
->setHeader($badge->getName()) | |||||
->setSubhead($badge->getFlavor()) | |||||
->setQuality($badge->getQuality()) | |||||
->setHref($badge->getViewURI()) | |||||
->addByLine($awarder_info); | |||||
$flex->addItem($item); | |||||
} | |||||
} | |||||
} else { | |||||
$flex = id(new PHUIInfoView()) | |||||
->setSeverity(PHUIInfoView::SEVERITY_NODATA) | |||||
->appendChild(pht('User does not have any badges.')); | |||||
} | |||||
// Best option? | |||||
$badges = id(new PhabricatorBadgesQuery()) | |||||
->setViewer($viewer) | |||||
->withStatuses(array( | |||||
PhabricatorBadgesBadge::STATUS_ACTIVE, | |||||
)) | |||||
->requireCapabilities( | |||||
array( | |||||
PhabricatorPolicyCapability::CAN_VIEW, | |||||
PhabricatorPolicyCapability::CAN_EDIT, | |||||
)) | |||||
->execute(); | |||||
$button = id(new PHUIButtonView()) | |||||
->setTag('a') | |||||
->setIcon('fa-plus') | |||||
->setText(pht('Award')) | |||||
->setWorkflow(true) | |||||
->setHref('/badges/award/'.$user->getID().'/'); | |||||
$can_award = false; | |||||
if (count($badges)) { | |||||
$can_award = true; | |||||
} | |||||
$header = id(new PHUIHeaderView()) | |||||
->setHeader(pht('Badges')); | |||||
if (count($badges)) { | |||||
$header->addActionLink($button); | |||||
} | |||||
$box = id(new PHUIObjectBoxView()) | |||||
->setHeader($header) | |||||
->addClass('project-view-badges') | |||||
->appendChild($flex) | |||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY); | |||||
return $box; | |||||
} | |||||
private function buildPeopleFeed( | private function buildPeopleFeed( | ||||
PhabricatorUser $user, | PhabricatorUser $user, | ||||
$viewer) { | $viewer) { | ||||
$query = new PhabricatorFeedQuery(); | $query = new PhabricatorFeedQuery(); | ||||
$query->setFilterPHIDs( | $query->setFilterPHIDs( | ||||
array( | array( | ||||
$user->getPHID(), | $user->getPHID(), | ||||
Show All 17 Lines |