From 2e6ab9b9a698372a0ffa80cb619d58b60a892afc Mon Sep 17 00:00:00 2001 From: epriestley Date: Fri, 23 Dec 2011 18:17:40 -0800 Subject: [PATCH] Convert user profile to be more useful and use the new Project profile style layout Summary: - Use new less-horrible layout. - Organize information more completely and sensibly. Test Plan: Looked at some profiles. Reviewers: btrahan, jungejason Reviewed By: jungejason CC: aran, jungejason Differential Revision: https://secure.phabricator.com/D1281 --- .../PhabricatorPeopleProfileController.php | 130 ++++++++++-------- .../people/controller/profile/__init__.php | 7 +- 2 files changed, 80 insertions(+), 57 deletions(-) diff --git a/src/applications/people/controller/profile/PhabricatorPeopleProfileController.php b/src/applications/people/controller/profile/PhabricatorPeopleProfileController.php index 71a50c61c1..bc45f37c0a 100644 --- a/src/applications/people/controller/profile/PhabricatorPeopleProfileController.php +++ b/src/applications/people/controller/profile/PhabricatorPeopleProfileController.php @@ -37,6 +37,8 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { return new Aphront404Response(); } + require_celerity_resource('phabricator-profile-css'); + $profile = id(new PhabricatorUserProfile())->loadOneWhere( 'userPHID = %s', $user->getPHID()); @@ -44,16 +46,29 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { $profile = new PhabricatorUserProfile(); } - $links = array(); + $nav = new AphrontSideNavFilterView(); + $nav->setBaseURI(new PhutilURI('/p/'.$user->getUserName().'/')); + $nav->addFilter('feed', 'Feed'); + $nav->addFilter('about', 'About'); - if ($user->getPHID() == $viewer->getPHID()) { - $links[] = phutil_render_tag( - 'a', - array( - 'href' => '/settings/page/profile/', - ), - 'Edit Profile'); - } + $nav->addSpacer(); + $nav->addLabel('Activity'); + + $external_arrow = "\xE2\x86\x97"; + $nav->addFilter( + null, + "Revisions {$external_arrow}", + '/differential/filter/revisions/?phid='.$user->getPHID()); + + $nav->addFilter( + null, + "Tasks {$external_arrow}", + '/maniphest/view/action/?users='.$user->getPHID()); + + $nav->addFilter( + null, + "Commits {$external_arrow}", + '/diffusion/author/'.$user->getUserName().'/'); $oauths = id(new PhabricatorUserOAuthInfo())->loadAllWhere( 'userID = %d', @@ -61,6 +76,7 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { $oauths = mpull($oauths, null, 'getOAuthProvider'); $providers = PhabricatorOAuthProvider::getAllProviders(); + $added_spacer = false; foreach ($providers as $provider) { if (!$provider->isProviderEnabled()) { continue; @@ -76,28 +92,26 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { $href = $oauths[$provider_key]->getAccountURI(); if ($href) { - $links[] = phutil_render_tag( - 'a', - array( - 'href' => $href, - ), - phutil_escape_html($name)); + if (!$added_spacer) { + $nav->addSpacer(); + $nav->addLabel('Linked Accounts'); + $added_spacer = true; + } + $nav->addFilter(null, $name.' '.$external_arrow, $href); } } - // TODO: perhaps, if someone wants to add to the profile of the user the - // ability to show the task/revisions where he is working/commenting - // on, this has to be changed to something like - // |$this->page = key($pages)|, since the "page" regexp was added to - // the aphrontconfiguration. - if (empty($links[$this->page])) { - $this->page = 'action'; - } + $this->page = $nav->selectFilter($this->page, 'feed'); switch ($this->page) { - default: + case 'feed': + $content = $this->renderUserFeed($user); + break; + case 'about': $content = $this->renderBasicInformation($user, $profile); break; + default: + throw new Exception("Unknown page '{$this->page}'!"); } $src_phid = $profile->getProfileImagePHID(); @@ -105,36 +119,31 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { $src_phid = $user->getProfileImagePHID(); } $picture = PhabricatorFileURI::getViewURIForPHID($src_phid); - $title = nonempty($profile->getTitle(), 'Untitled Document'); - $realname = '('.$user->getRealName().')'; - $profile = new PhabricatorProfileView(); - $profile->setProfilePicture($picture); - $profile->setProfileNames( - $user->getUserName(), - $realname, - $title); - foreach ($links as $page => $name) { - if (is_integer($page)) { - $profile->addProfileItem( - phutil_render_tag( - 'span', - array(), - $name)); - } else { - $profile->addProfileItem($page); - } + $header = new PhabricatorProfileHeaderView(); + $header + ->setProfilePicture($picture) + ->setName($user->getUserName().' ('.$user->getRealName().')') + ->setDescription($profile->getTitle()); + + $header->appendChild($nav); + $nav->appendChild( + '
'.$content.'
'); + + if ($user->getPHID() == $viewer->getPHID()) { + $nav->addSpacer(); + $nav->addFilter(null, 'Edit Profile...', '/settings/page/profile/'); } - $profile->appendChild($content); return $this->buildStandardPageResponse( - $profile, + $header, array( 'title' => $user->getUsername(), )); } private function renderBasicInformation($user, $profile) { + $blurb = nonempty( $profile->getBlurb(), '//Nothing is known about this rare specimen.//'); @@ -182,19 +191,28 @@ class PhabricatorPeopleProfileController extends PhabricatorPeopleController { '; - $content .= - '
-

Recent Activities

-
- - - - - -
Commits'.$commit_list.'
-
-
'; return $content; } + + private function renderUserFeed(PhabricatorUser $user) { + $query = new PhabricatorFeedQuery(); + $query->setFilterPHIDs( + array( + $user->getPHID(), + )); + $stories = $query->execute(); + + $builder = new PhabricatorFeedBuilder($stories); + $builder->setUser($this->getRequest()->getUser()); + $view = $builder->buildView(); + + return + '
+

Activity Feed

+
+ '.$view->render().' +
+
'; + } } diff --git a/src/applications/people/controller/profile/__init__.php b/src/applications/people/controller/profile/__init__.php index 9f271cdce8..1793969090 100644 --- a/src/applications/people/controller/profile/__init__.php +++ b/src/applications/people/controller/profile/__init__.php @@ -8,16 +8,21 @@ phutil_require_module('phabricator', 'aphront/response/404'); phutil_require_module('phabricator', 'applications/auth/oauth/provider/base'); +phutil_require_module('phabricator', 'applications/feed/builder/feed'); +phutil_require_module('phabricator', 'applications/feed/query'); phutil_require_module('phabricator', 'applications/files/uri'); phutil_require_module('phabricator', 'applications/markup/engine'); phutil_require_module('phabricator', 'applications/people/controller/base'); phutil_require_module('phabricator', 'applications/people/storage/profile'); phutil_require_module('phabricator', 'applications/people/storage/user'); phutil_require_module('phabricator', 'applications/people/storage/useroauthinfo'); -phutil_require_module('phabricator', 'view/layout/profile'); +phutil_require_module('phabricator', 'infrastructure/celerity/api'); +phutil_require_module('phabricator', 'view/layout/profileheader'); +phutil_require_module('phabricator', 'view/layout/sidenavfilter'); phutil_require_module('phabricator', 'view/utils'); phutil_require_module('phutil', 'markup'); +phutil_require_module('phutil', 'parser/uri'); phutil_require_module('phutil', 'utils');