[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/view/page/menu/ -> PhabricatorMainMenuView.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1