@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final class PeopleMainMenuBarExtension
4 extends PhabricatorMainMenuBarExtension {
5
6 const MAINMENUBARKEY = 'user';
7
8 public function isExtensionEnabledForViewer(PhabricatorUser $viewer) {
9 return $viewer->isLoggedIn();
10 }
11
12 public function shouldRequireFullSession() {
13 return false;
14 }
15
16 public function getExtensionOrder() {
17 return 1200;
18 }
19
20 public function buildMainMenus() {
21 $viewer = $this->getViewer();
22 $application = $this->getApplication();
23 $dropdown_menu = $this->newDropdown($viewer, $application);
24
25 $menu_id = celerity_generate_unique_node_id();
26
27 Javelin::initBehavior(
28 'user-menu',
29 array(
30 'menuID' => $menu_id,
31 'menu' => $dropdown_menu->getDropdownMenuMetadata(),
32 ));
33
34 $image = $viewer->getProfileImageURI();
35 $profile_image = id(new PHUIIconView())
36 ->setImage($image)
37 ->setHeadSize(PHUIIconView::HEAD_SMALL);
38
39 $user_menu = id(new PHUIButtonView())
40 ->setID($menu_id)
41 ->setTag('a')
42 ->setHref('/p/'.$viewer->getUsername().'/')
43 ->setIcon($profile_image)
44 ->addClass('phabricator-core-user-menu')
45 ->setHasCaret(true)
46 ->setNoCSS(true)
47 ->setAuralLabel(pht('Account Menu'));
48
49 return array(
50 $user_menu,
51 );
52 }
53
54 private function newDropdown(
55 PhabricatorUser $viewer,
56 $application) {
57
58 $person_to_show = id(new PHUIObjectItemView())
59 ->setObjectName($viewer->getRealName())
60 ->setSubHead($viewer->getUsername())
61 ->setImageURI($viewer->getProfileImageURI());
62
63 $user_view = id(new PHUIObjectItemListView())
64 ->setViewer($viewer)
65 ->setFlush(true)
66 ->setSimple(true)
67 ->addItem($person_to_show)
68 ->addClass('phabricator-core-user-profile-object');
69
70 $view = id(new PhabricatorActionListView())
71 ->setViewer($viewer);
72
73 if ($this->getIsFullSession()) {
74 $view->addAction(
75 id(new PhabricatorActionView())
76 ->appendChild($user_view));
77
78 $view->addAction(
79 id(new PhabricatorActionView())
80 ->setType(PhabricatorActionView::TYPE_DIVIDER));
81
82 $view->addAction(
83 id(new PhabricatorActionView())
84 ->setName(pht('Profile'))
85 ->setHref('/p/'.$viewer->getUsername().'/'));
86
87 $view->addAction(
88 id(new PhabricatorActionView())
89 ->setName(pht('Settings'))
90 ->setHref('/settings/user/'.$viewer->getUsername().'/'));
91
92 $view->addAction(
93 id(new PhabricatorActionView())
94 ->setName(pht('Manage'))
95 ->setHref('/people/manage/'.$viewer->getID().'/'));
96
97 if ($application) {
98 $help_links = $application->getHelpMenuItems($viewer);
99 if ($help_links) {
100 foreach ($help_links as $link) {
101 $view->addAction($link);
102 }
103 }
104 }
105
106 $view->addAction(
107 id(new PhabricatorActionView())
108 ->addSigil('logout-item')
109 ->setType(PhabricatorActionView::TYPE_DIVIDER));
110 }
111
112 $view->addAction(
113 id(new PhabricatorActionView())
114 ->setName(pht('Log Out %s', $viewer->getUsername()))
115 ->addSigil('logout-item')
116 ->setHref('/logout/')
117 ->setWorkflow(true));
118
119 return $view;
120 }
121
122}