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

Allow builtin named queries to be disabled

Summary:
Applications come with builtin queries, but users might want to get rid of them. Allow users to disable named queries if they prefer.

This has one funky behavior, which is that the first time you disable a named query it goes to the top of your list. That will be fixed in the next diff, which will make them reorderable.

Test Plan: Added/edited/removed named queries, disabled/enabled builtin named queries.

Reviewers: chad

Reviewed By: chad

CC: aran

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

+144 -54
+8
resources/sql/patches/20130602.namedqueries.sql
··· 1 + ALTER TABLE {$NAMESPACE}_search.search_namedquery 2 + ADD isBuiltin BOOL NOT NULL DEFAULT 0; 3 + 4 + ALTER TABLE {$NAMESPACE}_search.search_namedquery 5 + ADD isDisabled BOOL NOT NULL DEFAULT 0; 6 + 7 + ALTER TABLE {$NAMESPACE}_search.search_namedquery 8 + ADD sequence INT UNSIGNED NOT NULL DEFAULT 0;
+2 -1
src/applications/search/application/PhabricatorApplicationSearch.php
··· 35 35 'hovercard/(?P<mode>retrieve|test)/' => 36 36 'PhabricatorSearchHovercardController', 37 37 'edit/(?P<queryKey>[^/]+)/' => 'PhabricatorSearchEditController', 38 - 'delete/(?P<queryKey>[^/]+)/' => 'PhabricatorSearchDeleteController', 38 + 'delete/(?P<queryKey>[^/]+)/(?P<engine>[^/]+)/' 39 + => 'PhabricatorSearchDeleteController', 39 40 ), 40 41 ); 41 42 }
+23 -16
src/applications/search/controller/PhabricatorApplicationSearchController.php
··· 226 226 $engine = $this->getSearchEngine(); 227 227 $nav = $this->getNavigation(); 228 228 229 - $named_queries = id(new PhabricatorNamedQueryQuery()) 230 - ->setViewer($user) 231 - ->withUserPHIDs(array($user->getPHID())) 232 - ->withEngineClassNames(array(get_class($engine))) 233 - ->execute(); 234 - 235 - $named_queries += $engine->getBuiltinQueries(); 229 + $named_queries = $engine->loadAllNamedQueries(); 236 230 237 231 $list = new PhabricatorObjectItemListView(); 238 232 $list->setUser($user); 239 233 240 234 foreach ($named_queries as $named_query) { 235 + $class = get_class($engine); 236 + $key = $named_query->getQueryKey(); 237 + 241 238 $date_created = phabricator_datetime( 242 239 $named_query->getDateCreated(), 243 240 $user); 244 241 245 242 $item = id(new PhabricatorObjectItemView()) 246 243 ->setHeader($named_query->getQueryName()) 247 - ->setHref($engine->getQueryResultsPageURI($named_query->getQueryKey())); 244 + ->setHref($engine->getQueryResultsPageURI($key)); 245 + 246 + if ($named_query->getIsBuiltin() && $named_query->getIsDisabled()) { 247 + $icon = 'new'; 248 + } else { 249 + $icon = 'delete'; 250 + } 251 + 252 + $item->addAction( 253 + id(new PhabricatorMenuItemView()) 254 + ->setIcon($icon) 255 + ->setHref('/search/delete/'.$key.'/'.$class.'/') 256 + ->setWorkflow(true)); 248 257 249 258 if ($named_query->getIsBuiltin()) { 250 - $item->addIcon('lock-grey', pht('Builtin')); 259 + if ($named_query->getIsDisabled()) { 260 + $item->addIcon('delete-grey', pht('Disabled')); 261 + } else { 262 + $item->addIcon('lock-grey', pht('Builtin')); 263 + } 251 264 $item->setBarColor('grey'); 252 265 } else { 253 - $item->addIcon('none', $date_created); 254 - $item->addAction( 255 - id(new PhabricatorMenuItemView()) 256 - ->setIcon('delete') 257 - ->setHref('/search/delete/'.$named_query->getQueryKey().'/') 258 - ->setWorkflow(true)); 259 266 $item->addAction( 260 267 id(new PhabricatorMenuItemView()) 261 268 ->setIcon('edit') 262 - ->setHref('/search/edit/'.$named_query->getQueryKey().'/')); 269 + ->setHref('/search/edit/'.$key.'/')); 263 270 } 264 271 265 272 $list->addItem($item);
+60 -16
src/applications/search/controller/PhabricatorSearchDeleteController.php
··· 7 7 extends PhabricatorSearchBaseController { 8 8 9 9 private $queryKey; 10 + private $engineClass; 10 11 11 12 public function willProcessRequest(array $data) { 12 13 $this->queryKey = idx($data, 'queryKey'); 14 + $this->engineClass = idx($data, 'engine'); 13 15 } 14 16 15 17 public function processRequest() { 16 18 $request = $this->getRequest(); 17 19 $user = $request->getUser(); 18 20 19 - $saved_query = id(new PhabricatorSavedQueryQuery()) 20 - ->setViewer($user) 21 - ->withQueryKeys(array($this->queryKey)) 22 - ->executeOne(); 21 + $key = $this->queryKey; 23 22 24 - if (!$saved_query) { 25 - return new Aphront404Response(); 23 + $base_class = 'PhabricatorApplicationSearchEngine'; 24 + if (!is_subclass_of($this->engineClass, $base_class)) { 25 + return new Aphront400Response(); 26 26 } 27 27 28 - $engine = $saved_query->newEngine(); 28 + $engine = newv($this->engineClass, array()); 29 + $engine->setViewer($user); 29 30 30 31 $named_query = id(new PhabricatorNamedQueryQuery()) 31 32 ->setViewer($user) 32 - ->withQueryKeys(array($saved_query->getQueryKey())) 33 + ->withEngineClassNames(array($this->engineClass)) 34 + ->withQueryKeys(array($key)) 33 35 ->withUserPHIDs(array($user->getPHID())) 34 36 ->executeOne(); 37 + 38 + if (!$named_query && $engine->isBuiltinQuery($key)) { 39 + $named_query = id(new PhabricatorNamedQuery()) 40 + ->setUserPHID($user->getPHID()) 41 + ->setQueryName('(BUILTIN)') 42 + ->setQueryKey($key) 43 + ->setEngineClassName($this->engineClass) 44 + ->setIsBuiltin(true); 45 + } 46 + 35 47 if (!$named_query) { 36 48 return new Aphront404Response(); 37 49 } 38 50 51 + $builtin = null; 52 + if ($engine->isBuiltinQuery($key)) { 53 + $builtin = $engine->getBuiltinQuery($key); 54 + } 55 + 39 56 $return_uri = $engine->getQueryManagementURI(); 40 57 41 58 if ($request->isDialogFormPost()) { 42 - $named_query->delete(); 59 + if ($named_query->getIsBuiltin()) { 60 + $named_query->setIsDisabled((int)(!$named_query->getIsDisabled())); 61 + $named_query->save(); 62 + } else { 63 + $named_query->delete(); 64 + } 65 + 43 66 return id(new AphrontRedirectResponse())->setURI($return_uri); 44 67 } 45 68 69 + if ($named_query->getIsBuiltin()) { 70 + if ($named_query->getIsDisabled()) { 71 + $title = pht('Enable Query?'); 72 + $desc = pht( 73 + 'Enable the built-in query "%s"? It will appear in your menu again.', 74 + $builtin->getQueryName()); 75 + $button = pht('Enable Query'); 76 + } else { 77 + $title = pht('Disable Query?'); 78 + $desc = pht( 79 + 'This built-in query can not be deleted, but you can disable it so '. 80 + 'it does not appear in your query menu. You can enable it again '. 81 + 'later. Disable built-in query "%s"?', 82 + $builtin->getQueryName()); 83 + $button = pht('Disable Query'); 84 + } 85 + } else { 86 + $title = pht('Really Delete Query?'); 87 + $desc = pht( 88 + 'Really delete the query "%s"? You can not undo this. Remember '. 89 + 'all the great times you had filtering results together?', 90 + $named_query->getQueryName()); 91 + $button = pht('Delete Query'); 92 + } 93 + 46 94 $dialog = id(new AphrontDialogView()) 47 95 ->setUser($user) 48 - ->setTitle(pht("Really Delete Query?")) 49 - ->appendChild( 50 - pht( 51 - 'Really delete the query "%s"? You can not undo this. Remember '. 52 - 'all the great times you had filtering results together?', 53 - $named_query->getQueryName())) 96 + ->setTitle($title) 97 + ->appendChild($desc) 54 98 ->addCancelButton($return_uri) 55 - ->addSubmitButton(pht('Delete Query')); 99 + ->addSubmitButton($button); 56 100 57 101 return id(new AphrontDialogResponse())->setDialog($dialog); 58 102 }
+40 -7
src/applications/search/engine/PhabricatorApplicationSearchEngine.php
··· 111 111 112 112 $menu->newLabel(pht('Queries')); 113 113 114 - $named_queries = id(new PhabricatorNamedQueryQuery()) 115 - ->setViewer($viewer) 116 - ->withUserPHIDs(array($viewer->getPHID())) 117 - ->withEngineClassNames(array(get_class($this))) 118 - ->execute(); 119 - 120 - $named_queries = $named_queries + $this->getBuiltinQueries($viewer); 114 + $named_queries = $this->loadEnabledNamedQueries(); 121 115 122 116 foreach ($named_queries as $query) { 123 117 $key = $query->getQueryKey(); ··· 135 129 $menu->newLink(pht('Advanced Search'), $advanced_uri, 'query/advanced'); 136 130 137 131 return $this; 132 + } 133 + 134 + public function loadAllNamedQueries() { 135 + $viewer = $this->requireViewer(); 136 + 137 + $named_queries = id(new PhabricatorNamedQueryQuery()) 138 + ->setViewer($viewer) 139 + ->withUserPHIDs(array($viewer->getPHID())) 140 + ->withEngineClassNames(array(get_class($this))) 141 + ->execute(); 142 + $named_queries = mpull($named_queries, null, 'getQueryKey'); 143 + 144 + $builtin = $this->getBuiltinQueries($viewer); 145 + $builtin = mpull($builtin, null, 'getQueryKey'); 146 + 147 + foreach ($named_queries as $key => $named_query) { 148 + if ($named_query->getIsBuiltin()) { 149 + if (isset($builtin[$key])) { 150 + $named_queries[$key]->setQueryName($builtin[$key]->getQueryName()); 151 + unset($builtin[$key]); 152 + } else { 153 + unset($named_queries[$key]); 154 + } 155 + } 156 + 157 + unset($builtin[$key]); 158 + } 159 + 160 + return $named_queries + $builtin; 161 + } 162 + 163 + public function loadEnabledNamedQueries() { 164 + $named_queries = $this->loadAllNamedQueries(); 165 + foreach ($named_queries as $key => $named_query) { 166 + if ($named_query->getIsBuiltin() && $named_query->getIsDisabled()) { 167 + unset($named_queries[$key]); 168 + } 169 + } 170 + return $named_queries; 138 171 } 139 172 140 173
+7 -14
src/applications/search/storage/PhabricatorNamedQuery.php
··· 6 6 final class PhabricatorNamedQuery extends PhabricatorSearchDAO 7 7 implements PhabricatorPolicyInterface { 8 8 9 - protected $queryKey = ""; 10 - protected $queryName = ""; 11 - protected $userPHID = ""; 12 - protected $engineClassName = ""; 9 + protected $queryKey; 10 + protected $queryName; 11 + protected $userPHID; 12 + protected $engineClassName; 13 13 14 - private $isBuiltin; 15 - 16 - public function setIsBuiltin($is_builtin) { 17 - $this->isBuiltin = $is_builtin; 18 - return $this; 19 - } 20 - 21 - public function getIsBuiltin() { 22 - return $this->isBuiltin; 23 - } 14 + protected $isBuiltin = 0; 15 + protected $isDisabled = 0; 16 + protected $sequence = 0; 24 17 25 18 /* -( PhabricatorPolicyInterface )----------------------------------------- */ 26 19
+4
src/infrastructure/storage/patch/PhabricatorBuiltinPatchList.php
··· 1346 1346 'type' => 'sql', 1347 1347 'name' => $this->getPatchPath('20130602.morediviner.sql'), 1348 1348 ), 1349 + '20130602.namedqueries.sql' => array( 1350 + 'type' => 'sql', 1351 + 'name' => $this->getPatchPath('20130602.namedqueries.sql'), 1352 + ), 1349 1353 ); 1350 1354 } 1351 1355 }