Skip to content

Commit fffa7ff

Browse files
author
epriestley
committedJan 16, 2013
Allow users to customize applicaiton tile sizes
Summary: See discussion in D4438. Allows users to customize application tiles, and implements generally reasonable defaults so they hopefully won't. Sizes are "invisible" (internal only, used to hide admin apps from non-admins), "hidden" (hide by default, show after clicking "Show More Applications"), "show" (show a small square tile) and "full" (show a full-width tile with subtitle). Test Plan: Default view for a non-admin: {F29375} Adjusted settings, hidden: {F29373} Adjusted settings, shown: {F29374} Reviewers: chad, btrahan Reviewed By: chad CC: aran Differential Revision: https://secure.phabricator.com/D4439
1 parent fb9a1c3 commit fffa7ff

File tree

8 files changed

+325
-32
lines changed

8 files changed

+325
-32
lines changed
 

‎scripts/celerity_mapper.php

+1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
'phabricator-textareautils',
5858
'phabricator-file-upload',
5959
'javelin-behavior-global-drag-and-drop',
60+
'javelin-behavior-phabricator-home-reveal-tiles',
6061
),
6162
'core.pkg.css' => array(
6263
'phabricator-core-css',

‎src/__phutil_library_map__.php

+2
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,7 @@
11851185
'PhabricatorSettingsPanelDisplayPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelDisplayPreferences.php',
11861186
'PhabricatorSettingsPanelEmailAddresses' => 'applications/settings/panel/PhabricatorSettingsPanelEmailAddresses.php',
11871187
'PhabricatorSettingsPanelEmailPreferences' => 'applications/settings/panel/PhabricatorSettingsPanelEmailPreferences.php',
1188+
'PhabricatorSettingsPanelHomePreferences' => 'applications/settings/panel/PhabricatorSettingsPanelHomePreferences.php',
11881189
'PhabricatorSettingsPanelLDAP' => 'applications/settings/panel/PhabricatorSettingsPanelLDAP.php',
11891190
'PhabricatorSettingsPanelOAuth' => 'applications/settings/panel/PhabricatorSettingsPanelOAuth.php',
11901191
'PhabricatorSettingsPanelPassword' => 'applications/settings/panel/PhabricatorSettingsPanelPassword.php',
@@ -2525,6 +2526,7 @@
25252526
'PhabricatorSettingsPanelDisplayPreferences' => 'PhabricatorSettingsPanel',
25262527
'PhabricatorSettingsPanelEmailAddresses' => 'PhabricatorSettingsPanel',
25272528
'PhabricatorSettingsPanelEmailPreferences' => 'PhabricatorSettingsPanel',
2529+
'PhabricatorSettingsPanelHomePreferences' => 'PhabricatorSettingsPanel',
25282530
'PhabricatorSettingsPanelLDAP' => 'PhabricatorSettingsPanel',
25292531
'PhabricatorSettingsPanelOAuth' => 'PhabricatorSettingsPanel',
25302532
'PhabricatorSettingsPanelPassword' => 'PhabricatorSettingsPanel',

‎src/applications/base/PhabricatorApplication.php

+35
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ abstract class PhabricatorApplication {
1818
const GROUP_DEVELOPER = 'developer';
1919
const GROUP_MISC = 'misc';
2020

21+
const TILE_INVISIBLE = 'invisible';
22+
const TILE_HIDE = 'hide';
23+
const TILE_SHOW = 'show';
24+
const TILE_FULL = 'full';
25+
2126
public static function getApplicationGroups() {
2227
return array(
2328
self::GROUP_CORE => pht('Core Applications'),
@@ -30,6 +35,17 @@ public static function getApplicationGroups() {
3035
);
3136
}
3237

38+
public static function getTileDisplayName($constant) {
39+
$names = array(
40+
self::TILE_INVISIBLE => pht('Invisible'),
41+
self::TILE_HIDE => pht('Hidden'),
42+
self::TILE_SHOW => pht('Show Small Tile'),
43+
self::TILE_FULL => pht('Show Large Tile'),
44+
);
45+
return idx($names, $constant);
46+
}
47+
48+
3349

3450
/* -( Application Information )-------------------------------------------- */
3551

@@ -96,6 +112,25 @@ public function getEventListeners() {
96112
return array();
97113
}
98114

115+
public function getDefaultTileDisplay(PhabricatorUser $user) {
116+
switch ($this->getApplicationGroup()) {
117+
case self::GROUP_CORE:
118+
return self::TILE_FULL;
119+
case self::GROUP_UTILITIES:
120+
case self::GROUP_DEVELOPER:
121+
return self::TILE_HIDE;
122+
case self::GROUP_ADMIN:
123+
if ($user->getIsAdmin()) {
124+
return self::TILE_SHOW;
125+
} else {
126+
return self::TILE_INVISIBLE;
127+
}
128+
break;
129+
default:
130+
return self::TILE_SHOW;
131+
}
132+
}
133+
99134

100135
/* -( URI Routing )-------------------------------------------------------- */
101136

‎src/applications/directory/controller/PhabricatorDirectoryController.php

+107-29
Original file line numberDiff line numberDiff line change
@@ -25,51 +25,129 @@ public function buildNav() {
2525

2626
foreach ($applications as $key => $application) {
2727
if (!$application->shouldAppearInLaunchView()) {
28+
// Remove hidden applications (usually internal stuff).
29+
unset($applications[$key]);
30+
}
31+
$invisible = PhabricatorApplication::TILE_INVISIBLE;
32+
if ($application->getDefaultTileDisplay($user) == $invisible) {
33+
// Remove invisible applications (e.g., admin apps for non-admins).
2834
unset($applications[$key]);
2935
}
3036
}
3137

32-
$groups = PhabricatorApplication::getApplicationGroups();
38+
$status = array();
39+
foreach ($applications as $key => $application) {
40+
$status[get_class($application)] = $application->loadStatus($user);
41+
}
3342

34-
$applications = msort($applications, 'getApplicationOrder');
35-
$applications = mgroup($applications, 'getApplicationGroup');
36-
$applications = array_select_keys($applications, array_keys($groups));
43+
$tile_groups = array();
44+
$prefs = $user->loadPreferences()->getPreference(
45+
PhabricatorUserPreferences::PREFERENCE_APP_TILES,
46+
array());
47+
foreach ($applications as $key => $application) {
48+
$display = idx(
49+
$prefs,
50+
get_class($application),
51+
$application->getDefaultTileDisplay($user));
52+
$tile_groups[$display][] = $application;
53+
}
3754

38-
$view = array();
39-
foreach ($applications as $group => $application_list) {
40-
$status = array();
41-
foreach ($application_list as $key => $application) {
42-
$status[$key] = $application->loadStatus($user);
55+
$tile_groups = array_select_keys(
56+
$tile_groups,
57+
array(
58+
PhabricatorApplication::TILE_FULL,
59+
PhabricatorApplication::TILE_SHOW,
60+
PhabricatorApplication::TILE_HIDE,
61+
));
62+
63+
foreach ($tile_groups as $tile_display => $tile_group) {
64+
if (!$tile_group) {
65+
continue;
4366
}
4467

45-
$views = array();
46-
foreach ($application_list as $key => $application) {
47-
$tile = id(new PhabricatorApplicationLaunchView())
48-
->setApplication($application)
49-
->setApplicationStatus(idx($status, $key, array()))
50-
->setUser($user);
68+
$tile_group = msort($tile_group, 'getApplicationOrder');
5169

52-
if ($group == PhabricatorApplication::GROUP_CORE) {
53-
$tile->setFullWidth(true);
54-
}
70+
$is_small_tiles = ($tile_display == PhabricatorApplication::TILE_SHOW) ||
71+
($tile_display == PhabricatorApplication::TILE_HIDE);
5572

56-
$views[] = $tile;
73+
if ($is_small_tiles) {
74+
$groups = PhabricatorApplication::getApplicationGroups();
75+
$tile_group = mgroup($tile_group, 'getApplicationGroup');
76+
$tile_group = array_select_keys($tile_group, array_keys($groups));
77+
} else {
78+
$tile_group = array($tile_group);
5779
}
5880

59-
while (count($views) % 4) {
60-
$views[] = id(new PhabricatorApplicationLaunchView());
81+
$is_hide = ($tile_display == PhabricatorApplication::TILE_HIDE);
82+
if ($is_hide) {
83+
$show_item_id = celerity_generate_unique_node_id();
84+
$show_tiles_id = celerity_generate_unique_node_id();
85+
86+
$show_item = id(new PhabricatorMenuItemView())
87+
->setName(pht('Show More Applications'))
88+
->setHref('#')
89+
->addSigil('home-show-applications')
90+
->setID($show_item_id);
91+
92+
$hide_item = id(new PhabricatorMenuItemView())
93+
->setName(pht('Show Fewer Applications'))
94+
->setHref('#')
95+
->addSigil('home-hide-applications');
96+
97+
$nav->addMenuItem($show_item);
98+
$nav->addCustomBlock(
99+
'<div '.
100+
'id="'.phutil_escape_html($show_tiles_id).'"'.
101+
'style="display: none;">');
102+
103+
Javelin::initBehavior('phabricator-home-reveal-tiles', array(
104+
'tilesID' => $show_tiles_id,
105+
'showID' => $show_item_id,
106+
));
61107
}
62108

63-
$nav->addLabel($groups[$group]);
64-
$nav->addCustomBlock(
65-
phutil_render_tag(
66-
'div',
67-
array(
68-
'class' => 'application-tile-group',
69-
),
70-
id(new AphrontNullView())->appendChild($views)->render()));
109+
foreach ($tile_group as $group => $application_list) {
110+
$tiles = array();
111+
foreach ($application_list as $key => $application) {
112+
$tile = id(new PhabricatorApplicationLaunchView())
113+
->setApplication($application)
114+
->setApplicationStatus(
115+
idx($status, get_class($application), array()))
116+
->setUser($user);
117+
118+
if ($tile_display == PhabricatorApplication::TILE_FULL) {
119+
$tile->setFullWidth(true);
120+
}
121+
122+
$tiles[] = $tile;
123+
}
124+
125+
if ($is_small_tiles) {
126+
while (count($tiles) % 4) {
127+
$tiles[] = id(new PhabricatorApplicationLaunchView());
128+
}
129+
$nav->addLabel($groups[$group]);
130+
}
131+
$nav->addCustomBlock(
132+
phutil_render_tag(
133+
'div',
134+
array(
135+
'class' => 'application-tile-group',
136+
),
137+
id(new AphrontNullView())->appendChild($tiles)->render()));
138+
}
139+
140+
$is_hide = ($tile_display == PhabricatorApplication::TILE_HIDE);
141+
if ($is_hide) {
142+
$nav->addMenuItem($hide_item);
143+
$nav->addCustomBlock('</div>');
144+
}
71145
}
72146

147+
$nav->addFilter(
148+
'',
149+
pht('Customize Applications...'),
150+
'/settings/panel/home/');
73151
$nav->addClass('phabricator-side-menu-home');
74152
$nav->selectFilter(null);
75153

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
<?php
2+
3+
final class PhabricatorSettingsPanelHomePreferences
4+
extends PhabricatorSettingsPanel {
5+
6+
public function getPanelKey() {
7+
return 'home';
8+
}
9+
10+
public function getPanelName() {
11+
return pht('Home Page');
12+
}
13+
14+
public function getPanelGroup() {
15+
return pht('Application Settings');
16+
}
17+
18+
public function processRequest(AphrontRequest $request) {
19+
$user = $request->getUser();
20+
$preferences = $user->loadPreferences();
21+
22+
$apps = PhabricatorApplication::getAllInstalledApplications();
23+
$pref_tiles = PhabricatorUserPreferences::PREFERENCE_APP_TILES;
24+
$tiles = $preferences->getPreference($pref_tiles, array());
25+
26+
if ($request->isFormPost()) {
27+
$values = $request->getArr('tile');
28+
foreach ($apps as $app) {
29+
$key = get_class($app);
30+
$value = idx($values, $key);
31+
switch ($value) {
32+
case PhabricatorApplication::TILE_FULL:
33+
case PhabricatorApplication::TILE_SHOW:
34+
case PhabricatorApplication::TILE_HIDE:
35+
$tiles[$key] = $value;
36+
break;
37+
default:
38+
unset($tiles[$key]);
39+
break;
40+
}
41+
}
42+
$preferences->setPreference($pref_tiles, $tiles);
43+
$preferences->save();
44+
45+
return id(new AphrontRedirectResponse())
46+
->setURI($this->getPanelURI('?saved=true'));
47+
}
48+
49+
$header = id(new PhabricatorHeaderView())
50+
->setHeader(pht('Home Page Preferences'));
51+
52+
$form = id(new AphrontFormView())
53+
->setFlexible(true)
54+
->setUser($user);
55+
56+
$apps = msort($apps, 'getName');
57+
foreach ($apps as $app) {
58+
if (!$app->shouldAppearInLaunchView()) {
59+
continue;
60+
}
61+
62+
$default = $app->getDefaultTileDisplay($user);
63+
if ($default == PhabricatorApplication::TILE_INVISIBLE) {
64+
continue;
65+
}
66+
67+
$default_name = PhabricatorApplication::getTileDisplayName($default);
68+
69+
$hide = PhabricatorApplication::TILE_HIDE;
70+
$show = PhabricatorApplication::TILE_SHOW;
71+
$full = PhabricatorApplication::TILE_FULL;
72+
73+
$key = get_class($app);
74+
$form->appendChild(
75+
id(new AphrontFormSelectControl())
76+
->setLabel($app->getName())
77+
->setName('tile['.$key.']')
78+
->setOptions(
79+
array(
80+
$hide => PhabricatorApplication::getTileDisplayName($hide),
81+
'default' => pht('Use Default (%s)', $default_name),
82+
$show => PhabricatorApplication::getTileDisplayName($show),
83+
$full => PhabricatorApplication::getTileDisplayName($full),
84+
))
85+
->setValue(idx($tiles, $key, 'default')));
86+
}
87+
88+
$form
89+
->appendChild(
90+
id(new AphrontFormSubmitControl())
91+
->setValue('Save Preferences'));
92+
93+
$error_view = null;
94+
if ($request->getStr('saved') === 'true') {
95+
$error_view = id(new AphrontErrorView())
96+
->setTitle('Preferences Saved')
97+
->setSeverity(AphrontErrorView::SEVERITY_NOTICE)
98+
->setErrors(array('Your preferences have been saved.'));
99+
}
100+
101+
return array(
102+
$header,
103+
$error_view,
104+
$form,
105+
);
106+
}
107+
}
108+

‎src/applications/settings/storage/PhabricatorUserPreferences.php

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ final class PhabricatorUserPreferences extends PhabricatorUserDAO {
2020
const PREFERENCE_DIFFUSION_SYMBOLS = 'diffusion-symbols';
2121

2222
const PREFERENCE_NAV_WIDTH = 'nav-width';
23+
const PREFERENCE_APP_TILES = 'app-tiles';
2324

2425
protected $userPHID;
2526
protected $preferences = array();

0 commit comments

Comments
 (0)
Failed to load comments.