Skip to content

Commit 402b647

Browse files
author
epriestley
committedJan 21, 2017
Move Favorites and User menus to MenuBarExtensions
Summary: Ref T12140. The major effect of this change is that uninstalling "Home" (as we do on admin.phacility.com) no longer uninstalls the user menu (which is required to access settings or log out). This also simplifies the code a bit, by consolidating how menus are built into MenuBarExtensions instead of some in Applications and some in Extensions. Test Plan: - While logged in and logged out, saw main menus in the correct order. - Uninstalled Favorites, saw the menu vanish. - Uninstalled Home, still had a user menu. Reviewers: chad Reviewed By: chad Maniphest Tasks: T12140 Differential Revision: https://secure.phabricator.com/D17239
1 parent ddf82a8 commit 402b647

9 files changed

+231
-220
lines changed
 

‎src/__phutil_library_map__.php

+4
Original file line numberDiff line numberDiff line change
@@ -1785,6 +1785,7 @@
17851785
'PeopleBrowseUserDirectoryCapability' => 'applications/people/capability/PeopleBrowseUserDirectoryCapability.php',
17861786
'PeopleCreateUsersCapability' => 'applications/people/capability/PeopleCreateUsersCapability.php',
17871787
'PeopleHovercardEngineExtension' => 'applications/people/engineextension/PeopleHovercardEngineExtension.php',
1788+
'PeopleMainMenuBarExtension' => 'applications/people/engineextension/PeopleMainMenuBarExtension.php',
17881789
'PeopleUserLogGarbageCollector' => 'applications/people/garbagecollector/PeopleUserLogGarbageCollector.php',
17891790
'Phabricator404Controller' => 'applications/base/controller/Phabricator404Controller.php',
17901791
'PhabricatorAWSConfigOptions' => 'applications/config/option/PhabricatorAWSConfigOptions.php',
@@ -2671,6 +2672,7 @@
26712672
'PhabricatorFavoritesApplication' => 'applications/favorites/application/PhabricatorFavoritesApplication.php',
26722673
'PhabricatorFavoritesController' => 'applications/favorites/controller/PhabricatorFavoritesController.php',
26732674
'PhabricatorFavoritesMainController' => 'applications/favorites/controller/PhabricatorFavoritesMainController.php',
2675+
'PhabricatorFavoritesMainMenuBarExtension' => 'applications/favorites/engineextension/PhabricatorFavoritesMainMenuBarExtension.php',
26742676
'PhabricatorFavoritesMenuItemController' => 'applications/favorites/controller/PhabricatorFavoritesMenuItemController.php',
26752677
'PhabricatorFavoritesProfileMenuEngine' => 'applications/favorites/engine/PhabricatorFavoritesProfileMenuEngine.php',
26762678
'PhabricatorFaxContentSource' => 'infrastructure/contentsource/PhabricatorFaxContentSource.php',
@@ -6662,6 +6664,7 @@
66626664
'PeopleBrowseUserDirectoryCapability' => 'PhabricatorPolicyCapability',
66636665
'PeopleCreateUsersCapability' => 'PhabricatorPolicyCapability',
66646666
'PeopleHovercardEngineExtension' => 'PhabricatorHovercardEngineExtension',
6667+
'PeopleMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
66656668
'PeopleUserLogGarbageCollector' => 'PhabricatorGarbageCollector',
66666669
'Phabricator404Controller' => 'PhabricatorController',
66676670
'PhabricatorAWSConfigOptions' => 'PhabricatorApplicationConfigOptions',
@@ -7685,6 +7688,7 @@
76857688
'PhabricatorFavoritesApplication' => 'PhabricatorApplication',
76867689
'PhabricatorFavoritesController' => 'PhabricatorController',
76877690
'PhabricatorFavoritesMainController' => 'PhabricatorFavoritesController',
7691+
'PhabricatorFavoritesMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
76887692
'PhabricatorFavoritesMenuItemController' => 'PhabricatorFavoritesController',
76897693
'PhabricatorFavoritesProfileMenuEngine' => 'PhabricatorProfileMenuEngine',
76907694
'PhabricatorFaxContentSource' => 'PhabricatorContentSource',

‎src/applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ public function isExtensionEnabledForViewer(PhabricatorUser $viewer) {
99
return true;
1010
}
1111

12+
public function getExtensionOrder() {
13+
return 900;
14+
}
15+
1216
public function buildMainMenus() {
1317
$viewer = $this->getViewer();
1418

‎src/applications/base/PhabricatorApplication.php

-17
Original file line numberDiff line numberDiff line change
@@ -315,23 +315,6 @@ public function buildMainMenuItems(
315315
}
316316

317317

318-
/**
319-
* Build extra items for the main menu. Generally, this is used to render
320-
* static dropdowns.
321-
*
322-
* @param PhabricatorUser The viewing user.
323-
* @param AphrontController The current controller. May be null for special
324-
* pages like 404, exception handlers, etc.
325-
* @return view List of menu items.
326-
* @task ui
327-
*/
328-
public function buildMainMenuExtraNodes(
329-
PhabricatorUser $viewer,
330-
PhabricatorController $controller = null) {
331-
return array();
332-
}
333-
334-
335318
/* -( Application Management )--------------------------------------------- */
336319

337320

‎src/applications/favorites/application/PhabricatorFavoritesApplication.php

-78
Original file line numberDiff line numberDiff line change
@@ -32,82 +32,4 @@ public function isLaunchable() {
3232
return false;
3333
}
3434

35-
public function buildMainMenuExtraNodes(
36-
PhabricatorUser $viewer,
37-
PhabricatorController $controller = null) {
38-
39-
$dropdown = $this->renderFavoritesDropdown($viewer);
40-
if (!$dropdown) {
41-
return null;
42-
}
43-
44-
return id(new PHUIButtonView())
45-
->setTag('a')
46-
->setHref('#')
47-
->setIcon('fa-star')
48-
->addClass('phabricator-core-user-menu')
49-
->setNoCSS(true)
50-
->setDropdown(true)
51-
->setDropdownMenu($dropdown);
52-
}
53-
54-
private function renderFavoritesDropdown(PhabricatorUser $viewer) {
55-
$application = __CLASS__;
56-
57-
$applications = id(new PhabricatorApplicationQuery())
58-
->setViewer($viewer)
59-
->withClasses(array($application))
60-
->withInstalled(true)
61-
->execute();
62-
$favorites = head($applications);
63-
if (!$favorites) {
64-
return null;
65-
}
66-
67-
$menu_engine = id(new PhabricatorFavoritesProfileMenuEngine())
68-
->setViewer($viewer)
69-
->setProfileObject($favorites);
70-
71-
if ($viewer->getPHID()) {
72-
$menu_engine
73-
->setCustomPHID($viewer->getPHID())
74-
->setMenuType(PhabricatorProfileMenuEngine::MENU_COMBINED);
75-
} else {
76-
$menu_engine
77-
->setMenuType(PhabricatorProfileMenuEngine::MENU_GLOBAL);
78-
}
79-
80-
$filter_view = $menu_engine->buildNavigation();
81-
82-
$menu_view = $filter_view->getMenu();
83-
$item_views = $menu_view->getItems();
84-
85-
$view = id(new PhabricatorActionListView())
86-
->setViewer($viewer);
87-
foreach ($item_views as $item) {
88-
$type = null;
89-
if (!strlen($item->getName())) {
90-
$type = PhabricatorActionView::TYPE_DIVIDER;
91-
}
92-
$action = id(new PhabricatorActionView())
93-
->setName($item->getName())
94-
->setHref($item->getHref())
95-
->setType($type);
96-
$view->addAction($action);
97-
}
98-
99-
// Build out edit interface
100-
if ($viewer->isLoggedIn()) {
101-
$view->addAction(
102-
id(new PhabricatorActionView())
103-
->setType(PhabricatorActionView::TYPE_DIVIDER));
104-
$view->addAction(
105-
id(new PhabricatorActionView())
106-
->setName(pht('Edit Favorites'))
107-
->setHref('/favorites/'));
108-
}
109-
110-
return $view;
111-
}
112-
11335
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?php
2+
3+
final class PhabricatorFavoritesMainMenuBarExtension
4+
extends PhabricatorMainMenuBarExtension {
5+
6+
const MAINMENUBARKEY = 'favorites';
7+
8+
public function isExtensionEnabledForViewer(PhabricatorUser $viewer) {
9+
return PhabricatorApplication::isClassInstalledForViewer(
10+
'PhabricatorFavoritesApplication',
11+
$viewer);
12+
}
13+
14+
public function getExtensionOrder() {
15+
return 1100;
16+
}
17+
18+
public function buildMainMenus() {
19+
$viewer = $this->getViewer();
20+
21+
$dropdown = $this->newDropdown($viewer);
22+
if (!$dropdown) {
23+
return null;
24+
}
25+
26+
$favorites_menu = id(new PHUIButtonView())
27+
->setTag('a')
28+
->setHref('#')
29+
->setIcon('fa-star')
30+
->addClass('phabricator-core-user-menu')
31+
->setNoCSS(true)
32+
->setDropdown(true)
33+
->setDropdownMenu($dropdown);
34+
35+
return array(
36+
$favorites_menu,
37+
);
38+
}
39+
40+
private function newDropdown(PhabricatorUser $viewer) {
41+
$applications = id(new PhabricatorApplicationQuery())
42+
->setViewer($viewer)
43+
->withClasses(array('PhabricatorFavoritesApplication'))
44+
->withInstalled(true)
45+
->execute();
46+
$favorites = head($applications);
47+
if (!$favorites) {
48+
return null;
49+
}
50+
51+
$menu_engine = id(new PhabricatorFavoritesProfileMenuEngine())
52+
->setViewer($viewer)
53+
->setProfileObject($favorites);
54+
55+
if ($viewer->getPHID()) {
56+
$menu_engine
57+
->setCustomPHID($viewer->getPHID())
58+
->setMenuType(PhabricatorProfileMenuEngine::MENU_COMBINED);
59+
} else {
60+
$menu_engine
61+
->setMenuType(PhabricatorProfileMenuEngine::MENU_GLOBAL);
62+
}
63+
64+
$filter_view = $menu_engine->buildNavigation();
65+
66+
$menu_view = $filter_view->getMenu();
67+
$item_views = $menu_view->getItems();
68+
69+
$view = id(new PhabricatorActionListView())
70+
->setViewer($viewer);
71+
foreach ($item_views as $item) {
72+
$type = null;
73+
if (!strlen($item->getName())) {
74+
$type = PhabricatorActionView::TYPE_DIVIDER;
75+
}
76+
$action = id(new PhabricatorActionView())
77+
->setName($item->getName())
78+
->setHref($item->getHref())
79+
->setType($type);
80+
$view->addAction($action);
81+
}
82+
83+
if ($viewer->isLoggedIn()) {
84+
$view->addAction(
85+
id(new PhabricatorActionView())
86+
->setType(PhabricatorActionView::TYPE_DIVIDER));
87+
$view->addAction(
88+
id(new PhabricatorActionView())
89+
->setName(pht('Edit Favorites'))
90+
->setHref('/favorites/'));
91+
}
92+
93+
return $view;
94+
}
95+
96+
}

‎src/applications/home/application/PhabricatorHomeApplication.php

-110
Original file line numberDiff line numberDiff line change
@@ -42,114 +42,4 @@ public function getApplicationOrder() {
4242
return 9;
4343
}
4444

45-
public function buildMainMenuExtraNodes(
46-
PhabricatorUser $viewer,
47-
PhabricatorController $controller = null) {
48-
49-
if (!$viewer->isLoggedIn()) {
50-
return;
51-
}
52-
53-
$image = $viewer->getProfileImageURI();
54-
55-
$profile_image = id(new PHUIIconView())
56-
->setImage($image)
57-
->setHeadSize(PHUIIconView::HEAD_SMALL);
58-
59-
if ($controller) {
60-
$application = $controller->getCurrentApplication();
61-
} else {
62-
$application = null;
63-
}
64-
$dropdown_menu = $this->renderUserDropdown($viewer, $application);
65-
66-
$menu_id = celerity_generate_unique_node_id();
67-
68-
Javelin::initBehavior(
69-
'user-menu',
70-
array(
71-
'menuID' => $menu_id,
72-
'menu' => $dropdown_menu->getDropdownMenuMetadata(),
73-
));
74-
75-
return id(new PHUIButtonView())
76-
->setID($menu_id)
77-
->setTag('a')
78-
->setHref('/p/'.$viewer->getUsername().'/')
79-
->setIcon($profile_image)
80-
->addClass('phabricator-core-user-menu')
81-
->setHasCaret(true)
82-
->setNoCSS(true);
83-
}
84-
85-
private function renderUserDropdown(
86-
PhabricatorUser $viewer,
87-
$application) {
88-
89-
$person_to_show = id(new PHUIObjectItemView())
90-
->setObjectName($viewer->getRealName())
91-
->setSubHead($viewer->getUsername())
92-
->setImageURI($viewer->getProfileImageURI());
93-
94-
$user_view = id(new PHUIObjectItemListView())
95-
->setViewer($viewer)
96-
->setFlush(true)
97-
->setSimple(true)
98-
->addItem($person_to_show)
99-
->addClass('phabricator-core-user-profile-object');
100-
101-
$view = id(new PhabricatorActionListView())
102-
->setViewer($viewer);
103-
104-
// User Menu
105-
$view->addAction(
106-
id(new PhabricatorActionView())
107-
->appendChild($user_view));
108-
109-
$view->addAction(
110-
id(new PhabricatorActionView())
111-
->setType(PhabricatorActionView::TYPE_DIVIDER));
112-
113-
$view->addAction(
114-
id(new PhabricatorActionView())
115-
->setName(pht('Profile'))
116-
->setHref('/p/'.$viewer->getUsername().'/'));
117-
118-
$view->addAction(
119-
id(new PhabricatorActionView())
120-
->setName(pht('Settings'))
121-
->setHref('/settings/user/'.$viewer->getUsername().'/'));
122-
123-
$view->addAction(
124-
id(new PhabricatorActionView())
125-
->setName(pht('Manage'))
126-
->setHref('/people/manage/'.$viewer->getID().'/'));
127-
128-
// Help Menus
129-
if ($application) {
130-
$help_links = $application->getHelpMenuItems($viewer);
131-
if ($help_links) {
132-
foreach ($help_links as $link) {
133-
$view->addAction($link);
134-
}
135-
}
136-
}
137-
138-
// Logout Menu
139-
$view->addAction(
140-
id(new PhabricatorActionView())
141-
->addSigil('logout-item')
142-
->setType(PhabricatorActionView::TYPE_DIVIDER));
143-
144-
$view->addAction(
145-
id(new PhabricatorActionView())
146-
->setName(pht('Log Out %s', $viewer->getUsername()))
147-
->addSigil('logout-item')
148-
->setHref('/logout/')
149-
->setColor(PhabricatorActionView::RED)
150-
->setWorkflow(true));
151-
152-
return $view;
153-
}
154-
15545
}

0 commit comments

Comments
 (0)
Failed to load comments.