Path: blob/master/src/view/page/menu/PhabricatorMainMenuSearchView.php
12242 views
<?php12final class PhabricatorMainMenuSearchView extends AphrontView {34const DEFAULT_APPLICATION_ICON = 'fa-dot-circle-o';56private $id;7private $application;89public function setApplication(PhabricatorApplication $application) {10$this->application = $application;11return $this;12}1314public function getApplication() {15return $this->application;16}1718public function getID() {19if (!$this->id) {20$this->id = celerity_generate_unique_node_id();21}22return $this->id;23}2425public function render() {26$viewer = $this->getViewer();2728$target_id = celerity_generate_unique_node_id();29$search_id = $this->getID();30$button_id = celerity_generate_unique_node_id();31$selector_id = celerity_generate_unique_node_id();32$application_id = celerity_generate_unique_node_id();3334$input = phutil_tag(35'input',36array(37'type' => 'text',38'name' => 'query',39'id' => $search_id,40'autocomplete' => 'off',41'autocorrect' => 'off',42'autocapitalize' => 'off',43'spellcheck' => 'false',44));4546$target = javelin_tag(47'div',48array(49'id' => $target_id,50'class' => 'phabricator-main-menu-search-target',51),52'');5354$search_datasource = new PhabricatorSearchDatasource();55$scope_key = PhabricatorSearchScopeSetting::SETTINGKEY;5657Javelin::initBehavior(58'phabricator-search-typeahead',59array(60'id' => $target_id,61'input' => $search_id,62'button' => $button_id,63'selectorID' => $selector_id,64'applicationID' => $application_id,65'defaultApplicationIcon' => self::DEFAULT_APPLICATION_ICON,66'appScope' => PhabricatorSearchController::SCOPE_CURRENT_APPLICATION,67'src' => $search_datasource->getDatasourceURI(),68'limit' => 10,69'placeholder' => pht('Search'),70'scopeUpdateURI' => '/settings/adjust/?key='.$scope_key,71));7273$primary_input = phutil_tag(74'input',75array(76'type' => 'hidden',77'name' => 'search:primary',78'value' => 'true',79));8081$search_text = javelin_tag(82'span',83array(84'aural' => true,85),86pht('Search'));8788$selector = $this->buildModeSelector($selector_id, $application_id);8990$form = phabricator_form(91$viewer,92array(93'action' => '/search/',94'method' => 'POST',95),96phutil_tag(97'div',98array(99'class' => 'phabricator-main-menu-search-container',100),101array(102$input,103phutil_tag(104'button',105array(106'id' => $button_id,107'class' => 'phui-icon-view phui-font-fa fa-search',108),109$search_text),110$selector,111$primary_input,112$target,113)));114115return $form;116}117118public static function getGlobalSearchScopeItems(119PhabricatorUser $viewer,120PhabricatorApplication $application = null,121$global_only = false) {122123$items = array();124$items[] = array(125'name' => pht('Search'),126);127128$items[] = array(129'icon' => 'fa-globe',130'name' => pht('All Documents'),131'value' => 'all',132);133134$application_value = null;135$application_icon = self::DEFAULT_APPLICATION_ICON;136if ($application) {137$application_value = get_class($application);138if ($application->getApplicationSearchDocumentTypes()) {139$application_icon = $application->getIcon();140}141}142143$items[] = array(144'icon' => $application_icon,145'name' => pht('Current Application'),146'value' => PhabricatorSearchController::SCOPE_CURRENT_APPLICATION,147);148149$items[] = array(150'name' => pht('Saved Queries'),151);152153154$engine = id(new PhabricatorSearchApplicationSearchEngine())155->setViewer($viewer);156$engine_queries = $engine->loadEnabledNamedQueries();157foreach ($engine_queries as $query) {158$query_key = $query->getQueryKey();159if ($query_key == 'all') {160// Skip the builtin "All" query since it's redundant with the default161// setting.162continue;163}164165// In the global "Settings" panel, we don't want to offer personal166// queries the viewer may have saved.167if ($global_only) {168if (!$query->isGlobal()) {169continue;170}171}172173$query_name = $query->getQueryName();174175$items[] = array(176'icon' => 'fa-certificate',177'name' => $query_name,178'value' => $query_key,179);180}181182$items[] = array(183'name' => pht('More Options'),184);185186$items[] = array(187'icon' => 'fa-search-plus',188'name' => pht('Advanced Search'),189'href' => '/search/query/advanced/',190);191192$items[] = array(193'icon' => 'fa-book',194'name' => pht('User Guide: Search'),195'href' => PhabricatorEnv::getDoclink('Search User Guide'),196);197198return $items;199}200201private function buildModeSelector($selector_id, $application_id) {202$viewer = $this->getViewer();203204$items = self::getGlobalSearchScopeItems($viewer, $this->getApplication());205206$scope_key = PhabricatorSearchScopeSetting::SETTINGKEY;207$current_value = $viewer->getUserSetting($scope_key);208209$current_icon = 'fa-globe';210foreach ($items as $item) {211if (idx($item, 'value') == $current_value) {212$current_icon = $item['icon'];213break;214}215}216217$application = $this->getApplication();218219$application_value = null;220if ($application) {221$application_value = get_class($application);222}223224$selector = id(new PHUIButtonView())225->setID($selector_id)226->addClass('phabricator-main-menu-search-dropdown')227->addSigil('global-search-dropdown')228->setMetadata(229array(230'items' => $items,231'icon' => $current_icon,232'value' => $current_value,233))234->setIcon(235id(new PHUIIconView())236->addSigil('global-search-dropdown-icon')237->setIcon($current_icon))238->setAuralLabel(pht('Configure Global Search'))239->setDropdown(true);240241$input = javelin_tag(242'input',243array(244'type' => 'hidden',245'sigil' => 'global-search-dropdown-input',246'name' => 'search:scope',247'value' => $current_value,248));249250$application_input = javelin_tag(251'input',252array(253'type' => 'hidden',254'id' => $application_id,255'sigil' => 'global-search-dropdown-app',256'name' => 'search:application',257'value' => $application_value,258));259260return array($selector, $input, $application_input);261}262263}264265266