@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
fork

Configure Feed

Select the types of activity you want to include in your feed.

Modernize global search typeahead datasource

Summary: Ref T4420. Bring the global search up to date.

Test Plan: Typed various things into global search.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T4420

Differential Revision: https://secure.phabricator.com/D9889

+142 -95
+6
src/__phutil_library_map__.php
··· 592 592 'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionSvnRawDiffQuery.php', 593 593 'DiffusionSvnRequest' => 'applications/diffusion/request/DiffusionSvnRequest.php', 594 594 'DiffusionSymbolController' => 'applications/diffusion/controller/DiffusionSymbolController.php', 595 + 'DiffusionSymbolDatasource' => 'applications/diffusion/typeahead/DiffusionSymbolDatasource.php', 595 596 'DiffusionSymbolQuery' => 'applications/diffusion/query/DiffusionSymbolQuery.php', 596 597 'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php', 597 598 'DiffusionTagListView' => 'applications/diffusion/view/DiffusionTagListView.php', ··· 1150 1151 'PhabricatorApplicationCountdown' => 'applications/countdown/application/PhabricatorApplicationCountdown.php', 1151 1152 'PhabricatorApplicationDaemons' => 'applications/daemon/application/PhabricatorApplicationDaemons.php', 1152 1153 'PhabricatorApplicationDashboard' => 'applications/dashboard/application/PhabricatorApplicationDashboard.php', 1154 + 'PhabricatorApplicationDatasource' => 'applications/meta/typeahead/PhabricatorApplicationDatasource.php', 1153 1155 'PhabricatorApplicationDetailViewController' => 'applications/meta/controller/PhabricatorApplicationDetailViewController.php', 1154 1156 'PhabricatorApplicationDifferential' => 'applications/differential/application/PhabricatorApplicationDifferential.php', 1155 1157 'PhabricatorApplicationDiffusion' => 'applications/diffusion/application/PhabricatorApplicationDiffusion.php', ··· 2157 2159 'PhabricatorSearchConfigOptions' => 'applications/search/config/PhabricatorSearchConfigOptions.php', 2158 2160 'PhabricatorSearchController' => 'applications/search/controller/PhabricatorSearchController.php', 2159 2161 'PhabricatorSearchDAO' => 'applications/search/storage/PhabricatorSearchDAO.php', 2162 + 'PhabricatorSearchDatasource' => 'applications/search/typeahead/PhabricatorSearchDatasource.php', 2160 2163 'PhabricatorSearchDeleteController' => 'applications/search/controller/PhabricatorSearchDeleteController.php', 2161 2164 'PhabricatorSearchDocument' => 'applications/search/storage/document/PhabricatorSearchDocument.php', 2162 2165 'PhabricatorSearchDocumentField' => 'applications/search/storage/document/PhabricatorSearchDocumentField.php', ··· 3301 3304 'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery', 3302 3305 'DiffusionSvnRequest' => 'DiffusionRequest', 3303 3306 'DiffusionSymbolController' => 'DiffusionController', 3307 + 'DiffusionSymbolDatasource' => 'PhabricatorTypeaheadDatasource', 3304 3308 'DiffusionSymbolQuery' => 'PhabricatorOffsetPagedQuery', 3305 3309 'DiffusionTagListController' => 'DiffusionController', 3306 3310 'DiffusionTagListView' => 'DiffusionView', ··· 3924 3928 'PhabricatorApplicationCountdown' => 'PhabricatorApplication', 3925 3929 'PhabricatorApplicationDaemons' => 'PhabricatorApplication', 3926 3930 'PhabricatorApplicationDashboard' => 'PhabricatorApplication', 3931 + 'PhabricatorApplicationDatasource' => 'PhabricatorTypeaheadDatasource', 3927 3932 'PhabricatorApplicationDetailViewController' => 'PhabricatorApplicationsController', 3928 3933 'PhabricatorApplicationDifferential' => 'PhabricatorApplication', 3929 3934 'PhabricatorApplicationDiffusion' => 'PhabricatorApplication', ··· 5004 5009 'PhabricatorSearchConfigOptions' => 'PhabricatorApplicationConfigOptions', 5005 5010 'PhabricatorSearchController' => 'PhabricatorSearchBaseController', 5006 5011 'PhabricatorSearchDAO' => 'PhabricatorLiskDAO', 5012 + 'PhabricatorSearchDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 5007 5013 'PhabricatorSearchDeleteController' => 'PhabricatorSearchBaseController', 5008 5014 'PhabricatorSearchDocument' => 'PhabricatorSearchDAO', 5009 5015 'PhabricatorSearchDocumentField' => 'PhabricatorSearchDAO',
+47
src/applications/diffusion/typeahead/DiffusionSymbolDatasource.php
··· 1 + <?php 2 + 3 + final class DiffusionSymbolDatasource 4 + extends PhabricatorTypeaheadDatasource { 5 + 6 + public function getPlaceholderText() { 7 + return pht('Type a symbol name...'); 8 + } 9 + 10 + public function getDatasourceApplicationClass() { 11 + return 'PhabricatorApplicationDiffusion'; 12 + } 13 + 14 + public function loadResults() { 15 + $viewer = $this->getViewer(); 16 + $raw_query = $this->getRawQuery(); 17 + 18 + $results = array(); 19 + 20 + if (strlen($raw_query)) { 21 + $symbols = id(new DiffusionSymbolQuery()) 22 + ->setNamePrefix($raw_query) 23 + ->setLimit(15) 24 + ->needArcanistProjects(true) 25 + ->needRepositories(true) 26 + ->needPaths(true) 27 + ->execute(); 28 + foreach ($symbols as $symbol) { 29 + $lang = $symbol->getSymbolLanguage(); 30 + $name = $symbol->getSymbolName(); 31 + $type = $symbol->getSymbolType(); 32 + $proj = $symbol->getArcanistProject()->getName(); 33 + 34 + $results[] = id(new PhabricatorTypeaheadResult()) 35 + ->setName($name) 36 + ->setURI($symbol->getURI()) 37 + ->setPHID(md5($symbol->getURI())) // Just needs to be unique. 38 + ->setDisplayName($name) 39 + ->setDisplayType(strtoupper($lang).' '.ucwords($type).' ('.$proj.')') 40 + ->setPriorityType('symb'); 41 + } 42 + } 43 + 44 + return $results; 45 + } 46 + 47 + }
+43
src/applications/meta/typeahead/PhabricatorApplicationDatasource.php
··· 1 + <?php 2 + 3 + final class PhabricatorApplicationDatasource 4 + extends PhabricatorTypeaheadDatasource { 5 + 6 + public function getPlaceholderText() { 7 + return pht('Type an application name...'); 8 + } 9 + 10 + public function getDatasourceApplicationClass() { 11 + return 'PhabricatorApplicationApplications'; 12 + } 13 + 14 + public function loadResults() { 15 + $viewer = $this->getViewer(); 16 + $raw_query = $this->getRawQuery(); 17 + 18 + $results = array(); 19 + 20 + $applications = PhabricatorApplication::getAllInstalledApplications(); 21 + foreach ($applications as $application) { 22 + $uri = $application->getTypeaheadURI(); 23 + if (!$uri) { 24 + continue; 25 + } 26 + $name = $application->getName().' '.$application->getShortDescription(); 27 + $img = 'apps-'.$application->getIconName().'-dark-large'; 28 + $results[] = id(new PhabricatorTypeaheadResult()) 29 + ->setName($name) 30 + ->setURI($uri) 31 + ->setPHID($application->getPHID()) 32 + ->setPriorityString($application->getName()) 33 + ->setDisplayName($application->getName()) 34 + ->setDisplayType($application->getShortDescription()) 35 + ->setImageuRI($application->getIconURI()) 36 + ->setPriorityType('apps') 37 + ->setImageSprite('phabricator-search-icon sprite-apps-large '.$img); 38 + } 39 + 40 + return $results; 41 + } 42 + 43 + }
+18 -13
src/applications/people/typeahead/PhabricatorPeopleDatasource.php
··· 3 3 final class PhabricatorPeopleDatasource 4 4 extends PhabricatorTypeaheadDatasource { 5 5 6 + private $enrichResults; 7 + 8 + /** 9 + * Controls enriched rendering, for global search. This is a bit hacky and 10 + * should probably be handled in a more general way, but is fairly reasonable 11 + * for now. 12 + */ 13 + public function setEnrichResults($enrich) { 14 + $this->enrichResults = $enrich; 15 + return $this; 16 + } 17 + 6 18 public function getPlaceholderText() { 7 19 return pht('Type a username...'); 8 20 } ··· 71 83 } 72 84 } 73 85 74 - // TODO: Restore this when mainsearch moves here. 75 - /* 76 - 77 - if ($need_rich_data) { 86 + if ($this->enrichResults && $users) { 78 87 $phids = mpull($users, 'getPHID'); 79 - $handles = $this->loadViewerHandles($phids); 88 + $handles = id(new PhabricatorHandleQuery()) 89 + ->setViewer($viewer) 90 + ->withPHIDs($phids) 91 + ->execute(); 80 92 } 81 93 82 - */ 83 - 84 94 foreach ($users as $user) { 85 95 $closed = null; 86 96 if ($user->getIsDisabled()) { ··· 98 108 ->setPriorityType('user') 99 109 ->setClosed($closed); 100 110 101 - // TODO: Restore this too. 102 - /* 103 - 104 - if ($need_rich_data) { 111 + if ($this->enrichResults) { 105 112 $display_type = 'User'; 106 113 if ($user->getIsAdmin()) { 107 114 $display_type = 'Administrator'; ··· 109 116 $result->setDisplayType($display_type); 110 117 $result->setImageURI($handles[$user->getPHID()]->getImageURI()); 111 118 } 112 - 113 - */ 114 119 115 120 $results[] = $result; 116 121 }
+24
src/applications/search/typeahead/PhabricatorSearchDatasource.php
··· 1 + <?php 2 + 3 + final class PhabricatorSearchDatasource 4 + extends PhabricatorTypeaheadCompositeDatasource { 5 + 6 + public function getPlaceholderText() { 7 + return pht('Type an object name...'); 8 + } 9 + 10 + public function getDatasourceApplicationClass() { 11 + return 'PhabricatorApplicationSearch'; 12 + } 13 + 14 + public function getComponentDatasources() { 15 + return array( 16 + id(new PhabricatorPeopleDatasource())->setEnrichResults(true), 17 + new PhabricatorProjectDatasource(), 18 + new PhabricatorApplicationDatasource(), 19 + new PhabricatorTypeaheadMonogramDatasource(), 20 + new DiffusionSymbolDatasource(), 21 + ); 22 + } 23 + 24 + }
+1 -81
src/applications/typeahead/controller/PhabricatorTypeaheadCommonDatasourceController.php
··· 19 19 $query = $request->getStr('q'); 20 20 $raw_query = $request->getStr('raw'); 21 21 22 - $need_rich_data = false; 23 - 24 22 $need_users = false; 25 - $need_applications = false; 26 23 $need_projs = false; 27 24 $need_upforgrabs = false; 28 25 $need_noproject = false; 29 - $need_symbols = false; 30 - $need_jump_objects = false; 26 + $need_rich_data = false; 31 27 switch ($this->type) { 32 - case 'mainsearch': 33 - $need_users = true; 34 - $need_applications = true; 35 - $need_rich_data = true; 36 - $need_symbols = true; 37 - $need_projs = true; 38 - $need_jump_objects = true; 39 - break; 40 28 case 'searchowner': 41 29 $need_users = true; 42 30 $need_upforgrabs = true; ··· 183 171 $proj_result->setImageURI($proj->getProfileImageURI()); 184 172 185 173 $results[] = $proj_result; 186 - } 187 - } 188 - 189 - if ($need_applications) { 190 - $applications = PhabricatorApplication::getAllInstalledApplications(); 191 - foreach ($applications as $application) { 192 - $uri = $application->getTypeaheadURI(); 193 - if (!$uri) { 194 - continue; 195 - } 196 - $name = $application->getName().' '.$application->getShortDescription(); 197 - $img = 'apps-'.$application->getIconName().'-dark-large'; 198 - $results[] = id(new PhabricatorTypeaheadResult()) 199 - ->setName($name) 200 - ->setURI($uri) 201 - ->setPHID($application->getPHID()) 202 - ->setPriorityString($application->getName()) 203 - ->setDisplayName($application->getName()) 204 - ->setDisplayType($application->getShortDescription()) 205 - ->setImageuRI($application->getIconURI()) 206 - ->setPriorityType('apps') 207 - ->setImageSprite('phabricator-search-icon sprite-apps-large '.$img); 208 - } 209 - } 210 - 211 - if ($need_symbols) { 212 - $symbols = id(new DiffusionSymbolQuery()) 213 - ->setNamePrefix($query) 214 - ->setLimit(15) 215 - ->needArcanistProjects(true) 216 - ->needRepositories(true) 217 - ->needPaths(true) 218 - ->execute(); 219 - foreach ($symbols as $symbol) { 220 - $lang = $symbol->getSymbolLanguage(); 221 - $name = $symbol->getSymbolName(); 222 - $type = $symbol->getSymbolType(); 223 - $proj = $symbol->getArcanistProject()->getName(); 224 - 225 - $results[] = id(new PhabricatorTypeaheadResult()) 226 - ->setName($name) 227 - ->setURI($symbol->getURI()) 228 - ->setPHID(md5($symbol->getURI())) // Just needs to be unique. 229 - ->setDisplayName($name) 230 - ->setDisplayType(strtoupper($lang).' '.ucwords($type).' ('.$proj.')') 231 - ->setPriorityType('symb'); 232 - } 233 - } 234 - 235 - if ($need_jump_objects) { 236 - $objects = id(new PhabricatorObjectQuery()) 237 - ->setViewer($viewer) 238 - ->withNames(array($raw_query)) 239 - ->execute(); 240 - if ($objects) { 241 - $handles = id(new PhabricatorHandleQuery()) 242 - ->setViewer($viewer) 243 - ->withPHIDs(mpull($objects, 'getPHID')) 244 - ->execute(); 245 - $handle = head($handles); 246 - if ($handle) { 247 - $results[] = id(new PhabricatorTypeaheadResult()) 248 - ->setName($handle->getFullName()) 249 - ->setDisplayType($handle->getTypeName()) 250 - ->setURI($handle->getURI()) 251 - ->setPHID($handle->getPHID()) 252 - ->setPriorityType('jump'); 253 - } 254 174 } 255 175 } 256 176
+3 -1
src/view/page/menu/PhabricatorMainMenuSearchView.php
··· 35 35 ), 36 36 ''); 37 37 38 + $search_datasource = new PhabricatorSearchDatasource(); 39 + 38 40 Javelin::initBehavior( 39 41 'phabricator-search-typeahead', 40 42 array( 41 43 'id' => $target_id, 42 44 'input' => $search_id, 43 45 'button' => $button_id, 44 - 'src' => '/typeahead/common/mainsearch/', 46 + 'src' => $search_datasource->getDatasourceURI(), 45 47 'limit' => 10, 46 48 'placeholder' => pht('Search'), 47 49 ));