Changeset View
Changeset View
Standalone View
Standalone View
src/applications/home/controller/PhabricatorHomeController.php
Show All 19 Lines | public function buildNav() { | ||||
$nav = new AphrontSideNavFilterView(); | $nav = new AphrontSideNavFilterView(); | ||||
$nav->setBaseURI(new PhutilURI('/')); | $nav->setBaseURI(new PhutilURI('/')); | ||||
$applications = id(new PhabricatorApplicationQuery()) | $applications = id(new PhabricatorApplicationQuery()) | ||||
->setViewer($user) | ->setViewer($user) | ||||
->withInstalled(true) | ->withInstalled(true) | ||||
->withUnlisted(false) | ->withUnlisted(false) | ||||
->withLaunchable(true) | |||||
->execute(); | ->execute(); | ||||
foreach ($applications as $key => $application) { | foreach ($applications as $key => $application) { | ||||
if (!$application->shouldAppearInLaunchView()) { | |||||
// Remove hidden applications (usually internal stuff). | |||||
unset($applications[$key]); | |||||
} | |||||
$invisible = PhabricatorApplication::TILE_INVISIBLE; | $invisible = PhabricatorApplication::TILE_INVISIBLE; | ||||
if ($application->getDefaultTileDisplay($user) == $invisible) { | if ($application->getDefaultTileDisplay($user) == $invisible) { | ||||
// Remove invisible applications (e.g., admin apps for non-admins). | // Remove invisible applications (e.g., admin apps for non-admins). | ||||
unset($applications[$key]); | unset($applications[$key]); | ||||
} | } | ||||
} | } | ||||
$status = array(); | $pinned = $user->loadPreferences()->getPinnedApplications( | ||||
foreach ($applications as $key => $application) { | $applications, | ||||
$status[get_class($application)] = $application->loadStatus($user); | $user); | ||||
} | |||||
// Put "Applications" at the bottom. | |||||
$meta_app = 'PhabricatorApplicationApplications'; | |||||
$pinned = array_fuse($pinned); | |||||
unset($pinned[$meta_app]); | |||||
$pinned[$meta_app] = $meta_app; | |||||
$tile_groups = array(); | $tiles = array(); | ||||
$prefs = $user->loadPreferences()->getPreference( | foreach ($pinned as $pinned_application) { | ||||
PhabricatorUserPreferences::PREFERENCE_APP_TILES, | if (empty($applications[$pinned_application])) { | ||||
array()); | |||||
foreach ($applications as $key => $application) { | |||||
$display = idx( | |||||
$prefs, | |||||
get_class($application), | |||||
$application->getDefaultTileDisplay($user)); | |||||
$tile_groups[$display][] = $application; | |||||
} | |||||
$tile_groups = array_select_keys( | |||||
$tile_groups, | |||||
array( | |||||
PhabricatorApplication::TILE_FULL, | |||||
PhabricatorApplication::TILE_SHOW, | |||||
PhabricatorApplication::TILE_HIDE, | |||||
)); | |||||
foreach ($tile_groups as $tile_display => $tile_group) { | |||||
if (!$tile_group) { | |||||
continue; | continue; | ||||
} | } | ||||
$is_small_tiles = ($tile_display == PhabricatorApplication::TILE_SHOW) || | $application = $applications[$pinned_application]; | ||||
($tile_display == PhabricatorApplication::TILE_HIDE); | |||||
if ($is_small_tiles) { | |||||
$groups = PhabricatorApplication::getApplicationGroups(); | |||||
$tile_group = mgroup($tile_group, 'getApplicationGroup'); | |||||
$tile_group = array_select_keys($tile_group, array_keys($groups)); | |||||
} else { | |||||
$tile_group = array($tile_group); | |||||
} | |||||
$is_hide = ($tile_display == PhabricatorApplication::TILE_HIDE); | |||||
if ($is_hide) { | |||||
$show_item_id = celerity_generate_unique_node_id(); | |||||
$hide_item_id = celerity_generate_unique_node_id(); | |||||
$show_item = id(new PHUIListItemView()) | |||||
->setName(pht('Show More Applications')) | |||||
->setHref('#') | |||||
->addSigil('reveal-content') | |||||
->setID($show_item_id); | |||||
$hide_item = id(new PHUIListItemView()) | |||||
->setName(pht('Show Fewer Applications')) | |||||
->setHref('#') | |||||
->setStyle('display: none') | |||||
->setID($hide_item_id) | |||||
->addSigil('reveal-content'); | |||||
$nav->addMenuItem($show_item); | |||||
$tile_ids = array($hide_item_id); | |||||
} | |||||
foreach ($tile_group as $group => $application_list) { | |||||
$tiles = array(); | |||||
foreach ($application_list as $key => $application) { | |||||
$tile = id(new PhabricatorApplicationLaunchView()) | $tile = id(new PhabricatorApplicationLaunchView()) | ||||
->setApplication($application) | ->setApplication($application) | ||||
->setApplicationStatus( | ->setApplicationStatus($application->loadStatus($user)) | ||||
idx($status, get_class($application), array())) | |||||
->setUser($user); | ->setUser($user); | ||||
$tiles[] = $tile; | $tiles[] = $tile; | ||||
} | } | ||||
$group_id = celerity_generate_unique_node_id(); | |||||
$tile_ids[] = $group_id; | |||||
$nav->addCustomBlock( | $nav->addCustomBlock( | ||||
phutil_tag( | phutil_tag( | ||||
'div', | 'div', | ||||
array( | array( | ||||
'class' => 'application-tile-group', | 'class' => 'application-tile-group', | ||||
'id' => $group_id, | |||||
'style' => ($is_hide ? 'display: none' : null), | |||||
), | ), | ||||
mpull($tiles, 'render'))); | $tiles)); | ||||
} | |||||
if ($is_hide) { | |||||
Javelin::initBehavior('phabricator-reveal-content'); | |||||
$show_item->setMetadata( | |||||
array( | |||||
'showIDs' => $tile_ids, | |||||
'hideIDs' => array($show_item_id), | |||||
)); | |||||
$hide_item->setMetadata( | |||||
array( | |||||
'showIDs' => array($show_item_id), | |||||
'hideIDs' => $tile_ids, | |||||
)); | |||||
$nav->addMenuItem($hide_item); | |||||
} | |||||
} | |||||
$nav->addFilter( | $nav->addFilter( | ||||
'', | '', | ||||
pht('Customize Applications...'), | pht('Customize Applications...'), | ||||
'/settings/panel/home/'); | '/settings/panel/home/'); | ||||
$nav->addClass('phabricator-side-menu-home'); | $nav->addClass('phabricator-side-menu-home'); | ||||
$nav->selectFilter(null); | $nav->selectFilter(null); | ||||
return $nav; | return $nav; | ||||
} | } | ||||
} | } |