@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Use ActionListView for all profile actions

Summary:
This leaves the space between the properties and the blurb looking a bit empty, but there will be more stuff there soon (status, VCS names, email, phone/fax numbers, etc., and custom user fields).

I removed "view lint messages" since I'm pretty sure no one has ever clicked it. I think providing better search (e.g, T2625) to that UI in Diffusion is a preferable approach.

Test Plan: {F49423}

Reviewers: chad, btrahan

Reviewed By: chad

CC: aran

Differential Revision: https://secure.phabricator.com/D6403

+143 -190
+45 -45
src/__celerity_resource_map__.php
··· 3029 3029 ), 3030 3030 'phabricator-action-list-view-css' => 3031 3031 array( 3032 - 'uri' => '/res/f63afae7/rsrc/css/layout/phabricator-action-list-view.css', 3032 + 'uri' => '/res/ef104683/rsrc/css/layout/phabricator-action-list-view.css', 3033 3033 'type' => 'css', 3034 3034 'requires' => 3035 3035 array( ··· 4149 4149 ), array( 4150 4150 'packages' => 4151 4151 array( 4152 - '680ace9b' => 4152 + '6e2d527c' => 4153 4153 array( 4154 4154 'name' => 'core.pkg.css', 4155 4155 'symbols' => ··· 4197 4197 40 => 'phabricator-property-list-view-css', 4198 4198 41 => 'phabricator-tag-view-css', 4199 4199 ), 4200 - 'uri' => '/res/pkg/680ace9b/core.pkg.css', 4200 + 'uri' => '/res/pkg/6e2d527c/core.pkg.css', 4201 4201 'type' => 'css', 4202 4202 ), 4203 4203 '75ccea43' => ··· 4391 4391 'reverse' => 4392 4392 array( 4393 4393 'aphront-attached-file-view-css' => 'adc3c36d', 4394 - 'aphront-dialog-view-css' => '680ace9b', 4395 - 'aphront-error-view-css' => '680ace9b', 4396 - 'aphront-form-view-css' => '680ace9b', 4397 - 'aphront-list-filter-view-css' => '680ace9b', 4398 - 'aphront-pager-view-css' => '680ace9b', 4399 - 'aphront-panel-view-css' => '680ace9b', 4400 - 'aphront-table-view-css' => '680ace9b', 4401 - 'aphront-tokenizer-control-css' => '680ace9b', 4402 - 'aphront-tooltip-css' => '680ace9b', 4403 - 'aphront-typeahead-control-css' => '680ace9b', 4394 + 'aphront-dialog-view-css' => '6e2d527c', 4395 + 'aphront-error-view-css' => '6e2d527c', 4396 + 'aphront-form-view-css' => '6e2d527c', 4397 + 'aphront-list-filter-view-css' => '6e2d527c', 4398 + 'aphront-pager-view-css' => '6e2d527c', 4399 + 'aphront-panel-view-css' => '6e2d527c', 4400 + 'aphront-table-view-css' => '6e2d527c', 4401 + 'aphront-tokenizer-control-css' => '6e2d527c', 4402 + 'aphront-tooltip-css' => '6e2d527c', 4403 + 'aphront-typeahead-control-css' => '6e2d527c', 4404 4404 'differential-changeset-view-css' => 'dd27a69b', 4405 4405 'differential-core-view-css' => 'dd27a69b', 4406 4406 'differential-inline-comment-editor' => '4ad86dee', ··· 4414 4414 'differential-table-of-contents-css' => 'dd27a69b', 4415 4415 'diffusion-commit-view-css' => 'c8ce2d88', 4416 4416 'diffusion-icons-css' => 'c8ce2d88', 4417 - 'global-drag-and-drop-css' => '680ace9b', 4417 + 'global-drag-and-drop-css' => '6e2d527c', 4418 4418 'inline-comment-summary-css' => 'dd27a69b', 4419 4419 'javelin-aphlict' => '75ccea43', 4420 4420 'javelin-behavior' => 'a9f14d76', ··· 4488 4488 'javelin-util' => 'a9f14d76', 4489 4489 'javelin-vector' => 'a9f14d76', 4490 4490 'javelin-workflow' => 'a9f14d76', 4491 - 'lightbox-attachment-css' => '680ace9b', 4491 + 'lightbox-attachment-css' => '6e2d527c', 4492 4492 'maniphest-task-summary-css' => 'adc3c36d', 4493 4493 'maniphest-transaction-detail-css' => 'adc3c36d', 4494 - 'phabricator-action-list-view-css' => '680ace9b', 4495 - 'phabricator-application-launch-view-css' => '680ace9b', 4494 + 'phabricator-action-list-view-css' => '6e2d527c', 4495 + 'phabricator-application-launch-view-css' => '6e2d527c', 4496 4496 'phabricator-busy' => '75ccea43', 4497 4497 'phabricator-content-source-view-css' => 'dd27a69b', 4498 - 'phabricator-core-css' => '680ace9b', 4499 - 'phabricator-crumbs-view-css' => '680ace9b', 4498 + 'phabricator-core-css' => '6e2d527c', 4499 + 'phabricator-crumbs-view-css' => '6e2d527c', 4500 4500 'phabricator-drag-and-drop-file-upload' => '4ad86dee', 4501 4501 'phabricator-dropdown-menu' => '75ccea43', 4502 4502 'phabricator-file-upload' => '75ccea43', 4503 - 'phabricator-filetree-view-css' => '680ace9b', 4504 - 'phabricator-flag-css' => '680ace9b', 4505 - 'phabricator-form-view-css' => '680ace9b', 4506 - 'phabricator-header-view-css' => '680ace9b', 4503 + 'phabricator-filetree-view-css' => '6e2d527c', 4504 + 'phabricator-flag-css' => '6e2d527c', 4505 + 'phabricator-form-view-css' => '6e2d527c', 4506 + 'phabricator-header-view-css' => '6e2d527c', 4507 4507 'phabricator-hovercard' => '75ccea43', 4508 - 'phabricator-jump-nav' => '680ace9b', 4508 + 'phabricator-jump-nav' => '6e2d527c', 4509 4509 'phabricator-keyboard-shortcut' => '75ccea43', 4510 4510 'phabricator-keyboard-shortcut-manager' => '75ccea43', 4511 - 'phabricator-main-menu-view' => '680ace9b', 4511 + 'phabricator-main-menu-view' => '6e2d527c', 4512 4512 'phabricator-menu-item' => '75ccea43', 4513 - 'phabricator-nav-view-css' => '680ace9b', 4513 + 'phabricator-nav-view-css' => '6e2d527c', 4514 4514 'phabricator-notification' => '75ccea43', 4515 - 'phabricator-notification-css' => '680ace9b', 4516 - 'phabricator-notification-menu-css' => '680ace9b', 4517 - 'phabricator-object-item-list-view-css' => '680ace9b', 4515 + 'phabricator-notification-css' => '6e2d527c', 4516 + 'phabricator-notification-menu-css' => '6e2d527c', 4517 + 'phabricator-object-item-list-view-css' => '6e2d527c', 4518 4518 'phabricator-object-selector-css' => 'dd27a69b', 4519 4519 'phabricator-phtize' => '75ccea43', 4520 4520 'phabricator-prefab' => '75ccea43', 4521 4521 'phabricator-project-tag-css' => 'adc3c36d', 4522 - 'phabricator-property-list-view-css' => '680ace9b', 4523 - 'phabricator-remarkup-css' => '680ace9b', 4522 + 'phabricator-property-list-view-css' => '6e2d527c', 4523 + 'phabricator-remarkup-css' => '6e2d527c', 4524 4524 'phabricator-shaped-request' => '4ad86dee', 4525 - 'phabricator-side-menu-view-css' => '680ace9b', 4526 - 'phabricator-standard-page-view' => '680ace9b', 4527 - 'phabricator-tag-view-css' => '680ace9b', 4525 + 'phabricator-side-menu-view-css' => '6e2d527c', 4526 + 'phabricator-standard-page-view' => '6e2d527c', 4527 + 'phabricator-tag-view-css' => '6e2d527c', 4528 4528 'phabricator-textareautils' => '75ccea43', 4529 4529 'phabricator-tooltip' => '75ccea43', 4530 - 'phabricator-transaction-view-css' => '680ace9b', 4531 - 'phabricator-zindex-css' => '680ace9b', 4532 - 'phui-button-css' => '680ace9b', 4533 - 'phui-form-css' => '680ace9b', 4534 - 'phui-icon-view-css' => '680ace9b', 4535 - 'phui-spacing-css' => '680ace9b', 4536 - 'sprite-apps-large-css' => '680ace9b', 4537 - 'sprite-gradient-css' => '680ace9b', 4538 - 'sprite-icons-css' => '680ace9b', 4539 - 'sprite-menu-css' => '680ace9b', 4540 - 'syntax-highlighting-css' => '680ace9b', 4530 + 'phabricator-transaction-view-css' => '6e2d527c', 4531 + 'phabricator-zindex-css' => '6e2d527c', 4532 + 'phui-button-css' => '6e2d527c', 4533 + 'phui-form-css' => '6e2d527c', 4534 + 'phui-icon-view-css' => '6e2d527c', 4535 + 'phui-spacing-css' => '6e2d527c', 4536 + 'sprite-apps-large-css' => '6e2d527c', 4537 + 'sprite-gradient-css' => '6e2d527c', 4538 + 'sprite-icons-css' => '6e2d527c', 4539 + 'sprite-menu-css' => '6e2d527c', 4540 + 'syntax-highlighting-css' => '6e2d527c', 4541 4541 ), 4542 4542 ));
-2
src/__phutil_library_map__.php
··· 484 484 'DiffusionPathQuery' => 'applications/diffusion/query/DiffusionPathQuery.php', 485 485 'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/__tests__/DiffusionPathQueryTestCase.php', 486 486 'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php', 487 - 'DiffusionPeopleMenuEventListener' => 'applications/diffusion/events/DiffusionPeopleMenuEventListener.php', 488 487 'DiffusionQuery' => 'applications/diffusion/query/DiffusionQuery.php', 489 488 'DiffusionRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionRawDiffQuery.php', 490 489 'DiffusionRemarkupRule' => 'applications/diffusion/remarkup/DiffusionRemarkupRule.php', ··· 2412 2411 'DiffusionPathCompleteController' => 'DiffusionController', 2413 2412 'DiffusionPathQueryTestCase' => 'PhabricatorTestCase', 2414 2413 'DiffusionPathValidateController' => 'DiffusionController', 2415 - 'DiffusionPeopleMenuEventListener' => 'PhutilEventListener', 2416 2414 'DiffusionQuery' => 'PhabricatorQuery', 2417 2415 'DiffusionRawDiffQuery' => 'DiffusionQuery', 2418 2416 'DiffusionRemarkupRule' => 'PhabricatorRemarkupRuleObject',
+16 -16
src/applications/audit/events/AuditPeopleMenuEventListener.php
··· 3 3 final class AuditPeopleMenuEventListener extends PhutilEventListener { 4 4 5 5 public function register() { 6 - $this->listen(PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU); 6 + $this->listen(PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS); 7 7 } 8 8 9 9 public function handleEvent(PhutilEvent $event) { 10 10 switch ($event->getType()) { 11 - case PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU: 12 - $this->handleMenuEvent($event); 11 + case PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS: 12 + $this->handleActionsEvent($event); 13 13 break; 14 14 } 15 15 } 16 16 17 - private function handleMenuEvent($event) { 18 - $viewer = $event->getUser(); 19 - $menu = $event->getValue('menu'); 20 - $person = $event->getValue('person'); 21 - $username = phutil_escape_uri($person->getUsername()); 17 + private function handleActionsEvent($event) { 18 + $person = $event->getValue('object'); 19 + if (!($person instanceof PhabricatorUser)) { 20 + return; 21 + } 22 22 23 + $actions = $event->getValue('actions'); 24 + 25 + $username = phutil_escape_uri($person->getUsername()); 23 26 $href = '/audit/view/author/'.$username.'/'; 24 - $name = pht('Commits'); 25 27 26 - $menu->addMenuItemToLabel('activity', 27 - id(new PHUIListItemView()) 28 - ->setIsExternal(true) 29 - ->setName($name) 30 - ->setHref($href) 31 - ->setKey($name)); 28 + $actions[] = id(new PhabricatorActionView()) 29 + ->setIcon('transcript') 30 + ->setName(pht('View Commits')) 31 + ->setHref($href); 32 32 33 - $event->setValue('menu', $menu); 33 + $event->setValue('actions', $actions); 34 34 } 35 35 36 36 }
+16 -17
src/applications/conpherence/events/ConpherencePeopleMenuEventListener.php
··· 3 3 final class ConpherencePeopleMenuEventListener extends PhutilEventListener { 4 4 5 5 public function register() { 6 - $this->listen(PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU); 6 + $this->listen(PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS); 7 7 } 8 8 9 9 public function handleEvent(PhutilEvent $event) { 10 10 switch ($event->getType()) { 11 - case PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU: 12 - $this->handleMenuEvent($event); 11 + case PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS: 12 + $this->handleActionsEvent($event); 13 13 break; 14 14 } 15 15 } 16 16 17 - private function handleMenuEvent($event) { 18 - $viewer = $event->getUser(); 19 - $menu = $event->getValue('menu'); 20 - $person = $event->getValue('person'); 17 + private function handleActionsEvent($event) { 18 + $person = $event->getValue('object'); 19 + if (!($person instanceof PhabricatorUser)) { 20 + return; 21 + } 22 + 23 + $href = '/conpherence/new/?participant='.$person->getPHID(); 21 24 22 - $conpherence_uri = 23 - new PhutilURI('/conpherence/new/?participant='.$person->getPHID()); 24 - $name = pht('Message'); 25 + $actions = $event->getValue('actions'); 25 26 26 - $menu->addMenuItemBefore('activity', 27 - id(new PHUIListItemView()) 28 - ->setIsExternal(true) 29 - ->setName($name) 30 - ->setHref($conpherence_uri) 27 + $actions[] = id(new PhabricatorActionView()) 28 + ->setIcon('message') 29 + ->setName(pht('Send Message')) 31 30 ->setWorkflow(true) 32 - ->setKey($name)); 31 + ->setHref($href); 33 32 34 - $event->setValue('menu', $menu); 33 + $event->setValue('actions', $actions); 35 34 } 36 35 37 36 }
+18 -17
src/applications/differential/events/DifferentialPeopleMenuEventListener.php
··· 3 3 final class DifferentialPeopleMenuEventListener extends PhutilEventListener { 4 4 5 5 public function register() { 6 - $this->listen(PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU); 6 + $this->listen(PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS); 7 7 } 8 8 9 9 public function handleEvent(PhutilEvent $event) { 10 10 switch ($event->getType()) { 11 - case PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU: 12 - $this->handleMenuEvent($event); 11 + case PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS: 12 + $this->handleActionsEvent($event); 13 13 break; 14 14 } 15 15 } 16 16 17 - private function handleMenuEvent($event) { 18 - $viewer = $event->getUser(); 19 - $menu = $event->getValue('menu'); 20 - $person = $event->getValue('person'); 21 - $username = phutil_escape_uri($person->getUserName()); 17 + private function handleActionsEvent($event) { 18 + $person = $event->getValue('object'); 19 + if (!($person instanceof PhabricatorUser)) { 20 + return; 21 + } 22 + 23 + $href = '/differential/?authorPHIDs[]='.$person->getPHID(); 22 24 23 - $href = '/differential/filter/revisions/'.$username.'/'; 24 - $name = pht('Revisions'); 25 + $actions = $event->getValue('actions'); 25 26 26 - $menu->addMenuItemToLabel('activity', 27 - id(new PHUIListItemView()) 28 - ->setIsExternal(true) 29 - ->setHref($href) 30 - ->setName($name) 31 - ->setKey($name)); 27 + $actions[] = id(new PhabricatorActionView()) 28 + ->setUser($event->getUser()) 29 + ->setRenderAsForm(true) 30 + ->setIcon('transcript') 31 + ->setName(pht('View Revisions')) 32 + ->setHref($href); 32 33 33 - $event->setValue('menu', $menu); 34 + $event->setValue('actions', $actions); 34 35 } 35 36 36 37 }
-1
src/applications/diffusion/application/PhabricatorApplicationDiffusion.php
··· 26 26 27 27 public function getEventListeners() { 28 28 return array( 29 - new DiffusionPeopleMenuEventListener(), 30 29 new DiffusionHovercardEventListener(), 31 30 ); 32 31 }
-36
src/applications/diffusion/events/DiffusionPeopleMenuEventListener.php
··· 1 - <?php 2 - 3 - final class DiffusionPeopleMenuEventListener extends PhutilEventListener { 4 - 5 - public function register() { 6 - $this->listen(PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU); 7 - } 8 - 9 - public function handleEvent(PhutilEvent $event) { 10 - switch ($event->getType()) { 11 - case PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU: 12 - $this->handleMenuEvent($event); 13 - break; 14 - } 15 - } 16 - 17 - private function handleMenuEvent($event) { 18 - $viewer = $event->getUser(); 19 - $menu = $event->getValue('menu'); 20 - $person_phid = $event->getValue('person')->getPHID(); 21 - 22 - $href = '/diffusion/lint/?owner[0]='.$person_phid; 23 - $name = pht('Lint Messages'); 24 - 25 - $menu->addMenuItemToLabel('activity', 26 - id(new PHUIListItemView()) 27 - ->setIsExternal(true) 28 - ->setHref($href) 29 - ->setName($name) 30 - ->setKey($name)); 31 - 32 - $event->setValue('menu', $menu); 33 - } 34 - 35 - } 36 -
+7
src/applications/flag/events/PhabricatorFlagsUIEventListener.php
··· 24 24 return; 25 25 } 26 26 27 + if (($object instanceof PhabricatorUser)) { 28 + // Although there's no real reason not to let you flag users, it also 29 + // makes less conceptual sense than flaging other types of objects. For 30 + // now, don't allow it. 31 + return; 32 + } 33 + 27 34 $flag = PhabricatorFlagQuery::loadUserFlag($user, $object->getPHID()); 28 35 29 36 if ($flag) {
+16 -16
src/applications/maniphest/event/ManiphestPeopleMenuEventListener.php
··· 3 3 final class ManiphestPeopleMenuEventListener extends PhutilEventListener { 4 4 5 5 public function register() { 6 - $this->listen(PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU); 6 + $this->listen(PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS); 7 7 } 8 8 9 9 public function handleEvent(PhutilEvent $event) { 10 10 switch ($event->getType()) { 11 - case PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU: 12 - $this->handleMenuEvent($event); 11 + case PhabricatorEventType::TYPE_UI_DIDRENDERACTIONS: 12 + $this->handleActionsEvent($event); 13 13 break; 14 14 } 15 15 } 16 16 17 - private function handleMenuEvent($event) { 18 - $viewer = $event->getUser(); 19 - $menu = $event->getValue('menu'); 20 - $person_phid = $event->getValue('person')->getPHID(); 17 + private function handleActionsEvent($event) { 18 + $person = $event->getValue('object'); 19 + if (!($person instanceof PhabricatorUser)) { 20 + return; 21 + } 21 22 22 - $href = '/maniphest/view/action/?users='.$person_phid; 23 - $name = pht('Tasks'); 23 + $href = '/maniphest/view/action/?users='.$person->getPHID(); 24 24 25 - $menu->addMenuItemToLabel('activity', 26 - id(new PHUIListItemView()) 27 - ->setIsExternal(true) 28 - ->setHref($href) 29 - ->setName($name) 30 - ->setKey($name)); 25 + $actions = $event->getValue('actions'); 31 26 32 - $event->setValue('menu', $menu); 27 + $actions[] = id(new PhabricatorActionView()) 28 + ->setIcon('transcript') 29 + ->setName(pht('View Tasks')) 30 + ->setHref($href); 31 + 32 + $event->setValue('actions', $actions); 33 33 } 34 34 35 35 }
+1 -1
src/applications/people/application/PhabricatorApplicationPeople.php
··· 49 49 'picture/(?P<id>[1-9]\d*)/' => 50 50 'PhabricatorPeopleProfilePictureController', 51 51 ), 52 - '/p/(?P<username>[\w._-]+)/(?:(?P<page>\w+)/)?' 52 + '/p/(?P<username>[\w._-]+)/' 53 53 => 'PhabricatorPeopleProfileController', 54 54 '/emailverify/(?P<code>[^/]+)/' => 55 55 'PhabricatorEmailVerificationController',
+13 -37
src/applications/people/controller/PhabricatorPeopleProfileController.php
··· 4 4 extends PhabricatorPeopleController { 5 5 6 6 private $username; 7 - private $page; 8 7 9 8 public function shouldRequireAdmin() { 10 9 return false; ··· 12 11 13 12 public function willProcessRequest(array $data) { 14 13 $this->username = idx($data, 'username'); 15 - $this->page = idx($data, 'page'); 16 - } 17 - 18 - private function getMainFilters($username) { 19 - return array( 20 - array( 21 - 'key' => 'feed', 22 - 'name' => pht('Feed'), 23 - 'href' => '/p/'.$username.'/feed/' 24 - ), 25 - ); 26 14 } 27 15 28 16 public function processRequest() { ··· 41 29 $profile = $user->loadUserProfile(); 42 30 $username = phutil_escape_uri($user->getUserName()); 43 31 44 - $menu = new PHUIListView(); 45 - foreach ($this->getMainFilters($username) as $filter) { 46 - $menu->newLink($filter['name'], $filter['href'], $filter['key']); 47 - } 48 - 49 - $menu->newLabel(pht('Activity'), 'activity'); 50 - // NOTE: applications install the various links through PhabricatorEvent 51 - // listeners 52 - 53 - $event = new PhabricatorEvent( 54 - PhabricatorEventType::TYPE_PEOPLE_DIDRENDERMENU, 55 - array( 56 - 'menu' => $menu, 57 - 'person' => $user, 58 - )); 59 - $event->setUser($viewer); 60 - PhutilEventEngine::dispatchEvent($event); 61 - $nav = AphrontSideNavFilterView::newFromMenu($event->getValue('menu')); 62 - $nav->selectFilter($this->page, 'feed'); 63 - 64 32 $picture = $user->loadProfileImageURI(); 65 33 66 34 $header = id(new PhabricatorHeaderView()) ··· 104 72 } 105 73 106 74 $actions = id(new PhabricatorActionListView()) 75 + ->setObject($user) 107 76 ->setUser($viewer); 108 77 109 78 $can_edit = ($user->getPHID() == $viewer->getPHID()); ··· 134 103 135 104 $properties = $this->buildPropertyView($user); 136 105 137 - $nav->appendChild($header); 138 - $nav->appendChild($actions); 139 - $nav->appendChild($properties); 140 - $nav->appendChild($this->renderUserFeed($user)); 106 + $crumbs = $this->buildApplicationCrumbs(); 107 + $crumbs->addCrumb( 108 + id(new PhabricatorCrumbView()) 109 + ->setName($user->getUsername())); 110 + $feed = $this->renderUserFeed($user); 141 111 142 112 return $this->buildApplicationPage( 143 - $nav, 113 + array( 114 + $crumbs, 115 + $header, 116 + $actions, 117 + $properties, 118 + $feed, 119 + ), 144 120 array( 145 121 'title' => $user->getUsername(), 146 122 'device' => true,
+5 -1
src/view/layout/PhabricatorHeaderView.php
··· 36 36 public function render() { 37 37 require_celerity_resource('phabricator-header-view-css'); 38 38 39 + $classes = array(); 40 + $classes[] = 'phabricator-header-shell'; 41 + 39 42 $image = null; 40 43 if ($this->image) { 41 44 $image = phutil_tag( ··· 45 48 'style' => 'background-image: url('.$this->image.')', 46 49 ), 47 50 ''); 51 + $classes[] = 'phabricator-header-has-image'; 48 52 } 49 53 50 54 $header = array(); ··· 84 88 return phutil_tag( 85 89 'div', 86 90 array( 87 - 'class' => 'phabricator-header-shell', 91 + 'class' => implode(' ', $classes), 88 92 ), 89 93 array( 90 94 $image,
+6 -1
webroot/rsrc/css/layout/phabricator-action-list-view.css
··· 21 21 } 22 22 23 23 .device-desktop .phabricator-header-shell + .phabricator-action-list-view { 24 - margin-top: -28px; 24 + margin-top: -33px; 25 + } 26 + 27 + .device-desktop .phabricator-header-shell.phabricator-header-has-image + 28 + .phabricator-action-list-view { 29 + margin-top: -53px; 25 30 } 26 31 27 32 .device .phabricator-header-shell + .phabricator-action-list-view {