Allow users to select QueryPanel search engines from a list

Summary: Ref T4986. Instead of requiring users to know the name of an application search engine class, let them select from a list.

Test Plan:
Created a new panel.

{F165468}

Reviewers: chad

Reviewed By: chad

Subscribers: epriestley

Maniphest Tasks: T4986

Differential Revision: https://secure.phabricator.com/D9500
This commit is contained in:
epriestley
2014-06-12 13:22:20 -07:00
parent c72e2f35f3
commit b8bc0aa2b0
45 changed files with 221 additions and 3 deletions

View File

@@ -1495,6 +1495,7 @@ phutil_register_library_map(array(
'PhabricatorDashboardPanelQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelQuery.php', 'PhabricatorDashboardPanelQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelQuery.php',
'PhabricatorDashboardPanelRenderController' => 'applications/dashboard/controller/PhabricatorDashboardPanelRenderController.php', 'PhabricatorDashboardPanelRenderController' => 'applications/dashboard/controller/PhabricatorDashboardPanelRenderController.php',
'PhabricatorDashboardPanelRenderingEngine' => 'applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php', 'PhabricatorDashboardPanelRenderingEngine' => 'applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php',
'PhabricatorDashboardPanelSearchApplicationCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelSearchApplicationCustomField.php',
'PhabricatorDashboardPanelSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php', 'PhabricatorDashboardPanelSearchEngine' => 'applications/dashboard/query/PhabricatorDashboardPanelSearchEngine.php',
'PhabricatorDashboardPanelTransaction' => 'applications/dashboard/storage/PhabricatorDashboardPanelTransaction.php', 'PhabricatorDashboardPanelTransaction' => 'applications/dashboard/storage/PhabricatorDashboardPanelTransaction.php',
'PhabricatorDashboardPanelTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardPanelTransactionEditor.php', 'PhabricatorDashboardPanelTransactionEditor' => 'applications/dashboard/editor/PhabricatorDashboardPanelTransactionEditor.php',
@@ -4319,6 +4320,7 @@ phutil_register_library_map(array(
'PhabricatorDashboardPanelQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorDashboardPanelQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhabricatorDashboardPanelRenderController' => 'PhabricatorDashboardController', 'PhabricatorDashboardPanelRenderController' => 'PhabricatorDashboardController',
'PhabricatorDashboardPanelRenderingEngine' => 'Phobject', 'PhabricatorDashboardPanelRenderingEngine' => 'Phobject',
'PhabricatorDashboardPanelSearchApplicationCustomField' => 'PhabricatorStandardCustomField',
'PhabricatorDashboardPanelSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PhabricatorDashboardPanelSearchEngine' => 'PhabricatorApplicationSearchEngine',
'PhabricatorDashboardPanelTransaction' => 'PhabricatorApplicationTransaction', 'PhabricatorDashboardPanelTransaction' => 'PhabricatorApplicationTransaction',
'PhabricatorDashboardPanelTransactionEditor' => 'PhabricatorApplicationTransactionEditor', 'PhabricatorDashboardPanelTransactionEditor' => 'PhabricatorApplicationTransactionEditor',

View File

@@ -3,6 +3,10 @@
final class PhabricatorCommitSearchEngine final class PhabricatorCommitSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Commits');
}
public function buildSavedQueryFromRequest(AphrontRequest $request) { public function buildSavedQueryFromRequest(AphrontRequest $request) {
$saved = new PhabricatorSavedQuery(); $saved = new PhabricatorSavedQuery();

View File

@@ -3,6 +3,10 @@
final class PhabricatorCalendarEventSearchEngine final class PhabricatorCalendarEventSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Calendar Events');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationCalendar'; return 'PhabricatorApplicationCalendar';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorConduitSearchEngine final class PhabricatorConduitSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Conduit Methods');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationConduit'; return 'PhabricatorApplicationConduit';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorCountdownSearchEngine final class PhabricatorCountdownSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Countdowns');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationCountdown'; return 'PhabricatorApplicationCountdown';
} }

View File

@@ -0,0 +1,40 @@
<?php
final class PhabricatorDashboardPanelSearchApplicationCustomField
extends PhabricatorStandardCustomField {
public function getFieldType() {
return 'search.application';
}
public function shouldAppearInApplicationSearch() {
return false;
}
public function renderEditControl(array $handles) {
$engines = id(new PhutilSymbolLoader())
->setAncestorClass('PhabricatorApplicationSearchEngine')
->loadObjects();
$options = array();
$value = $this->getFieldValue();
if (strlen($value) && empty($engines[$value])) {
$options[$value] = $value;
}
$engines = msort($engines, 'getResultTypeDescription');
foreach ($engines as $class_name => $engine) {
$options[$class_name] = $engine->getResultTypeDescription();
}
return id(new AphrontFormSelectControl())
->setLabel($this->getFieldName())
->setCaption($this->getCaption())
->setName($this->getFieldKey())
->setValue($this->getFieldValue())
->setOptions($options);
}
}

View File

@@ -20,11 +20,11 @@ final class PhabricatorDashboardPanelTypeQuery
public function getFieldSpecifications() { public function getFieldSpecifications() {
return array( return array(
'class' => array( 'class' => array(
'name' => pht('ApplicationSearch Class'), 'name' => pht('Search For'),
'type' => 'text', 'type' => 'search.application',
), ),
'key' => array( 'key' => array(
'name' => pht('ApplicationSearch Key'), 'name' => pht('Query'),
'type' => 'text', 'type' => 'text',
), ),
'limit' => array( 'limit' => array(

View File

@@ -3,6 +3,10 @@
final class PhabricatorDashboardPanelSearchEngine final class PhabricatorDashboardPanelSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Dashboard Panels');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDashboard'; return 'PhabricatorApplicationDashboard';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorDashboardSearchEngine final class PhabricatorDashboardSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Dashboards');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDashboard'; return 'PhabricatorApplicationDashboard';
} }

View File

@@ -3,6 +3,10 @@
final class DifferentialRevisionSearchEngine final class DifferentialRevisionSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Differential Revisions');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDifferential'; return 'PhabricatorApplicationDifferential';
} }

View File

@@ -3,6 +3,10 @@
final class DivinerAtomSearchEngine final class DivinerAtomSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Documentation Atoms');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDiviner'; return 'PhabricatorApplicationDiviner';
} }

View File

@@ -3,6 +3,10 @@
final class DrydockBlueprintSearchEngine final class DrydockBlueprintSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Drydock Blueprints');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDrydock'; return 'PhabricatorApplicationDrydock';
} }

View File

@@ -3,6 +3,10 @@
final class DrydockLeaseSearchEngine final class DrydockLeaseSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Drydock Leases');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDrydock'; return 'PhabricatorApplicationDrydock';
} }

View File

@@ -3,6 +3,10 @@
final class DrydockLogSearchEngine final class DrydockLogSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Drydock Logs');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDrydock'; return 'PhabricatorApplicationDrydock';
} }

View File

@@ -3,6 +3,10 @@
final class DrydockResourceSearchEngine final class DrydockResourceSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Drydock Resources');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDrydock'; return 'PhabricatorApplicationDrydock';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorFeedSearchEngine final class PhabricatorFeedSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Feed Stories');
}
public function buildSavedQueryFromRequest(AphrontRequest $request) { public function buildSavedQueryFromRequest(AphrontRequest $request) {
$saved = new PhabricatorSavedQuery(); $saved = new PhabricatorSavedQuery();

View File

@@ -3,6 +3,10 @@
final class PhabricatorFileSearchEngine final class PhabricatorFileSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Files');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationFiles'; return 'PhabricatorApplicationFiles';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorFlagSearchEngine final class PhabricatorFlagSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Flags');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationFlags'; return 'PhabricatorApplicationFlags';
} }

View File

@@ -3,6 +3,10 @@
final class HarbormasterBuildPlanSearchEngine final class HarbormasterBuildPlanSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Harbormaster Build Plans');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationHarbormaster'; return 'PhabricatorApplicationHarbormaster';
} }

View File

@@ -3,6 +3,10 @@
final class HarbormasterBuildableSearchEngine final class HarbormasterBuildableSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Harbormaster Buildables');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationHarbormaster'; return 'PhabricatorApplicationHarbormaster';
} }

View File

@@ -3,6 +3,10 @@
final class HeraldRuleSearchEngine final class HeraldRuleSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Herald Rules');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationHerald'; return 'PhabricatorApplicationHerald';
} }

View File

@@ -3,6 +3,10 @@
final class HeraldTranscriptSearchEngine final class HeraldTranscriptSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Herald Transcripts');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationHerald'; return 'PhabricatorApplicationHerald';
} }

View File

@@ -3,6 +3,10 @@
final class LegalpadDocumentSearchEngine final class LegalpadDocumentSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Legalpad Documents');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationLegalpad'; return 'PhabricatorApplicationLegalpad';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorMacroSearchEngine final class PhabricatorMacroSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Macros');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationMacro'; return 'PhabricatorApplicationMacro';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorMailingListSearchEngine final class PhabricatorMailingListSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Mailing Lists');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationMailingLists'; return 'PhabricatorApplicationMailingLists';
} }

View File

@@ -30,6 +30,10 @@ final class ManiphestTaskSearchEngine
return $this; return $this;
} }
public function getResultTypeDescription() {
return pht('Tasks');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationManiphest'; return 'PhabricatorApplicationManiphest';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorAppSearchEngine final class PhabricatorAppSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Applications');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationApplications'; return 'PhabricatorApplicationApplications';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorOAuthServerClientSearchEngine final class PhabricatorOAuthServerClientSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('OAuth Clients');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationOAuthServer'; return 'PhabricatorApplicationOAuthServer';
} }

View File

@@ -3,6 +3,10 @@
final class PassphraseCredentialSearchEngine final class PassphraseCredentialSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Passphrase Credentials');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationPassphrase'; return 'PhabricatorApplicationPassphrase';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorPasteSearchEngine final class PhabricatorPasteSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Pastes');
}
public function buildSavedQueryFromRequest(AphrontRequest $request) { public function buildSavedQueryFromRequest(AphrontRequest $request) {
$saved = new PhabricatorSavedQuery(); $saved = new PhabricatorSavedQuery();
$saved->setParameter( $saved->setParameter(

View File

@@ -3,6 +3,10 @@
final class PhabricatorPeopleLogSearchEngine final class PhabricatorPeopleLogSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Account Activity');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationPeople'; return 'PhabricatorApplicationPeople';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorPeopleSearchEngine final class PhabricatorPeopleSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Users');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationPeople'; return 'PhabricatorApplicationPeople';
} }

View File

@@ -3,6 +3,10 @@
final class PholioMockSearchEngine final class PholioMockSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Pholio Mocks');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationPholio'; return 'PhabricatorApplicationPholio';
} }

View File

@@ -3,6 +3,10 @@
final class PhrequentSearchEngine final class PhrequentSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Phrequent Time');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationPhrequent'; return 'PhabricatorApplicationPhrequent';
} }

View File

@@ -3,6 +3,10 @@
final class PhrictionSearchEngine final class PhrictionSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Wiki Documents');
}
public function buildSavedQueryFromRequest(AphrontRequest $request) { public function buildSavedQueryFromRequest(AphrontRequest $request) {
$saved = new PhabricatorSavedQuery(); $saved = new PhabricatorSavedQuery();

View File

@@ -3,6 +3,10 @@
final class PonderQuestionSearchEngine final class PonderQuestionSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Ponder Questions');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationPonder'; return 'PhabricatorApplicationPonder';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorProjectSearchEngine final class PhabricatorProjectSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Projects');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationProject'; return 'PhabricatorApplicationProject';
} }

View File

@@ -5,6 +5,10 @@ final class ReleephBranchSearchEngine
private $product; private $product;
public function getResultTypeDescription() {
return pht('Releeph Branches');
}
public function setProduct(ReleephProject $product) { public function setProduct(ReleephProject $product) {
$this->product = $product; $this->product = $product;
return $this; return $this;

View File

@@ -3,6 +3,10 @@
final class ReleephProductSearchEngine final class ReleephProductSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Releeph Products');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationReleeph'; return 'PhabricatorApplicationReleeph';
} }

View File

@@ -6,6 +6,10 @@ final class ReleephRequestSearchEngine
private $branch; private $branch;
private $baseURI; private $baseURI;
public function getResultTypeDescription() {
return pht('Releeph Pull Requests');
}
public function setBranch(ReleephBranch $branch) { public function setBranch(ReleephBranch $branch) {
$this->branch = $branch; $this->branch = $branch;
return $this; return $this;

View File

@@ -3,6 +3,10 @@
final class PhabricatorRepositoryPushLogSearchEngine final class PhabricatorRepositoryPushLogSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Push Logs');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDiffusion'; return 'PhabricatorApplicationDiffusion';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorRepositorySearchEngine final class PhabricatorRepositorySearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Repositories');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationDiffusion'; return 'PhabricatorApplicationDiffusion';
} }

View File

@@ -120,6 +120,18 @@ abstract class PhabricatorApplicationSearchEngine {
abstract protected function getURI($path); abstract protected function getURI($path);
/**
* Return a human readable description of the type of objects this query
* searches for.
*
* For example, "Tasks" or "Commits".
*
* @return string Human-readable description of what this engine is used to
* find.
*/
abstract public function getResultTypeDescription();
public function newSavedQuery() { public function newSavedQuery() {
return id(new PhabricatorSavedQuery()) return id(new PhabricatorSavedQuery())
->setEngineClassName(get_class($this)); ->setEngineClassName(get_class($this));

View File

@@ -3,6 +3,10 @@
final class PhabricatorSearchApplicationSearchEngine final class PhabricatorSearchApplicationSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Fulltext Results');
}
public function getApplicationClassName() { public function getApplicationClassName() {
return 'PhabricatorApplicationSearch'; return 'PhabricatorApplicationSearch';
} }

View File

@@ -3,6 +3,10 @@
final class PhabricatorSlowvoteSearchEngine final class PhabricatorSlowvoteSearchEngine
extends PhabricatorApplicationSearchEngine { extends PhabricatorApplicationSearchEngine {
public function getResultTypeDescription() {
return pht('Slowvotes');
}
public function buildSavedQueryFromRequest(AphrontRequest $request) { public function buildSavedQueryFromRequest(AphrontRequest $request) {
$saved = new PhabricatorSavedQuery(); $saved = new PhabricatorSavedQuery();
$saved->setParameter( $saved->setParameter(