diff --git a/src/__celerity_resource_map__.php b/src/__celerity_resource_map__.php
index 8b39b81a07..e43a9fd3a4 100644
--- a/src/__celerity_resource_map__.php
+++ b/src/__celerity_resource_map__.php
@@ -3271,6 +3271,15 @@ celerity_register_resource_map(array(
),
'disk' => '/rsrc/css/application/search/search-results.css',
),
+ 'phabricator-settings-css' =>
+ array(
+ 'uri' => '/res/fb9d017f/rsrc/css/application/settings/settings.css',
+ 'type' => 'css',
+ 'requires' =>
+ array(
+ ),
+ 'disk' => '/rsrc/css/application/settings/settings.css',
+ ),
'phabricator-shaped-request' =>
array(
'uri' => '/res/fbdb92db/rsrc/js/application/core/ShapedRequest.js',
diff --git a/src/applications/settings/panel/PhabricatorSettingsPanelHomePreferences.php b/src/applications/settings/panel/PhabricatorSettingsPanelHomePreferences.php
index 7bc95340d8..bce927a3b7 100644
--- a/src/applications/settings/panel/PhabricatorSettingsPanelHomePreferences.php
+++ b/src/applications/settings/panel/PhabricatorSettingsPanelHomePreferences.php
@@ -19,6 +19,8 @@ final class PhabricatorSettingsPanelHomePreferences
$user = $request->getUser();
$preferences = $user->loadPreferences();
+ require_celerity_resource('phabricator-settings-css');
+
$apps = PhabricatorApplication::getAllInstalledApplications();
$pref_tiles = PhabricatorUserPreferences::PREFERENCE_APP_TILES;
$tiles = $preferences->getPreference($pref_tiles, array());
@@ -53,40 +55,143 @@ final class PhabricatorSettingsPanelHomePreferences
->setFlexible(true)
->setUser($user);
- $apps = msort($apps, 'getName');
- foreach ($apps as $app) {
- if (!$app->shouldAppearInLaunchView()) {
+ $group_map = PhabricatorApplication::getApplicationGroups();
+
+ $output = array();
+
+ $applications = PhabricatorApplication::getAllInstalledApplications();
+
+ $applications = mgroup($applications, 'getApplicationGroup');
+
+ $applications = array_select_keys(
+ $applications,
+ array_keys($group_map));
+
+ foreach ($applications as $group => $apps) {
+ $group_name = $group_map[$group];
+ $rows = array();
+
+ foreach ($apps as $app) {
+ if (!$app->shouldAppearInLaunchView()) {
+ continue;
+ }
+
+ $default = $app->getDefaultTileDisplay($user);
+ if ($default == PhabricatorApplication::TILE_INVISIBLE) {
+ continue;
+ }
+
+
+
+ $default_name = PhabricatorApplication::getTileDisplayName($default);
+
+ $hide = PhabricatorApplication::TILE_HIDE;
+ $show = PhabricatorApplication::TILE_SHOW;
+ $full = PhabricatorApplication::TILE_FULL;
+
+ $key = get_class($app);
+
+ $default_radio_button_status =
+ (idx($tiles, $key, 'default') == 'default') ? 'checked' : null;
+
+ $hide_radio_button_status =
+ (idx($tiles, $key, 'default') == $hide) ? 'checked' : null;
+
+ $show_radio_button_status =
+ (idx($tiles, $key, 'default') == $show) ? 'checked' : null;
+
+ $full_radio_button_status =
+ (idx($tiles, $key, 'default') == $full) ? 'checked' : null;
+
+
+ $default_radio_button = phutil_tag(
+ 'input',
+ array(
+ 'type' => 'radio',
+ 'name' => 'tile['.$key.']',
+ 'value' => 'default',
+ 'checked' => $default_radio_button_status,
+ ));
+
+ $hide_radio_button = phutil_tag(
+ 'input',
+ array(
+ 'type' => 'radio',
+ 'name' => 'tile['.$key.']',
+ 'value' => $hide,
+ 'checked' => $hide_radio_button_status,
+ ));
+
+ $show_radio_button = phutil_tag(
+ 'input',
+ array(
+ 'type' => 'radio',
+ 'name' => 'tile['.$key.']',
+ 'value' => $show,
+ 'checked' => $show_radio_button_status,
+ ));
+
+ $full_radio_button = phutil_tag(
+ 'input',
+ array(
+ 'type' => 'radio',
+ 'name' => 'tile['.$key.']',
+ 'value' => $full,
+ 'checked' => $full_radio_button_status,
+ ));
+
+ $app_column = hsprintf(
+ "%s
Default: %s"
+ , $app->getName(), $default_name);
+
+ $rows[] = array(
+ $app_column,
+ $default_radio_button,
+ $hide_radio_button,
+ $show_radio_button,
+ $full_radio_button,
+ );
+ }
+
+ if (empty($rows)) {
continue;
}
- $default = $app->getDefaultTileDisplay($user);
- if ($default == PhabricatorApplication::TILE_INVISIBLE) {
- continue;
- }
+ $table = new AphrontTableView($rows);
- $default_name = PhabricatorApplication::getTileDisplayName($default);
-
- $hide = PhabricatorApplication::TILE_HIDE;
- $show = PhabricatorApplication::TILE_SHOW;
- $full = PhabricatorApplication::TILE_FULL;
-
- $key = get_class($app);
- // Won't pht() for dynamic string (Applcation Name)
- $form->appendChild(
- id(new AphrontFormSelectControl())
- ->setLabel($app->getName())
- ->setName('tile['.$key.']')
- ->setOptions(
- array(
- $hide => PhabricatorApplication::getTileDisplayName($hide),
- 'default' => pht('Use Default (%s)', $default_name),
- $show => PhabricatorApplication::getTileDisplayName($show),
- $full => PhabricatorApplication::getTileDisplayName($full),
+ $table
+ ->setClassName('phabricator-settings-homepagetable')
+ ->setHeaders(
+ array(
+ pht('Applications'),
+ pht('Default'),
+ pht('Hidden'),
+ pht('Small'),
+ pht('Large'),
))
- ->setValue(idx($tiles, $key, 'default')));
+ ->setColumnClasses(
+ array(
+ '',
+ 'fixed',
+ 'fixed',
+ 'fixed',
+ 'fixed',
+ ));
+
+
+ $panel = id(new AphrontPanelView())
+ ->setHeader($group_name)
+ ->addClass('phabricator-settings-panelview')
+ ->appendChild($table)
+ ->setNoBackground();
+
+
+ $output[] = $panel;
+
}
$form
+ ->appendChild($output)
->appendChild(
id(new AphrontFormSubmitControl())
->setValue(pht('Save Preferences')));
diff --git a/webroot/rsrc/css/application/settings/settings.css b/webroot/rsrc/css/application/settings/settings.css
new file mode 100644
index 0000000000..6f71309826
--- /dev/null
+++ b/webroot/rsrc/css/application/settings/settings.css
@@ -0,0 +1,20 @@
+/**
+ * @provides phabricator-settings-css
+ */
+
+.phabricator-settings-homepagetable {
+ width: 60% !important;
+ margin: auto;
+}
+
+.phabricator-settings-homepagetable td.fixed {
+ width: 24px;
+ text-align: center;
+
+}
+
+.phabricator-settings-panelview h1 {
+ text-align: center;
+}
+
+