From 78784aa1fe86aeca4f9d062c9a36bac7e276e439 Mon Sep 17 00:00:00 2001 From: epriestley Date: Wed, 3 Oct 2012 15:46:19 -0700 Subject: [PATCH] Group applications into groups on /applications/ Summary: So they're maybe a little easier to deal with? I'm going to take this formally to "plz @chad plz help" land. Test Plan: {F20329} Reviewers: btrahan, vrana, chad Reviewed By: vrana CC: aran Differential Revision: https://secure.phabricator.com/D3609 --- .../PhabricatorApplicationAudit.php | 6 ++- .../base/PhabricatorApplication.php | 28 ++++++++++- .../PhabricatorApplicationConduit.php | 8 ++++ .../PhabricatorApplicationCountdown.php | 4 ++ .../PhabricatorApplicationDaemons.php | 4 ++ .../PhabricatorApplicationDifferential.php | 6 ++- .../PhabricatorApplicationDiffusion.php | 6 ++- .../PhabricatorApplicationDiviner.php | 4 ++ .../PhabricatorApplicationFact.php | 4 ++ .../PhabricatorApplicationFiles.php | 4 ++ .../PhabricatorApplicationFlags.php | 4 ++ .../PhabricatorApplicationHerald.php | 4 ++ .../PhabricatorApplicationMacro.php | 4 ++ .../PhabricatorApplicationMailingLists.php | 4 ++ .../PhabricatorApplicationManiphest.php | 6 ++- .../PhabricatorApplicationsListController.php | 47 ++++++++++++------- .../PhabricatorApplicationMetaMTA.php | 4 ++ .../PhabricatorApplicationOwners.php | 4 ++ .../PhabricatorApplicationPaste.php | 4 ++ .../PhabricatorApplicationPeople.php | 4 ++ .../PhabricatorApplicationPhame.php | 4 ++ .../PhabricatorApplicationPHID.php | 4 ++ .../PhabricatorApplicationPhriction.php | 6 ++- .../PhabricatorApplicationPonder.php | 4 ++ .../PhabricatorApplicationProject.php | 4 ++ .../PhabricatorApplicationRepositories.php | 4 ++ .../PhabricatorApplicationSettings.php | 4 ++ .../PhabricatorApplicationSlowvote.php | 4 ++ .../PhabricatorApplicationUIExamples.php | 8 ++++ .../PhabricatorApplicationPHPAST.php | 4 ++ src/view/layout/AphrontSideNavView.php | 9 +++- 31 files changed, 187 insertions(+), 27 deletions(-) diff --git a/src/applications/audit/application/PhabricatorApplicationAudit.php b/src/applications/audit/application/PhabricatorApplicationAudit.php index ee3502f87a..a229f0d990 100644 --- a/src/applications/audit/application/PhabricatorApplicationAudit.php +++ b/src/applications/audit/application/PhabricatorApplicationAudit.php @@ -42,7 +42,11 @@ final class PhabricatorApplicationAudit extends PhabricatorApplication { ); } - public function getCoreApplicationOrder() { + public function getApplicationGroup() { + return self::GROUP_CORE; + } + + public function getApplicationOrder() { return 0.130; } diff --git a/src/applications/base/PhabricatorApplication.php b/src/applications/base/PhabricatorApplication.php index 1c5f23eef2..657739ef54 100644 --- a/src/applications/base/PhabricatorApplication.php +++ b/src/applications/base/PhabricatorApplication.php @@ -26,6 +26,26 @@ */ abstract class PhabricatorApplication { + const GROUP_CORE = 'core'; + const GROUP_COMMUNICATION = 'communication'; + const GROUP_ORGANIZATION = 'organization'; + const GROUP_UTILITIES = 'util'; + const GROUP_ADMIN = 'admin'; + const GROUP_DEVELOPER = 'developer'; + const GROUP_MISC = 'misc'; + + public static function getApplicationGroups() { + return array( + self::GROUP_CORE => pht('Core Applications'), + self::GROUP_COMMUNICATION => pht('Communication'), + self::GROUP_ORGANIZATION => pht('Organization'), + self::GROUP_UTILITIES => pht('Utilities'), + self::GROUP_ADMIN => pht('Administration'), + self::GROUP_DEVELOPER => pht('Developer Tools'), + self::GROUP_MISC => pht('Miscellaneous Applications'), + ); + } + /* -( Application Information )-------------------------------------------- */ @@ -66,8 +86,12 @@ abstract class PhabricatorApplication { return true; } - public function getCoreApplicationOrder() { - return null; + public function getApplicationOrder() { + return PHP_INT_MAX; + } + + public function getApplicationGroup() { + return self::GROUP_MISC; } public function getTitleGlyph() { diff --git a/src/applications/conduit/application/PhabricatorApplicationConduit.php b/src/applications/conduit/application/PhabricatorApplicationConduit.php index e89f25cdd2..3c393fdcd2 100644 --- a/src/applications/conduit/application/PhabricatorApplicationConduit.php +++ b/src/applications/conduit/application/PhabricatorApplicationConduit.php @@ -39,6 +39,14 @@ final class PhabricatorApplicationConduit extends PhabricatorApplication { return "\xE2\x87\xB5"; } + public function getApplicationGroup() { + return self::GROUP_DEVELOPER; + } + + public function getApplicationOrder() { + return 0.100; + } + public function getRoutes() { return array( '/conduit/' => array( diff --git a/src/applications/countdown/application/PhabricatorApplicationCountdown.php b/src/applications/countdown/application/PhabricatorApplicationCountdown.php index 255a02e206..f7e9868086 100644 --- a/src/applications/countdown/application/PhabricatorApplicationCountdown.php +++ b/src/applications/countdown/application/PhabricatorApplicationCountdown.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationCountdown extends PhabricatorApplication { return pht('Utilize the full capabilities of your ALU.'); } + public function getApplicationGroup() { + return self::GROUP_UTILITIES; + } + public function getRoutes() { return array( '/countdown/' => array( diff --git a/src/applications/daemon/application/PhabricatorApplicationDaemons.php b/src/applications/daemon/application/PhabricatorApplicationDaemons.php index c2209a4ab9..841afe1463 100644 --- a/src/applications/daemon/application/PhabricatorApplicationDaemons.php +++ b/src/applications/daemon/application/PhabricatorApplicationDaemons.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationDaemons extends PhabricatorApplication { return 'daemons'; } + public function getApplicationGroup() { + return self::GROUP_ADMIN; + } + public function getRoutes() { return array( '/daemon/' => array( diff --git a/src/applications/differential/application/PhabricatorApplicationDifferential.php b/src/applications/differential/application/PhabricatorApplicationDifferential.php index 79c6b98a15..b327153aa8 100644 --- a/src/applications/differential/application/PhabricatorApplicationDifferential.php +++ b/src/applications/differential/application/PhabricatorApplicationDifferential.php @@ -66,7 +66,11 @@ final class PhabricatorApplicationDifferential extends PhabricatorApplication { ); } - public function getCoreApplicationOrder() { + public function getApplicationGroup() { + return self::GROUP_CORE; + } + + public function getApplicationOrder() { return 0.100; } diff --git a/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php b/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php index 0051166bfe..d5ae8c24ee 100644 --- a/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php +++ b/src/applications/diffusion/application/PhabricatorApplicationDiffusion.php @@ -82,7 +82,11 @@ final class PhabricatorApplicationDiffusion extends PhabricatorApplication { ); } - public function getCoreApplicationOrder() { + public function getApplicationGroup() { + return self::GROUP_CORE; + } + + public function getApplicationOrder() { return 0.120; } diff --git a/src/applications/diviner/application/PhabricatorApplicationDiviner.php b/src/applications/diviner/application/PhabricatorApplicationDiviner.php index a8c786cc1b..a15ad514a5 100644 --- a/src/applications/diviner/application/PhabricatorApplicationDiviner.php +++ b/src/applications/diviner/application/PhabricatorApplicationDiviner.php @@ -40,6 +40,10 @@ final class PhabricatorApplicationDiviner extends PhabricatorApplication { ); } + public function getApplicationGroup() { + return self::GROUP_COMMUNICATION; + } + public function buildMainMenuItems( PhabricatorUser $user, PhabricatorController $controller = null) { diff --git a/src/applications/fact/application/PhabricatorApplicationFact.php b/src/applications/fact/application/PhabricatorApplicationFact.php index d39c2580a3..4f2fb42ea8 100644 --- a/src/applications/fact/application/PhabricatorApplicationFact.php +++ b/src/applications/fact/application/PhabricatorApplicationFact.php @@ -30,6 +30,10 @@ final class PhabricatorApplicationFact extends PhabricatorApplication { return 'fact'; } + public function getApplicationGroup() { + return self::GROUP_UTILITIES; + } + public function getRoutes() { return array( '/fact/' => array( diff --git a/src/applications/files/application/PhabricatorApplicationFiles.php b/src/applications/files/application/PhabricatorApplicationFiles.php index 7ab3ae6a5b..77e3fdbffc 100644 --- a/src/applications/files/application/PhabricatorApplicationFiles.php +++ b/src/applications/files/application/PhabricatorApplicationFiles.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationFiles extends PhabricatorApplication { return pht('Blob store for Pokemon pictures.'); } + public function getApplicationGroup() { + return self::GROUP_UTILITIES; + } + public function getRoutes() { return array( '/F(?P\d+)' => 'PhabricatorFileShortcutController', diff --git a/src/applications/flag/application/PhabricatorApplicationFlags.php b/src/applications/flag/application/PhabricatorApplicationFlags.php index e6721ec522..63471a62f9 100644 --- a/src/applications/flag/application/PhabricatorApplicationFlags.php +++ b/src/applications/flag/application/PhabricatorApplicationFlags.php @@ -36,6 +36,10 @@ final class PhabricatorApplicationFlags extends PhabricatorApplication { ); } + public function getApplicationGroup() { + return self::GROUP_ORGANIZATION; + } + public function loadStatus(PhabricatorUser $user) { $status = array(); diff --git a/src/applications/herald/application/PhabricatorApplicationHerald.php b/src/applications/herald/application/PhabricatorApplicationHerald.php index 943ae9ca07..41dea836fc 100644 --- a/src/applications/herald/application/PhabricatorApplicationHerald.php +++ b/src/applications/herald/application/PhabricatorApplicationHerald.php @@ -42,6 +42,10 @@ final class PhabricatorApplicationHerald extends PhabricatorApplication { return pht('Watch for danger!'); } + public function getApplicationGroup() { + return self::GROUP_ORGANIZATION; + } + public function getRoutes() { return array( '/herald/' => array( diff --git a/src/applications/macro/application/PhabricatorApplicationMacro.php b/src/applications/macro/application/PhabricatorApplicationMacro.php index 74f7506a34..343ac047db 100644 --- a/src/applications/macro/application/PhabricatorApplicationMacro.php +++ b/src/applications/macro/application/PhabricatorApplicationMacro.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationMacro extends PhabricatorApplication { return "\xE2\x9A\x98"; } + public function getApplicationGroup() { + return self::GROUP_UTILITIES; + } + public function getRoutes() { return array( '/macro/' => array( diff --git a/src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php b/src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php index 17dda9563e..129e5fdeaf 100644 --- a/src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php +++ b/src/applications/mailinglists/application/PhabricatorApplicationMailingLists.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationMailingLists extends PhabricatorApplication { return 'mail'; } + public function getApplicationGroup() { + return self::GROUP_ADMIN; + } + public function getRoutes() { return array( '/mailinglists/' => array( diff --git a/src/applications/maniphest/application/PhabricatorApplicationManiphest.php b/src/applications/maniphest/application/PhabricatorApplicationManiphest.php index 983125340a..c225044ce2 100644 --- a/src/applications/maniphest/application/PhabricatorApplicationManiphest.php +++ b/src/applications/maniphest/application/PhabricatorApplicationManiphest.php @@ -34,7 +34,11 @@ final class PhabricatorApplicationManiphest extends PhabricatorApplication { return 'maniphest'; } - public function getCoreApplicationOrder() { + public function getApplicationGroup() { + return self::GROUP_CORE; + } + + public function getApplicationOrder() { return 0.110; } diff --git a/src/applications/meta/controller/PhabricatorApplicationsListController.php b/src/applications/meta/controller/PhabricatorApplicationsListController.php index 2e1dbb6ff1..01fdd88142 100644 --- a/src/applications/meta/controller/PhabricatorApplicationsListController.php +++ b/src/applications/meta/controller/PhabricatorApplicationsListController.php @@ -24,7 +24,6 @@ final class PhabricatorApplicationsListController $user = $request->getUser(); $applications = PhabricatorApplication::getAllInstalledApplications(); - $applications = msort($applications, 'getName'); foreach ($applications as $key => $application) { if (!$application->shouldAppearInLaunchView()) { @@ -32,25 +31,37 @@ final class PhabricatorApplicationsListController } } - $status = array(); - foreach ($applications as $key => $application) { - $status[$key] = $application->loadStatus($user); - } + $groups = PhabricatorApplication::getApplicationGroups(); - $views = array(); - foreach ($applications as $key => $application) { - $views[] = id(new PhabricatorApplicationLaunchView()) - ->setApplication($application) - ->setApplicationStatus(idx($status, $key, array())) - ->setUser($user); - } + $applications = msort($applications, 'getApplicationOrder'); + $applications = mgroup($applications, 'getApplicationGroup'); + $applications = array_select_keys($applications, array_keys($groups)); - $view = phutil_render_tag( - 'div', - array( - 'class' => 'phabricator-application-list', - ), - id(new AphrontNullView())->appendChild($views)->render()); + $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, diff --git a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php index f45640144c..130a5f89ef 100644 --- a/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php +++ b/src/applications/metamta/application/PhabricatorApplicationMetaMTA.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationMetaMTA extends PhabricatorApplication { return pht('Yo dawg, we heard you like MTAs.'); } + public function getApplicationGroup() { + return self::GROUP_ADMIN; + } + 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 5659c862a1..bf4a40ce70 100644 --- a/src/applications/owners/application/PhabricatorApplicationOwners.php +++ b/src/applications/owners/application/PhabricatorApplicationOwners.php @@ -42,6 +42,10 @@ final class PhabricatorApplicationOwners extends PhabricatorApplication { return pht('Adopt today!'); } + public function getApplicationGroup() { + return self::GROUP_ORGANIZATION; + } + public function getRoutes() { return array( '/owners/' => array( diff --git a/src/applications/paste/application/PhabricatorApplicationPaste.php b/src/applications/paste/application/PhabricatorApplicationPaste.php index 0ca94dd5c4..655d78608d 100644 --- a/src/applications/paste/application/PhabricatorApplicationPaste.php +++ b/src/applications/paste/application/PhabricatorApplicationPaste.php @@ -30,6 +30,10 @@ final class PhabricatorApplicationPaste extends PhabricatorApplication { return "\xE2\x9C\x8E"; } + public function getApplicationGroup() { + return self::GROUP_UTILITIES; + } + public function getRoutes() { return array( '/P(?P\d+)' => 'PhabricatorPasteViewController', diff --git a/src/applications/people/application/PhabricatorApplicationPeople.php b/src/applications/people/application/PhabricatorApplicationPeople.php index 40eda3ec28..91facadc36 100644 --- a/src/applications/people/application/PhabricatorApplicationPeople.php +++ b/src/applications/people/application/PhabricatorApplicationPeople.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationPeople extends PhabricatorApplication { return pht('Sort of a social utility.'); } + public function getApplicationGroup() { + return self::GROUP_ADMIN; + } + public function getRoutes() { return array( '/people/' => array( diff --git a/src/applications/phame/application/PhabricatorApplicationPhame.php b/src/applications/phame/application/PhabricatorApplicationPhame.php index e05e951487..5038c1cd9f 100644 --- a/src/applications/phame/application/PhabricatorApplicationPhame.php +++ b/src/applications/phame/application/PhabricatorApplicationPhame.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationPhame extends PhabricatorApplication { return PhabricatorEnv::getDoclink('article/Phame_User_Guide.html'); } + public function getApplicationGroup() { + return self::GROUP_COMMUNICATION; + } + public function getRoutes() { return array( '/phame/' => array( diff --git a/src/applications/phid/application/PhabricatorApplicationPHID.php b/src/applications/phid/application/PhabricatorApplicationPHID.php index 8c41c701da..5da3a8dd5a 100644 --- a/src/applications/phid/application/PhabricatorApplicationPHID.php +++ b/src/applications/phid/application/PhabricatorApplicationPHID.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationPHID extends PhabricatorApplication { return "#"; } + public function getApplicationGroup() { + return self::GROUP_DEVELOPER; + } + public function getRoutes() { return array( '/phid/' => array( diff --git a/src/applications/phriction/application/PhabricatorApplicationPhriction.php b/src/applications/phriction/application/PhabricatorApplicationPhriction.php index 2a9b42380d..7bfe8febdc 100644 --- a/src/applications/phriction/application/PhabricatorApplicationPhriction.php +++ b/src/applications/phriction/application/PhabricatorApplicationPhriction.php @@ -57,7 +57,11 @@ final class PhabricatorApplicationPhriction extends PhabricatorApplication { ); } - public function getCoreApplicationOrder() { + public function getApplicationGroup() { + return self::GROUP_COMMUNICATION; + } + + public function getApplicationOrder() { return 0.140; } diff --git a/src/applications/ponder/application/PhabricatorApplicationPonder.php b/src/applications/ponder/application/PhabricatorApplicationPonder.php index d04d2748be..16e64059ac 100644 --- a/src/applications/ponder/application/PhabricatorApplicationPonder.php +++ b/src/applications/ponder/application/PhabricatorApplicationPonder.php @@ -43,6 +43,10 @@ final class PhabricatorApplicationPonder extends PhabricatorApplication { return $status; } + public function getApplicationGroup() { + return self::GROUP_COMMUNICATION; + } + public function getroutes() { return array( '/Q(?P\d+)' => 'PonderQuestionViewController', diff --git a/src/applications/project/application/PhabricatorApplicationProject.php b/src/applications/project/application/PhabricatorApplicationProject.php index bba25821d6..49594817d0 100644 --- a/src/applications/project/application/PhabricatorApplicationProject.php +++ b/src/applications/project/application/PhabricatorApplicationProject.php @@ -38,6 +38,10 @@ final class PhabricatorApplicationProject extends PhabricatorApplication { return pht('Group stuff into big piles.'); } + public function getApplicationGroup() { + return self::GROUP_ORGANIZATION; + } + public function getRoutes() { return array( '/project/' => array( diff --git a/src/applications/repository/application/PhabricatorApplicationRepositories.php b/src/applications/repository/application/PhabricatorApplicationRepositories.php index 8d8b2fecfa..c55760e542 100644 --- a/src/applications/repository/application/PhabricatorApplicationRepositories.php +++ b/src/applications/repository/application/PhabricatorApplicationRepositories.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationRepositories extends PhabricatorApplication { return "rX"; } + public function getApplicationGroup() { + return self::GROUP_ADMIN; + } + public function getRoutes() { return array( '/repository/' => array( diff --git a/src/applications/settings/application/PhabricatorApplicationSettings.php b/src/applications/settings/application/PhabricatorApplicationSettings.php index 22dc2a2f0a..275845e6d9 100644 --- a/src/applications/settings/application/PhabricatorApplicationSettings.php +++ b/src/applications/settings/application/PhabricatorApplicationSettings.php @@ -39,6 +39,10 @@ final class PhabricatorApplicationSettings extends PhabricatorApplication { ); } + public function getApplicationGroup() { + return self::GROUP_UTILITIES; + } + public function buildMainMenuItems( PhabricatorUser $user, PhabricatorController $controller = null) { diff --git a/src/applications/slowvote/application/PhabricatorApplicationSlowvote.php b/src/applications/slowvote/application/PhabricatorApplicationSlowvote.php index 7d55e82a69..7424b156af 100644 --- a/src/applications/slowvote/application/PhabricatorApplicationSlowvote.php +++ b/src/applications/slowvote/application/PhabricatorApplicationSlowvote.php @@ -42,6 +42,10 @@ final class PhabricatorApplicationSlowvote extends PhabricatorApplication { return pht('Design by committee.'); } + public function getApplicationGroup() { + return self::GROUP_UTILITIES; + } + public function getRoutes() { return array( '/V(?P\d+)' => 'PhabricatorSlowvotePollController', diff --git a/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php b/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php index 7b89a89047..a0c899f4a0 100644 --- a/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php +++ b/src/applications/uiexample/application/PhabricatorApplicationUIExamples.php @@ -38,6 +38,14 @@ final class PhabricatorApplicationUIExamples extends PhabricatorApplication { return pht('A gallery of modern art.'); } + public function getApplicationGroup() { + return self::GROUP_DEVELOPER; + } + + public function getApplicationOrder() { + return 0.110; + } + public function getRoutes() { return array( '/uiexample/' => array( diff --git a/src/applications/xhpastview/application/PhabricatorApplicationPHPAST.php b/src/applications/xhpastview/application/PhabricatorApplicationPHPAST.php index 16b0e763de..4e8bd1c920 100644 --- a/src/applications/xhpastview/application/PhabricatorApplicationPHPAST.php +++ b/src/applications/xhpastview/application/PhabricatorApplicationPHPAST.php @@ -34,6 +34,10 @@ final class PhabricatorApplicationPHPAST extends PhabricatorApplication { return "\xE2\x96\xA0"; } + public function getApplicationGroup() { + return self::GROUP_DEVELOPER; + } + public function getRoutes() { return array( '/xhpast/' => array( diff --git a/src/view/layout/AphrontSideNavView.php b/src/view/layout/AphrontSideNavView.php index 6e032a1bd6..f7f16ffedc 100644 --- a/src/view/layout/AphrontSideNavView.php +++ b/src/view/layout/AphrontSideNavView.php @@ -193,18 +193,23 @@ final class AphrontSideNavView extends AphrontView { $meta = null; + $group_core = PhabricatorApplication::GROUP_CORE; + $applications = PhabricatorApplication::getAllInstalledApplications(); foreach ($applications as $application) { if ($application instanceof PhabricatorApplicationApplications) { $meta = $application; continue; } - if ($application->getCoreApplicationOrder() !== null) { + if ($application->getApplicationGroup() != $group_core) { + continue; + } + if ($application->getApplicationOrder() !== null) { $core[] = $application; } } - $core = msort($core, 'getCoreApplicationOrder'); + $core = msort($core, 'getApplicationOrder'); if ($meta) { $core[] = $meta; }