diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,7 +7,7 @@ */ return array( 'names' => array( - 'core.pkg.css' => 'a419cf4b', + 'core.pkg.css' => '3da0755f', 'core.pkg.js' => '2a50ac55', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => '2de124c9', @@ -114,7 +114,7 @@ 'rsrc/css/font/phui-font-icon-base.css' => 'ecbbb4c2', 'rsrc/css/layout/phabricator-filetree-view.css' => 'fccf9f82', 'rsrc/css/layout/phabricator-hovercard-view.css' => '1239cd52', - 'rsrc/css/layout/phabricator-side-menu-view.css' => 'bec2458e', + 'rsrc/css/layout/phabricator-side-menu-view.css' => '845bdf68', 'rsrc/css/layout/phabricator-source-code-view.css' => 'cbeef983', 'rsrc/css/phui/calendar/phui-calendar-day.css' => 'd1cf6f93', 'rsrc/css/phui/calendar/phui-calendar-list.css' => 'c1c7f338', @@ -762,7 +762,7 @@ 'phabricator-remarkup-css' => '7afb543c', 'phabricator-search-results-css' => '7dea472c', 'phabricator-shaped-request' => '7cbe244b', - 'phabricator-side-menu-view-css' => 'bec2458e', + 'phabricator-side-menu-view-css' => '845bdf68', 'phabricator-slowvote-css' => 'da0afb1b', 'phabricator-source-code-view-css' => 'cbeef983', 'phabricator-standard-page-view' => '3c99cdf4', diff --git a/src/applications/people/controller/PhabricatorPeopleController.php b/src/applications/people/controller/PhabricatorPeopleController.php --- a/src/applications/people/controller/PhabricatorPeopleController.php +++ b/src/applications/people/controller/PhabricatorPeopleController.php @@ -60,30 +60,45 @@ "{$name}/calendar/", pht('Calendar'), 'fa-calendar'); } + $nav->newDivider(); + $class = 'PhabricatorManiphestApplication'; if (PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) { - $phid = $user->getPHID(); - $view_uri = sprintf( + $view_uri = urisprintf( '/maniphest/?statuses=open()&assigned=%s#R', - $phid); - $nav->addIcon( - 'maniphest', pht('Open Tasks'), 'fa-anchor', null, $view_uri); + $user->getPHID()); + + $nav->newIcon() + ->setName(pht('Open Tasks')) + ->setIcon('fa-anchor') + ->addClass('phui-profile-external-link') + ->setHref($view_uri); } $class = 'PhabricatorDifferentialApplication'; if (PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) { - $username = phutil_escape_uri($name); - $view_uri = '/differential/?authors='.$username; - $nav->addIcon( - 'differential', pht('Revisions'), 'fa-cog', null, $view_uri); + $view_uri = urisprintf( + '/differential/?authors=%s#R', + $name); + + $nav->newIcon() + ->setName(pht('Revisions')) + ->setIcon('fa-cog') + ->addClass('phui-profile-external-link') + ->setHref($view_uri); } $class = 'PhabricatorAuditApplication'; if (PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) { - $username = phutil_escape_uri($name); - $view_uri = '/audit/?authors='.$username; - $nav->addIcon( - 'audit', pht('Commits'), 'fa-code', null, $view_uri); + $view_uri = urisprintf( + '/audit/?authors=%s#R', + $name); + + $nav->newIcon() + ->setName(pht('Commits')) + ->setIcon('fa-code') + ->addClass('phui-profile-external-link') + ->setHref($view_uri); } return $nav; diff --git a/src/applications/project/controller/PhabricatorProjectController.php b/src/applications/project/controller/PhabricatorProjectController.php --- a/src/applications/project/controller/PhabricatorProjectController.php +++ b/src/applications/project/controller/PhabricatorProjectController.php @@ -56,14 +56,11 @@ $picture = $project->getProfileImageURI(); $name = $project->getName(); - $columns = id(new PhabricatorProjectColumnQuery()) - ->setViewer($viewer) - ->withProjectPHIDs(array($project->getPHID())) - ->execute(); - if ($columns) { - $board_icon = 'fa-columns'; + $class = 'PhabricatorManiphestApplication'; + if (PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) { + $have_maniphest = true; } else { - $board_icon = 'fa-columns grey'; + $have_maniphest = false; } $nav = new AphrontSideNavFilterView(); @@ -71,19 +68,45 @@ $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); $nav->addIcon("profile/{$id}/", $name, null, $picture); - $class = 'PhabricatorManiphestApplication'; - if (PhabricatorApplication::isClassInstalledForViewer($class, $viewer)) { - $phid = $project->getPHID(); + if ($have_maniphest) { + $columns = id(new PhabricatorProjectColumnQuery()) + ->setViewer($viewer) + ->withProjectPHIDs(array($project->getPHID())) + ->execute(); + if ($columns) { + $board_icon = 'fa-columns'; + } else { + $board_icon = 'fa-columns grey'; + } + $nav->addIcon("board/{$id}/", pht('Workboard'), $board_icon); + } + + $nav->addIcon("members/{$id}/", pht('Members'), 'fa-group'); + + $nav->newDivider(); + + if ($have_maniphest) { $query_uri = urisprintf( '/maniphest/?statuses=open()&projects=%s#R', - $phid); - $nav->addIcon(null, pht('Open Tasks'), 'fa-anchor', null, $query_uri); + $project->getPHID()); + + $nav->newIcon() + ->setName(pht('Open Tasks')) + ->setIcon('fa-anchor') + ->addClass('phui-profile-external-link') + ->setHref($query_uri); } - $nav->addIcon("feed/{$id}/", pht('Feed'), 'fa-newspaper-o'); - $nav->addIcon("members/{$id}/", pht('Members'), 'fa-group'); - $nav->addIcon("details/{$id}/", pht('Edit Details'), 'fa-pencil'); + $feed_uri = urisprintf( + '/feed/?projects=%s#R', + $project->getPHID()); + + $nav->newIcon() + ->setName(pht('Feed')) + ->setIcon('fa-newspaper-o') + ->addClass('phui-profile-external-link') + ->setHref($feed_uri); return $nav; } diff --git a/src/view/layout/AphrontSideNavFilterView.php b/src/view/layout/AphrontSideNavFilterView.php --- a/src/view/layout/AphrontSideNavFilterView.php +++ b/src/view/layout/AphrontSideNavFilterView.php @@ -109,15 +109,32 @@ $href = $uri; } - $item = id(new PHUIListItemView()) + $item = $this->newIcon() ->setKey($key) - ->setRenderNameAsTooltip(true) - ->setType(PHUIListItemView::TYPE_ICON_NAV) ->setIcon($icon) ->setHref($href) ->setName($name) ->setProfileImage($image); - return $this->addMenuItem($item); + + return $this; + } + + public function newDivider() { + $item = id(new PHUIListItemView()) + ->setType(PHUIListItemView::TYPE_DIVIDER); + + $this->addMenuItem($item); + + return $item; + } + + public function newIcon() { + $item = id(new PHUIListItemView()) + ->setType(PHUIListItemView::TYPE_ICON_NAV); + + $this->addMenuItem($item); + + return $item; } public function addButton($key, $name, $uri = null) { diff --git a/src/view/phui/PHUIListItemView.php b/src/view/phui/PHUIListItemView.php --- a/src/view/phui/PHUIListItemView.php +++ b/src/view/phui/PHUIListItemView.php @@ -3,7 +3,6 @@ final class PHUIListItemView extends AphrontTagView { const TYPE_LINK = 'type-link'; - const TYPE_SPACER = 'type-spacer'; const TYPE_LABEL = 'type-label'; const TYPE_BUTTON = 'type-button'; const TYPE_CUSTOM = 'type-custom'; diff --git a/src/view/phui/PHUIListView.php b/src/view/phui/PHUIListView.php --- a/src/view/phui/PHUIListView.php +++ b/src/view/phui/PHUIListView.php @@ -153,6 +153,8 @@ } public function willRender() { + $types = array(); + $key_map = array(); foreach ($this->items as $item) { $key = $item->getKey(); @@ -163,7 +165,23 @@ } $key_map[$key] = $item; } + + $types[] = $item->getType(); } + + foreach (array_values($this->items) as $idx => $item) { + $prev = idx($types, $idx - 1); + $next = idx($types, $idx + 1); + + if ($prev === null || $prev === PHUIListItemView::TYPE_DIVIDER) { + $item->addClass('head'); + } + + if ($next === null || $next === PHUIListItemView::TYPE_DIVIDER) { + $item->addClass('tail'); + } + } + } protected function getTagName() { diff --git a/webroot/rsrc/css/layout/phabricator-side-menu-view.css b/webroot/rsrc/css/layout/phabricator-side-menu-view.css --- a/webroot/rsrc/css/layout/phabricator-side-menu-view.css +++ b/webroot/rsrc/css/layout/phabricator-side-menu-view.css @@ -61,14 +61,30 @@ .device-desktop .phabricator-icon-nav .phabricator-nav-local { width: 40px; margin-top: 16px; +} + +.device-desktop .phabricator-icon-nav .phui-list-item-type-icon-nav { border-color: {$lightblueborder}; - border-width: 1px 1px 1px 0; + border-width: 0 1px 0 0; border-style: solid; background-color: #fff; +} + +.device-desktop .phabricator-icon-nav .phui-profile-external-link { + background-color: {$bluebackground}; +} + +.device-desktop .phabricator-icon-nav .phui-list-item-type-icon-nav.head { + border-top-width: 1px; border-top-right-radius: 3px; +} + +.device-desktop .phabricator-icon-nav .phui-list-item-type-icon-nav.tail { + border-bottom-width: 1px; border-bottom-right-radius: 3px; } + .device-desktop .phabricator-icon-nav .phabricator-nav-content { margin-left: 41px; } @@ -89,10 +105,6 @@ color: {$blue}; } -.phabricator-icon-nav .phabricator-side-menu .phui-list-item-selected { - border: none; -} - .phabricator-icon-nav .phabricator-side-menu .phui-list-item-selected .phui-icon-view { color: {$darkbluetext}; @@ -106,3 +118,7 @@ display: inline-block; margin: 7px; } + +.phabricator-icon-nav .phui-list-item-type-divider { + height: 40px; +}