Allow named queries to be reordered by dragging
Summary:
Also you have to drop them. So drag, and then drop.
This needs some cleanup and reconciliation/generalization with the Maniphest implementation. In particular, you can't drag things to the very top right now, and they should share more CSS and more behaviors.
Test Plan:
Look I alphabetized them:
{F45286}
Reviewers: chad
Reviewed By: chad
CC: aran
Differential Revision: https://secure.phabricator.com/D6136
This commit is contained in:
@@ -37,6 +37,7 @@ final class PhabricatorApplicationSearch extends PhabricatorApplication {
|
||||
'edit/(?P<queryKey>[^/]+)/' => 'PhabricatorSearchEditController',
|
||||
'delete/(?P<queryKey>[^/]+)/(?P<engine>[^/]+)/'
|
||||
=> 'PhabricatorSearchDeleteController',
|
||||
'order/(?P<engine>[^/]+)/' => 'PhabricatorSearchOrderController',
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -228,17 +228,23 @@ final class PhabricatorApplicationSearchController
|
||||
|
||||
$named_queries = $engine->loadAllNamedQueries();
|
||||
|
||||
$list_id = celerity_generate_unique_node_id();
|
||||
|
||||
$list = new PhabricatorObjectItemListView();
|
||||
$list->setUser($user);
|
||||
$list->setID($list_id);
|
||||
|
||||
Javelin::initBehavior(
|
||||
'search-reorder-queries',
|
||||
array(
|
||||
'listID' => $list_id,
|
||||
'orderURI' => '/search/order/'.get_class($engine).'/',
|
||||
));
|
||||
|
||||
foreach ($named_queries as $named_query) {
|
||||
$class = get_class($engine);
|
||||
$key = $named_query->getQueryKey();
|
||||
|
||||
$date_created = phabricator_datetime(
|
||||
$named_query->getDateCreated(),
|
||||
$user);
|
||||
|
||||
$item = id(new PhabricatorObjectItemView())
|
||||
->setHeader($named_query->getQueryName())
|
||||
->setHref($engine->getQueryResultsPageURI($key));
|
||||
@@ -263,13 +269,19 @@ final class PhabricatorApplicationSearchController
|
||||
}
|
||||
$item->setBarColor('grey');
|
||||
} else {
|
||||
$item->addIcon('none', $date_created);
|
||||
$item->addAction(
|
||||
id(new PHUIListItemView())
|
||||
->setIcon('edit')
|
||||
->setHref('/search/edit/'.$key.'/'));
|
||||
}
|
||||
|
||||
$item->setGrippable(true);
|
||||
$item->addSigil('named-query');
|
||||
$item->setMetadata(
|
||||
array(
|
||||
'queryKey' => $named_query->getQueryKey(),
|
||||
));
|
||||
|
||||
$list->addItem($item);
|
||||
}
|
||||
|
||||
|
||||
@@ -36,12 +36,7 @@ final class PhabricatorSearchDeleteController
|
||||
->executeOne();
|
||||
|
||||
if (!$named_query && $engine->isBuiltinQuery($key)) {
|
||||
$named_query = id(new PhabricatorNamedQuery())
|
||||
->setUserPHID($user->getPHID())
|
||||
->setQueryName('(BUILTIN)')
|
||||
->setQueryKey($key)
|
||||
->setEngineClassName($this->engineClass)
|
||||
->setIsBuiltin(true);
|
||||
$named_query = $engine->getBuiltinQuery($key);
|
||||
}
|
||||
|
||||
if (!$named_query) {
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @group search
|
||||
*/
|
||||
final class PhabricatorSearchOrderController
|
||||
extends PhabricatorSearchBaseController {
|
||||
|
||||
private $engineClass;
|
||||
|
||||
public function willProcessRequest(array $data) {
|
||||
$this->engineClass = idx($data, 'engine');
|
||||
}
|
||||
|
||||
public function processRequest() {
|
||||
$request = $this->getRequest();
|
||||
$user = $request->getUser();
|
||||
|
||||
$request->validateCSRF();
|
||||
|
||||
$base_class = 'PhabricatorApplicationSearchEngine';
|
||||
if (!is_subclass_of($this->engineClass, $base_class)) {
|
||||
return new Aphront400Response();
|
||||
}
|
||||
|
||||
$engine = newv($this->engineClass, array());
|
||||
$engine->setViewer($user);
|
||||
|
||||
$queries = $engine->loadAllNamedQueries();
|
||||
$queries = mpull($queries, null, 'getQueryKey');
|
||||
|
||||
$order = $request->getStrList('order');
|
||||
$queries = array_select_keys($queries, $order) + $queries;
|
||||
|
||||
$sequence = 1;
|
||||
foreach ($queries as $query) {
|
||||
$query->setSequence($sequence++);
|
||||
$query->save();
|
||||
}
|
||||
|
||||
return id(new AphrontAjaxResponse());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -157,6 +157,8 @@ abstract class PhabricatorApplicationSearchEngine {
|
||||
unset($builtin[$key]);
|
||||
}
|
||||
|
||||
$named_queries = msort($named_queries, 'getSortKey');
|
||||
|
||||
return $named_queries + $builtin;
|
||||
}
|
||||
|
||||
@@ -181,12 +183,15 @@ abstract class PhabricatorApplicationSearchEngine {
|
||||
$names = $this->getBuiltinQueryNames();
|
||||
|
||||
$queries = array();
|
||||
$sequence = 0;
|
||||
foreach ($names as $key => $name) {
|
||||
$queries[$key] = id(new PhabricatorNamedQuery())
|
||||
->setUserPHID($this->requireViewer()->getPHID())
|
||||
->setEngineClassName(get_class($this))
|
||||
->setQueryName($name)
|
||||
->setQueryKey($key)
|
||||
->setIsBuiltin(true)
|
||||
->makeEphemeral();
|
||||
->setSequence((1 << 24) + $sequence++)
|
||||
->setIsBuiltin(true);
|
||||
}
|
||||
|
||||
return $queries;
|
||||
|
||||
@@ -15,6 +15,10 @@ final class PhabricatorNamedQuery extends PhabricatorSearchDAO
|
||||
protected $isDisabled = 0;
|
||||
protected $sequence = 0;
|
||||
|
||||
public function getSortKey() {
|
||||
return sprintf('~%010d%010d', $this->sequence, $this->getID());
|
||||
}
|
||||
|
||||
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user