Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15309037
D14922.id36057.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
27 KB
Referenced Files
None
Subscribers
None
D14922.id36057.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1501,6 +1501,7 @@
'PHUIListItemView' => 'view/phui/PHUIListItemView.php',
'PHUIListView' => 'view/phui/PHUIListView.php',
'PHUIListViewTestCase' => 'view/layout/__tests__/PHUIListViewTestCase.php',
+ 'PHUIMainMenuView' => 'view/phui/PHUIMainMenuView.php',
'PHUIObjectBoxView' => 'view/phui/PHUIObjectBoxView.php',
'PHUIObjectItemListExample' => 'applications/uiexample/examples/PHUIObjectItemListExample.php',
'PHUIObjectItemListView' => 'view/phui/PHUIObjectItemListView.php',
@@ -1723,6 +1724,7 @@
'PhabricatorAuthListController' => 'applications/auth/controller/config/PhabricatorAuthListController.php',
'PhabricatorAuthLoginController' => 'applications/auth/controller/PhabricatorAuthLoginController.php',
'PhabricatorAuthLoginHandler' => 'applications/auth/handler/PhabricatorAuthLoginHandler.php',
+ 'PhabricatorAuthMainMenuBarExtension' => 'applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php',
'PhabricatorAuthManagementCachePKCS8Workflow' => 'applications/auth/management/PhabricatorAuthManagementCachePKCS8Workflow.php',
'PhabricatorAuthManagementLDAPWorkflow' => 'applications/auth/management/PhabricatorAuthManagementLDAPWorkflow.php',
'PhabricatorAuthManagementListFactorsWorkflow' => 'applications/auth/management/PhabricatorAuthManagementListFactorsWorkflow.php',
@@ -2363,6 +2365,7 @@
'PhabricatorHelpDocumentationController' => 'applications/help/controller/PhabricatorHelpDocumentationController.php',
'PhabricatorHelpEditorProtocolController' => 'applications/help/controller/PhabricatorHelpEditorProtocolController.php',
'PhabricatorHelpKeyboardShortcutController' => 'applications/help/controller/PhabricatorHelpKeyboardShortcutController.php',
+ 'PhabricatorHelpMainMenuBarExtension' => 'applications/help/extension/PhabricatorHelpMainMenuBarExtension.php',
'PhabricatorHeraldApplication' => 'applications/herald/application/PhabricatorHeraldApplication.php',
'PhabricatorHighSecurityRequestExceptionHandler' => 'aphront/handler/PhabricatorHighSecurityRequestExceptionHandler.php',
'PhabricatorHomeApplication' => 'applications/home/application/PhabricatorHomeApplication.php',
@@ -2480,6 +2483,7 @@
'PhabricatorMailSetupCheck' => 'applications/config/check/PhabricatorMailSetupCheck.php',
'PhabricatorMailTarget' => 'applications/metamta/replyhandler/PhabricatorMailTarget.php',
'PhabricatorMailgunConfigOptions' => 'applications/config/option/PhabricatorMailgunConfigOptions.php',
+ 'PhabricatorMainMenuBarExtension' => 'view/page/menu/PhabricatorMainMenuBarExtension.php',
'PhabricatorMainMenuSearchView' => 'view/page/menu/PhabricatorMainMenuSearchView.php',
'PhabricatorMainMenuView' => 'view/page/menu/PhabricatorMainMenuView.php',
'PhabricatorManagementWorkflow' => 'infrastructure/management/PhabricatorManagementWorkflow.php',
@@ -2724,6 +2728,7 @@
'PhabricatorPeopleLogQuery' => 'applications/people/query/PhabricatorPeopleLogQuery.php',
'PhabricatorPeopleLogSearchEngine' => 'applications/people/query/PhabricatorPeopleLogSearchEngine.php',
'PhabricatorPeopleLogsController' => 'applications/people/controller/PhabricatorPeopleLogsController.php',
+ 'PhabricatorPeopleMainMenuBarExtension' => 'applications/people/extension/PhabricatorPeopleMainMenuBarExtension.php',
'PhabricatorPeopleNewController' => 'applications/people/controller/PhabricatorPeopleNewController.php',
'PhabricatorPeopleNoOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleNoOwnerDatasource.php',
'PhabricatorPeopleOwnerDatasource' => 'applications/people/typeahead/PhabricatorPeopleOwnerDatasource.php',
@@ -3091,6 +3096,7 @@
'PhabricatorSettingsAdjustController' => 'applications/settings/controller/PhabricatorSettingsAdjustController.php',
'PhabricatorSettingsApplication' => 'applications/settings/application/PhabricatorSettingsApplication.php',
'PhabricatorSettingsMainController' => 'applications/settings/controller/PhabricatorSettingsMainController.php',
+ 'PhabricatorSettingsMainMenuBarExtension' => 'applications/settings/extension/PhabricatorSettingsMainMenuBarExtension.php',
'PhabricatorSettingsPanel' => 'applications/settings/panel/PhabricatorSettingsPanel.php',
'PhabricatorSetupCheck' => 'applications/config/check/PhabricatorSetupCheck.php',
'PhabricatorSetupCheckTestCase' => 'applications/config/check/__tests__/PhabricatorSetupCheckTestCase.php',
@@ -5615,6 +5621,7 @@
'PHUIListItemView' => 'AphrontTagView',
'PHUIListView' => 'AphrontTagView',
'PHUIListViewTestCase' => 'PhabricatorTestCase',
+ 'PHUIMainMenuView' => 'AphrontView',
'PHUIObjectBoxView' => 'AphrontView',
'PHUIObjectItemListExample' => 'PhabricatorUIExample',
'PHUIObjectItemListView' => 'AphrontTagView',
@@ -5863,6 +5870,7 @@
'PhabricatorAuthListController' => 'PhabricatorAuthProviderConfigController',
'PhabricatorAuthLoginController' => 'PhabricatorAuthController',
'PhabricatorAuthLoginHandler' => 'Phobject',
+ 'PhabricatorAuthMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
'PhabricatorAuthManagementCachePKCS8Workflow' => 'PhabricatorAuthManagementWorkflow',
'PhabricatorAuthManagementLDAPWorkflow' => 'PhabricatorAuthManagementWorkflow',
'PhabricatorAuthManagementListFactorsWorkflow' => 'PhabricatorAuthManagementWorkflow',
@@ -6630,6 +6638,7 @@
'PhabricatorHelpDocumentationController' => 'PhabricatorHelpController',
'PhabricatorHelpEditorProtocolController' => 'PhabricatorHelpController',
'PhabricatorHelpKeyboardShortcutController' => 'PhabricatorHelpController',
+ 'PhabricatorHelpMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
'PhabricatorHeraldApplication' => 'PhabricatorApplication',
'PhabricatorHighSecurityRequestExceptionHandler' => 'PhabricatorRequestExceptionHandler',
'PhabricatorHomeApplication' => 'PhabricatorApplication',
@@ -6747,6 +6756,7 @@
'PhabricatorMailSetupCheck' => 'PhabricatorSetupCheck',
'PhabricatorMailTarget' => 'Phobject',
'PhabricatorMailgunConfigOptions' => 'PhabricatorApplicationConfigOptions',
+ 'PhabricatorMainMenuBarExtension' => 'Phobject',
'PhabricatorMainMenuSearchView' => 'AphrontView',
'PhabricatorMainMenuView' => 'AphrontView',
'PhabricatorManagementWorkflow' => 'PhutilArgumentWorkflow',
@@ -7036,6 +7046,7 @@
'PhabricatorPeopleLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorPeopleLogSearchEngine' => 'PhabricatorApplicationSearchEngine',
'PhabricatorPeopleLogsController' => 'PhabricatorPeopleController',
+ 'PhabricatorPeopleMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
'PhabricatorPeopleNewController' => 'PhabricatorPeopleController',
'PhabricatorPeopleNoOwnerDatasource' => 'PhabricatorTypeaheadDatasource',
'PhabricatorPeopleOwnerDatasource' => 'PhabricatorTypeaheadCompositeDatasource',
@@ -7487,6 +7498,7 @@
'PhabricatorSettingsAdjustController' => 'PhabricatorController',
'PhabricatorSettingsApplication' => 'PhabricatorApplication',
'PhabricatorSettingsMainController' => 'PhabricatorController',
+ 'PhabricatorSettingsMainMenuBarExtension' => 'PhabricatorMainMenuBarExtension',
'PhabricatorSettingsPanel' => 'Phobject',
'PhabricatorSetupCheck' => 'Phobject',
'PhabricatorSetupCheckTestCase' => 'PhabricatorTestCase',
diff --git a/src/applications/auth/application/PhabricatorAuthApplication.php b/src/applications/auth/application/PhabricatorAuthApplication.php
--- a/src/applications/auth/application/PhabricatorAuthApplication.php
+++ b/src/applications/auth/application/PhabricatorAuthApplication.php
@@ -38,48 +38,6 @@
return array();
}
- public function buildMainMenuItems(
- PhabricatorUser $user,
- PhabricatorController $controller = null) {
-
- $items = array();
-
- if ($user->isLoggedIn()) {
- $item = id(new PHUIListItemView())
- ->addClass('core-menu-item')
- ->setName(pht('Log Out'))
- ->setIcon('fa-sign-out')
- ->setWorkflow(true)
- ->setHref('/logout/')
- ->setSelected(($controller instanceof PhabricatorLogoutController))
- ->setAural(pht('Log Out'))
- ->setOrder(900);
- $items[] = $item;
- } else {
- if ($controller instanceof PhabricatorAuthController) {
- // Don't show the "Login" item on auth controllers, since they're
- // generally all related to logging in anyway.
- } else {
- $uri = new PhutilURI('/auth/start/');
- if ($controller) {
- $path = $controller->getRequest()->getPath();
- $uri->setQueryParam('next', $path);
- }
- $item = id(new PHUIListItemView())
- ->addClass('core-menu-item')
- ->setName(pht('Log In'))
- // TODO: Login icon?
- ->setIcon('fa-sign-in')
- ->setHref($uri)
- ->setAural(pht('Log In'))
- ->setOrder(900);
- $items[] = $item;
- }
- }
-
- return $items;
- }
-
public function getApplicationGroup() {
return self::GROUP_ADMIN;
}
diff --git a/src/applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php b/src/applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php
new file mode 100644
--- /dev/null
+++ b/src/applications/auth/extension/PhabricatorAuthMainMenuBarExtension.php
@@ -0,0 +1,73 @@
+<?php
+
+final class PhabricatorAuthMainMenuBarExtension
+ extends PhabricatorMainMenuBarExtension {
+
+ const MAINMENUBARKEY = 'auth';
+
+ public function isExtensionEnabledForViewer(PhabricatorUser $viewer) {
+ return true;
+ }
+
+ public function buildMainMenus() {
+ $viewer = $this->getViewer();
+
+ if ($viewer->isLoggedIn()) {
+ return array(
+ $this->buildLogoutMenu(),
+ );
+ }
+
+ $controller = $this->getController();
+ if ($controller instanceof PhabricatorAuthController) {
+ // Don't show the "Login" item on auth controllers, since they're
+ // generally all related to logging in anyway.
+ return array();
+ }
+
+ return array(
+ $this->buildLoginMenu(),
+ );
+ }
+
+ private function buildLogoutMenu() {
+ $controller = $this->getController();
+
+ $is_selected = ($controller instanceof PhabricatorLogoutController);
+
+ $bar_item = id(new PHUIListItemView())
+ ->addClass('core-menu-item')
+ ->setName(pht('Log Out'))
+ ->setIcon('fa-sign-out')
+ ->setWorkflow(true)
+ ->setHref('/logout/')
+ ->setSelected($is_selected)
+ ->setAural(pht('Log Out'));
+
+ return id(new PHUIMainMenuView())
+ ->setOrder(900)
+ ->setMenuBarItem($bar_item);
+ }
+
+ private function buildLoginMenu() {
+ $controller = $this->getController();
+
+ $uri = new PhutilURI('/auth/start/');
+ if ($controller) {
+ $path = $controller->getRequest()->getPath();
+ $uri->setQueryParam('next', $path);
+ }
+
+ $bar_item = id(new PHUIListItemView())
+ ->addClass('core-menu-item')
+ ->setName(pht('Log In'))
+ ->setIcon('fa-sign-in')
+ ->setHref($uri)
+ ->setAural(pht('Log In'));
+
+ return id(new PHUIMainMenuView())
+ ->setOrder(900)
+ ->setMenuBarItem($bar_item);
+ }
+
+}
diff --git a/src/applications/help/application/PhabricatorHelpApplication.php b/src/applications/help/application/PhabricatorHelpApplication.php
--- a/src/applications/help/application/PhabricatorHelpApplication.php
+++ b/src/applications/help/application/PhabricatorHelpApplication.php
@@ -25,84 +25,4 @@
);
}
- public function buildMainMenuItems(
- PhabricatorUser $user,
- PhabricatorController $controller = null) {
-
- $application = null;
- if ($controller) {
- $application = $controller->getCurrentApplication();
- }
-
- $items = array();
-
- $help_id = celerity_generate_unique_node_id();
-
- Javelin::initBehavior(
- 'aphlict-dropdown',
- array(
- 'bubbleID' => $help_id,
- 'dropdownID' => 'phabricator-help-menu',
- 'applicationClass' => __CLASS__,
- 'local' => true,
- 'desktop' => true,
- 'right' => true,
- ));
-
- $item = id(new PHUIListItemView())
- ->setIcon('fa-life-ring')
- ->addClass('core-menu-item')
- ->setID($help_id)
- ->setOrder(200);
-
- $hide = true;
- if ($application) {
- $help_name = pht('%s Help', $application->getName());
- $item
- ->setName($help_name)
- ->setHref('/help/documentation/'.get_class($application).'/')
- ->setAural($help_name);
- $help_items = $application->getHelpMenuItems($user);
- if ($help_items) {
- $hide = false;
- }
- }
- if ($hide) {
- $item->setStyle('display: none');
- }
- $items[] = $item;
-
- return $items;
- }
-
- public function buildMainMenuExtraNodes(
- PhabricatorUser $viewer,
- PhabricatorController $controller = null) {
-
- $application = null;
- if ($controller) {
- $application = $controller->getCurrentApplication();
- }
-
- $view = null;
- if ($application) {
- $help_items = $application->getHelpMenuItems($viewer);
- if ($help_items) {
- $view = new PHUIListView();
- foreach ($help_items as $item) {
- $view->addMenuItem($item);
- }
- }
- }
-
- return phutil_tag(
- 'div',
- array(
- 'id' => 'phabricator-help-menu',
- 'class' => 'phabricator-main-menu-dropdown phui-list-sidenav',
- 'style' => 'display: none',
- ),
- $view);
- }
-
}
diff --git a/src/applications/help/extension/PhabricatorHelpMainMenuBarExtension.php b/src/applications/help/extension/PhabricatorHelpMainMenuBarExtension.php
new file mode 100644
--- /dev/null
+++ b/src/applications/help/extension/PhabricatorHelpMainMenuBarExtension.php
@@ -0,0 +1,70 @@
+<?php
+
+final class PhabricatorHelpMainMenuBarExtension
+ extends PhabricatorMainMenuBarExtension {
+
+ const MAINMENUBARKEY = 'help';
+
+ public function isExtensionEnabledForViewer(PhabricatorUser $viewer) {
+ return true;
+ }
+
+ public function buildMainMenus() {
+ $application = $this->getApplication();
+ if (!$application) {
+ return array();
+ }
+
+ $viewer = $this->getViewer();
+ $help_links = $application->getHelpMenuItems($viewer);
+ if (!$help_links) {
+ return array();
+ }
+
+ $help_id = celerity_generate_unique_node_id();
+
+ Javelin::initBehavior(
+ 'aphlict-dropdown',
+ array(
+ 'bubbleID' => $help_id,
+ 'dropdownID' => 'phabricator-help-menu',
+ 'local' => true,
+ 'desktop' => true,
+ 'right' => true,
+ ));
+
+ $help_name = pht('%s Help', $application->getName());
+
+ $help_item = id(new PHUIListItemView())
+ ->setIcon('fa-life-ring')
+ ->addClass('core-menu-item')
+ ->setID($help_id)
+ ->setName($help_name)
+ ->setHref('/help/documentation/'.get_class($application).'/')
+ ->setAural($help_name);
+
+ $view = new PHUIListView();
+ foreach ($help_links as $help_link) {
+ $view->addMenuItem($help_link);
+ }
+
+ $dropdown_menu = phutil_tag(
+ 'div',
+ array(
+ 'id' => 'phabricator-help-menu',
+ 'class' => 'phabricator-main-menu-dropdown phui-list-sidenav',
+ 'style' => 'display: none',
+ ),
+ $view);
+
+ $help_menu = id(new PHUIMainMenuView())
+ ->setOrder(200)
+ ->setMenuBarItem($help_item)
+ ->appendChild($dropdown_menu);
+
+ return array(
+ $help_menu,
+ );
+ }
+
+}
diff --git a/src/applications/people/application/PhabricatorPeopleApplication.php b/src/applications/people/application/PhabricatorPeopleApplication.php
--- a/src/applications/people/application/PhabricatorPeopleApplication.php
+++ b/src/applications/people/application/PhabricatorPeopleApplication.php
@@ -123,48 +123,6 @@
return $status;
}
- public function buildMainMenuItems(
- PhabricatorUser $user,
- PhabricatorController $controller = null) {
-
- $items = array();
-
- if ($user->isLoggedIn() && $user->isUserActivated()) {
- $profile = id(new PhabricatorPeopleQuery())
- ->setViewer($user)
- ->needProfileImage(true)
- ->withPHIDs(array($user->getPHID()))
- ->executeOne();
- $image = $profile->getProfileImageURI();
-
- $item = id(new PHUIListItemView())
- ->setName($user->getUsername())
- ->setHref('/p/'.$user->getUsername().'/')
- ->addClass('core-menu-item')
- ->setAural(pht('Profile'))
- ->setOrder(100);
-
- $classes = array(
- 'phabricator-core-menu-icon',
- 'phabricator-core-menu-profile-image',
- );
-
- $item->appendChild(
- phutil_tag(
- 'span',
- array(
- 'class' => implode(' ', $classes),
- 'style' => 'background-image: url('.$image.')',
- ),
- ''));
-
- $items[] = $item;
- }
-
- return $items;
- }
-
-
public function getQuickCreateItems(PhabricatorUser $viewer) {
$items = array();
diff --git a/src/applications/people/extension/PhabricatorPeopleMainMenuBarExtension.php b/src/applications/people/extension/PhabricatorPeopleMainMenuBarExtension.php
new file mode 100644
--- /dev/null
+++ b/src/applications/people/extension/PhabricatorPeopleMainMenuBarExtension.php
@@ -0,0 +1,49 @@
+<?php
+
+final class PhabricatorPeopleMainMenuBarExtension
+ extends PhabricatorMainMenuBarExtension {
+
+ const MAINMENUBARKEY = 'people';
+
+ public function buildMainMenus() {
+ $viewer = $this->getViewer();
+
+ // TODO: This should get cached.
+
+ $profile = id(new PhabricatorPeopleQuery())
+ ->setViewer($viewer)
+ ->needProfileImage(true)
+ ->withPHIDs(array($viewer->getPHID()))
+ ->executeOne();
+ $image = $profile->getProfileImageURI();
+
+ $bar_item = id(new PHUIListItemView())
+ ->setName($viewer->getUsername())
+ ->setHref('/p/'.$viewer->getUsername().'/')
+ ->addClass('core-menu-item')
+ ->setAural(pht('Profile'));
+
+ $classes = array(
+ 'phabricator-core-menu-icon',
+ 'phabricator-core-menu-profile-image',
+ );
+
+ $bar_item->appendChild(
+ phutil_tag(
+ 'span',
+ array(
+ 'class' => implode(' ', $classes),
+ 'style' => 'background-image: url('.$image.')',
+ ),
+ ''));
+
+ $profile_menu = id(new PHUIMainMenuView())
+ ->setOrder(100)
+ ->setMenuBarItem($bar_item);
+
+ return array(
+ $profile_menu,
+ );
+ }
+
+}
diff --git a/src/applications/settings/application/PhabricatorSettingsApplication.php b/src/applications/settings/application/PhabricatorSettingsApplication.php
--- a/src/applications/settings/application/PhabricatorSettingsApplication.php
+++ b/src/applications/settings/application/PhabricatorSettingsApplication.php
@@ -40,26 +40,4 @@
return self::GROUP_UTILITIES;
}
- public function buildMainMenuItems(
- PhabricatorUser $user,
- PhabricatorController $controller = null) {
-
- $items = array();
-
- if ($user->isLoggedIn() && $user->isUserActivated()) {
- $selected = ($controller instanceof PhabricatorSettingsMainController);
- $item = id(new PHUIListItemView())
- ->setName(pht('Settings'))
- ->setIcon('fa-wrench')
- ->addClass('core-menu-item')
- ->setSelected($selected)
- ->setHref('/settings/')
- ->setAural(pht('Settings'))
- ->setOrder(400);
- $items[] = $item;
- }
-
- return $items;
- }
-
}
diff --git a/src/applications/settings/extension/PhabricatorSettingsMainMenuBarExtension.php b/src/applications/settings/extension/PhabricatorSettingsMainMenuBarExtension.php
new file mode 100644
--- /dev/null
+++ b/src/applications/settings/extension/PhabricatorSettingsMainMenuBarExtension.php
@@ -0,0 +1,29 @@
+<?php
+
+final class PhabricatorSettingsMainMenuBarExtension
+ extends PhabricatorMainMenuBarExtension {
+
+ const MAINMENUBARKEY = 'settings';
+
+ public function buildMainMenus() {
+ $controller = $this->getController();
+ $is_selected = ($controller instanceof PhabricatorSettingsMainController);
+
+ $bar_item = id(new PHUIListItemView())
+ ->setName(pht('Settings'))
+ ->setIcon('fa-wrench')
+ ->addClass('core-menu-item')
+ ->setSelected($is_selected)
+ ->setHref('/settings/')
+ ->setAural(pht('Settings'));
+
+ $settings_menu = id(new PHUIMainMenuView())
+ ->setMenuBarItem($bar_item)
+ ->setOrder(400);
+
+ return array(
+ $settings_menu,
+ );
+ }
+
+}
diff --git a/src/view/page/menu/PhabricatorMainMenuBarExtension.php b/src/view/page/menu/PhabricatorMainMenuBarExtension.php
new file mode 100644
--- /dev/null
+++ b/src/view/page/menu/PhabricatorMainMenuBarExtension.php
@@ -0,0 +1,88 @@
+<?php
+
+abstract class PhabricatorMainMenuBarExtension extends Phobject {
+
+ private $viewer;
+ private $application;
+ private $controller;
+
+ public function setViewer(PhabricatorUser $viewer) {
+ $this->viewer = $viewer;
+ return $this;
+ }
+
+ public function getViewer() {
+ return $this->viewer;
+ }
+
+ public function setApplication(PhabricatorApplication $application) {
+ $this->application = $application;
+ return $this;
+ }
+
+ public function getApplication() {
+ return $this->application;
+ }
+
+ public function setController(PhabricatorController $controller) {
+ $this->controller = $controller;
+ return $this;
+ }
+
+ public function getController() {
+ return $this->controller;
+ }
+
+ final public function getExtensionKey() {
+ return $this->getPhobjectClassConstant('MAINMENUBARKEY');
+ }
+
+ public function isExtensionEnabled() {
+ return true;
+ }
+
+ public function isExtensionEnabledForViewer(PhabricatorUser $viewer) {
+ if (!$viewer->isLoggedIn()) {
+ return false;
+ }
+
+ if (!$viewer->isUserActivated()) {
+ return false;
+ }
+
+ // Don't show menus for users with partial sessions. This usually means
+ // they have logged in but have not made it through MFA, so we don't want
+ // to show notification counts, saved queries, etc.
+ if (!$viewer->hasSession()) {
+ return false;
+ }
+
+ if ($viewer->getSession()->getIsPartial()) {
+ return false;
+ }
+
+ return true;
+ }
+
+ abstract public function buildMainMenus();
+
+ final public static function getAllExtensions() {
+ return id(new PhutilClassMapQuery())
+ ->setAncestorClass(__CLASS__)
+ ->setUniqueMethod('getExtensionKey')
+ ->execute();
+ }
+
+ final public static function getAllEnabledExtensions() {
+ $extensions = self::getAllExtensions();
+
+ foreach ($extensions as $key => $extension) {
+ if (!$extension->isExtensionEnabled()) {
+ unset($extensions[$key]);
+ }
+ }
+
+ return $extensions;
+ }
+
+}
diff --git a/src/view/page/menu/PhabricatorMainMenuView.php b/src/view/page/menu/PhabricatorMainMenuView.php
--- a/src/view/page/menu/PhabricatorMainMenuView.php
+++ b/src/view/page/menu/PhabricatorMainMenuView.php
@@ -30,7 +30,7 @@
require_celerity_resource('sprite-main-header-css');
$header_id = celerity_generate_unique_node_id();
- $menus = array();
+ $menu_bar = array();
$alerts = array();
$search_button = '';
$app_button = '';
@@ -41,7 +41,7 @@
if (array_filter($menu)) {
$alerts[] = $menu;
}
- $menus = array_merge($menus, $dropdowns);
+ $menu_bar = array_merge($menu_bar, $dropdowns);
$app_button = $this->renderApplicationMenuButton($header_id);
$search_button = $this->renderSearchMenuButton($header_id);
} else {
@@ -73,13 +73,69 @@
}
$applications = PhabricatorApplication::getAllInstalledApplications();
+
+ $menus = array();
+ $controller = $this->getController();
foreach ($applications as $application) {
- $menus[] = $application->buildMainMenuExtraNodes(
+ $app_actions = $application->buildMainMenuItems(
+ $user,
+ $controller);
+ $app_extra = $application->buildMainMenuExtraNodes(
$user,
- $this->getController());
+ $controller);
+
+ foreach ($app_actions as $action) {
+ $menus[] = id(new PHUIMainMenuView())
+ ->setMenuBarItem($action)
+ ->setOrder($action->getOrder());
+ }
+
+ if ($app_extra !== null) {
+ $menus[] = id(new PHUIMainMenuView())
+ ->appendChild($app_extra);
+ }
+ }
+
+ $extensions = PhabricatorMainMenuBarExtension::getAllEnabledExtensions();
+ foreach ($extensions as $extension) {
+ $extension->setViewer($user);
+
+ $controller = $this->getController();
+ if ($controller) {
+ $extension->setController($controller);
+ $application = $controller->getCurrentApplication();
+ if ($application) {
+ $extension->setApplication($application);
+ }
+ }
+ }
+
+ foreach ($extensions as $key => $extension) {
+ if (!$extension->isExtensionEnabledForViewer($extension->getViewer())) {
+ unset($extensions[$key]);
+ }
+ }
+
+ foreach ($extensions as $extension) {
+ foreach ($extension->buildMainMenus() as $menu) {
+ $menus[] = $menu;
+ }
+ }
+
+ $menus = msort($menus, 'getOrder');
+ $bar_items = array();
+ foreach ($menus as $menu) {
+ $menu_bar[] = $menu;
+
+ $item = $menu->getMenuBarItem();
+ if ($item === null) {
+ continue;
+ }
+
+ $bar_items[] = $item;
}
- $application_menu = $this->renderApplicationMenu();
+ $application_menu = $this->renderApplicationMenu($bar_items);
$classes = array();
$classes[] = 'phabricator-main-menu sprite-main-header';
$classes[] = 'phabricator-main-menu-background';
@@ -98,7 +154,7 @@
$aural,
$application_menu,
$search_menu,
- $menus,
+ $menu_bar,
));
}
@@ -174,21 +230,8 @@
''));
}
- public function renderApplicationMenu() {
+ private function renderApplicationMenu(array $bar_items) {
$user = $this->getUser();
- $controller = $this->getController();
-
- $applications = PhabricatorApplication::getAllInstalledApplications();
-
- $actions = array();
- foreach ($applications as $application) {
- $app_actions = $application->buildMainMenuItems($user, $controller);
- foreach ($app_actions as $action) {
- $actions[] = $action;
- }
- }
-
- $actions = msort($actions, 'getOrder');
$view = $this->getApplicationMenu();
@@ -199,13 +242,13 @@
$view->addClass('phabricator-dark-menu');
$view->addClass('phabricator-application-menu');
- if ($actions) {
+ if ($bar_items) {
$view->addMenuItem(
id(new PHUIListItemView())
->setType(PHUIListItemView::TYPE_LABEL)
->setName(pht('Actions')));
- foreach ($actions as $action) {
- $view->addMenuItem($action);
+ foreach ($bar_items as $bar_item) {
+ $view->addMenuItem($bar_item);
}
}
diff --git a/src/view/phui/PHUIMainMenuView.php b/src/view/phui/PHUIMainMenuView.php
new file mode 100644
--- /dev/null
+++ b/src/view/phui/PHUIMainMenuView.php
@@ -0,0 +1,31 @@
+<?php
+
+final class PHUIMainMenuView extends AphrontView {
+
+ private $menuItem;
+ private $extraContent = array();
+ private $order;
+
+ public function setMenuBarItem(PHUIListItemView $menu_item) {
+ $this->menuItem = $menu_item;
+ return $this;
+ }
+
+ public function getMenuBarItem() {
+ return $this->menuItem;
+ }
+
+ public function setOrder($order) {
+ $this->order = $order;
+ return $this;
+ }
+
+ public function getOrder() {
+ return $this->order;
+ }
+
+ public function render() {
+ return $this->renderChildren();
+ }
+
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Mar 7, 6:50 AM (4 d, 11 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7325007
Default Alt Text
D14922.id36057.diff (27 KB)
Attached To
Mode
D14922: Begin modularizing main menu items
Attached
Detach File
Event Timeline
Log In to Comment