diff --git a/src/applications/audit/application/PhabricatorApplicationAudit.php b/src/applications/audit/application/PhabricatorApplicationAudit.php index 87b6b2cfde..ef85b7c0fc 100644 --- a/src/applications/audit/application/PhabricatorApplicationAudit.php +++ b/src/applications/audit/application/PhabricatorApplicationAudit.php @@ -2,10 +2,6 @@ final class PhabricatorApplicationAudit extends PhabricatorApplication { - public function getShortDescription() { - return pht('Audit Code'); - } - public function getBaseURI() { return '/audit/'; } @@ -14,6 +10,10 @@ final class PhabricatorApplicationAudit extends PhabricatorApplication { return 'audit'; } + public function getShortDescription() { + return pht('Browse and Audit Commits'); + } + public function getHelpURI() { return PhabricatorEnv::getDoclink('Audit User Guide'); } diff --git a/src/applications/auth/application/PhabricatorApplicationAuth.php b/src/applications/auth/application/PhabricatorApplicationAuth.php index 0a25817907..3c51aa9bc0 100644 --- a/src/applications/auth/application/PhabricatorApplicationAuth.php +++ b/src/applications/auth/application/PhabricatorApplicationAuth.php @@ -14,6 +14,10 @@ final class PhabricatorApplicationAuth extends PhabricatorApplication { return 'authentication'; } + public function getShortDescription() { + return pht('Configure Login and Registration'); + } + public function getHelpURI() { // NOTE: Although reasonable help exists for this in "Configuring Accounts // and Registration", specifying a help URI here means we get the menu diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php index bed89ed741..91acc55a8f 100644 --- a/src/applications/base/PhabricatorApplication.php +++ b/src/applications/base/PhabricatorApplication.php @@ -155,12 +155,10 @@ abstract class PhabricatorApplication } public function getHelpURI() { - // TODO: When these applications get created, link to their docs: - // - // - Drydock - // - OAuth Server - + return null; + } + public function getOverview() { return null; } diff --git a/src/applications/calendar/application/PhabricatorApplicationCalendar.php b/src/applications/calendar/application/PhabricatorApplicationCalendar.php index 9554557dc5..18c6b12d11 100644 --- a/src/applications/calendar/application/PhabricatorApplicationCalendar.php +++ b/src/applications/calendar/application/PhabricatorApplicationCalendar.php @@ -3,7 +3,7 @@ final class PhabricatorApplicationCalendar extends PhabricatorApplication { public function getShortDescription() { - return pht('Dates and Stuff'); + return pht('Upcoming Events'); } public function getFlavorText() { diff --git a/src/applications/chatlog/applications/PhabricatorApplicationChatLog.php b/src/applications/chatlog/applications/PhabricatorApplicationChatLog.php index 707cf46344..018cae36c0 100644 --- a/src/applications/chatlog/applications/PhabricatorApplicationChatLog.php +++ b/src/applications/chatlog/applications/PhabricatorApplicationChatLog.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationChatLog extends PhabricatorApplication { } public function getShortDescription() { - return pht('Chat Log'); + return pht('IRC Logs'); } public function getIconName() { diff --git a/src/applications/conduit/application/PhabricatorApplicationConduit.php b/src/applications/conduit/application/PhabricatorApplicationConduit.php index 248877bb9b..e50778e30f 100644 --- a/src/applications/conduit/application/PhabricatorApplicationConduit.php +++ b/src/applications/conduit/application/PhabricatorApplicationConduit.php @@ -19,7 +19,7 @@ final class PhabricatorApplicationConduit extends PhabricatorApplication { } public function getShortDescription() { - return 'Conduit API Console'; + return pht('Phabricator Developer API Console'); } public function getTitleGlyph() { diff --git a/src/applications/config/application/PhabricatorApplicationConfig.php b/src/applications/config/application/PhabricatorApplicationConfig.php index d18b81c2df..aa3756c438 100644 --- a/src/applications/config/application/PhabricatorApplicationConfig.php +++ b/src/applications/config/application/PhabricatorApplicationConfig.php @@ -22,6 +22,10 @@ final class PhabricatorApplicationConfig extends PhabricatorApplication { return false; } + public function getShortDescription() { + return pht('Configure Phabricator'); + } + public function getRoutes() { return array( '/config/' => array( diff --git a/src/applications/conpherence/application/PhabricatorApplicationConpherence.php b/src/applications/conpherence/application/PhabricatorApplicationConpherence.php index 7a36283459..d86cb67722 100644 --- a/src/applications/conpherence/application/PhabricatorApplicationConpherence.php +++ b/src/applications/conpherence/application/PhabricatorApplicationConpherence.php @@ -10,7 +10,7 @@ final class PhabricatorApplicationConpherence extends PhabricatorApplication { } public function getShortDescription() { - return pht('Messaging'); + return pht('Send Messages'); } public function getIconName() { diff --git a/src/applications/countdown/application/PhabricatorApplicationCountdown.php b/src/applications/countdown/application/PhabricatorApplicationCountdown.php index ba01b55f57..e50dec7725 100644 --- a/src/applications/countdown/application/PhabricatorApplicationCountdown.php +++ b/src/applications/countdown/application/PhabricatorApplicationCountdown.php @@ -11,7 +11,7 @@ final class PhabricatorApplicationCountdown extends PhabricatorApplication { } public function getShortDescription() { - return pht('Countdown Timers'); + return pht('Countdown to Events'); } public function getTitleGlyph() { diff --git a/src/applications/daemon/application/PhabricatorApplicationDaemons.php b/src/applications/daemon/application/PhabricatorApplicationDaemons.php index f6582ccfee..4ceec3a4cb 100644 --- a/src/applications/daemon/application/PhabricatorApplicationDaemons.php +++ b/src/applications/daemon/application/PhabricatorApplicationDaemons.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationDaemons extends PhabricatorApplication { } public function getShortDescription() { - return pht('Manage Daemons'); + return pht('Manage Phabricator Daemons'); } public function getBaseURI() { diff --git a/src/applications/dashboard/application/PhabricatorApplicationDashboard.php b/src/applications/dashboard/application/PhabricatorApplicationDashboard.php index 4c3f57b5ad..65704afd98 100644 --- a/src/applications/dashboard/application/PhabricatorApplicationDashboard.php +++ b/src/applications/dashboard/application/PhabricatorApplicationDashboard.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationDashboard extends PhabricatorApplication { } public function getShortDescription() { - return pht('Such Data'); + return pht('Create Custom Pages'); } public function getIconName() { diff --git a/src/applications/differential/application/PhabricatorApplicationDifferential.php b/src/applications/differential/application/PhabricatorApplicationDifferential.php index 289a1a4d5e..b2816d6ab9 100644 --- a/src/applications/differential/application/PhabricatorApplicationDifferential.php +++ b/src/applications/differential/application/PhabricatorApplicationDifferential.php @@ -36,6 +36,14 @@ final class PhabricatorApplicationDifferential extends PhabricatorApplication { ); } + public function getOverview() { + return pht(<<[1-9]\d*)' => 'DifferentialRevisionViewController', diff --git a/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php b/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php index e22087af67..15865e5ceb 100644 --- a/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php +++ b/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php @@ -3,7 +3,7 @@ final class PhabricatorApplicationDiffusion extends PhabricatorApplication { public function getShortDescription() { - return pht('Repository Browser'); + return pht('Host and Browse Repositories'); } public function getBaseURI() { diff --git a/src/applications/diviner/application/PhabricatorApplicationDiviner.php b/src/applications/diviner/application/PhabricatorApplicationDiviner.php index 524786fe9d..da2fd4bcb8 100644 --- a/src/applications/diviner/application/PhabricatorApplicationDiviner.php +++ b/src/applications/diviner/application/PhabricatorApplicationDiviner.php @@ -36,7 +36,7 @@ final class PhabricatorApplicationDiviner extends PhabricatorApplication { } public function getApplicationGroup() { - return self::GROUP_COMMUNICATION; + return self::GROUP_UTILITIES; } public function getRemarkupRules() { diff --git a/src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php b/src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php index 24b605c1cc..d1e0281765 100644 --- a/src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php +++ b/src/applications/doorkeeper/application/PhabricatorApplicationDoorkeeper.php @@ -6,14 +6,14 @@ final class PhabricatorApplicationDoorkeeper extends PhabricatorApplication { return false; } - public function getBaseURI() { - return '/doorkeeper/'; - } - public function shouldAppearInLaunchView() { return false; } + public function getShortDescription() { + return pht('Connect to Other Software'); + } + public function getRemarkupRules() { return array( new DoorkeeperRemarkupRuleAsana(), diff --git a/src/applications/drydock/application/PhabricatorApplicationDrydock.php b/src/applications/drydock/application/PhabricatorApplicationDrydock.php index fc2e39c4b4..06bd4d264a 100644 --- a/src/applications/drydock/application/PhabricatorApplicationDrydock.php +++ b/src/applications/drydock/application/PhabricatorApplicationDrydock.php @@ -30,6 +30,10 @@ final class PhabricatorApplicationDrydock extends PhabricatorApplication { return true; } + public function getHelpURI() { + return PhabricatorEnv::getDoclink('Drydock User Guide'); + } + public function getRoutes() { return array( '/drydock/' => array( diff --git a/src/applications/fact/application/PhabricatorApplicationFact.php b/src/applications/fact/application/PhabricatorApplicationFact.php index 0436594b50..3a3439c7bc 100644 --- a/src/applications/fact/application/PhabricatorApplicationFact.php +++ b/src/applications/fact/application/PhabricatorApplicationFact.php @@ -3,7 +3,7 @@ final class PhabricatorApplicationFact extends PhabricatorApplication { public function getShortDescription() { - return 'Analyze Data'; + return pht('Chart and Analyze Data'); } public function getName() { diff --git a/src/applications/feed/application/PhabricatorApplicationFeed.php b/src/applications/feed/application/PhabricatorApplicationFeed.php index 21c8092e3d..b30da72fe5 100644 --- a/src/applications/feed/application/PhabricatorApplicationFeed.php +++ b/src/applications/feed/application/PhabricatorApplicationFeed.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationFeed extends PhabricatorApplication { } public function getShortDescription() { - return pht('Review Activity'); + return pht('Review Recent Activity'); } public function getIconName() { diff --git a/src/applications/flag/application/PhabricatorApplicationFlags.php b/src/applications/flag/application/PhabricatorApplicationFlags.php index b7701340b6..e9bee801d1 100644 --- a/src/applications/flag/application/PhabricatorApplicationFlags.php +++ b/src/applications/flag/application/PhabricatorApplicationFlags.php @@ -3,7 +3,7 @@ final class PhabricatorApplicationFlags extends PhabricatorApplication { public function getShortDescription() { - return pht('Reminders'); + return pht('Personal Bookmarks and Reminders'); } public function getBaseURI() { @@ -25,7 +25,7 @@ final class PhabricatorApplicationFlags extends PhabricatorApplication { } public function getApplicationGroup() { - return self::GROUP_ORGANIZATION; + return self::GROUP_UTILITIES; } public function loadStatus(PhabricatorUser $user) { diff --git a/src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php b/src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php index 4e3c61a64f..699f58077f 100644 --- a/src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php +++ b/src/applications/harbormaster/application/PhabricatorApplicationHarbormaster.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationHarbormaster extends PhabricatorApplication { } public function getShortDescription() { - return pht('Continuous Build'); + return pht('Builds and Continuous Integration'); } public function getIconName() { diff --git a/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php b/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php index 7b9dd4b0b5..999e20b646 100644 --- a/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php +++ b/src/applications/legalpad/application/PhabricatorApplicationLegalpad.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationLegalpad extends PhabricatorApplication { } public function getShortDescription() { - return pht('Legal Documents'); + return pht('Agreements and Signatures'); } public function getIconName() { diff --git a/src/applications/meta/application/PhabricatorApplicationApplications.php b/src/applications/meta/application/PhabricatorApplicationApplications.php index 66c611406c..847e0f2c2b 100644 --- a/src/applications/meta/application/PhabricatorApplicationApplications.php +++ b/src/applications/meta/application/PhabricatorApplicationApplications.php @@ -11,7 +11,7 @@ final class PhabricatorApplicationApplications extends PhabricatorApplication { } public function getShortDescription() { - return 'Installed Applications'; + return pht('Explore More Applications'); } public function getIconName() { @@ -26,7 +26,7 @@ final class PhabricatorApplicationApplications extends PhabricatorApplication { return self::GROUP_ADMIN; } - public function getRoutes() { + public function getRoutes() { return array( '/applications/' => array( '(?:query/(?P[^/]+)/)?' => @@ -38,7 +38,6 @@ final class PhabricatorApplicationApplications extends PhabricatorApplication { '(?P\w+)/(?Pinstall|uninstall)/' => 'PhabricatorApplicationUninstallController', ), - ); } diff --git a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php index b2cc713181..1dacee6761 100644 --- a/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php +++ b/src/applications/meta/controller/PhabricatorApplicationDetailViewController.php @@ -1,10 +1,14 @@ application = $data['application']; } @@ -61,16 +65,37 @@ final class PhabricatorApplicationDetailViewController $viewer = $this->getRequest()->getUser(); - $properties = id(new PHUIPropertyListView()) - ->addProperty(pht('Description'), $application->getShortDescription()); + $properties = id(new PHUIPropertyListView()); $properties->setActionList($actions); + $properties->addProperty( + pht('Description'), + $application->getShortDescription()); + + if ($application->getFlavorText()) { + $properties->addProperty( + null, + phutil_tag('em', array(), $application->getFlavorText())); + } + if ($application->isBeta()) { $properties->addProperty( pht('Release'), pht('Beta')); } + $overview = $application->getOverview(); + if ($overview) { + $properties->addSectionHeader( + pht('Overview'), + PHUIPropertyListView::ICON_SUMMARY); + $properties->addTextContent( + PhabricatorMarkupEngine::renderOneObject( + id(new PhabricatorMarkupOneOff())->setContent($overview), + 'default', + $viewer)); + } + $descriptions = PhabricatorPolicyQuery::renderPolicyDescriptions( $viewer, $application); @@ -94,6 +119,14 @@ final class PhabricatorApplicationDetailViewController ->setUser($user) ->setObjectURI($this->getRequest()->getRequestURI()); + if ($selected->getHelpURI()) { + $view->addAction( + id(new PhabricatorActionView()) + ->setName(pht('Help / Documentation')) + ->setIcon('fa-life-ring') + ->setHref($selected->getHelpURI())); + } + $can_edit = PhabricatorPolicyFilter::hasCapability( $user, $selected, diff --git a/src/applications/meta/controller/PhabricatorApplicationEditController.php b/src/applications/meta/controller/PhabricatorApplicationEditController.php index aa4952205b..5d1ac1e185 100644 --- a/src/applications/meta/controller/PhabricatorApplicationEditController.php +++ b/src/applications/meta/controller/PhabricatorApplicationEditController.php @@ -1,10 +1,14 @@ application = $data['application']; } diff --git a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php index 8445526a04..052ef30222 100644 --- a/src/applications/meta/controller/PhabricatorApplicationUninstallController.php +++ b/src/applications/meta/controller/PhabricatorApplicationUninstallController.php @@ -6,6 +6,10 @@ final class PhabricatorApplicationUninstallController private $application; private $action; + public function shouldRequireAdmin() { + return true; + } + public function willProcessRequest(array $data) { $this->application = $data['application']; $this->action = $data['action']; diff --git a/src/applications/meta/controller/PhabricatorApplicationsController.php b/src/applications/meta/controller/PhabricatorApplicationsController.php index 69f5bd03dd..e5b035bab4 100644 --- a/src/applications/meta/controller/PhabricatorApplicationsController.php +++ b/src/applications/meta/controller/PhabricatorApplicationsController.php @@ -2,10 +2,6 @@ abstract class PhabricatorApplicationsController extends PhabricatorController { - public function shouldRequireAdmin() { - return true; - } - public function buildSideNavView($for_app = false) { $user = $this->getRequest()->getUser(); diff --git a/src/applications/meta/controller/PhabricatorApplicationsListController.php b/src/applications/meta/controller/PhabricatorApplicationsListController.php index 5815f7cff2..9bcb845768 100644 --- a/src/applications/meta/controller/PhabricatorApplicationsListController.php +++ b/src/applications/meta/controller/PhabricatorApplicationsListController.php @@ -5,6 +5,10 @@ final class PhabricatorApplicationsListController private $queryKey; + public function shouldAllowPublic() { + return true; + } + public function willProcessRequest(array $data) { $this->queryKey = idx($data, 'queryKey'); } diff --git a/src/applications/meta/query/PhabricatorAppSearchEngine.php b/src/applications/meta/query/PhabricatorAppSearchEngine.php index a83a84e566..4f26a80859 100644 --- a/src/applications/meta/query/PhabricatorAppSearchEngine.php +++ b/src/applications/meta/query/PhabricatorAppSearchEngine.php @@ -25,6 +25,9 @@ final class PhabricatorAppSearchEngine $saved->setParameter( 'firstParty', $this->readBoolFromRequest($request, 'firstParty')); + $saved->setParameter( + 'launchable', + $this->readBoolFromRequest($request, 'launchable')); return $saved; } @@ -54,6 +57,11 @@ final class PhabricatorAppSearchEngine $query->withFirstParty($first_party); } + $launchable = $saved->getParameter('launchable'); + if ($launchable !== null) { + $query->withLaunchable($launchable); + } + return $query; } @@ -99,6 +107,17 @@ final class PhabricatorAppSearchEngine '' => pht('Show All Applications'), 'true' => pht('Show First-Party Applications'), 'false' => pht('Show Third-Party Applications'), + ))) + ->appendChild( + id(new AphrontFormSelectControl()) + ->setLabel(pht('Launchable')) + ->setName('launchable') + ->setValue($this->getBoolFromQuery($saved, 'launchable')) + ->setOptions( + array( + '' => pht('Show All Applications'), + 'true' => pht('Show Launchable Applications'), + 'false' => pht('Show Non-Launchable Applications'), ))); } @@ -109,6 +128,7 @@ final class PhabricatorAppSearchEngine public function getBuiltinQueryNames() { $names = array( + 'launcher' => pht('Launcher'), 'all' => pht('All Applications'), ); @@ -121,6 +141,10 @@ final class PhabricatorAppSearchEngine $query->setQueryKey($query_key); switch ($query_key) { + case 'launcher': + return $query + ->setParameter('installed', true) + ->setParameter('launchable', true); case 'all': return $query; } @@ -129,33 +153,93 @@ final class PhabricatorAppSearchEngine } protected function renderResultList( - array $applications, + array $all_applications, PhabricatorSavedQuery $query, array $handle) { - assert_instances_of($applications, 'PhabricatorApplication'); + assert_instances_of($all_applications, 'PhabricatorApplication'); - $list = new PHUIObjectItemListView(); + $all_applications = msort($all_applications, 'getName'); - $applications = msort($applications, 'getName'); - - foreach ($applications as $application) { - $item = id(new PHUIObjectItemView()) - ->setHeader($application->getName()) - ->setHref('/applications/view/'.get_class($application).'/') - ->addAttribute($application->getShortDescription()); - - if (!$application->isInstalled()) { - $item->addIcon('delete', pht('Uninstalled')); - } - - if ($application->isBeta()) { - $item->addIcon('lint-warning', pht('Beta')); - } - - $list->addItem($item); + if ($query->getQueryKey() == 'launcher') { + $groups = mgroup($all_applications, 'getApplicationGroup'); + } else { + $groups = array($all_applications); } - return $list; + $group_names = PhabricatorApplication::getApplicationGroups(); + $groups = array_select_keys($groups, array_keys($group_names)) + $groups; + + $results = array(); + foreach ($groups as $group => $applications) { + if (count($groups) > 1) { + $results[] = phutil_tag( + 'h1', + array( + 'class' => 'launcher-header', + ), + idx($group_names, $group, $group)); + } + + $list = new PHUIObjectItemListView(); + $list->addClass('phui-object-item-launcher-list'); + + foreach ($applications as $application) { + $icon = $application->getIconName(); + if (!$icon) { + $icon = 'application'; + } + + // TODO: This sheet doesn't work the same way other sheets do so it + // ends up with the wrong classes if we try to use PHUIIconView. This + // is probably all changing in the redesign anyway. + + $icon_view = javelin_tag( + 'span', + array( + 'class' => 'phui-icon-view '. + 'sprite-apps-large apps-'.$icon.'-dark-large', + 'aural' => false, + ), + ''); + + $description = phutil_tag( + 'div', + array( + 'style' => 'white-space: nowrap; '. + 'overflow: hidden; '. + 'text-overflow: ellipsis;', + ), + $application->getShortDescription()); + + $item = id(new PHUIObjectItemView()) + ->setHeader($application->getName()) + ->setImageIcon($icon_view) + ->addAttribute($description) + ->addAction( + id(new PHUIListItemView()) + ->setName(pht('Help/Options')) + ->setIcon('fa-cog') + ->setHref('/applications/view/'.get_class($application).'/')); + + if ($application->getBaseURI()) { + $item->setHref($application->getBaseURI()); + } + + if (!$application->isInstalled()) { + $item->addIcon('delete', pht('Uninstalled')); + } + + if ($application->isBeta()) { + $item->addIcon('fa-star-half-o grey', pht('Beta')); + } + + $list->addItem($item); + } + + $results[] = $list; + } + + return $results; } } diff --git a/src/applications/meta/query/PhabricatorApplicationQuery.php b/src/applications/meta/query/PhabricatorApplicationQuery.php index ca14d6954a..366a29d422 100644 --- a/src/applications/meta/query/PhabricatorApplicationQuery.php +++ b/src/applications/meta/query/PhabricatorApplicationQuery.php @@ -9,6 +9,7 @@ final class PhabricatorApplicationQuery private $nameContains; private $unlisted; private $classes; + private $launchable; private $phids; const ORDER_APPLICATION = 'order:application'; @@ -41,6 +42,11 @@ final class PhabricatorApplicationQuery return $this; } + public function withLaunchable($launchable) { + $this->launchable = $launchable; + return $this; + } + public function withClasses(array $classes) { $this->classes = $classes; return $this; @@ -117,6 +123,15 @@ final class PhabricatorApplicationQuery } } + if ($this->launchable !== null) { + foreach ($apps as $key => $app) { + if ($app->shouldAppearInLaunchView() != $this->launchable) { + unset($apps[$key]); + } + } + } + + switch ($this->order) { case self::ORDER_NAME: $apps = msort($apps, 'getName'); diff --git a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php index 844eca2ec0..70605eb1a1 100644 --- a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php +++ b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php @@ -2,14 +2,14 @@ final class PhabricatorApplicationMetaMTA extends PhabricatorApplication { - public function getBaseURI() { - return '/mail/'; - } - public function getIconName() { return 'metamta'; } + public function getShortDescription() { + return pht('Delivers Mail'); + } + public function getFlavorText() { return pht('Yo dawg, we heard you like MTAs.'); } diff --git a/src/applications/notification/application/PhabricatorApplicationNotifications.php b/src/applications/notification/application/PhabricatorApplicationNotifications.php index a4925c107d..1de16b76cd 100644 --- a/src/applications/notification/application/PhabricatorApplicationNotifications.php +++ b/src/applications/notification/application/PhabricatorApplicationNotifications.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationNotifications extends PhabricatorApplication { } public function getShortDescription() { - return pht('Beep Beep Bloop'); + return pht('Real-Time Updates and Alerts'); } public function getRoutes() { diff --git a/src/applications/nuance/application/PhabricatorApplicationNuance.php b/src/applications/nuance/application/PhabricatorApplicationNuance.php index ac962b1982..5bf137b814 100644 --- a/src/applications/nuance/application/PhabricatorApplicationNuance.php +++ b/src/applications/nuance/application/PhabricatorApplicationNuance.php @@ -27,6 +27,10 @@ final class PhabricatorApplicationNuance extends PhabricatorApplication { return '/nuance/'; } + public function getShortDescription() { + return pht('High-Volume Task Queues'); + } + public function getRoutes() { return array( '/nuance/' => array( diff --git a/src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php b/src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php index 8510f8c5f6..399367436f 100644 --- a/src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php +++ b/src/applications/oauthserver/application/PhabricatorApplicationOAuthServer.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationOAuthServer extends PhabricatorApplication { } public function getShortDescription() { - return pht('OAuth Provider'); + return pht('OAuth Login Provider'); } public function getIconName() { @@ -23,13 +23,17 @@ final class PhabricatorApplicationOAuthServer extends PhabricatorApplication { } public function getApplicationGroup() { - return self::GROUP_UTILITIES; + return self::GROUP_ADMIN; } public function isBeta() { return true; } + public function getHelpURI() { + return PhabricatorEnv::getDoclink('Using the Phabricator OAuth Server'); + } + public function getRoutes() { return array( '/oauthserver/' => array( diff --git a/src/applications/owners/application/PhabricatorApplicationOwners.php b/src/applications/owners/application/PhabricatorApplicationOwners.php index ed80bf0b45..6412772236 100644 --- a/src/applications/owners/application/PhabricatorApplicationOwners.php +++ b/src/applications/owners/application/PhabricatorApplicationOwners.php @@ -11,7 +11,7 @@ final class PhabricatorApplicationOwners extends PhabricatorApplication { } public function getShortDescription() { - return pht('Group Source Code'); + return pht('Track Ownership of Source Code'); } public function getTitleGlyph() { @@ -27,7 +27,7 @@ final class PhabricatorApplicationOwners extends PhabricatorApplication { } public function getApplicationGroup() { - return self::GROUP_ORGANIZATION; + return self::GROUP_UTILITIES; } public function getRoutes() { diff --git a/src/applications/passphrase/application/PhabricatorApplicationPassphrase.php b/src/applications/passphrase/application/PhabricatorApplicationPassphrase.php index 2632106044..dedeb505b8 100644 --- a/src/applications/passphrase/application/PhabricatorApplicationPassphrase.php +++ b/src/applications/passphrase/application/PhabricatorApplicationPassphrase.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationPassphrase extends PhabricatorApplication { } public function getShortDescription() { - return pht('Credential Management'); + return pht('Store Passwords and Credentials'); } public function getIconName() { diff --git a/src/applications/paste/application/PhabricatorApplicationPaste.php b/src/applications/paste/application/PhabricatorApplicationPaste.php index 0e99441e5d..5ba1f211fc 100644 --- a/src/applications/paste/application/PhabricatorApplicationPaste.php +++ b/src/applications/paste/application/PhabricatorApplicationPaste.php @@ -18,6 +18,10 @@ final class PhabricatorApplicationPaste extends PhabricatorApplication { return self::GROUP_UTILITIES; } + public function getShortDescription() { + return pht('Share Text Snippets'); + } + public function getRemarkupRules() { return array( new PhabricatorPasteRemarkupRule(), diff --git a/src/applications/people/application/PhabricatorApplicationPeople.php b/src/applications/people/application/PhabricatorApplicationPeople.php index 2b89dc4d2c..d387b0f882 100644 --- a/src/applications/people/application/PhabricatorApplicationPeople.php +++ b/src/applications/people/application/PhabricatorApplicationPeople.php @@ -3,7 +3,7 @@ final class PhabricatorApplicationPeople extends PhabricatorApplication { public function getShortDescription() { - return pht('User Accounts'); + return pht('User Accounts and Profiles'); } public function getBaseURI() { diff --git a/src/applications/phlux/application/PhabricatorApplicationPhlux.php b/src/applications/phlux/application/PhabricatorApplicationPhlux.php index 85c1699cb3..c6e42598cc 100644 --- a/src/applications/phlux/application/PhabricatorApplicationPhlux.php +++ b/src/applications/phlux/application/PhabricatorApplicationPhlux.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationPhlux extends PhabricatorApplication { } public function getShortDescription() { - return pht('Configuration Store'); + return pht('Key/Value Configuration Store'); } public function getIconName() { diff --git a/src/applications/pholio/application/PhabricatorApplicationPholio.php b/src/applications/pholio/application/PhabricatorApplicationPholio.php index 96f113cba3..500ee5098b 100644 --- a/src/applications/pholio/application/PhabricatorApplicationPholio.php +++ b/src/applications/pholio/application/PhabricatorApplicationPholio.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationPholio extends PhabricatorApplication { } public function getShortDescription() { - return pht('Design Review'); + return pht('Review Mocks and Design'); } public function getIconName() { diff --git a/src/applications/phortune/application/PhabricatorApplicationPhortune.php b/src/applications/phortune/application/PhabricatorApplicationPhortune.php index fe08ef4487..ab22fbde88 100644 --- a/src/applications/phortune/application/PhabricatorApplicationPhortune.php +++ b/src/applications/phortune/application/PhabricatorApplicationPhortune.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationPhortune extends PhabricatorApplication { } public function getShortDescription() { - return pht('Account and Billing'); + return pht('Accounts and Billing'); } public function getIconName() { diff --git a/src/applications/phrequent/application/PhabricatorApplicationPhrequent.php b/src/applications/phrequent/application/PhabricatorApplicationPhrequent.php index 35f2dd9fd9..4bcccef60d 100644 --- a/src/applications/phrequent/application/PhabricatorApplicationPhrequent.php +++ b/src/applications/phrequent/application/PhabricatorApplicationPhrequent.php @@ -3,7 +3,7 @@ final class PhabricatorApplicationPhrequent extends PhabricatorApplication { public function getShortDescription() { - return pht('Track Time'); + return pht('Track Time Spent'); } public function getBaseURI() { @@ -19,7 +19,7 @@ final class PhabricatorApplicationPhrequent extends PhabricatorApplication { } public function getApplicationGroup() { - return self::GROUP_ORGANIZATION; + return self::GROUP_UTILITIES; } public function getApplicationOrder() { diff --git a/src/applications/ponder/application/PhabricatorApplicationPonder.php b/src/applications/ponder/application/PhabricatorApplicationPonder.php index 220750b558..0821533460 100644 --- a/src/applications/ponder/application/PhabricatorApplicationPonder.php +++ b/src/applications/ponder/application/PhabricatorApplicationPonder.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationPonder extends PhabricatorApplication { } public function getShortDescription() { - return pht('Find Answers'); + return pht('Questions and Answers'); } public function getIconName() { diff --git a/src/applications/project/application/PhabricatorApplicationProject.php b/src/applications/project/application/PhabricatorApplicationProject.php index 22e016c285..60c13fb62e 100644 --- a/src/applications/project/application/PhabricatorApplicationProject.php +++ b/src/applications/project/application/PhabricatorApplicationProject.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationProject extends PhabricatorApplication { } public function getShortDescription() { - return pht('Organize Work'); + return pht('Create Groups, Tags, and Projects'); } public function getBaseURI() { diff --git a/src/applications/releeph/application/PhabricatorApplicationReleeph.php b/src/applications/releeph/application/PhabricatorApplicationReleeph.php index 3876470ff5..79f7a24961 100644 --- a/src/applications/releeph/application/PhabricatorApplicationReleeph.php +++ b/src/applications/releeph/application/PhabricatorApplicationReleeph.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationReleeph extends PhabricatorApplication { } public function getShortDescription() { - return pht('Release Branches'); + return pht('Pull Requests'); } public function getBaseURI() { diff --git a/src/applications/repository/application/PhabricatorApplicationRepositories.php b/src/applications/repository/application/PhabricatorApplicationRepositories.php index 0afce533b4..e2caea3527 100644 --- a/src/applications/repository/application/PhabricatorApplicationRepositories.php +++ b/src/applications/repository/application/PhabricatorApplicationRepositories.php @@ -14,7 +14,7 @@ final class PhabricatorApplicationRepositories extends PhabricatorApplication { } public function getShortDescription() { - return 'Track Repositories'; + return pht('(Deprecated)'); } public function getTitleGlyph() { diff --git a/src/applications/search/application/PhabricatorApplicationSearch.php b/src/applications/search/application/PhabricatorApplicationSearch.php index eb2199947b..c1b73f7446 100644 --- a/src/applications/search/application/PhabricatorApplicationSearch.php +++ b/src/applications/search/application/PhabricatorApplicationSearch.php @@ -11,7 +11,7 @@ final class PhabricatorApplicationSearch extends PhabricatorApplication { } public function getShortDescription() { - return pht('Search & Find'); + return pht('Full-Text Search'); } public function getFlavorText() { diff --git a/src/applications/settings/application/PhabricatorApplicationSettings.php b/src/applications/settings/application/PhabricatorApplicationSettings.php index 65ad9505ad..a4028f6b9a 100644 --- a/src/applications/settings/application/PhabricatorApplicationSettings.php +++ b/src/applications/settings/application/PhabricatorApplicationSettings.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationSettings extends PhabricatorApplication { } public function getShortDescription() { - return 'User Preferences'; + return pht('User Preferences'); } public function getIconName() { @@ -18,6 +18,10 @@ final class PhabricatorApplicationSettings extends PhabricatorApplication { return false; } + public function shouldAppearInLaunchView() { + return false; + } + public function getRoutes() { return array( '/settings/' => array( diff --git a/src/applications/tokens/application/PhabricatorApplicationTokens.php b/src/applications/tokens/application/PhabricatorApplicationTokens.php index 39d665e7b4..dd1a77d2d0 100644 --- a/src/applications/tokens/application/PhabricatorApplicationTokens.php +++ b/src/applications/tokens/application/PhabricatorApplicationTokens.php @@ -19,7 +19,7 @@ final class PhabricatorApplicationTokens extends PhabricatorApplication { } public function getShortDescription() { - return pht('Acquire Trinkets'); + return pht('Award and Acquire Trinkets'); } public function getApplicationGroup() { diff --git a/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php b/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php index e74c1138ad..e7774432a2 100644 --- a/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php +++ b/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php @@ -7,7 +7,7 @@ final class PhabricatorApplicationUIExamples extends PhabricatorApplication { } public function getShortDescription() { - return 'Developer UI Examples'; + return pht('Phabricator Developer UI Examples'); } public function getIconName() { diff --git a/src/view/phui/PHUIObjectItemView.php b/src/view/phui/PHUIObjectItemView.php index f888207454..80592fe5f9 100644 --- a/src/view/phui/PHUIObjectItemView.php +++ b/src/view/phui/PHUIObjectItemView.php @@ -21,6 +21,7 @@ final class PHUIObjectItemView extends AphrontTagView { private $imageURI; private $state; private $fontIcon; + private $imageIcon; const AGE_FRESH = 'fresh'; const AGE_STALE = 'stale'; @@ -115,6 +116,15 @@ final class PHUIObjectItemView extends AphrontTagView { return $this->imageURI; } + public function setImageIcon($image_icon) { + $this->imageIcon = $image_icon; + return $this; + } + + public function getImageIcon() { + return $this->imageIcon; + } + public function setState($state) { $this->state = $state; switch ($state) { @@ -288,6 +298,10 @@ final class PHUIObjectItemView extends AphrontTagView { $item_classes[] = 'phui-object-item-with-image'; } + if ($this->getImageIcon()) { + $item_classes[] = 'phui-object-item-with-image-icon'; + } + if ($this->fontIcon) { $item_classes[] = 'phui-object-item-with-ficon'; } @@ -520,6 +534,22 @@ final class PHUIObjectItemView extends AphrontTagView { 'style' => 'background-image: url('.$this->getImageURI().')', ), ''); + } else if ($this->getImageIcon()) { + $image = phutil_tag( + 'div', + array( + 'class' => 'phui-object-item-image-icon', + ), + $this->getImageIcon()); + } + + if ($image && $this->href) { + $image = phutil_tag( + 'a', + array( + 'href' => $this->href, + ), + $image); } $ficon = null; 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 e4055541e6..d9787f2c51 100644 --- a/webroot/rsrc/css/phui/phui-object-item-list-view.css +++ b/webroot/rsrc/css/phui/phui-object-item-list-view.css @@ -671,3 +671,54 @@ border: none; border-bottom: 1px solid {$thinblueborder}; } + + +/* - Launcher List ---------------------------------------------------------- */ + +.launcher-header { + margin: 8px 16px -4px; + clear: both; + color: {$darkbluetext}; +} + +.launcher-header:nth-of-type(1) { + margin-top: 24px; +} + +.phui-object-item-launcher-list { + overflow: hidden; +} + +.device-desktop .phui-object-item-launcher-list .phui-object-item { + width: 32.333%; + float: left; + margin-right: 1%; + box-sizing: border-box; +} + +.phui-object-item-image-icon { + background: none; +} + +.phui-object-item-image-icon { + width: 30px; + height: 30px; + margin: 4px 4px 4px 4px; + position: absolute; +} + +.phui-object-item-image-icon .phui-icon-view { + position: absolute; + width: 28px; + height: 28px; + left: 6px; + top: 6px; +} + +.phui-object-item-with-image-icon .phui-object-item-frame { + min-height: 48px; +} + +.phui-object-item-with-image-icon .phui-object-item-content-box { + margin-left: 44px; +}