[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorMainMenuView extends AphrontView { 4 5 private $controller; 6 private $applicationMenu; 7 8 public function setApplicationMenu(PHUIListView $application_menu) { 9 $this->applicationMenu = $application_menu; 10 return $this; 11 } 12 13 public function getApplicationMenu() { 14 return $this->applicationMenu; 15 } 16 17 public function setController(PhabricatorController $controller) { 18 $this->controller = $controller; 19 return $this; 20 } 21 22 public function getController() { 23 return $this->controller; 24 } 25 26 public function render() { 27 $user = $this->user; 28 29 require_celerity_resource('phabricator-main-menu-view'); 30 require_celerity_resource('sprite-main-header-css'); 31 32 $header_id = celerity_generate_unique_node_id(); 33 $menus = array(); 34 $alerts = array(); 35 $search_button = ''; 36 $app_button = ''; 37 $aural = null; 38 39 if ($user->isLoggedIn() && $user->isUserActivated()) { 40 list($menu, $dropdowns, $aural) = $this->renderNotificationMenu(); 41 if (array_filter($menu)) { 42 $alerts[] = $menu; 43 } 44 $menus = array_merge($menus, $dropdowns); 45 $app_button = $this->renderApplicationMenuButton($header_id); 46 $search_button = $this->renderSearchMenuButton($header_id); 47 } else { 48 $app_button = $this->renderApplicationMenuButton($header_id); 49 if (PhabricatorEnv::getEnvConfig('policy.allow-public')) { 50 $search_button = $this->renderSearchMenuButton($header_id); 51 } 52 } 53 54 $search_menu = $this->renderPhabricatorSearchMenu(); 55 56 if ($alerts) { 57 $alerts = javelin_tag( 58 'div', 59 array( 60 'class' => 'phabricator-main-menu-alerts', 61 'aural' => false, 62 ), 63 $alerts); 64 } 65 66 if ($aural) { 67 $aural = javelin_tag( 68 'span', 69 array( 70 'aural' => true, 71 ), 72 phutil_implode_html(' ', $aural)); 73 } 74 75 $application_menu = $this->renderApplicationMenu(); 76 $classes = array(); 77 $classes[] = 'phabricator-main-menu'; 78 $classes[] = 'sprite-main-header'; 79 $classes[] = 'main-header-'.PhabricatorEnv::getEnvConfig('ui.header-color'); 80 81 return phutil_tag( 82 'div', 83 array( 84 'class' => implode(' ', $classes), 85 'id' => $header_id, 86 ), 87 array( 88 $app_button, 89 $search_button, 90 $this->renderPhabricatorLogo(), 91 $alerts, 92 $aural, 93 $application_menu, 94 $search_menu, 95 $menus, 96 )); 97 } 98 99 private function renderSearch() { 100 $user = $this->user; 101 102 $result = null; 103 104 $keyboard_config = array( 105 'helpURI' => '/help/keyboardshortcut/', 106 ); 107 108 if ($user->isLoggedIn()) { 109 $show_search = $user->isUserActivated(); 110 } else { 111 $show_search = PhabricatorEnv::getEnvConfig('policy.allow-public'); 112 } 113 114 if ($show_search) { 115 $search = new PhabricatorMainMenuSearchView(); 116 $search->setUser($user); 117 $result = $search; 118 119 $pref_shortcut = PhabricatorUserPreferences::PREFERENCE_SEARCH_SHORTCUT; 120 if ($user->loadPreferences()->getPreference($pref_shortcut, true)) { 121 $keyboard_config['searchID'] = $search->getID(); 122 } 123 } 124 125 Javelin::initBehavior('phabricator-keyboard-shortcuts', $keyboard_config); 126 127 if ($result) { 128 $result = id(new PHUIListItemView()) 129 ->addClass('phabricator-main-menu-search') 130 ->appendChild($result); 131 } 132 133 return $result; 134 } 135 136 public function renderApplicationMenuButton($header_id) { 137 $button_id = celerity_generate_unique_node_id(); 138 return javelin_tag( 139 'a', 140 array( 141 'class' => 'phabricator-main-menu-expand-button '. 142 'phabricator-expand-search-menu', 143 'sigil' => 'jx-toggle-class', 144 'meta' => array( 145 'map' => array( 146 $header_id => 'phabricator-application-menu-expanded', 147 $button_id => 'menu-icon-app-blue', 148 ), 149 ), 150 ), 151 phutil_tag( 152 'span', 153 array( 154 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-app', 155 'id' => $button_id, 156 ), 157 '')); 158 } 159 160 public function renderApplicationMenu() { 161 $user = $this->getUser(); 162 $controller = $this->getController(); 163 164 $applications = PhabricatorApplication::getAllInstalledApplications(); 165 166 $actions = array(); 167 foreach ($applications as $application) { 168 $app_actions = $application->buildMainMenuItems($user, $controller); 169 foreach ($app_actions as $action) { 170 $actions[] = $action; 171 } 172 } 173 174 $actions = msort($actions, 'getOrder'); 175 176 $view = $this->getApplicationMenu(); 177 178 if (!$view) { 179 $view = new PHUIListView(); 180 } 181 182 $view->addClass('phabricator-dark-menu'); 183 $view->addClass('phabricator-application-menu'); 184 185 if ($actions) { 186 $view->addMenuItem( 187 id(new PHUIListItemView()) 188 ->setType(PHUIListItemView::TYPE_LABEL) 189 ->setName(pht('Actions'))); 190 foreach ($actions as $action) { 191 $icon = $action->getIcon(); 192 if ($icon) { 193 $action->appendChild($this->renderMenuIcon($icon)); 194 } 195 $view->addMenuItem($action); 196 } 197 } 198 199 return $view; 200 } 201 202 public function renderSearchMenuButton($header_id) { 203 $button_id = celerity_generate_unique_node_id(); 204 return javelin_tag( 205 'a', 206 array( 207 'class' => 'phabricator-main-menu-search-button '. 208 'phabricator-expand-application-menu', 209 'sigil' => 'jx-toggle-class', 210 'meta' => array( 211 'map' => array( 212 $header_id => 'phabricator-search-menu-expanded', 213 $button_id => 'menu-icon-search-blue', 214 ), 215 ), 216 ), 217 phutil_tag( 218 'span', 219 array( 220 'class' => 'phabricator-menu-button-icon sprite-menu menu-icon-search', 221 'id' => $button_id, 222 ), 223 '')); 224 } 225 226 private function renderPhabricatorSearchMenu() { 227 228 $view = new PHUIListView(); 229 $view->addClass('phabricator-dark-menu'); 230 $view->addClass('phabricator-search-menu'); 231 232 $search = $this->renderSearch(); 233 if ($search) { 234 $view->addMenuItem($search); 235 } 236 237 return $view; 238 } 239 240 private function renderPhabricatorLogo() { 241 242 return phutil_tag( 243 'a', 244 array( 245 'class' => 'phabricator-main-menu-brand', 246 'href' => '/', 247 ), 248 array( 249 javelin_tag( 250 'span', 251 array( 252 'aural' => true, 253 ), 254 pht('Home')), 255 phutil_tag( 256 'span', 257 array( 258 'class' => 'sprite-menu phabricator-main-menu-eye', 259 ), 260 ''), 261 phutil_tag( 262 'span', 263 array( 264 'class' => 'sprite-menu phabricator-main-menu-logo', 265 ), 266 ''), 267 )); 268 } 269 270 private function renderNotificationMenu() { 271 $user = $this->user; 272 273 require_celerity_resource('phabricator-notification-css'); 274 require_celerity_resource('phabricator-notification-menu-css'); 275 require_celerity_resource('sprite-menu-css'); 276 277 $container_classes = array( 278 'sprite-menu', 279 'alert-notifications', 280 ); 281 282 $aural = array(); 283 284 $message_tag = ''; 285 $message_notification_dropdown = ''; 286 $conpherence = 'PhabricatorConpherenceApplication'; 287 if (PhabricatorApplication::isClassInstalledForViewer( 288 $conpherence, 289 $user)) { 290 $message_id = celerity_generate_unique_node_id(); 291 $message_count_id = celerity_generate_unique_node_id(); 292 $message_dropdown_id = celerity_generate_unique_node_id(); 293 294 $unread_status = ConpherenceParticipationStatus::BEHIND; 295 $unread = id(new ConpherenceParticipantCountQuery()) 296 ->withParticipantPHIDs(array($user->getPHID())) 297 ->withParticipationStatus($unread_status) 298 ->execute(); 299 $message_count_number = idx($unread, $user->getPHID(), 0); 300 301 if ($message_count_number) { 302 $aural[] = phutil_tag( 303 'a', 304 array( 305 'href' => '/conpherence/', 306 ), 307 pht( 308 '%s unread messages.', 309 new PhutilNumber($message_count_number))); 310 } else { 311 $aural[] = pht('No messages.'); 312 } 313 314 if ($message_count_number > 999) { 315 $message_count_number = "\xE2\x88\x9E"; 316 } 317 318 $message_count_tag = phutil_tag( 319 'span', 320 array( 321 'id' => $message_count_id, 322 'class' => 'phabricator-main-menu-message-count', 323 ), 324 $message_count_number); 325 326 $message_icon_tag = phutil_tag( 327 'span', 328 array( 329 'class' => 'sprite-menu phabricator-main-menu-message-icon', 330 ), 331 ''); 332 333 if ($message_count_number) { 334 $container_classes[] = 'message-unread'; 335 } 336 337 $message_tag = phutil_tag( 338 'a', 339 array( 340 'href' => '/conpherence/', 341 'class' => implode(' ', $container_classes), 342 'id' => $message_id, 343 ), 344 array( 345 $message_icon_tag, 346 $message_count_tag, 347 )); 348 349 Javelin::initBehavior( 350 'aphlict-dropdown', 351 array( 352 'bubbleID' => $message_id, 353 'countID' => $message_count_id, 354 'dropdownID' => $message_dropdown_id, 355 'loadingText' => pht('Loading...'), 356 'uri' => '/conpherence/panel/', 357 'countType' => 'messages', 358 'countNumber' => $message_count_number, 359 )); 360 361 $message_notification_dropdown = javelin_tag( 362 'div', 363 array( 364 'id' => $message_dropdown_id, 365 'class' => 'phabricator-notification-menu', 366 'sigil' => 'phabricator-notification-menu', 367 'style' => 'display: none;', 368 ), 369 ''); 370 } 371 372 $bubble_tag = ''; 373 $notification_dropdown = ''; 374 $notification_app = 'PhabricatorNotificationsApplication'; 375 if (PhabricatorApplication::isClassInstalledForViewer( 376 $notification_app, 377 $user)) { 378 $count_id = celerity_generate_unique_node_id(); 379 $dropdown_id = celerity_generate_unique_node_id(); 380 $bubble_id = celerity_generate_unique_node_id(); 381 382 $count_number = id(new PhabricatorFeedStoryNotification()) 383 ->countUnread($user); 384 385 if ($count_number) { 386 $aural[] = phutil_tag( 387 'a', 388 array( 389 'href' => '/notification/', 390 ), 391 pht( 392 '%s unread notifications.', 393 new PhutilNumber($count_number))); 394 } else { 395 $aural[] = pht('No notifications.'); 396 } 397 398 if ($count_number > 999) { 399 $count_number = "\xE2\x88\x9E"; 400 } 401 402 $count_tag = phutil_tag( 403 'span', 404 array( 405 'id' => $count_id, 406 'class' => 'phabricator-main-menu-alert-count', 407 ), 408 $count_number); 409 410 $icon_tag = phutil_tag( 411 'span', 412 array( 413 'class' => 'sprite-menu phabricator-main-menu-alert-icon', 414 ), 415 ''); 416 417 if ($count_number) { 418 $container_classes[] = 'alert-unread'; 419 } 420 421 $bubble_tag = phutil_tag( 422 'a', 423 array( 424 'href' => '/notification/', 425 'class' => implode(' ', $container_classes), 426 'id' => $bubble_id, 427 ), 428 array($icon_tag, $count_tag)); 429 430 Javelin::initBehavior( 431 'aphlict-dropdown', 432 array( 433 'bubbleID' => $bubble_id, 434 'countID' => $count_id, 435 'dropdownID' => $dropdown_id, 436 'loadingText' => pht('Loading...'), 437 'uri' => '/notification/panel/', 438 'countType' => 'notifications', 439 'countNumber' => $count_number, 440 )); 441 442 $notification_dropdown = javelin_tag( 443 'div', 444 array( 445 'id' => $dropdown_id, 446 'class' => 'phabricator-notification-menu', 447 'sigil' => 'phabricator-notification-menu', 448 'style' => 'display: none;', 449 ), 450 ''); 451 } 452 453 $dropdowns = array( 454 $notification_dropdown, 455 $message_notification_dropdown, 456 ); 457 458 $applications = PhabricatorApplication::getAllInstalledApplications(); 459 foreach ($applications as $application) { 460 $dropdowns[] = $application->buildMainMenuExtraNodes( 461 $this->getUser(), 462 $this->getController()); 463 } 464 465 return array( 466 array( 467 $bubble_tag, 468 $message_tag, 469 ), 470 $dropdowns, 471 $aural, 472 ); 473 } 474 475 private function renderMenuIcon($name) { 476 return phutil_tag( 477 'span', 478 array( 479 'class' => 'phabricator-core-menu-icon '. 480 'sprite-menu menu-icon-'.$name, 481 ), 482 ''); 483 } 484 485 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |