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:
epriestley
2013-06-05 16:22:27 -07:00
parent f26be0e2d4
commit 0f82990798
11 changed files with 221 additions and 68 deletions

View File

@@ -37,6 +37,7 @@ final class PhabricatorApplicationSearch extends PhabricatorApplication {
'edit/(?P<queryKey>[^/]+)/' => 'PhabricatorSearchEditController',
'delete/(?P<queryKey>[^/]+)/(?P<engine>[^/]+)/'
=> 'PhabricatorSearchDeleteController',
'order/(?P<engine>[^/]+)/' => 'PhabricatorSearchOrderController',
),
);
}

View File

@@ -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);
}

View File

@@ -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) {

View File

@@ -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());
}
}

View File

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

View File

@@ -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 )----------------------------------------- */