From c506cfe8d9778af62b79ae45c8658e50a44bf41d Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 15 Jan 2013 15:41:22 -0800 Subject: [PATCH] Implement very basic uberhome Summary: No fancy-pants smarty stuff yet, but merges /applications/ and the awful application buttons into the dark navigation. Hover state is maybe a little weird. Test Plan: {F29324} Reviewers: chad, btrahan Reviewed By: btrahan CC: aran, btrahan, codeblock Differential Revision: https://secure.phabricator.com/D4431 --- scripts/celerity/generate_sprites.php | 3 +- scripts/celerity_mapper.php | 1 - src/__celerity_resource_map__.php | 218 +++++++----------- src/__phutil_library_map__.php | 2 - .../PhabricatorApplicationCalendar.php | 4 + .../PhabricatorApplicationDaemons.php | 2 +- .../PhabricatorDirectoryController.php | 50 +++- .../PhabricatorDirectoryMainController.php | 144 +----------- .../PhabricatorApplicationApplications.php | 6 +- .../PhabricatorApplicationsListController.php | 59 ----- .../view/PhabricatorApplicationLaunchView.php | 105 ++++----- .../PhabricatorApplicationPHID.php | 2 +- src/view/layout/AphrontSideNavFilterView.php | 8 + .../rsrc/css/aphront/phabricator-nav-view.css | 19 +- .../phabricator-application-launch-view.css | 121 ++-------- .../directory/phabricator-app-buttons.css | 97 -------- webroot/rsrc/image/apps.png | Bin 3972 -> 0 bytes webroot/rsrc/image/appstatus_empty.png | Bin 774 -> 0 bytes webroot/rsrc/image/appstatus_info.png | Bin 690 -> 0 bytes webroot/rsrc/image/appstatus_needs.png | Bin 719 -> 0 bytes webroot/rsrc/image/appstatus_okay.png | Bin 476 -> 0 bytes 21 files changed, 246 insertions(+), 595 deletions(-) delete mode 100644 src/applications/meta/controller/PhabricatorApplicationsListController.php delete mode 100644 webroot/rsrc/css/application/directory/phabricator-app-buttons.css delete mode 100644 webroot/rsrc/image/apps.png delete mode 100644 webroot/rsrc/image/appstatus_empty.png delete mode 100644 webroot/rsrc/image/appstatus_info.png delete mode 100644 webroot/rsrc/image/appstatus_needs.png delete mode 100755 webroot/rsrc/image/appstatus_okay.png diff --git a/scripts/celerity/generate_sprites.php b/scripts/celerity/generate_sprites.php index 7c7ab79580..1a337e2c63 100755 --- a/scripts/celerity/generate_sprites.php +++ b/scripts/celerity/generate_sprites.php @@ -31,7 +31,8 @@ $sheets = array( 'menu' => $generator->buildMenuSheet(), 'apps' => $generator->buildAppsSheet(), 'apps-large' => $generator->buildAppsLargeSheet(), - 'apps-xlarge' => $generator->buildAppsXLargeSheet(), +// TODO: @chad: should we actually remove this? +// 'apps-xlarge' => $generator->buildAppsXLargeSheet(), 'gradient' => $generator->buildGradientSheet(), ); diff --git a/scripts/celerity_mapper.php b/scripts/celerity_mapper.php index 14d4d449c9..eb57ecc97e 100755 --- a/scripts/celerity_mapper.php +++ b/scripts/celerity_mapper.php @@ -74,7 +74,6 @@ $package_spec = array( 'phabricator-directory-css', 'phabricator-jump-nav', - 'phabricator-app-buttons-css', 'phabricator-remarkup-css', 'syntax-highlighting-css', diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index 910ca068d7..3145ea5100 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -7,41 +7,6 @@ */ celerity_register_resource_map(array( - '/rsrc/image/apps.png' => - array( - 'hash' => 'f7cb4abeb73245fea4098a02fd784653', - 'uri' => '/res/f7cb4abe/rsrc/image/apps.png', - 'disk' => '/rsrc/image/apps.png', - 'type' => 'png', - ), - '/rsrc/image/appstatus_empty.png' => - array( - 'hash' => '2f8102e0a0f5a0980d87d4ab4ba8c8fd', - 'uri' => '/res/2f8102e0/rsrc/image/appstatus_empty.png', - 'disk' => '/rsrc/image/appstatus_empty.png', - 'type' => 'png', - ), - '/rsrc/image/appstatus_info.png' => - array( - 'hash' => '407de6daf2edc4a8b68e2e369f4fc8cb', - 'uri' => '/res/407de6da/rsrc/image/appstatus_info.png', - 'disk' => '/rsrc/image/appstatus_info.png', - 'type' => 'png', - ), - '/rsrc/image/appstatus_needs.png' => - array( - 'hash' => '2c1e193bc786ca4fca0b851ed9cd3d92', - 'uri' => '/res/2c1e193b/rsrc/image/appstatus_needs.png', - 'disk' => '/rsrc/image/appstatus_needs.png', - 'type' => 'png', - ), - '/rsrc/image/appstatus_okay.png' => - array( - 'hash' => 'd00e683ee1c61d0ccced1200775cdbb5', - 'uri' => '/res/d00e683e/rsrc/image/appstatus_okay.png', - 'disk' => '/rsrc/image/appstatus_okay.png', - 'type' => 'png', - ), '/rsrc/image/avatar.png' => array( 'hash' => '1c5f255071537f05406adee86717ff27', @@ -653,7 +618,7 @@ celerity_register_resource_map(array( ), 'aphront-form-view-css' => array( - 'uri' => '/res/bdc0b393/rsrc/css/aphront/form-view.css', + 'uri' => '/res/ff83e503/rsrc/css/aphront/form-view.css', 'type' => 'css', 'requires' => array( @@ -680,7 +645,7 @@ celerity_register_resource_map(array( ), 'aphront-list-filter-view-css' => array( - 'uri' => '/res/f6d419df/rsrc/css/aphront/list-filter-view.css', + 'uri' => '/res/0f5ddaba/rsrc/css/aphront/list-filter-view.css', 'type' => 'css', 'requires' => array( @@ -849,7 +814,7 @@ celerity_register_resource_map(array( ), 'differential-revision-list-css' => array( - 'uri' => '/res/fe6c4721/rsrc/css/application/differential/revision-list.css', + 'uri' => '/res/7659ad8d/rsrc/css/application/differential/revision-list.css', 'type' => 'css', 'requires' => array( @@ -2428,18 +2393,9 @@ celerity_register_resource_map(array( ), 'disk' => '/rsrc/css/layout/phabricator-action-list-view.css', ), - 'phabricator-app-buttons-css' => - array( - 'uri' => '/res/1a1f926e/rsrc/css/application/directory/phabricator-app-buttons.css', - 'type' => 'css', - 'requires' => - array( - ), - 'disk' => '/rsrc/css/application/directory/phabricator-app-buttons.css', - ), 'phabricator-application-launch-view-css' => array( - 'uri' => '/res/464720b1/rsrc/css/application/base/phabricator-application-launch-view.css', + 'uri' => '/res/ddfc3af4/rsrc/css/application/base/phabricator-application-launch-view.css', 'type' => 'css', 'requires' => array( @@ -2664,7 +2620,7 @@ celerity_register_resource_map(array( ), 'phabricator-nav-view-css' => array( - 'uri' => '/res/00ba5b11/rsrc/css/aphront/phabricator-nav-view.css', + 'uri' => '/res/44a2e453/rsrc/css/aphront/phabricator-nav-view.css', 'type' => 'css', 'requires' => array( @@ -3078,7 +3034,7 @@ celerity_register_resource_map(array( ), 'phabricator-zindex-css' => array( - 'uri' => '/res/99eb34fd/rsrc/css/core/z-index.css', + 'uri' => '/res/81ca67ef/rsrc/css/core/z-index.css', 'type' => 'css', 'requires' => array( @@ -3268,7 +3224,7 @@ celerity_register_resource_map(array( ), array( 'packages' => array( - '6d57aed2' => + '38f5403c' => array( 'name' => 'core.pkg.css', 'symbols' => @@ -3287,33 +3243,32 @@ celerity_register_resource_map(array( 11 => 'aphront-list-filter-view-css', 12 => 'phabricator-directory-css', 13 => 'phabricator-jump-nav', - 14 => 'phabricator-app-buttons-css', - 15 => 'phabricator-remarkup-css', - 16 => 'syntax-highlighting-css', - 17 => 'aphront-pager-view-css', - 18 => 'phabricator-transaction-view-css', - 19 => 'aphront-tooltip-css', - 20 => 'aphront-headsup-view-css', - 21 => 'phabricator-flag-css', - 22 => 'aphront-error-view-css', - 23 => 'sprite-icon-css', - 24 => 'sprite-gradient-css', - 25 => 'sprite-menu-css', - 26 => 'sprite-apps-large-css', - 27 => 'phabricator-main-menu-view', - 28 => 'phabricator-notification-css', - 29 => 'phabricator-notification-menu-css', - 30 => 'lightbox-attachment-css', - 31 => 'phabricator-header-view-css', - 32 => 'phabricator-form-view-css', - 33 => 'phabricator-filetree-view-css', - 34 => 'phabricator-nav-view-css', - 35 => 'phabricator-side-menu-view-css', - 36 => 'phabricator-crumbs-view-css', - 37 => 'phabricator-object-item-list-view-css', - 38 => 'global-drag-and-drop-css', + 14 => 'phabricator-remarkup-css', + 15 => 'syntax-highlighting-css', + 16 => 'aphront-pager-view-css', + 17 => 'phabricator-transaction-view-css', + 18 => 'aphront-tooltip-css', + 19 => 'aphront-headsup-view-css', + 20 => 'phabricator-flag-css', + 21 => 'aphront-error-view-css', + 22 => 'sprite-icon-css', + 23 => 'sprite-gradient-css', + 24 => 'sprite-menu-css', + 25 => 'sprite-apps-large-css', + 26 => 'phabricator-main-menu-view', + 27 => 'phabricator-notification-css', + 28 => 'phabricator-notification-menu-css', + 29 => 'lightbox-attachment-css', + 30 => 'phabricator-header-view-css', + 31 => 'phabricator-form-view-css', + 32 => 'phabricator-filetree-view-css', + 33 => 'phabricator-nav-view-css', + 34 => 'phabricator-side-menu-view-css', + 35 => 'phabricator-crumbs-view-css', + 36 => 'phabricator-object-item-list-view-css', + 37 => 'global-drag-and-drop-css', ), - 'uri' => '/res/pkg/6d57aed2/core.pkg.css', + 'uri' => '/res/pkg/38f5403c/core.pkg.css', 'type' => 'css', ), 'b239ff06' => @@ -3369,7 +3324,7 @@ celerity_register_resource_map(array( 'uri' => '/res/pkg/8edbada5/darkconsole.pkg.js', 'type' => 'js', ), - 'ec01d039' => + '20933a11' => array( 'name' => 'differential.pkg.css', 'symbols' => @@ -3389,7 +3344,7 @@ celerity_register_resource_map(array( 12 => 'differential-local-commits-view-css', 13 => 'inline-comment-summary-css', ), - 'uri' => '/res/pkg/ec01d039/differential.pkg.css', + 'uri' => '/res/pkg/20933a11/differential.pkg.css', 'type' => 'css', ), 'bbd79ca2' => @@ -3502,34 +3457,34 @@ celerity_register_resource_map(array( 'reverse' => array( 'aphront-attached-file-view-css' => 'ac211174', - 'aphront-crumbs-view-css' => '6d57aed2', - 'aphront-dialog-view-css' => '6d57aed2', - 'aphront-error-view-css' => '6d57aed2', - 'aphront-form-view-css' => '6d57aed2', - 'aphront-headsup-action-list-view-css' => 'ec01d039', - 'aphront-headsup-view-css' => '6d57aed2', - 'aphront-list-filter-view-css' => '6d57aed2', - 'aphront-pager-view-css' => '6d57aed2', - 'aphront-panel-view-css' => '6d57aed2', - 'aphront-table-view-css' => '6d57aed2', - 'aphront-tokenizer-control-css' => '6d57aed2', - 'aphront-tooltip-css' => '6d57aed2', - 'aphront-typeahead-control-css' => '6d57aed2', - 'differential-changeset-view-css' => 'ec01d039', - 'differential-core-view-css' => 'ec01d039', + 'aphront-crumbs-view-css' => '38f5403c', + 'aphront-dialog-view-css' => '38f5403c', + 'aphront-error-view-css' => '38f5403c', + 'aphront-form-view-css' => '38f5403c', + 'aphront-headsup-action-list-view-css' => '20933a11', + 'aphront-headsup-view-css' => '38f5403c', + 'aphront-list-filter-view-css' => '38f5403c', + 'aphront-pager-view-css' => '38f5403c', + 'aphront-panel-view-css' => '38f5403c', + 'aphront-table-view-css' => '38f5403c', + 'aphront-tokenizer-control-css' => '38f5403c', + 'aphront-tooltip-css' => '38f5403c', + 'aphront-typeahead-control-css' => '38f5403c', + 'differential-changeset-view-css' => '20933a11', + 'differential-core-view-css' => '20933a11', 'differential-inline-comment-editor' => 'bbd79ca2', - 'differential-local-commits-view-css' => 'ec01d039', - 'differential-results-table-css' => 'ec01d039', - 'differential-revision-add-comment-css' => 'ec01d039', - 'differential-revision-comment-css' => 'ec01d039', - 'differential-revision-comment-list-css' => 'ec01d039', - 'differential-revision-history-css' => 'ec01d039', - 'differential-revision-list-css' => 'ec01d039', - 'differential-table-of-contents-css' => 'ec01d039', + 'differential-local-commits-view-css' => '20933a11', + 'differential-results-table-css' => '20933a11', + 'differential-revision-add-comment-css' => '20933a11', + 'differential-revision-comment-css' => '20933a11', + 'differential-revision-comment-list-css' => '20933a11', + 'differential-revision-history-css' => '20933a11', + 'differential-revision-list-css' => '20933a11', + 'differential-table-of-contents-css' => '20933a11', 'diffusion-commit-view-css' => 'c8ce2d88', 'diffusion-icons-css' => 'c8ce2d88', - 'global-drag-and-drop-css' => '6d57aed2', - 'inline-comment-summary-css' => 'ec01d039', + 'global-drag-and-drop-css' => '38f5403c', + 'inline-comment-summary-css' => '20933a11', 'javelin-aphlict' => 'b239ff06', 'javelin-behavior' => 'fbeded59', 'javelin-behavior-aphlict-dropdown' => 'b239ff06', @@ -3597,49 +3552,48 @@ celerity_register_resource_map(array( 'javelin-util' => 'fbeded59', 'javelin-vector' => 'fbeded59', 'javelin-workflow' => 'fbeded59', - 'lightbox-attachment-css' => '6d57aed2', + 'lightbox-attachment-css' => '38f5403c', 'maniphest-task-summary-css' => 'ac211174', 'maniphest-transaction-detail-css' => 'ac211174', - 'phabricator-app-buttons-css' => '6d57aed2', 'phabricator-busy' => 'b239ff06', - 'phabricator-content-source-view-css' => 'ec01d039', - 'phabricator-core-buttons-css' => '6d57aed2', - 'phabricator-core-css' => '6d57aed2', - 'phabricator-crumbs-view-css' => '6d57aed2', - 'phabricator-directory-css' => '6d57aed2', + 'phabricator-content-source-view-css' => '20933a11', + 'phabricator-core-buttons-css' => '38f5403c', + 'phabricator-core-css' => '38f5403c', + 'phabricator-crumbs-view-css' => '38f5403c', + 'phabricator-directory-css' => '38f5403c', 'phabricator-drag-and-drop-file-upload' => 'bbd79ca2', 'phabricator-dropdown-menu' => 'b239ff06', 'phabricator-file-upload' => 'b239ff06', - 'phabricator-filetree-view-css' => '6d57aed2', - 'phabricator-flag-css' => '6d57aed2', - 'phabricator-form-view-css' => '6d57aed2', - 'phabricator-header-view-css' => '6d57aed2', - 'phabricator-jump-nav' => '6d57aed2', + 'phabricator-filetree-view-css' => '38f5403c', + 'phabricator-flag-css' => '38f5403c', + 'phabricator-form-view-css' => '38f5403c', + 'phabricator-header-view-css' => '38f5403c', + 'phabricator-jump-nav' => '38f5403c', 'phabricator-keyboard-shortcut' => 'b239ff06', 'phabricator-keyboard-shortcut-manager' => 'b239ff06', - 'phabricator-main-menu-view' => '6d57aed2', + 'phabricator-main-menu-view' => '38f5403c', 'phabricator-menu-item' => 'b239ff06', - 'phabricator-nav-view-css' => '6d57aed2', + 'phabricator-nav-view-css' => '38f5403c', 'phabricator-notification' => 'b239ff06', - 'phabricator-notification-css' => '6d57aed2', - 'phabricator-notification-menu-css' => '6d57aed2', - 'phabricator-object-item-list-view-css' => '6d57aed2', - 'phabricator-object-selector-css' => 'ec01d039', + 'phabricator-notification-css' => '38f5403c', + 'phabricator-notification-menu-css' => '38f5403c', + 'phabricator-object-item-list-view-css' => '38f5403c', + 'phabricator-object-selector-css' => '20933a11', 'phabricator-paste-file-upload' => 'b239ff06', 'phabricator-prefab' => 'b239ff06', 'phabricator-project-tag-css' => 'ac211174', - 'phabricator-remarkup-css' => '6d57aed2', + 'phabricator-remarkup-css' => '38f5403c', 'phabricator-shaped-request' => 'bbd79ca2', - 'phabricator-side-menu-view-css' => '6d57aed2', - 'phabricator-standard-page-view' => '6d57aed2', + 'phabricator-side-menu-view-css' => '38f5403c', + 'phabricator-standard-page-view' => '38f5403c', 'phabricator-textareautils' => 'b239ff06', 'phabricator-tooltip' => 'b239ff06', - 'phabricator-transaction-view-css' => '6d57aed2', - 'phabricator-zindex-css' => '6d57aed2', - 'sprite-apps-large-css' => '6d57aed2', - 'sprite-gradient-css' => '6d57aed2', - 'sprite-icon-css' => '6d57aed2', - 'sprite-menu-css' => '6d57aed2', - 'syntax-highlighting-css' => '6d57aed2', + 'phabricator-transaction-view-css' => '38f5403c', + 'phabricator-zindex-css' => '38f5403c', + 'sprite-apps-large-css' => '38f5403c', + 'sprite-gradient-css' => '38f5403c', + 'sprite-icon-css' => '38f5403c', + 'sprite-menu-css' => '38f5403c', + 'syntax-highlighting-css' => '38f5403c', ), )); diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 1fe9146cb0..7cb1d89ef7 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -648,7 +648,6 @@ phutil_register_library_map(array( 'PhabricatorApplicationTransactionView' => 'applications/transactions/view/PhabricatorApplicationTransactionView.php', 'PhabricatorApplicationTransactions' => 'applications/transactions/application/PhabricatorApplicationTransactions.php', 'PhabricatorApplicationUIExamples' => 'applications/uiexample/application/PhabricatorApplicationUIExamples.php', - 'PhabricatorApplicationsListController' => 'applications/meta/controller/PhabricatorApplicationsListController.php', 'PhabricatorAuditActionConstants' => 'applications/audit/constants/PhabricatorAuditActionConstants.php', 'PhabricatorAuditAddCommentController' => 'applications/audit/controller/PhabricatorAuditAddCommentController.php', 'PhabricatorAuditComment' => 'applications/audit/storage/PhabricatorAuditComment.php', @@ -2022,7 +2021,6 @@ phutil_register_library_map(array( 'PhabricatorApplicationTransactionView' => 'AphrontView', 'PhabricatorApplicationTransactions' => 'PhabricatorApplication', 'PhabricatorApplicationUIExamples' => 'PhabricatorApplication', - 'PhabricatorApplicationsListController' => 'PhabricatorController', 'PhabricatorAuditAddCommentController' => 'PhabricatorAuditController', 'PhabricatorAuditComment' => array( diff --git a/src/applications/calendar/application/PhabricatorApplicationCalendar.php b/src/applications/calendar/application/PhabricatorApplicationCalendar.php index 94161557ba..d3300cf4a9 100644 --- a/src/applications/calendar/application/PhabricatorApplicationCalendar.php +++ b/src/applications/calendar/application/PhabricatorApplicationCalendar.php @@ -20,6 +20,10 @@ final class PhabricatorApplicationCalendar extends PhabricatorApplication { return "\xE2\x8C\xA8"; } + public function getApplicationGroup() { + return self::GROUP_COMMUNICATION; + } + public function getRoutes() { return array( '/calendar/' => array( diff --git a/src/applications/daemon/application/PhabricatorApplicationDaemons.php b/src/applications/daemon/application/PhabricatorApplicationDaemons.php index c4fb917987..f4abf1c985 100644 --- a/src/applications/daemon/application/PhabricatorApplicationDaemons.php +++ b/src/applications/daemon/application/PhabricatorApplicationDaemons.php @@ -3,7 +3,7 @@ final class PhabricatorApplicationDaemons extends PhabricatorApplication { public function getName() { - return 'Daemon Console'; + return 'Daemons'; } public function getShortDescription() { diff --git a/src/applications/directory/controller/PhabricatorDirectoryController.php b/src/applications/directory/controller/PhabricatorDirectoryController.php index 1de6f38adf..9c8e8b19c1 100644 --- a/src/applications/directory/controller/PhabricatorDirectoryController.php +++ b/src/applications/directory/controller/PhabricatorDirectoryController.php @@ -21,11 +21,51 @@ abstract class PhabricatorDirectoryController extends PhabricatorController { $nav = new AphrontSideNavFilterView(); $nav->setBaseURI(new PhutilURI('/')); - $nav->addLabel('Phabricator'); - $nav->addFilter('home', 'Tactical Command', '/'); - $nav->addFilter('jump', 'Jump Nav'); - $nav->addFilter('feed', 'Feed'); - $nav->addFilter('applications', 'More Stuff'); + $applications = PhabricatorApplication::getAllInstalledApplications(); + + foreach ($applications as $key => $application) { + if (!$application->shouldAppearInLaunchView()) { + unset($applications[$key]); + } + } + + $groups = PhabricatorApplication::getApplicationGroups(); + + $applications = msort($applications, 'getApplicationOrder'); + $applications = mgroup($applications, 'getApplicationGroup'); + $applications = array_select_keys($applications, array_keys($groups)); + + $view = array(); + foreach ($applications as $group => $application_list) { + $status = array(); + foreach ($application_list as $key => $application) { + $status[$key] = $application->loadStatus($user); + } + + $views = array(); + foreach ($application_list as $key => $application) { + $views[] = id(new PhabricatorApplicationLaunchView()) + ->setApplication($application) + ->setApplicationStatus(idx($status, $key, array())) + ->setUser($user); + } + + while (count($views) % 4) { + $views[] = id(new PhabricatorApplicationLaunchView()); + } + + $nav->addLabel($groups[$group]); + $nav->addCustomBlock( + phutil_render_tag( + 'div', + array( + 'class' => 'application-tile-group', + ), + id(new AphrontNullView())->appendChild($views)->render())); + } + + $nav->addClass('phabricator-side-menu-home'); + $nav->selectFilter(null); return $nav; } diff --git a/src/applications/directory/controller/PhabricatorDirectoryMainController.php b/src/applications/directory/controller/PhabricatorDirectoryMainController.php index 754d519560..82e8190795 100644 --- a/src/applications/directory/controller/PhabricatorDirectoryMainController.php +++ b/src/applications/directory/controller/PhabricatorDirectoryMainController.php @@ -4,39 +4,26 @@ final class PhabricatorDirectoryMainController extends PhabricatorDirectoryController { private $filter; - private $subfilter; public function willProcessRequest(array $data) { $this->filter = idx($data, 'filter'); - $this->subfilter = idx($data, 'subfilter'); } public function processRequest() { $user = $this->getRequest()->getUser(); + if ($this->filter == 'jump') { + return $this->buildJumpResponse(); + } + $nav = $this->buildNav(); - $this->filter = $nav->selectFilter($this->filter, 'home'); - switch ($this->filter) { - case 'jump': - break; - case 'home': - $project_query = new PhabricatorProjectQuery(); - $project_query->setViewer($user); - $project_query->withMemberPHIDs(array($user->getPHID())); - $projects = $project_query->execute(); - break; - default: - throw new Exception("Unknown filter '{$this->filter}'!"); - } - - switch ($this->filter) { - case 'jump': - return $this->buildJumpResponse($nav); - default: - return $this->buildMainResponse($nav, $projects); - } + $project_query = new PhabricatorProjectQuery(); + $project_query->setViewer($user); + $project_query->withMemberPHIDs(array($user->getPHID())); + $projects = $project_query->execute(); + return $this->buildMainResponse($nav, $projects); } private function buildMainResponse($nav, array $projects) { @@ -56,12 +43,10 @@ final class PhabricatorDirectoryMainController $jump_panel = $this->buildJumpPanel(); $revision_panel = $this->buildRevisionPanel(); - $app_panel = $this->buildAppPanel(); $audit_panel = $this->buildAuditPanel(); $commit_panel = $this->buildCommitPanel(); $content = array( - $app_panel, $jump_panel, $unbreak_panel, $triage_panel, @@ -82,7 +67,7 @@ final class PhabricatorDirectoryMainController )); } - private function buildJumpResponse($nav) { + private function buildJumpResponse() { $request = $this->getRequest(); $jump = $request->getStr('jump'); @@ -97,15 +82,9 @@ final class PhabricatorDirectoryMainController return id(new AphrontRedirectResponse()) ->setURI('/search/'.$query->getQueryKey().'/'); + } else { + return id(new AphrontRedirectResponse())->setURI('/'); } - - - $nav->appendChild($this->buildJumpPanel($jump)); - return $this->buildStandardPageResponse( - $nav, - array( - 'title' => 'Jump Nav', - )); } private function buildUnbreakNowPanel() { @@ -389,105 +368,6 @@ final class PhabricatorDirectoryMainController return $panel; } - private function buildAppPanel() { - require_celerity_resource('phabricator-app-buttons-css'); - - $nav_buttons = array(); - - $nav_buttons[] = array( - 'Differential', - '/differential/', - 'differential', - 'Code Reviews'); - - if (PhabricatorEnv::getEnvConfig('maniphest.enabled')) { - $nav_buttons[] = array( - 'Maniphest', - '/maniphest/', - 'maniphest', - 'Tasks'); - $nav_buttons[] = array( - 'Create Task', - '/maniphest/task/create/', - 'create-task'); - } - - $nav_buttons[] = array( - 'Upload File', - '/file/upload/', - 'upload-file', - 'Share Files'); - $nav_buttons[] = array( - 'Create Paste', - '/paste/create/', - 'create-paste', - 'Share Text'); - - - if (PhabricatorEnv::getEnvConfig('phriction.enabled')) { - $nav_buttons[] = array( - 'Phriction', - '/w/', - 'phriction', - 'Browse Wiki'); - } - - $nav_buttons[] = array( - 'Diffusion', - '/diffusion/', - 'diffusion', - 'Browse Code'); - - $nav_buttons[] = array( - 'Audit', - '/audit/', - 'audit', - 'Audit Code'); - - $view = new AphrontNullView(); - $view->appendChild('
'); - foreach ($nav_buttons as $info) { - // Subtitle is optional. - list($name, $uri, $icon, $subtitle) = array_merge($info, array(null)); - - if ($subtitle) { - $subtitle = - '
'. - phutil_escape_html($subtitle). - '
'; - } - - $button = phutil_render_tag( - 'a', - array( - 'href' => $uri, - 'class' => 'app-button icon-'.$icon, - ), - phutil_render_tag( - 'div', - array( - 'class' => 'app-icon icon-'.$icon, - ), - '')); - $caption = phutil_render_tag( - 'a', - array( - 'href' => $uri, - 'class' => 'phabricator-button-caption', - ), - phutil_escape_html($name).$subtitle); - - $view->appendChild( - '
'. - $button. - $caption. - '
'); - } - $view->appendChild('
'); - - return $view; - } - private function renderMiniPanel($title, $body) { $panel = new AphrontMiniPanelView(); $panel->appendChild( diff --git a/src/applications/meta/application/PhabricatorApplicationApplications.php b/src/applications/meta/application/PhabricatorApplicationApplications.php index 6d34c59a09..5a85d55283 100644 --- a/src/applications/meta/application/PhabricatorApplicationApplications.php +++ b/src/applications/meta/application/PhabricatorApplicationApplications.php @@ -15,11 +15,7 @@ final class PhabricatorApplicationApplications extends PhabricatorApplication { } public function getRoutes() { - return array( - '/applications/' => array( - '' => 'PhabricatorApplicationsListController' - ), - ); + return array(); } public function getTitleGlyph() { diff --git a/src/applications/meta/controller/PhabricatorApplicationsListController.php b/src/applications/meta/controller/PhabricatorApplicationsListController.php deleted file mode 100644 index b309ee825d..0000000000 --- a/src/applications/meta/controller/PhabricatorApplicationsListController.php +++ /dev/null @@ -1,59 +0,0 @@ -getRequest(); - $user = $request->getUser(); - - $applications = PhabricatorApplication::getAllInstalledApplications(); - - foreach ($applications as $key => $application) { - if (!$application->shouldAppearInLaunchView()) { - unset($applications[$key]); - } - } - - $groups = PhabricatorApplication::getApplicationGroups(); - - $applications = msort($applications, 'getApplicationOrder'); - $applications = mgroup($applications, 'getApplicationGroup'); - $applications = array_select_keys($applications, array_keys($groups)); - - $view = array(); - foreach ($applications as $group => $application_list) { - $status = array(); - foreach ($application_list as $key => $application) { - $status[$key] = $application->loadStatus($user); - } - - $views = array(); - foreach ($application_list as $key => $application) { - $views[] = id(new PhabricatorApplicationLaunchView()) - ->setApplication($application) - ->setApplicationStatus(idx($status, $key, array())) - ->setUser($user); - } - - $view[] = id(new PhabricatorHeaderView()) - ->setHeader($groups[$group]); - - $view[] = phutil_render_tag( - 'div', - array( - 'class' => 'phabricator-application-list', - ), - id(new AphrontNullView())->appendChild($views)->render()); - } - - return $this->buildApplicationPage( - $view, - array( - 'title' => 'Applications', - 'device' => true, - )); - } - -} - diff --git a/src/applications/meta/view/PhabricatorApplicationLaunchView.php b/src/applications/meta/view/PhabricatorApplicationLaunchView.php index ce902c97de..329792b476 100644 --- a/src/applications/meta/view/PhabricatorApplicationLaunchView.php +++ b/src/applications/meta/view/PhabricatorApplicationLaunchView.php @@ -19,79 +19,60 @@ final class PhabricatorApplicationLaunchView extends AphrontView { $application = $this->application; require_celerity_resource('phabricator-application-launch-view-css'); - require_celerity_resource('sprite-apps-xlarge-css'); + require_celerity_resource('sprite-apps-large-css'); $content = array(); - $content[] = phutil_render_tag( - 'span', - array( - 'class' => 'phabricator-application-launch-name', - ), - phutil_escape_html($application->getName())); - $content[] = phutil_render_tag( - 'span', - array( - 'class' => 'phabricator-application-launch-description', - ), - phutil_escape_html($application->getShortDescription())); - - - $count = 0; - $content[] = ''; - - if ($this->status) { - foreach ($this->status as $status) { - $count += $status->getCount(); - $content[] = $status; - } - } else { - $flavor = $application->getFlavorText(); - if ($flavor !== null) { - $content[] = phutil_render_tag( - 'span', - array( - 'class' => 'phabricator-application-flavor-text', - ), - phutil_escape_html($flavor)); - } - } - - $content[] = ''; - - if ($count) { + $icon = null; + if ($application) { $content[] = phutil_render_tag( 'span', array( - 'class' => 'phabricator-application-launch-attention', + 'class' => 'phabricator-application-launch-name', ), - phutil_escape_html($count)); + phutil_escape_html($application->getName())); + + $count = 0; + if ($this->status) { + foreach ($this->status as $status) { + $count += $status->getCount(); + } + } + + if ($count) { + $content[] = phutil_render_tag( + 'span', + array( + 'class' => 'phabricator-application-launch-attention', + ), + phutil_escape_html($count)); + } + + $classes = array(); + $classes[] = 'phabricator-application-launch-icon'; + $styles = array(); + + if ($application->getIconURI()) { + $styles[] = 'background-image: url('.$application->getIconURI().')'; + } else { + $icon = $application->getIconName(); + $classes[] = 'sprite-apps-large'; + $classes[] = 'app-'.$icon.'-light-large'; + } + + $icon = phutil_render_tag( + 'span', + array( + 'class' => implode(' ', $classes), + 'style' => nonempty(implode('; ', $styles), null), + ), + ''); } - $classes = array(); - $classes[] = 'phabricator-application-launch-icon'; - $styles = array(); - - if ($application->getIconURI()) { - $styles[] = 'background-image: url('.$application->getIconURI().')'; - } else { - $icon = $application->getIconName(); - $classes[] = 'sprite-apps-xlarge'; - $classes[] = 'app-'.$icon.'-dark-xlarge'; - } - - $icon = phutil_render_tag( - 'span', - array( - 'class' => implode(' ', $classes), - 'style' => nonempty(implode('; ', $styles), null), - ), - ''); - return phutil_render_tag( - 'a', + $application ? 'a' : 'div', array( 'class' => 'phabricator-application-launch-container', - 'href' => $application->getBaseURI(), + 'href' => $application ? $application->getBaseURI() : null, ), $icon. $this->renderSingleView($content)); diff --git a/src/applications/phid/application/PhabricatorApplicationPHID.php b/src/applications/phid/application/PhabricatorApplicationPHID.php index ad660195ff..f6f2f1180b 100644 --- a/src/applications/phid/application/PhabricatorApplicationPHID.php +++ b/src/applications/phid/application/PhabricatorApplicationPHID.php @@ -3,7 +3,7 @@ final class PhabricatorApplicationPHID extends PhabricatorApplication { public function getName() { - return 'PHID Manager'; + return 'PHIDs'; } public function getBaseURI() { diff --git a/src/view/layout/AphrontSideNavFilterView.php b/src/view/layout/AphrontSideNavFilterView.php index 136e12626f..4258dd9a4a 100644 --- a/src/view/layout/AphrontSideNavFilterView.php +++ b/src/view/layout/AphrontSideNavFilterView.php @@ -24,6 +24,12 @@ final class AphrontSideNavFilterView extends AphrontView { private $active; private $menu; private $crumbs; + private $classes = array(); + + public function addClass($class) { + $this->classes[] = $class; + return $this; + } public function __construct() { $this->menu = new PhabricatorMenuView(); @@ -230,6 +236,8 @@ final class AphrontSideNavFilterView extends AphrontView { } } + $nav_classes = array_merge($nav_classes, $this->classes); + return phutil_render_tag( 'div', array( diff --git a/webroot/rsrc/css/aphront/phabricator-nav-view.css b/webroot/rsrc/css/aphront/phabricator-nav-view.css index 69ae68bfc5..ea083511d5 100644 --- a/webroot/rsrc/css/aphront/phabricator-nav-view.css +++ b/webroot/rsrc/css/aphront/phabricator-nav-view.css @@ -6,13 +6,21 @@ cursor: col-resize; } +.phabricator-nav { + /* Force top margins in page content not to collapse with the top margin of + the navigation container by giving it padding. Then put it in the right + position by undoing the padding with a margin. */ + padding-top: 1px; + margin-top: -1px; +} + .phabricator-nav-column-background { position: fixed; top: 0; left: 0; bottom: 0; width: 205px; - background: #ececec; + background: #252b2d; box-shadow: inset -3px 0 4px rgba(0, 0, 0, 0.05); background-image: url(/rsrc/image/menu_texture.png); } @@ -66,3 +74,12 @@ .device-desktop .has-local-nav .phabricator-nav-content { margin-left: 205px; } + +.phabricator-side-menu-home .phabricator-nav-column-background, +.phabricator-side-menu-home .phabricator-nav-local { + width: 320px; +} + +.device-desktop .phabricator-side-menu-home .phabricator-nav-content { + margin-left: 320px; +} diff --git a/webroot/rsrc/css/application/base/phabricator-application-launch-view.css b/webroot/rsrc/css/application/base/phabricator-application-launch-view.css index bf55270f3a..278c6f463f 100644 --- a/webroot/rsrc/css/application/base/phabricator-application-launch-view.css +++ b/webroot/rsrc/css/application/base/phabricator-application-launch-view.css @@ -9,16 +9,9 @@ */ -/* On desktops, put some space around the whole grid. */ -.device-desktop .phabricator-application-list { - padding: 0 0 20px 20px; -} -/* On tablets, show two columns in the center. */ -.device-tablet .phabricator-application-list { - width: 660px; - margin: auto; - padding: .5em 0; +.application-tile-group { + overflow: hidden; } @@ -28,31 +21,25 @@ */ -a.phabricator-application-launch-container { - display: inline-block; - width: 220px; - min-height: 90px; - padding: 12px 15px 10px 75px; - margin: 3px 6px; +a.phabricator-application-launch-container, +div.phabricator-application-launch-container { + display: block; + float: left; + width: 78px; + height: 78px; overflow: hidden; position: relative; text-decoration: none; - border: 1px solid #a7a8aa; - background-color: #f3f3f3; - border-radius: 3px; - box-shadow: 0px 1px 2px #ccc; + border: 1px solid #080909; + } a.phabricator-application-launch-container:hover { text-decoration: none; } -a.phabricator-application-launch-container:active { - box-shadow: inset 0 0px 3px rgba(0, 0, 0, 0.9); -} - /* The hover effect looks awful on phones/tablets when scrolling. */ .device-desktop a.phabricator-application-launch-container:hover { background-color: #638ed3; @@ -60,92 +47,34 @@ a.phabricator-application-launch-container:active { color: #fff; } -.phabricator-application-launch-name, -.phabricator-application-launch-description, -.phabricator-application-launch-status { - display: block; -} - .phabricator-application-launch-icon { display: block; position: absolute; - left: 10px; - top: 10px; - width: 56px; - height: 56px; - background-repeat: no-repeat; + left: 25px; + top: 15px; + width: 28px; + height: 28px; } .phabricator-application-launch-name { + display: block; + margin-top: 50px; font-weight: bold; - font-size: 14px; - padding-bottom: 2px -} - -.phabricator-application-launch-description { - color: #888; - font-size: 12px -} - -.device-desktop a.phabricator-application-launch-container:hover - .phabricator-application-launch-description { - color: #dddddd; + font-size: 11px; + text-align: center; + color: #ffffff; + text-shadow: 0px 1px 1px #000000; } .phabricator-application-launch-attention { position: absolute; - left: 45px; - top: 10px; + right: 4px; + top: 4px; background: #ff0000; border-radius: 10px; color: white; - font-weight: normal; - padding: 2px 6px; + font-weight: bold; + padding: 1px 6px 2px; border: 1px solid #aa0000; - box-shadow: 0px 0px 3px rgba(255, 255, 255, 0.5), - inset 0 0 3px #aa0000; -} - -.phabricator-application-status-block { - margin-top: 0.5em; - padding-top: 0.5em; - border-top: 1px solid #dfdfdf; - display: block; -} - -.phabricator-application-flavor-text, -.phabricator-application-status { - float: left; - display: block; - position: relative; - font-size: 11px; - color: #666666; -} - -.phabricator-application-status { - height: 20px; - padding-left: 22px; - - background-repeat: no-repeat; - background-size: 16px auto; - padding-top: 1px; -} - -.device-desktop a.phabricator-application-launch-container:hover - .phabricator-application-status, -.device-desktop a.phabricator-application-launch-container:hover - .phabricator-application-flavor-text { - color: #eeeeee; -} - -.phabricator-application-status-type-needs { - background-image: url(/rsrc/image/appstatus_needs.png); -} - -.phabricator-application-status-type-empty { - background-image: url(/rsrc/image/appstatus_empty.png); -} - -.phabricator-application-status-type-info { - background-image: url(/rsrc/image/appstatus_info.png); + font-size: 12px; } diff --git a/webroot/rsrc/css/application/directory/phabricator-app-buttons.css b/webroot/rsrc/css/application/directory/phabricator-app-buttons.css deleted file mode 100644 index f079e726f1..0000000000 --- a/webroot/rsrc/css/application/directory/phabricator-app-buttons.css +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @provides phabricator-app-buttons-css - */ - -.phabricator-app-buttons { - padding: 2em 3em 0em; -} - -.phabricator-app-button { - display: block; - float: left; - margin-right: 8px; - margin-bottom: 8px; - text-align: center; -} - -.phabricator-app-button .app-button { - display: block; - margin: 0px 10px 4px; - - background: #5e77aa; - cursor: pointer; - - background-color: #e9ecec; - border: 1px solid #999; - border-bottom-color: #888; - - box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.07), - inset 1px 1px 2px rgba(255, 255, 255, 0.80), - inset -1px -1px 3px rgba(0, 0, 0, 0.20); - border-radius: 6px; -} - -.phabricator-app-button .app-button:active { - background-color: #dddddd; - background-image: none; - border-bottom-color: #999; -} - -a.phabricator-button-caption, -a.phabricator-button-caption:link, -a.phabricator-button-caption:active, -a.phabricator-button-caption:hover, -a.phabricator-button-caption:visited { - white-space: nowrap; - overflow: hidden; - text-align: center; - font-size: 11px; - padding: 3px 0; - font-weight: bold; -} - -.phabricator-app-subtitle { - color: #888888; - font-weight: normal; -} - - -.app-icon { - position: relative; - width: 50px; - height: 50px; - margin: 5px; - background: url('/rsrc/image/apps.png') 0 0 no-repeat; -} - -.icon-differential { - background-position: 0 0; -} - -.icon-maniphest { - background-position: 0 -50px; -} - -.icon-create-task { - background-position: 0 -100px; -} - -.icon-upload-file { - background-position: 0 -150px; -} - -.icon-create-paste { - background-position: 0 -200px; -} - -.icon-phriction { - background-position: 0 -250px; -} - -.icon-diffusion { - background-position: 0 -300px; -} - -.icon-audit { - background-position: 0 -350px; -} diff --git a/webroot/rsrc/image/apps.png b/webroot/rsrc/image/apps.png deleted file mode 100644 index 4e0aaa83389a42c1324d896869f6a2924de5cb95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3972 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 diff --git a/webroot/rsrc/image/appstatus_empty.png b/webroot/rsrc/image/appstatus_empty.png deleted file mode 100644 index e1a48b5841d052346485bb9589147a2b63faaff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 774 zcmV+h1Nr=kP)bY=}d@> zSir0Y0w*|D2pwHOsCi-TM)RK-bpNqPidn-I1XG8!3xef6C&v(!4haXOnzJ`7K?I;f zg@Qn%0Lx^ZLU43Z3?Y$uR-Qn#38PNpaDi6P5)jyVf@Z(IL68#u1qf>(t|2%ekw*{_ z1=0`|nJ<>WbZJ7Op`3W+PFh_QLr9z#3DhZ0AwY)&JL@QrUkRn7jh#}5cF0J|3J;=F zK_#`_QuhN%SF%nEXjKSe@l>t!I1Im-lEM+hmas-Sc8&<5K6Y`~3B*gs7A0Zv2}8kj;(Fc`G*BDAXm5IZ=_Z ziXB5M)C`C^(Db?f_KTj*WcUB-ZLo4x;Q7l?vOvZ{U(4Ks0h5jRb;L z0MyScAPRtNYvKrLCCm^Yej&soKDjlU)+A60Fdw8K=!F8qXik$4Epzb>cT}JX6WNDJ zLD<-ojytH)euhwT3ALn8-MGaQ^#UMNnAqeQ(UTL^f*=^qrNX(nfnbuwYvE>ByI?Ge?xt zBNWTj#20gVV*(Y+xwDcs|aRskgm?js=gP6)2GumTg(Fop zEI%6E>+)L?B;9Vn--@x`&_N0xQaqv>Zq2C-TGpsc*aLPR-z}YXIK8$fdO6nS?EVN3_vLh@lcHcD%@jE7O>e5p8X0i Y04oyl0wAhv#Q*>R07*qoM6N<$g7P~z^Z)<= diff --git a/webroot/rsrc/image/appstatus_needs.png b/webroot/rsrc/image/appstatus_needs.png deleted file mode 100644 index cdd5542f910fb2b3482b058ed10f7be8ee1c229d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0xE_u%(u-)z}(r6@qO>1Hr-1@h2yMWZ*cq z5(ry~P{}V-FD$rVkKwgm|XeD;OXm>QnZ;C0%YULROHbe~J9cQo62$s*MdcQQeclmp$Yv~n#YZVnFi^7xa1cX-2BtVelxZ(qcHL&xCKF@|&1(by*R9UDXspHPmHpQ-W zflZ0rca}VX912`u3UaR?k^vaA$=oAI1l&Q$oUy!sq`s`--6H=WmLS4oz;l6Y4|{f0 z_|3HeQYzGZz+Sy=*Eu`7R?S$Q3Tg$Dj#`b8Cg57DQ9-JJK@Ma8{jP;^^5w8x;rgz1 z5#*@n_B{Po4ug;DyO!1(=O86xDpn!)j=B=+q`;YiGN9NvISc}g*+l>l;(XFUWA-cn zkc-0~(D?9b;^}xvW3(z7^C62QrC8nnbJMd9i=WnGjAw|nmzOWb6N-z(l=a|Bn%vRm zNK6DGy_UM6CFgIb^d7SoJDg#*-HvG8SSglSj#NjbHg{J#-F%>vqRKQ$E)|L&z415~)zoLa!VUp)H}U;v3+{$wjg2;X93CQ`2S}EBFfzNs$rOP%k zpzC7EwC_c1{kDSbwn7&hJzZ?QJ)5DeY)?N223k16@f@nT;FweLJm%ER!LuLBxA~1( S$I