diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php index d6787317ae..9de5e73a9d 100644 --- a/src/__celerity_resource_map__.php +++ b/src/__celerity_resource_map__.php @@ -2298,7 +2298,7 @@ celerity_register_resource_map(array( ), 'phabricator-application-launch-view-css' => array( - 'uri' => '/res/effb87ee/rsrc/css/application/base/phabricator-application-launch-view.css', + 'uri' => '/res/51aa93f4/rsrc/css/application/base/phabricator-application-launch-view.css', 'type' => 'css', 'requires' => array( diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php index caaf4ac053..1c5f23eef2 100644 --- a/src/applications/base/PhabricatorApplication.php +++ b/src/applications/base/PhabricatorApplication.php @@ -108,11 +108,33 @@ abstract class PhabricatorApplication { /* -( UI Integration )----------------------------------------------------- */ + /** + * Render status elements (like "3 Waiting Reviews") for application list + * views. These provide a way to alert users to new or pending action items + * in applications. + * + * @param PhabricatorUser Viewing user. + * @return list Application status elements. + * @task ui + */ public function loadStatus(PhabricatorUser $user) { return array(); } + /** + * You can provide an optional piece of flavor text for the application. This + * is currently rendered in application launch views if the application has no + * status elements. + * + * @return string|null Flavor text. + * @task ui + */ + public function getFlavorText() { + return null; + } + + /** * Build items for the main menu. * @@ -120,7 +142,7 @@ abstract class PhabricatorApplication { * @param AphrontController The current controller. May be null for special * pages like 404, exception handlers, etc. * @return list List of menu items. - * @task UI + * @task ui */ public function buildMainMenuItems( PhabricatorUser $user, diff --git a/src/applications/countdown/application/PhabricatorApplicationCountdown.php b/src/applications/countdown/application/PhabricatorApplicationCountdown.php index 0602328d8a..255a02e206 100644 --- a/src/applications/countdown/application/PhabricatorApplicationCountdown.php +++ b/src/applications/countdown/application/PhabricatorApplicationCountdown.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationCountdown extends PhabricatorApplication { return "\xE2\x9A\xB2"; } + public function getFlavorText() { + return pht('Utilize the full capabilities of your ALU.'); + } + public function getRoutes() { return array( '/countdown/' => array( diff --git a/src/applications/files/application/PhabricatorApplicationFiles.php b/src/applications/files/application/PhabricatorApplicationFiles.php index f0b8e2e47d..7ab3ae6a5b 100644 --- a/src/applications/files/application/PhabricatorApplicationFiles.php +++ b/src/applications/files/application/PhabricatorApplicationFiles.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationFiles extends PhabricatorApplication { return "\xE2\x87\xAA"; } + public function getFlavorText() { + return pht('Blob store for Pokemon pictures.'); + } + public function getRoutes() { return array( '/F(?P\d+)' => 'PhabricatorFileShortcutController', diff --git a/src/applications/herald/application/PhabricatorApplicationHerald.php b/src/applications/herald/application/PhabricatorApplicationHerald.php index 8b775796d3..943ae9ca07 100644 --- a/src/applications/herald/application/PhabricatorApplicationHerald.php +++ b/src/applications/herald/application/PhabricatorApplicationHerald.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationHerald extends PhabricatorApplication { return PhabricatorEnv::getDoclink('article/Herald_User_Guide.html'); } + public function getFlavorText() { + return pht('Watch for danger!'); + } + public function getRoutes() { return array( '/herald/' => array( diff --git a/src/applications/meta/view/PhabricatorApplicationLaunchView.php b/src/applications/meta/view/PhabricatorApplicationLaunchView.php index fbbd7ce8e0..e1ba27caec 100644 --- a/src/applications/meta/view/PhabricatorApplicationLaunchView.php +++ b/src/applications/meta/view/PhabricatorApplicationLaunchView.php @@ -58,15 +58,27 @@ final class PhabricatorApplicationLaunchView extends AphrontView { $count = 0; + $content[] = ''; + if ($this->status) { - $content[] = ''; foreach ($this->status as $status) { $count += $status->getCount(); $content[] = $status; } - $content[] = ''; + } 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) { $content[] = phutil_render_tag( 'span', @@ -76,7 +88,6 @@ final class PhabricatorApplicationLaunchView extends AphrontView { phutil_escape_html($count)); } - $classes = array(); $classes[] = 'phabricator-application-launch-icon'; $styles = array(); diff --git a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php index 632d515ed4..f45640144c 100644 --- a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php +++ b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php @@ -30,6 +30,10 @@ final class PhabricatorApplicationMetaMTA extends PhabricatorApplication { return 'mail'; } + public function getFlavorText() { + return pht('Yo dawg, we heard you like MTAs.'); + } + public function getRoutes() { return array( $this->getBaseURI() => array( diff --git a/src/applications/owners/application/PhabricatorApplicationOwners.php b/src/applications/owners/application/PhabricatorApplicationOwners.php index a3fbe3b848..5659c862a1 100644 --- a/src/applications/owners/application/PhabricatorApplicationOwners.php +++ b/src/applications/owners/application/PhabricatorApplicationOwners.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationOwners extends PhabricatorApplication { return PhabricatorEnv::getDoclink('article/Owners_Tool_User_Guide.html'); } + public function getFlavorText() { + return pht('Adopt today!'); + } + public function getRoutes() { return array( '/owners/' => array( diff --git a/src/applications/people/application/PhabricatorApplicationPeople.php b/src/applications/people/application/PhabricatorApplicationPeople.php index 886e61a327..40eda3ec28 100644 --- a/src/applications/people/application/PhabricatorApplicationPeople.php +++ b/src/applications/people/application/PhabricatorApplicationPeople.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationPeople extends PhabricatorApplication { return 'people'; } + public function getFlavorText() { + return pht('Sort of a social utility.'); + } + public function getRoutes() { return array( '/people/' => array( diff --git a/src/applications/project/application/PhabricatorApplicationProject.php b/src/applications/project/application/PhabricatorApplicationProject.php index b3b2b91fc5..bba25821d6 100644 --- a/src/applications/project/application/PhabricatorApplicationProject.php +++ b/src/applications/project/application/PhabricatorApplicationProject.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationProject extends PhabricatorApplication { return 'projects'; } + public function getFlavorText() { + return pht('Group stuff into big piles.'); + } + public function getRoutes() { return array( '/project/' => array( diff --git a/src/applications/slowvote/application/PhabricatorApplicationSlowvote.php b/src/applications/slowvote/application/PhabricatorApplicationSlowvote.php index 78f32958ab..7d55e82a69 100644 --- a/src/applications/slowvote/application/PhabricatorApplicationSlowvote.php +++ b/src/applications/slowvote/application/PhabricatorApplicationSlowvote.php @@ -38,6 +38,9 @@ final class PhabricatorApplicationSlowvote extends PhabricatorApplication { return PhabricatorEnv::getDoclink('article/Slowvote_User_Guide.html'); } + public function getFlavorText() { + return pht('Design by committee.'); + } public function getRoutes() { return array( diff --git a/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php b/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php index c9547169f1..7b89a89047 100644 --- a/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php +++ b/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationUIExamples extends PhabricatorApplication { return "\xE2\x8F\x9A"; } + public function getFlavorText() { + return pht('A gallery of modern art.'); + } + public function getRoutes() { return array( '/uiexample/' => array( 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 4f60f42ebc..69d576835d 100644 --- a/webroot/rsrc/css/application/base/phabricator-application-launch-view.css +++ b/webroot/rsrc/css/application/base/phabricator-application-launch-view.css @@ -30,9 +30,9 @@ a.phabricator-application-launch-container { display: inline-block; - width: 210px; + width: 200px; min-height: 90px; - padding: 5px 15px 5px 80px; + padding: 5px 15px 5px 90px; margin: 3px 6px; overflow: hidden; position: relative; @@ -107,14 +107,18 @@ a.phabricator-application-launch-container:hover { 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; - color: #666666; background-repeat: no-repeat; background-size: 16px auto;