@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
at upstream/main 163 lines 4.3 kB view raw
1<?php 2 3final class DivinerAtomSearchEngine extends PhabricatorApplicationSearchEngine { 4 5 public function getResultTypeDescription() { 6 return pht('Documentation Atoms'); 7 } 8 9 public function getApplicationClassName() { 10 return PhabricatorDivinerApplication::class; 11 } 12 13 public function canUseInPanelContext() { 14 return false; 15 } 16 17 public function buildSavedQueryFromRequest(AphrontRequest $request) { 18 $saved = new PhabricatorSavedQuery(); 19 20 $saved->setParameter( 21 'bookPHIDs', 22 $this->readPHIDsFromRequest($request, 'bookPHIDs')); 23 $saved->setParameter( 24 'repositoryPHIDs', 25 $this->readPHIDsFromRequest($request, 'repositoryPHIDs')); 26 $saved->setParameter('name', $request->getStr('name')); 27 $saved->setParameter( 28 'types', 29 $this->readListFromRequest($request, 'types')); 30 31 return $saved; 32 } 33 34 public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 35 $query = new DivinerAtomQuery(); 36 37 $books = $saved->getParameter('bookPHIDs'); 38 if ($books) { 39 $query->withBookPHIDs($books); 40 } 41 42 $repository_phids = $saved->getParameter('repositoryPHIDs'); 43 if ($repository_phids) { 44 $query->withRepositoryPHIDs($repository_phids); 45 } 46 47 $name = $saved->getParameter('name'); 48 if ($name) { 49 $query->withNameContains($name); 50 } 51 52 $types = $saved->getParameter('types'); 53 if ($types) { 54 $query->withTypes($types); 55 } 56 57 return $query; 58 } 59 60 public function buildSearchForm( 61 AphrontFormView $form, 62 PhabricatorSavedQuery $saved) { 63 64 $form->appendChild( 65 id(new AphrontFormTextControl()) 66 ->setLabel(pht('Name Contains')) 67 ->setName('name') 68 ->setValue($saved->getParameter('name'))); 69 70 $all_types = array(); 71 foreach (DivinerAtom::getAllTypes() as $type) { 72 $all_types[$type] = DivinerAtom::getAtomTypeNameString($type); 73 } 74 asort($all_types); 75 76 $types = $saved->getParameter('types', array()); 77 $types = array_fuse($types); 78 $type_control = id(new AphrontFormCheckboxControl()) 79 ->setLabel(pht('Types')); 80 foreach ($all_types as $type => $name) { 81 $type_control->addCheckbox( 82 'types[]', 83 $type, 84 $name, 85 isset($types[$type])); 86 } 87 $form->appendChild($type_control); 88 89 $form->appendControl( 90 id(new AphrontFormTokenizerControl()) 91 ->setDatasource(new DivinerBookDatasource()) 92 ->setName('bookPHIDs') 93 ->setLabel(pht('Books')) 94 ->setValue($saved->getParameter('bookPHIDs'))); 95 96 $form->appendControl( 97 id(new AphrontFormTokenizerControl()) 98 ->setLabel(pht('Repositories')) 99 ->setName('repositoryPHIDs') 100 ->setDatasource(new DiffusionRepositoryDatasource()) 101 ->setValue($saved->getParameter('repositoryPHIDs'))); 102 } 103 104 protected function getURI($path) { 105 return '/diviner/'.$path; 106 } 107 108 protected function getBuiltinQueryNames() { 109 return array( 110 'all' => pht('All Atoms'), 111 ); 112 } 113 114 public function buildSavedQueryFromBuiltin($query_key) { 115 $query = $this->newSavedQuery(); 116 $query->setQueryKey($query_key); 117 118 switch ($query_key) { 119 case 'all': 120 return $query; 121 } 122 123 return parent::buildSavedQueryFromBuiltin($query_key); 124 } 125 126 /** 127 * @param array<DivinerLiveSymbol> $symbols 128 * @param PhabricatorSavedQuery $query 129 * @param array<PhabricatorObjectHandle> $handles 130 */ 131 protected function renderResultList( 132 array $symbols, 133 PhabricatorSavedQuery $query, 134 array $handles) { 135 136 assert_instances_of($symbols, DivinerLiveSymbol::class); 137 138 $viewer = $this->requireViewer(); 139 140 $list = id(new PHUIObjectItemListView()) 141 ->setUser($viewer); 142 143 foreach ($symbols as $symbol) { 144 $type = $symbol->getType(); 145 $type_name = DivinerAtom::getAtomTypeNameString($type); 146 147 $item = id(new PHUIObjectItemView()) 148 ->setHeader($symbol->getTitle()) 149 ->setHref($symbol->getURI()) 150 ->addAttribute($symbol->getSummary()) 151 ->addIcon('none', $type_name); 152 153 $list->addItem($item); 154 } 155 156 $result = new PhabricatorApplicationSearchResultView(); 157 $result->setObjectList($list); 158 $result->setNoDataString(pht('No books found.')); 159 160 return $result; 161 } 162 163}