From 953f281dc08f028d3d49482947d6a42e86bf8f47 Mon Sep 17 00:00:00 2001 From: Chad Little Date: Mon, 12 Jan 2015 10:04:01 -0800 Subject: [PATCH] Revamp Projects with new navigation Summary: A refresh of Projects including a new navigations UI. - New Navigation UI. - Auto switch default page if Workboard has been initialized - Move Feed to it's own page - Increase 'tasks' on Project Home to 50 over 10 - Fix various display bugs on Workboards - Remove 'crumbs' from Project portal (unneeded). Test Plan: - clicked a link for a project with no workboard and saw the profile - clicked a link for a project with a workboard and saw the workboard - navigated around the various edit pages, inspecting links and making sure things linked back to the new profile uri {F266460} {F266461} {F266462} {F266463} {F266464} Reviewers: epriestley, btrahan Reviewed By: epriestley, btrahan Subscribers: Korvin, epriestley Differential Revision: https://secure.phabricator.com/D11272 --- resources/celerity/map.php | 22 +-- src/__phutil_library_map__.php | 4 + .../PhabricatorProjectApplication.php | 8 +- .../PhabricatorProjectBoardController.php | 12 +- .../PhabricatorProjectBoardViewController.php | 34 +++-- ...abricatorProjectColumnDetailController.php | 14 +- ...PhabricatorProjectColumnEditController.php | 22 +-- .../PhabricatorProjectController.php | 39 +++++- ...habricatorProjectEditDetailsController.php | 23 ++-- .../PhabricatorProjectEditMainController.php | 18 +-- ...habricatorProjectEditPictureController.php | 17 +-- .../PhabricatorProjectFeedController.php | 91 ++++++++++++ .../PhabricatorProjectListController.php | 2 +- ...habricatorProjectMembersEditController.php | 88 +++++++----- .../PhabricatorProjectProfileController.php | 129 ++++-------------- .../PhabricatorProjectUpdateController.php | 2 +- .../PhabricatorProjectViewController.php | 56 ++++++++ .../PhabricatorProjectWatchController.php | 2 +- .../query/PhabricatorProjectSearchEngine.php | 8 ++ src/view/layout/AphrontSideNavFilterView.php | 26 ++++ src/view/phui/PHUIListItemView.php | 15 ++ webroot/rsrc/css/aphront/multi-column.css | 16 +-- .../css/application/profile/profile-view.css | 10 ++ .../css/layout/phabricator-side-menu-view.css | 41 ++++++ .../css/phui/phui-object-item-list-view.css | 4 +- webroot/rsrc/css/phui/phui-workboard-view.css | 9 ++ 26 files changed, 466 insertions(+), 246 deletions(-) create mode 100644 src/applications/project/controller/PhabricatorProjectFeedController.php create mode 100644 src/applications/project/controller/PhabricatorProjectViewController.php diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 1caf088992..9a8228e82c 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -7,7 +7,7 @@ */ return array( 'names' => array( - 'core.pkg.css' => 'b99369cc', + 'core.pkg.css' => '60a6d241', 'core.pkg.js' => '61af8961', 'darkconsole.pkg.js' => '8ab24e01', 'differential.pkg.css' => '8af45893', @@ -23,7 +23,7 @@ return array( 'rsrc/css/aphront/error-view.css' => '3462dbee', 'rsrc/css/aphront/lightbox-attachment.css' => '7acac05d', 'rsrc/css/aphront/list-filter-view.css' => '2ae43867', - 'rsrc/css/aphront/multi-column.css' => '6d72e772', + 'rsrc/css/aphront/multi-column.css' => '41a848c0', 'rsrc/css/aphront/notification.css' => '9c279160', 'rsrc/css/aphront/pager-view.css' => '2e3539af', 'rsrc/css/aphront/panel-view.css' => '5846dfa2', @@ -94,7 +94,7 @@ return array( 'rsrc/css/application/ponder/feed.css' => 'e62615b6', 'rsrc/css/application/ponder/post.css' => 'ebab8a70', 'rsrc/css/application/ponder/vote.css' => '8ed6ed8b', - 'rsrc/css/application/profile/profile-view.css' => '28f433ef', + 'rsrc/css/application/profile/profile-view.css' => 'fddedfa1', 'rsrc/css/application/projects/project-icon.css' => 'c2ecb7f1', 'rsrc/css/application/releeph/releeph-core.css' => '9b3c5733', 'rsrc/css/application/releeph/releeph-preview-branch.css' => 'b7a6f4a5', @@ -115,7 +115,7 @@ return array( 'rsrc/css/layout/phabricator-crumbs-view.css' => 'd5aa87e4', 'rsrc/css/layout/phabricator-filetree-view.css' => 'fccf9f82', 'rsrc/css/layout/phabricator-hovercard-view.css' => '893f4783', - 'rsrc/css/layout/phabricator-side-menu-view.css' => '90eafc85', + 'rsrc/css/layout/phabricator-side-menu-view.css' => '7e8c6341', 'rsrc/css/layout/phabricator-source-code-view.css' => '7d346aa4', 'rsrc/css/phui/calendar/phui-calendar-day.css' => 'de035c8a', 'rsrc/css/phui/calendar/phui-calendar-list.css' => 'c1d0ca59', @@ -136,7 +136,7 @@ return array( 'rsrc/css/phui/phui-info-panel.css' => '27ea50a1', 'rsrc/css/phui/phui-list.css' => '53deb25c', 'rsrc/css/phui/phui-object-box.css' => 'dd19785f', - 'rsrc/css/phui/phui-object-item-list-view.css' => '5b2ad99d', + 'rsrc/css/phui/phui-object-item-list-view.css' => '8279b873', 'rsrc/css/phui/phui-pinboard-view.css' => '3dd4a269', 'rsrc/css/phui/phui-property-list-view.css' => '51480060', 'rsrc/css/phui/phui-remarkup-preview.css' => '19ad512b', @@ -145,7 +145,7 @@ return array( 'rsrc/css/phui/phui-tag-view.css' => '6b74282b', 'rsrc/css/phui/phui-text.css' => 'cf019f54', 'rsrc/css/phui/phui-timeline-view.css' => '415bf348', - 'rsrc/css/phui/phui-workboard-view.css' => '2bf82d00', + 'rsrc/css/phui/phui-workboard-view.css' => '8896938c', 'rsrc/css/phui/phui-workpanel-view.css' => 'e495a5cc', 'rsrc/css/sprite-apps-large.css' => '20ec0cc0', 'rsrc/css/sprite-apps.css' => 'd5baed0f', @@ -498,7 +498,7 @@ return array( 'aphront-dialog-view-css' => '4dbbe3bb', 'aphront-error-view-css' => '3462dbee', 'aphront-list-filter-view-css' => '2ae43867', - 'aphront-multi-column-view-css' => '6d72e772', + 'aphront-multi-column-view-css' => '41a848c0', 'aphront-pager-view-css' => '2e3539af', 'aphront-panel-view-css' => '5846dfa2', 'aphront-table-view-css' => 'b22b7216', @@ -728,11 +728,11 @@ return array( 'phabricator-object-selector-css' => '029a133d', 'phabricator-phtize' => 'd254d646', 'phabricator-prefab' => '72da38cc', - 'phabricator-profile-css' => '28f433ef', + 'phabricator-profile-css' => 'fddedfa1', 'phabricator-remarkup-css' => '7604f12e', 'phabricator-search-results-css' => 'f240504c', 'phabricator-shaped-request' => '7cbe244b', - 'phabricator-side-menu-view-css' => '90eafc85', + 'phabricator-side-menu-view-css' => '7e8c6341', 'phabricator-slowvote-css' => '266df6a1', 'phabricator-source-code-view-css' => '7d346aa4', 'phabricator-standard-page-view' => '2c96cfb5', @@ -780,7 +780,7 @@ return array( 'phui-info-panel-css' => '27ea50a1', 'phui-list-view-css' => '53deb25c', 'phui-object-box-css' => 'dd19785f', - 'phui-object-item-list-view-css' => '5b2ad99d', + 'phui-object-item-list-view-css' => '8279b873', 'phui-pinboard-view-css' => '3dd4a269', 'phui-property-list-view-css' => '51480060', 'phui-remarkup-preview-css' => '19ad512b', @@ -789,7 +789,7 @@ return array( 'phui-tag-view-css' => '6b74282b', 'phui-text-css' => 'cf019f54', 'phui-timeline-view-css' => '415bf348', - 'phui-workboard-view-css' => '2bf82d00', + 'phui-workboard-view-css' => '8896938c', 'phui-workpanel-view-css' => 'e495a5cc', 'phuix-action-list-view' => 'b5c256b8', 'phuix-action-view' => '6e8cefa4', diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 8dd35d0f85..8e5982ca0d 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2199,6 +2199,7 @@ phutil_register_library_map(array( 'PhabricatorProjectEditMainController' => 'applications/project/controller/PhabricatorProjectEditMainController.php', 'PhabricatorProjectEditPictureController' => 'applications/project/controller/PhabricatorProjectEditPictureController.php', 'PhabricatorProjectEditorTestCase' => 'applications/project/editor/__tests__/PhabricatorProjectEditorTestCase.php', + 'PhabricatorProjectFeedController' => 'applications/project/controller/PhabricatorProjectFeedController.php', 'PhabricatorProjectIcon' => 'applications/project/icon/PhabricatorProjectIcon.php', 'PhabricatorProjectInterface' => 'applications/project/interface/PhabricatorProjectInterface.php', 'PhabricatorProjectListController' => 'applications/project/controller/PhabricatorProjectListController.php', @@ -2225,6 +2226,7 @@ phutil_register_library_map(array( 'PhabricatorProjectTransactionQuery' => 'applications/project/query/PhabricatorProjectTransactionQuery.php', 'PhabricatorProjectUIEventListener' => 'applications/project/events/PhabricatorProjectUIEventListener.php', 'PhabricatorProjectUpdateController' => 'applications/project/controller/PhabricatorProjectUpdateController.php', + 'PhabricatorProjectViewController' => 'applications/project/controller/PhabricatorProjectViewController.php', 'PhabricatorProjectWatchController' => 'applications/project/controller/PhabricatorProjectWatchController.php', 'PhabricatorProjectWikiExplainController' => 'applications/project/controller/PhabricatorProjectWikiExplainController.php', 'PhabricatorProjectsPolicyRule' => 'applications/policy/rule/PhabricatorProjectsPolicyRule.php', @@ -5418,6 +5420,7 @@ phutil_register_library_map(array( 'PhabricatorProjectEditMainController' => 'PhabricatorProjectController', 'PhabricatorProjectEditPictureController' => 'PhabricatorProjectController', 'PhabricatorProjectEditorTestCase' => 'PhabricatorTestCase', + 'PhabricatorProjectFeedController' => 'PhabricatorProjectController', 'PhabricatorProjectIcon' => 'Phobject', 'PhabricatorProjectListController' => 'PhabricatorProjectController', 'PhabricatorProjectMemberOfProjectEdgeType' => 'PhabricatorEdgeType', @@ -5445,6 +5448,7 @@ phutil_register_library_map(array( 'PhabricatorProjectTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 'PhabricatorProjectUIEventListener' => 'PhabricatorEventListener', 'PhabricatorProjectUpdateController' => 'PhabricatorProjectController', + 'PhabricatorProjectViewController' => 'PhabricatorProjectController', 'PhabricatorProjectWatchController' => 'PhabricatorProjectController', 'PhabricatorProjectWikiExplainController' => 'PhabricatorProjectController', 'PhabricatorProjectsPolicyRule' => 'PhabricatorPolicyRule', diff --git a/src/applications/project/application/PhabricatorProjectApplication.php b/src/applications/project/application/PhabricatorProjectApplication.php index 568d25d944..e844c309f6 100644 --- a/src/applications/project/application/PhabricatorProjectApplication.php +++ b/src/applications/project/application/PhabricatorProjectApplication.php @@ -52,8 +52,12 @@ final class PhabricatorProjectApplication extends PhabricatorApplication { => 'PhabricatorProjectMembersEditController', 'members/(?P[1-9]\d*)/remove/' => 'PhabricatorProjectMembersRemoveController', - 'view/(?P[1-9]\d*)/' + 'profile/(?P[1-9]\d*)/' => 'PhabricatorProjectProfileController', + 'feed/(?P[1-9]\d*)/' + => 'PhabricatorProjectFeedController', + 'view/(?P[1-9]\d*)/' + => 'PhabricatorProjectViewController', 'picture/(?P[1-9]\d*)/' => 'PhabricatorProjectEditPictureController', 'icon/(?P[1-9]\d*)/' @@ -86,7 +90,7 @@ final class PhabricatorProjectApplication extends PhabricatorApplication { 'wiki/' => 'PhabricatorProjectWikiExplainController', ), '/tag/' => array( - '(?P[^/]+)/' => 'PhabricatorProjectProfileController', + '(?P[^/]+)/' => 'PhabricatorProjectViewController', '(?P[^/]+)/board/' => 'PhabricatorProjectBoardViewController', ), ); diff --git a/src/applications/project/controller/PhabricatorProjectBoardController.php b/src/applications/project/controller/PhabricatorProjectBoardController.php index 46bb320866..ef2e09f8f1 100644 --- a/src/applications/project/controller/PhabricatorProjectBoardController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardController.php @@ -13,12 +13,10 @@ abstract class PhabricatorProjectBoardController return $this->project; } - protected function buildApplicationCrumbs() { - $project = $this->getProject(); - $crumbs = parent::buildApplicationCrumbs(); - $crumbs->addTextCrumb( - $project->getName(), - $this->getApplicationURI('view/'.$project->getID().'/')); - return $crumbs; + public function buildIconNavView(PhabricatorProject $project) { + $id = $project->getID(); + $nav = parent::buildIconNavView($project); + $nav->selectFilter("board/{$id}/"); + return $nav; } } diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php index f3ecd788b2..014d28a3d3 100644 --- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php @@ -15,16 +15,9 @@ final class PhabricatorProjectBoardViewController return true; } - public function willProcessRequest(array $data) { - $this->id = idx($data, 'id'); - $this->slug = idx($data, 'slug'); - $this->queryKey = idx($data, 'queryKey'); - $this->filter = (bool)idx($data, 'filter'); - } - - public function processRequest() { - $request = $this->getRequest(); + public function handleRequest(AphrontRequest $request) { $viewer = $request->getUser(); + $id = $request->getURIData('id'); $show_hidden = $request->getBool('hidden'); $this->showHidden = $show_hidden; @@ -32,10 +25,12 @@ final class PhabricatorProjectBoardViewController $project = id(new PhabricatorProjectQuery()) ->setViewer($viewer) ->needImages(true); - if ($this->slug) { - $project->withSlugs(array($this->slug)); + $id = $request->getURIData('id'); + $slug = $request->getURIData('slug'); + if ($slug) { + $project->withSlugs(array($slug)); } else { - $project->withIDs(array($this->id)); + $project->withIDs(array($id)); } $project = $project->executeOne(); if (!$project) { @@ -111,7 +106,7 @@ final class PhabricatorProjectBoardViewController $engine->getQueryResultsPageURI($saved->getQueryKey()))); } - $query_key = $this->queryKey; + $query_key = $request->getURIData('queryKey'); if (!$query_key) { $query_key = 'open'; } @@ -133,7 +128,7 @@ final class PhabricatorProjectBoardViewController $custom_query = $saved; } - if ($this->filter) { + if ($request->getURIData('filter')) { $filter_form = id(new AphrontFormView()) ->setUser($viewer); $engine->buildSearchForm($filter_form, $saved); @@ -303,7 +298,7 @@ final class PhabricatorProjectBoardViewController $header_link = phutil_tag( 'a', array( - 'href' => $this->getApplicationURI('view/'.$project->getID().'/'), + 'href' => $this->getApplicationURI('profile/'.$project->getID().'/'), ), $project->getName()); @@ -312,7 +307,7 @@ final class PhabricatorProjectBoardViewController ->setUser($viewer) ->setNoBackground(true) ->setImage($project->getProfileImageURI()) - ->setImageURL($this->getApplicationURI('view/'.$project->getID().'/')) + ->setImageURL($this->getApplicationURI('profile/'.$project->getID().'/')) ->addActionLink($sort_menu) ->addActionLink($filter_menu) ->addActionLink($manage_menu) @@ -322,10 +317,13 @@ final class PhabricatorProjectBoardViewController ->appendChild($board) ->addClass('project-board-wrapper'); + $nav = $this->buildIconNavView($project); + $nav->appendChild($header); + $nav->appendChild($board_box); + return $this->buildApplicationPage( array( - $header, - $board_box, + $nav, ), array( 'title' => pht('%s Board', $project->getName()), diff --git a/src/applications/project/controller/PhabricatorProjectColumnDetailController.php b/src/applications/project/controller/PhabricatorProjectColumnDetailController.php index d1c7ca7f16..bda99e3ad4 100644 --- a/src/applications/project/controller/PhabricatorProjectColumnDetailController.php +++ b/src/applications/project/controller/PhabricatorProjectColumnDetailController.php @@ -22,6 +22,7 @@ final class PhabricatorProjectColumnDetailController PhabricatorPolicyCapability::CAN_VIEW, )) ->withIDs(array($this->projectID)) + ->needImages(true) ->executeOne(); if (!$project) { @@ -47,11 +48,6 @@ final class PhabricatorProjectColumnDetailController $timeline->setShouldTerminate(true); $title = pht('%s', $column->getDisplayName()); - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb( - pht('Board'), - $this->getApplicationURI('board/'.$project->getID().'/')); - $crumbs->addTextCrumb($title); $header = $this->buildHeaderView($column); $actions = $this->buildActionView($column); @@ -61,11 +57,13 @@ final class PhabricatorProjectColumnDetailController ->setHeader($header) ->addPropertyList($properties); + $nav = $this->buildIconNavView($project); + $nav->appendChild($box); + $nav->appendChild($timeline); + return $this->buildApplicationPage( array( - $crumbs, - $box, - $timeline, + $nav, ), array( 'title' => $title, diff --git a/src/applications/project/controller/PhabricatorProjectColumnEditController.php b/src/applications/project/controller/PhabricatorProjectColumnEditController.php index 84a5e2d590..c5606f9bc3 100644 --- a/src/applications/project/controller/PhabricatorProjectColumnEditController.php +++ b/src/applications/project/controller/PhabricatorProjectColumnEditController.php @@ -23,6 +23,7 @@ final class PhabricatorProjectColumnEditController PhabricatorPolicyCapability::CAN_EDIT, )) ->withIDs(array($this->projectID)) + ->needImages(true) ->executeOne(); if (!$project) { @@ -135,11 +136,9 @@ final class PhabricatorProjectColumnEditController if ($is_new) { $title = pht('Create Column'); $submit = pht('Create Column'); - $crumb_text = pht('Create Column'); } else { $title = pht('Edit %s', $column->getDisplayName()); $submit = pht('Save Column'); - $crumb_text = pht('Edit'); } $form->appendChild( @@ -147,28 +146,17 @@ final class PhabricatorProjectColumnEditController ->setValue($submit) ->addCancelButton($view_uri)); - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb( - pht('Board'), - $this->getApplicationURI('board/'.$project->getID().'/')); - - if (!$is_new) { - $crumbs->addTextCrumb( - $column->getDisplayName(), - $view_uri); - } - - $crumbs->addTextCrumb($crumb_text); - $form_box = id(new PHUIObjectBoxView()) ->setHeaderText($title) ->setValidationException($validation_exception) ->setForm($form); + $nav = $this->buildIconNavView($project); + $nav->appendChild($form_box); + return $this->buildApplicationPage( array( - $crumbs, - $form_box, + $nav, ), array( 'title' => $title, diff --git a/src/applications/project/controller/PhabricatorProjectController.php b/src/applications/project/controller/PhabricatorProjectController.php index 02a6fd1d45..749259db41 100644 --- a/src/applications/project/controller/PhabricatorProjectController.php +++ b/src/applications/project/controller/PhabricatorProjectController.php @@ -2,23 +2,56 @@ abstract class PhabricatorProjectController extends PhabricatorController { + public function buildApplicationMenu() { + return $this->buildSideNavView(true)->getMenu(); + } + public function buildSideNavView($for_app = false) { $user = $this->getRequest()->getUser(); $nav = new AphrontSideNavFilterView(); $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); + $id = null; if ($for_app) { + $user = $this->getRequest()->getUser(); + $id = $this->getRequest()->getURIData('id'); + if ($id) { + $nav->addFilter("profile/{$id}/", pht('Profile')); + $nav->addFilter("board/{$id}/", pht('Workboard')); + $nav->addFilter("members/{$id}/", pht('Members')); + $nav->addFilter("feed/{$id}/", pht('Feed')); + $nav->addFilter("edit/{$id}/", pht('Edit')); + } $nav->addFilter('create', pht('Create Project')); } - id(new PhabricatorProjectSearchEngine()) - ->setViewer($user) - ->addNavigationItems($nav->getMenu()); + if (!$id) { + id(new PhabricatorProjectSearchEngine()) + ->setViewer($user) + ->addNavigationItems($nav->getMenu()); + } $nav->selectFilter(null); return $nav; } + public function buildIconNavView(PhabricatorProject $project) { + $id = $project->getID(); + $picture = $project->getProfileImageURI(); + $name = $project->getName(); + + $nav = new AphrontSideNavFilterView(); + $nav->setIconNav(true); + $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); + $nav->addIcon("profile/{$id}/", $name, null, $picture); + $nav->addIcon("board/{$id}/", pht('Workboard'), 'fa-columns'); + $nav->addIcon("feed/{$id}/", pht('Feed'), 'fa-newspaper-o'); + $nav->addIcon("members/{$id}/", pht('Members'), 'fa-group'); + $nav->addIcon("edit/{$id}/", pht('Edit'), 'fa-pencil'); + + return $nav; + } + } diff --git a/src/applications/project/controller/PhabricatorProjectEditDetailsController.php b/src/applications/project/controller/PhabricatorProjectEditDetailsController.php index 73b3e705c9..7cffebafd4 100644 --- a/src/applications/project/controller/PhabricatorProjectEditDetailsController.php +++ b/src/applications/project/controller/PhabricatorProjectEditDetailsController.php @@ -14,12 +14,14 @@ final class PhabricatorProjectEditDetailsController $viewer = $request->getUser(); if ($this->id) { - $is_new = false; + $id = $request->getURIData('id'); + $is_new = false; $project = id(new PhabricatorProjectQuery()) ->setViewer($viewer) ->withIDs(array($this->id)) ->needSlugs(true) + ->needImages(true) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, @@ -149,7 +151,7 @@ final class PhabricatorProjectEditDetailsController if ($is_new) { $redirect_uri = - $this->getApplicationURI('view/'.$project->getID().'/'); + $this->getApplicationURI('profile/'.$project->getID().'/'); } else { $redirect_uri = $this->getApplicationURI('edit/'.$project->getID().'/'); @@ -300,22 +302,17 @@ final class PhabricatorProjectEditDetailsController ->setValidationException($validation_exception) ->setForm($form); - $crumbs = $this->buildApplicationCrumbs($this->buildSideNavView()); - if ($is_new) { - $crumbs->addTextCrumb($title); + if (!$is_new) { + $nav = $this->buildIconNavView($project); + $nav->selectFilter("edit/{$id}/"); + $nav->appendChild($form_box); } else { - $crumbs - ->addTextCrumb($project->getName(), - $this->getApplicationURI('view/'.$project->getID().'/')) - ->addTextCrumb(pht('Edit'), - $this->getApplicationURI('edit/'.$project->getID().'/')) - ->addTextCrumb(pht('Details')); + $nav = array($form_box); } return $this->buildApplicationPage( array( - $crumbs, - $form_box, + $nav, ), array( 'title' => $title, diff --git a/src/applications/project/controller/PhabricatorProjectEditMainController.php b/src/applications/project/controller/PhabricatorProjectEditMainController.php index 99bd6cb88a..7e1826c652 100644 --- a/src/applications/project/controller/PhabricatorProjectEditMainController.php +++ b/src/applications/project/controller/PhabricatorProjectEditMainController.php @@ -18,6 +18,7 @@ final class PhabricatorProjectEditMainController public function processRequest() { $request = $this->getRequest(); $viewer = $request->getUser(); + $id = $request->getURIData('id'); $project = id(new PhabricatorProjectQuery()) ->setViewer($viewer) @@ -43,12 +44,6 @@ final class PhabricatorProjectEditMainController $actions = $this->buildActionListView($project); $properties = $this->buildPropertyListView($project, $actions); - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb( - $project->getName(), - $this->getApplicationURI('view/'.$project->getID().'/')); - $crumbs->addTextCrumb(pht('Edit')); - $object_box = id(new PHUIObjectBoxView()) ->setHeader($header) ->addPropertyList($properties); @@ -58,11 +53,16 @@ final class PhabricatorProjectEditMainController new PhabricatorProjectTransactionQuery()); $timeline->setShouldTerminate(true); + $nav = $this->buildIconNavView($project); + $nav->selectFilter("edit/{$id}/"); + $nav->appendChild($object_box); + $nav->appendChild($timeline); + + $mnav = $this->buildSideNavView(); + return $this->buildApplicationPage( array( - $crumbs, - $object_box, - $timeline, + $nav, ), array( 'title' => $project->getName(), diff --git a/src/applications/project/controller/PhabricatorProjectEditPictureController.php b/src/applications/project/controller/PhabricatorProjectEditPictureController.php index 44a71780d0..8e342c3c9a 100644 --- a/src/applications/project/controller/PhabricatorProjectEditPictureController.php +++ b/src/applications/project/controller/PhabricatorProjectEditPictureController.php @@ -12,10 +12,12 @@ final class PhabricatorProjectEditPictureController public function processRequest() { $request = $this->getRequest(); $viewer = $request->getUser(); + $id = $request->getURIData('id'); $project = id(new PhabricatorProjectQuery()) ->setViewer($viewer) ->withIDs(array($this->id)) + ->needImages(true) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, @@ -27,7 +29,7 @@ final class PhabricatorProjectEditPictureController } $edit_uri = $this->getApplicationURI('edit/'.$project->getID().'/'); - $view_uri = $this->getApplicationURI('view/'.$project->getID().'/'); + $view_uri = $this->getApplicationURI('profile/'.$project->getID().'/'); $supported_formats = PhabricatorFile::getTransformableImageFormats(); $e_file = true; @@ -100,10 +102,6 @@ final class PhabricatorProjectEditPictureController } $title = pht('Edit Project Picture'); - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb($project->getName(), $view_uri); - $crumbs->addTextCrumb(pht('Edit'), $edit_uri); - $crumbs->addTextCrumb(pht('Picture')); $form = id(new PHUIFormLayoutView()) ->setUser($viewer); @@ -292,11 +290,14 @@ final class PhabricatorProjectEditPictureController ->setHeaderText(pht('Upload New Picture')) ->setForm($upload_form); + $nav = $this->buildIconNavView($project); + $nav->selectFilter("edit/{$id}/"); + $nav->appendChild($form_box); + $nav->appendChild($upload_box); + return $this->buildApplicationPage( array( - $crumbs, - $form_box, - $upload_box, + $nav, ), array( 'title' => $title, diff --git a/src/applications/project/controller/PhabricatorProjectFeedController.php b/src/applications/project/controller/PhabricatorProjectFeedController.php new file mode 100644 index 0000000000..48f2e9ad15 --- /dev/null +++ b/src/applications/project/controller/PhabricatorProjectFeedController.php @@ -0,0 +1,91 @@ +getUser(); + + $query = id(new PhabricatorProjectQuery()) + ->setViewer($user) + ->needMembers(true) + ->needWatchers(true) + ->needImages(true) + ->needSlugs(true); + $id = $request->getURIData('id'); + $slug = $request->getURIData('slug'); + if ($slug) { + $query->withSlugs(array($slug)); + } else { + $query->withIDs(array($id)); + } + $project = $query->executeOne(); + if (!$project) { + return new Aphront404Response(); + } + if ($slug && $slug != $project->getPrimarySlug()) { + return id(new AphrontRedirectResponse()) + ->setURI('/tag/'.$project->getPrimarySlug().'/'); + } + + require_celerity_resource('phabricator-profile-css'); + + $query = new PhabricatorFeedQuery(); + $query->setFilterPHIDs( + array( + $project->getPHID(), + )); + $query->setLimit(50); + $query->setViewer($request->getUser()); + $stories = $query->execute(); + $feed = $this->renderStories($stories); + + $content = phutil_tag_div('phabricator-project-feed', $feed); + + $nav = $this->buildIconNavView($project); + $nav->selectFilter("feed/{$id}/"); + $nav->appendChild($content); + + return $this->buildApplicationPage( + array( + $nav, + ), + array( + 'title' => $project->getName(), + )); + } + + private function renderFeedPage(PhabricatorProject $project) { + + $query = new PhabricatorFeedQuery(); + $query->setFilterPHIDs(array($project->getPHID())); + $query->setViewer($this->getRequest()->getUser()); + $query->setLimit(100); + $stories = $query->execute(); + + if (!$stories) { + return pht('There are no stories about this project.'); + } + + return $this->renderStories($stories); + } + + private function renderStories(array $stories) { + assert_instances_of($stories, 'PhabricatorFeedStory'); + + $builder = new PhabricatorFeedBuilder($stories); + $builder->setUser($this->getRequest()->getUser()); + $builder->setShowHovercards(true); + $view = $builder->buildView(); + + return phutil_tag_div( + 'profile-feed', + $view->render()); + } + + +} diff --git a/src/applications/project/controller/PhabricatorProjectListController.php b/src/applications/project/controller/PhabricatorProjectListController.php index b0cb8a085f..1852f43bfc 100644 --- a/src/applications/project/controller/PhabricatorProjectListController.php +++ b/src/applications/project/controller/PhabricatorProjectListController.php @@ -22,7 +22,7 @@ final class PhabricatorProjectListController return $this->delegateToController($controller); } - protected function buildApplicationMenu() { + public function buildApplicationMenu() { return $this->buildSideNavView(true)->getMenu(); } diff --git a/src/applications/project/controller/PhabricatorProjectMembersEditController.php b/src/applications/project/controller/PhabricatorProjectMembersEditController.php index ac81b32e96..5b6a95f9cf 100644 --- a/src/applications/project/controller/PhabricatorProjectMembersEditController.php +++ b/src/applications/project/controller/PhabricatorProjectMembersEditController.php @@ -12,15 +12,16 @@ final class PhabricatorProjectMembersEditController public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); + $id = $request->getURIData('id'); $project = id(new PhabricatorProjectQuery()) ->setViewer($user) ->withIDs(array($this->id)) ->needMembers(true) + ->needImages(true) ->requireCapabilities( array( PhabricatorPolicyCapability::CAN_VIEW, - PhabricatorPolicyCapability::CAN_EDIT, )) ->executeOne(); if (!$project) { @@ -73,39 +74,44 @@ final class PhabricatorProjectMembersEditController ); } - $header_name = pht('Edit Members'); - $title = pht('Edit Members'); + $can_edit = PhabricatorPolicyFilter::hasCapability( + $user, + $project, + PhabricatorPolicyCapability::CAN_EDIT); - $form = new AphrontFormView(); - $form - ->setUser($user) - ->appendChild( - id(new AphrontFormTokenizerControl()) - ->setName('phids') - ->setLabel(pht('Add Members')) - ->setDatasource(new PhabricatorPeopleDatasource())) - ->appendChild( - id(new AphrontFormSubmitControl()) - ->addCancelButton('/project/view/'.$project->getID().'/') - ->setValue(pht('Add Members'))); + $form_box = null; + $title = pht('Add Members'); + if ($can_edit) { + $header_name = pht('Edit Members'); + $view_uri = $this->getApplicationURI('profile/'.$project->getID().'/'); + + $form = new AphrontFormView(); + $form + ->setUser($user) + ->appendChild( + id(new AphrontFormTokenizerControl()) + ->setName('phids') + ->setLabel(pht('Add Members')) + ->setDatasource(new PhabricatorPeopleDatasource())) + ->appendChild( + id(new AphrontFormSubmitControl()) + ->addCancelButton($view_uri) + ->setValue(pht('Add Members'))); + $form_box = id(new PHUIObjectBoxView()) + ->setHeaderText($title) + ->setForm($form); + } $member_list = $this->renderMemberList($project, $handles); - $form_box = id(new PHUIObjectBoxView()) - ->setHeaderText($title) - ->setForm($form); - - $crumbs = $this->buildApplicationCrumbs($this->buildSideNavView()) - ->addTextCrumb( - $project->getName(), - '/project/view/'.$project->getID().'/') - ->addTextCrumb(pht('Edit Members'), $this->getApplicationURI()); + $nav = $this->buildIconNavView($project); + $nav->selectFilter("members/{$id}/"); + $nav->appendChild($form_box); + $nav->appendChild($member_list); return $this->buildApplicationPage( array( - $crumbs, - $form_box, - $member_list, + $nav, ), array( 'title' => $title, @@ -119,8 +125,14 @@ final class PhabricatorProjectMembersEditController $request = $this->getRequest(); $viewer = $request->getUser(); + $can_edit = PhabricatorPolicyFilter::hasCapability( + $viewer, + $project, + PhabricatorPolicyCapability::CAN_EDIT); + $list = id(new PHUIObjectItemListView()) - ->setNoDataString(pht('This project does not have any members.')); + ->setNoDataString(pht('This project does not have any members.')) + ->setStackable(true); foreach ($handles as $handle) { $remove_uri = $this->getApplicationURI( @@ -131,16 +143,22 @@ final class PhabricatorProjectMembersEditController ->setHref($handle->getURI()) ->setImageURI($handle->getImageURI()); - $item->addAction( - id(new PHUIListItemView()) - ->setIcon('fa-times') - ->setName(pht('Remove')) - ->setHref($remove_uri) - ->setWorkflow(true)); + if ($can_edit) { + $item->addAction( + id(new PHUIListItemView()) + ->setIcon('fa-times') + ->setName(pht('Remove')) + ->setHref($remove_uri) + ->setWorkflow(true)); + } $list->addItem($item); } - return $list; + $box = id(new PHUIObjectBoxView()) + ->setHeaderText(pht('Members')) + ->appendChild($list); + + return $box; } } diff --git a/src/applications/project/controller/PhabricatorProjectProfileController.php b/src/applications/project/controller/PhabricatorProjectProfileController.php index e0281f0893..fc5258be7c 100644 --- a/src/applications/project/controller/PhabricatorProjectProfileController.php +++ b/src/applications/project/controller/PhabricatorProjectProfileController.php @@ -3,22 +3,11 @@ final class PhabricatorProjectProfileController extends PhabricatorProjectController { - private $id; - private $slug; - public function shouldAllowPublic() { return true; } - public function willProcessRequest(array $data) { - // via /project/view/$id/ - $this->id = idx($data, 'id'); - // via /tag/$slug/ - $this->slug = idx($data, 'slug'); - } - - public function processRequest() { - $request = $this->getRequest(); + public function handleRequest(AphrontRequest $request) { $user = $request->getUser(); $query = id(new PhabricatorProjectQuery()) @@ -27,55 +16,43 @@ final class PhabricatorProjectProfileController ->needWatchers(true) ->needImages(true) ->needSlugs(true); - if ($this->slug) { - $query->withSlugs(array($this->slug)); + $id = $request->getURIData('id'); + $slug = $request->getURIData('slug'); + if ($slug) { + $query->withSlugs(array($slug)); } else { - $query->withIDs(array($this->id)); + $query->withIDs(array($id)); } $project = $query->executeOne(); if (!$project) { return new Aphront404Response(); } - if ($this->slug && $this->slug != $project->getPrimarySlug()) { + if ($slug && $slug != $project->getPrimarySlug()) { return id(new AphrontRedirectResponse()) ->setURI('/tag/'.$project->getPrimarySlug().'/'); } $picture = $project->getProfileImageURI(); - require_celerity_resource('phabricator-profile-css'); - $tasks = $this->renderTasksPage($project); + $content = phutil_tag_div('phabricator-project-layout', $tasks); - $query = new PhabricatorFeedQuery(); - $query->setFilterPHIDs( - array( - $project->getPHID(), - )); - $query->setLimit(50); - $query->setViewer($this->getRequest()->getUser()); - $stories = $query->execute(); - $feed = $this->renderStories($stories); - - $content = phutil_tag_div( - 'phabricator-project-layout', - array($tasks, $feed)); - - $id = $project->getID(); - $icon = id(new PHUIIconView()) - ->setIconFont('fa-columns'); - $board_btn = id(new PHUIButtonView()) - ->setTag('a') - ->setText(pht('Workboard')) - ->setHref($this->getApplicationURI("board/{$id}/")) - ->setIcon($icon); + $phid = $project->getPHID(); + $create_uri = '/maniphest/task/create/?projects='.$phid; + $icon_new = id(new PHUIIconView()) + ->setIconFont('fa-plus'); + $button_add = id(new PHUIButtonView()) + ->setTag('a') + ->setText(pht('New Task')) + ->setHref($create_uri) + ->setIcon($icon_new); $header = id(new PHUIHeaderView()) ->setHeader($project->getName()) ->setUser($user) ->setPolicyObject($project) ->setImage($picture) - ->addActionLink($board_btn); + ->addActionLink($button_add); if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) { $header->setStatus('fa-check', 'bluegrey', pht('Active')); @@ -86,57 +63,28 @@ final class PhabricatorProjectProfileController $actions = $this->buildActionListView($project); $properties = $this->buildPropertyListView($project, $actions); - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb($project->getName()); - $object_box = id(new PHUIObjectBoxView()) ->setHeader($header) ->addPropertyList($properties); + $nav = $this->buildIconNavView($project); + $nav->selectFilter("profile/{$id}/"); + $nav->appendChild($object_box); + $nav->appendChild($content); + return $this->buildApplicationPage( array( - $crumbs, - $object_box, - $content, + $nav, ), array( 'title' => $project->getName(), )); } - private function renderFeedPage(PhabricatorProject $project) { - - $query = new PhabricatorFeedQuery(); - $query->setFilterPHIDs(array($project->getPHID())); - $query->setViewer($this->getRequest()->getUser()); - $query->setLimit(100); - $stories = $query->execute(); - - if (!$stories) { - return pht('There are no stories about this project.'); - } - - return $this->renderStories($stories); - } - - private function renderStories(array $stories) { - assert_instances_of($stories, 'PhabricatorFeedStory'); - - $builder = new PhabricatorFeedBuilder($stories); - $builder->setUser($this->getRequest()->getUser()); - $builder->setShowHovercards(true); - $view = $builder->buildView(); - - return phutil_tag_div( - 'profile-feed', - $view->render()); - } - - private function renderTasksPage(PhabricatorProject $project) { $user = $this->getRequest()->getUser(); - $limit = 10; + $limit = 50; $query = id(new ManiphestTaskQuery()) ->setViewer($user) @@ -168,24 +116,15 @@ final class PhabricatorProjectProfileController '/maniphest/?statuses=%s&allProjects=%s#R', implode(',', ManiphestTaskStatus::getOpenStatusConstants()), $phid); - $create_uri = '/maniphest/task/create/?projects='.$phid; $icon = id(new PHUIIconView()) - ->setIconFont('fa-list'); + ->setIconFont('fa-search'); $button_view = id(new PHUIButtonView()) ->setTag('a') - ->setText(pht('View All')) + ->setText(pht('View Query')) ->setHref($view_uri) ->setIcon($icon); - $icon_new = id(new PHUIIconView()) - ->setIconFont('fa-plus'); - $button_add = id(new PHUIButtonView()) - ->setTag('a') - ->setText(pht('New Task')) - ->setHref($create_uri) - ->setIcon($icon_new); $header = id(new PHUIHeaderView()) - ->addActionLink($button_add) ->addActionLink($button_view); if ($count > $limit) { @@ -217,20 +156,6 @@ final class PhabricatorProjectProfileController $project, PhabricatorPolicyCapability::CAN_EDIT); - $view->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Edit Project')) - ->setIcon('fa-pencil') - ->setHref($this->getApplicationURI("edit/{$id}/"))); - - $view->addAction( - id(new PhabricatorActionView()) - ->setName(pht('Edit Members')) - ->setIcon('fa-users') - ->setHref($this->getApplicationURI("members/{$id}/")) - ->setDisabled(!$can_edit) - ->setWorkflow(!$can_edit)); - $action = null; if (!$project->isUserMember($viewer->getPHID())) { $can_join = PhabricatorPolicyFilter::hasCapability( diff --git a/src/applications/project/controller/PhabricatorProjectUpdateController.php b/src/applications/project/controller/PhabricatorProjectUpdateController.php index d1a3d98ad7..a484b2b670 100644 --- a/src/applications/project/controller/PhabricatorProjectUpdateController.php +++ b/src/applications/project/controller/PhabricatorProjectUpdateController.php @@ -42,7 +42,7 @@ final class PhabricatorProjectUpdateController return new Aphront404Response(); } - $project_uri = '/project/view/'.$project->getID().'/'; + $project_uri = $this->getApplicationURI('profile/'.$project->getID().'/'); if ($process_action) { diff --git a/src/applications/project/controller/PhabricatorProjectViewController.php b/src/applications/project/controller/PhabricatorProjectViewController.php new file mode 100644 index 0000000000..a974010bc0 --- /dev/null +++ b/src/applications/project/controller/PhabricatorProjectViewController.php @@ -0,0 +1,56 @@ +getRequest(); + $user = $request->getUser(); + + $query = id(new PhabricatorProjectQuery()) + ->setViewer($user) + ->needMembers(true) + ->needWatchers(true) + ->needImages(true) + ->needSlugs(true); + $id = $request->getURIData('id'); + $slug = $request->getURIData('slug'); + if ($slug) { + $query->withSlugs(array($slug)); + } else { + $query->withIDs(array($id)); + } + $project = $query->executeOne(); + if (!$project) { + return new Aphront404Response(); + } + + + $columns = id(new PhabricatorProjectColumnQuery()) + ->setViewer($user) + ->withProjectPHIDs(array($project->getPHID())) + ->execute(); + if ($columns) { + $controller = 'board'; + } else { + $controller = 'profile'; + } + + switch ($controller) { + case 'board': + $controller_object = new PhabricatorProjectBoardViewController(); + break; + case 'profile': + default: + $controller_object = new PhabricatorProjectProfileController(); + break; + } + + return $this->delegateToController($controller_object); + } + +} diff --git a/src/applications/project/controller/PhabricatorProjectWatchController.php b/src/applications/project/controller/PhabricatorProjectWatchController.php index 9f375e11fc..b1c52e7870 100644 --- a/src/applications/project/controller/PhabricatorProjectWatchController.php +++ b/src/applications/project/controller/PhabricatorProjectWatchController.php @@ -25,7 +25,7 @@ final class PhabricatorProjectWatchController return new Aphront404Response(); } - $project_uri = '/project/view/'.$project->getID().'/'; + $project_uri = $this->getApplicationURI('profile/'.$project->getID().'/'); // You must be a member of a project to if (!$project->isUserMember($viewer->getPHID())) { diff --git a/src/applications/project/query/PhabricatorProjectSearchEngine.php b/src/applications/project/query/PhabricatorProjectSearchEngine.php index a72206ca10..f9d0964eda 100644 --- a/src/applications/project/query/PhabricatorProjectSearchEngine.php +++ b/src/applications/project/query/PhabricatorProjectSearchEngine.php @@ -219,8 +219,15 @@ final class PhabricatorProjectSearchEngine foreach ($projects as $key => $project) { $id = $project->getID(); + $profile_uri = $this->getApplicationURI("profile/{$id}/"); $workboards_uri = $this->getApplicationURI("board/{$id}/"); $members_uri = $this->getApplicationURI("members/{$id}/"); + $profile_url = phutil_tag( + 'a', + array( + 'href' => $profile_uri, + ), + pht('Profile')); $workboards_url = phutil_tag( 'a', array( @@ -252,6 +259,7 @@ final class PhabricatorProjectSearchEngine ->setHref($this->getApplicationURI("view/{$id}/")) ->setImageURI($project->getProfileImageURI()) ->addAttribute($tag_list) + ->addAttribute($profile_url) ->addAttribute($workboards_url) ->addAttribute($members_url); diff --git a/src/view/layout/AphrontSideNavFilterView.php b/src/view/layout/AphrontSideNavFilterView.php index 0a0554b37f..f82208d5d6 100644 --- a/src/view/layout/AphrontSideNavFilterView.php +++ b/src/view/layout/AphrontSideNavFilterView.php @@ -27,6 +27,7 @@ final class AphrontSideNavFilterView extends AphrontView { private $crumbs; private $classes = array(); private $menuID; + private $iconNav; public function setMenuID($menu_id) { $this->menuID = $menu_id; @@ -61,6 +62,11 @@ final class AphrontSideNavFilterView extends AphrontView { return $this->crumbs; } + public function setIconNav($nav) { + $this->iconNav = $nav; + return $this; + } + public function setActive($active) { $this->active = $active; return $this; @@ -94,6 +100,22 @@ final class AphrontSideNavFilterView extends AphrontView { $key, $name, $uri, PHUIListItemView::TYPE_LINK); } + public function addIcon($key, $name, $icon, $image = null) { + $href = clone $this->baseURI; + $href->setPath(rtrim($href->getPath().$key, '/').'/'); + $href = (string)$href; + + $item = id(new PHUIListItemView()) + ->setKey($key) + ->setRenderNameAsTooltip(true) + ->setType(PHUIListItemView::TYPE_ICON_NAV) + ->setIcon($icon) + ->setHref($href) + ->setName($name) + ->setProfileImage($image); + return $this->addMenuItem($item); + } + public function addButton($key, $name, $uri = null) { return $this->addThing( $key, $name, $uri, PHUIListItemView::TYPE_BUTTON); @@ -109,6 +131,7 @@ final class AphrontSideNavFilterView extends AphrontView { ->setName($name) ->setType($type); + if (strlen($key)) { $item->setKey($key); } @@ -192,6 +215,9 @@ final class AphrontSideNavFilterView extends AphrontView { $nav_classes = array(); $nav_classes[] = 'phabricator-nav'; + if ($this->iconNav) { + $nav_classes[] = 'phabricator-icon-nav'; + } $nav_id = null; $drag_id = null; diff --git a/src/view/phui/PHUIListItemView.php b/src/view/phui/PHUIListItemView.php index a292ec7bd5..4ceb5acb5c 100644 --- a/src/view/phui/PHUIListItemView.php +++ b/src/view/phui/PHUIListItemView.php @@ -9,6 +9,7 @@ final class PHUIListItemView extends AphrontTagView { const TYPE_CUSTOM = 'type-custom'; const TYPE_DIVIDER = 'type-divider'; const TYPE_ICON = 'type-icon'; + const TYPE_ICON_NAV = 'type-icon-nav'; const STATUS_WARN = 'phui-list-item-warn'; const STATUS_FAIL = 'phui-list-item-fail'; @@ -26,6 +27,7 @@ final class PHUIListItemView extends AphrontTagView { private $statusColor; private $order; private $aural; + private $profileImage; public function setAural($aural) { $this->aural = $aural; @@ -73,6 +75,11 @@ final class PHUIListItemView extends AphrontTagView { return $this; } + public function setProfileImage($image) { + $this->profileImage = $image; + return $this; + } + public function getIcon() { return $this->icon; } @@ -170,9 +177,11 @@ final class PHUIListItemView extends AphrontTagView { if ($this->name) { if ($this->getRenderNameAsTooltip()) { + Javelin::initBehavior('phabricator-tooltips'); $sigil = 'has-tooltip'; $meta = array( 'tip' => $this->name, + 'align' => 'E', ); } else { $external = null; @@ -224,6 +233,12 @@ final class PHUIListItemView extends AphrontTagView { ->setIconFont($icon_name); } + if ($this->profileImage) { + $icon = id(new PHUIIconView()) + ->setHeadSize(PHUIIconView::HEAD_SMALL) + ->setImage($this->profileImage); + } + if ($this->appIcon) { $icon = id(new PHUIIconView()) ->addClass('phui-list-item-icon') diff --git a/webroot/rsrc/css/aphront/multi-column.css b/webroot/rsrc/css/aphront/multi-column.css index 3d1ed79805..08f17f2b21 100644 --- a/webroot/rsrc/css/aphront/multi-column.css +++ b/webroot/rsrc/css/aphront/multi-column.css @@ -159,25 +159,25 @@ display: block; width: auto; } - .device-desktop .aphront-multi-column-column-outer { + .device-desktop .dashboard-view .aphront-multi-column-column-outer { display: block; border: none; } - .device-desktop .aphront-multi-column-column.mlr { + .device-desktop .dashboard-view .aphront-multi-column-column.mlr { margin: 0; } - .device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up - .aphront-multi-column-column-outer.half { + .device-desktop .dashboard-view .aphront-multi-column-fluid + .aphront-multi-column-2-up .aphront-multi-column-column-outer.half { width: auto; margin: 0 0 16px; } - .device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up - .aphront-multi-column-column-outer.thirds { + .device-desktop .dashboard-view .aphront-multi-column-fluid + .aphront-multi-column-2-up .aphront-multi-column-column-outer.thirds { width: auto; margin: 0 0 16px; } - .device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up - .aphront-multi-column-column-outer.third { + .device-desktop .dashboard-view .aphront-multi-column-fluid + .aphront-multi-column-2-up .aphront-multi-column-column-outer.third { width: auto; margin: 0 0 16px; } diff --git a/webroot/rsrc/css/application/profile/profile-view.css b/webroot/rsrc/css/application/profile/profile-view.css index a51fa5a195..97020aaf37 100644 --- a/webroot/rsrc/css/application/profile/profile-view.css +++ b/webroot/rsrc/css/application/profile/profile-view.css @@ -51,3 +51,13 @@ .device-tablet .phabricator-project-layout .profile-feed { padding: 16px; } + +.phabricator-project-feed { + padding: 4px 0 12px 12px; + max-width: 640px; +} + +.device-phone .phabricator-project-feed { + padding: 0 12px; + width: auto; +} diff --git a/webroot/rsrc/css/layout/phabricator-side-menu-view.css b/webroot/rsrc/css/layout/phabricator-side-menu-view.css index 5748624e4a..b831d1befb 100644 --- a/webroot/rsrc/css/layout/phabricator-side-menu-view.css +++ b/webroot/rsrc/css/layout/phabricator-side-menu-view.css @@ -43,3 +43,44 @@ text-decoration: none; background-color: {$hovergrey}; } + +.device-desktop .phabricator-icon-nav .phabricator-nav-column-background, +.device-desktop .phabricator-icon-nav .phabricator-nav-local { + width: 40px; +} + +.device-desktop .phabricator-icon-nav .phabricator-nav-content { + margin-left: 41px; +} + +.phabricator-icon-nav .phabricator-side-menu .phui-list-item-href { + height: 40px; + width: 40px; + padding: 0; +} + +.phabricator-icon-nav .phabricator-side-menu .phui-list-item-icon { + font-size: 20px; + width: 40px; + line-height: 40px; + text-align: center; + vertical-align: bottom; +} + +.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: {$sky}; +} + +.phabricator-icon-nav .phui-icon-view.phuihead-small { + height: 24px; + width: 24px; + border: 1px solid #fff; + background-size: 24px; + display: inline-block; + margin: 7px; +} diff --git a/webroot/rsrc/css/phui/phui-object-item-list-view.css b/webroot/rsrc/css/phui/phui-object-item-list-view.css index 978e2ba99a..1923c50236 100644 --- a/webroot/rsrc/css/phui/phui-object-item-list-view.css +++ b/webroot/rsrc/css/phui/phui-object-item-list-view.css @@ -19,7 +19,7 @@ } .phui-object-box .phui-object-item-list-view.phui-object-list-flush { - padding: 8px 12px 4px 12px; + padding: 8px 8px 4px 8px; background-color: #E5E8EE; } @@ -38,7 +38,7 @@ border-color: {$lightgreyborder}; margin: 5px 0; overflow: hidden; - border-left-width: 6px; + border-left-width: 4px; background: #fff; margin-bottom: 4px; } diff --git a/webroot/rsrc/css/phui/phui-workboard-view.css b/webroot/rsrc/css/phui/phui-workboard-view.css index 1176671c7c..eab522b6fe 100644 --- a/webroot/rsrc/css/phui/phui-workboard-view.css +++ b/webroot/rsrc/css/phui/phui-workboard-view.css @@ -73,6 +73,15 @@ margin: 0 3px; } +.device-desktop .project-board-wrapper .phui-workboard-view-shadow { + left: 53px; +} + +.device-desktop .phui-workboard-view .aphront-multi-column-fixed + .aphront-multi-column-inner { + margin-left: 0; +} + .device-tablet .project-board-wrapper { margin-left: 8px; margin-right: 8px;