diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2493,6 +2493,7 @@ 'PhabricatorDashboardPanelNgrams' => 'applications/dashboard/storage/PhabricatorDashboardPanelNgrams.php', 'PhabricatorDashboardPanelPHIDType' => 'applications/dashboard/phid/PhabricatorDashboardPanelPHIDType.php', 'PhabricatorDashboardPanelQuery' => 'applications/dashboard/query/PhabricatorDashboardPanelQuery.php', + 'PhabricatorDashboardPanelQueryDatasource' => 'applications/dashboard/typeahead/PhabricatorDashboardPanelQueryDatasource.php', 'PhabricatorDashboardPanelRenderController' => 'applications/dashboard/controller/PhabricatorDashboardPanelRenderController.php', 'PhabricatorDashboardPanelRenderingEngine' => 'applications/dashboard/engine/PhabricatorDashboardPanelRenderingEngine.php', 'PhabricatorDashboardPanelSearchApplicationCustomField' => 'applications/dashboard/customfield/PhabricatorDashboardPanelSearchApplicationCustomField.php', @@ -7514,6 +7515,7 @@ 'PhabricatorDashboardPanelNgrams' => 'PhabricatorSearchNgrams', 'PhabricatorDashboardPanelPHIDType' => 'PhabricatorPHIDType', 'PhabricatorDashboardPanelQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'PhabricatorDashboardPanelQueryDatasource' => 'PhabricatorTypeaheadDatasource', 'PhabricatorDashboardPanelRenderController' => 'PhabricatorDashboardController', 'PhabricatorDashboardPanelRenderingEngine' => 'Phobject', 'PhabricatorDashboardPanelSearchApplicationCustomField' => 'PhabricatorStandardCustomField', diff --git a/src/applications/audit/query/PhabricatorCommitSearchEngine.php b/src/applications/audit/query/PhabricatorCommitSearchEngine.php --- a/src/applications/audit/query/PhabricatorCommitSearchEngine.php +++ b/src/applications/audit/query/PhabricatorCommitSearchEngine.php @@ -4,7 +4,7 @@ extends PhabricatorApplicationSearchEngine { public function getResultTypeDescription() { - return pht('Commits'); + return pht('Diffusion Commits'); } public function getApplicationClassName() { diff --git a/src/applications/auth/query/PhabricatorAuthInviteSearchEngine.php b/src/applications/auth/query/PhabricatorAuthInviteSearchEngine.php --- a/src/applications/auth/query/PhabricatorAuthInviteSearchEngine.php +++ b/src/applications/auth/query/PhabricatorAuthInviteSearchEngine.php @@ -4,13 +4,17 @@ extends PhabricatorApplicationSearchEngine { public function getResultTypeDescription() { - return pht('Email Invites'); + return pht('Auth Email Invites'); } public function getApplicationClassName() { return 'PhabricatorAuthApplication'; } + public function canUseInPanelContext() { + return false; + } + public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); diff --git a/src/applications/badges/query/PhabricatorBadgesSearchEngine.php b/src/applications/badges/query/PhabricatorBadgesSearchEngine.php --- a/src/applications/badges/query/PhabricatorBadgesSearchEngine.php +++ b/src/applications/badges/query/PhabricatorBadgesSearchEngine.php @@ -4,7 +4,7 @@ extends PhabricatorApplicationSearchEngine { public function getResultTypeDescription() { - return pht('Badge'); + return pht('Badges'); } public function getApplicationClassName() { diff --git a/src/applications/calendar/query/PhabricatorCalendarExportSearchEngine.php b/src/applications/calendar/query/PhabricatorCalendarExportSearchEngine.php --- a/src/applications/calendar/query/PhabricatorCalendarExportSearchEngine.php +++ b/src/applications/calendar/query/PhabricatorCalendarExportSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorCalendarApplication'; } + public function canUseInPanelContext() { + return false; + } + public function newQuery() { $viewer = $this->requireViewer(); diff --git a/src/applications/calendar/query/PhabricatorCalendarImportLogSearchEngine.php b/src/applications/calendar/query/PhabricatorCalendarImportLogSearchEngine.php --- a/src/applications/calendar/query/PhabricatorCalendarImportLogSearchEngine.php +++ b/src/applications/calendar/query/PhabricatorCalendarImportLogSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorCalendarApplication'; } + public function canUseInPanelContext() { + return false; + } + public function newQuery() { return new PhabricatorCalendarImportLogQuery(); } diff --git a/src/applications/calendar/query/PhabricatorCalendarImportSearchEngine.php b/src/applications/calendar/query/PhabricatorCalendarImportSearchEngine.php --- a/src/applications/calendar/query/PhabricatorCalendarImportSearchEngine.php +++ b/src/applications/calendar/query/PhabricatorCalendarImportSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorCalendarApplication'; } + public function canUseInPanelContext() { + return false; + } + public function newQuery() { return new PhabricatorCalendarImportQuery(); } diff --git a/src/applications/conduit/query/PhabricatorConduitLogSearchEngine.php b/src/applications/conduit/query/PhabricatorConduitLogSearchEngine.php --- a/src/applications/conduit/query/PhabricatorConduitLogSearchEngine.php +++ b/src/applications/conduit/query/PhabricatorConduitLogSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorConduitApplication'; } + public function canUseInPanelContext() { + return false; + } + public function newQuery() { return new PhabricatorConduitLogQuery(); } diff --git a/src/applications/conduit/query/PhabricatorConduitSearchEngine.php b/src/applications/conduit/query/PhabricatorConduitSearchEngine.php --- a/src/applications/conduit/query/PhabricatorConduitSearchEngine.php +++ b/src/applications/conduit/query/PhabricatorConduitSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorConduitApplication'; } + public function canUseInPanelContext() { + return false; + } + public function getPageSize(PhabricatorSavedQuery $saved) { return PHP_INT_MAX - 1; } diff --git a/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php b/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php --- a/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php +++ b/src/applications/conpherence/query/ConpherenceThreadSearchEngine.php @@ -4,7 +4,7 @@ extends PhabricatorApplicationSearchEngine { public function getResultTypeDescription() { - return pht('Rooms'); + return pht('Conpherence Rooms'); } public function getApplicationClassName() { diff --git a/src/applications/dashboard/customfield/PhabricatorDashboardPanelSearchApplicationCustomField.php b/src/applications/dashboard/customfield/PhabricatorDashboardPanelSearchApplicationCustomField.php --- a/src/applications/dashboard/customfield/PhabricatorDashboardPanelSearchApplicationCustomField.php +++ b/src/applications/dashboard/customfield/PhabricatorDashboardPanelSearchApplicationCustomField.php @@ -12,42 +12,18 @@ } public function renderEditControl(array $handles) { - $engines = id(new PhutilClassMapQuery()) - ->setAncestorClass('PhabricatorApplicationSearchEngine') - ->setFilterMethod('canUseInPanelContext') - ->execute(); - - $all_apps = id(new PhabricatorApplicationQuery()) - ->setViewer($this->getViewer()) - ->withUnlisted(false) - ->withInstalled(true) - ->execute(); - foreach ($engines as $index => $engine) { - if (!isset($all_apps[$engine->getApplicationClassName()])) { - unset($engines[$index]); - continue; - } - } - - $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()) + return id(new AphrontFormTokenizerControl()) + ->setUser($this->getViewer()) ->setID($this->getFieldControlID()) ->setLabel($this->getFieldName()) ->setCaption($this->getCaption()) ->setName($this->getFieldKey()) ->setValue($this->getFieldValue()) - ->setOptions($options); + ->setLimit(1) + ->setDatasource(new PhabricatorDashboardPanelQueryDatasource()); } } diff --git a/src/applications/dashboard/typeahead/PhabricatorDashboardPanelQueryDatasource.php b/src/applications/dashboard/typeahead/PhabricatorDashboardPanelQueryDatasource.php new file mode 100644 --- /dev/null +++ b/src/applications/dashboard/typeahead/PhabricatorDashboardPanelQueryDatasource.php @@ -0,0 +1,72 @@ +buildResults(); + return $this->filterResultsAgainstTokens($results); + } + + + protected function renderSpecialTokens(array $values) { + return $this->renderTokensFromResults($this->buildResults(), $values); + } + + private function buildResults() { + $engines = id(new PhutilClassMapQuery()) + ->setAncestorClass('PhabricatorApplicationSearchEngine') + ->setFilterMethod('canUseInPanelContext') + ->execute(); + + $all_apps = id(new PhabricatorApplicationQuery()) + ->setViewer($this->getViewer()) + ->withUnlisted(false) + ->withInstalled(true) + ->execute(); + $icons = array(); + foreach ($engines as $index => $engine) { + if (!isset($all_apps[$engine->getApplicationClassName()])) { + unset($engines[$index]); + continue; + } + $app = $all_apps[$engine->getApplicationClassName()]; + $icons[$index] = $app->getIcon(); + } + + $engines = msort($engines, 'getResultTypeDescription'); + $options = array(); + foreach ($engines as $class_name => $engine) { + $option = array(); + $option['name'] = $engine->getResultTypeDescription(); + $option['engine'] = $class_name; + $option['icon'] = $icons[$class_name]; + $options[] = $option; + } + + $results = array(); + foreach ($options as $option) { + $value = $option['engine']; + $result = id(new PhabricatorTypeaheadResult()) + ->setPHID($value) + ->setName($option['name']) + ->setIcon($option['icon']); + + $results[$value] = $result; + } + return $results; + } + +} diff --git a/src/applications/diviner/query/DivinerAtomSearchEngine.php b/src/applications/diviner/query/DivinerAtomSearchEngine.php --- a/src/applications/diviner/query/DivinerAtomSearchEngine.php +++ b/src/applications/diviner/query/DivinerAtomSearchEngine.php @@ -10,6 +10,10 @@ return 'PhabricatorDivinerApplication'; } + public function canUseInPanelContext() { + return false; + } + public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); diff --git a/src/applications/files/query/PhabricatorFileSearchEngine.php b/src/applications/files/query/PhabricatorFileSearchEngine.php --- a/src/applications/files/query/PhabricatorFileSearchEngine.php +++ b/src/applications/files/query/PhabricatorFileSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorFilesApplication'; } + public function canUseInPanelContext() { + return false; + } + public function newQuery() { return new PhabricatorFileQuery(); } diff --git a/src/applications/herald/query/HeraldTranscriptSearchEngine.php b/src/applications/herald/query/HeraldTranscriptSearchEngine.php --- a/src/applications/herald/query/HeraldTranscriptSearchEngine.php +++ b/src/applications/herald/query/HeraldTranscriptSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorHeraldApplication'; } + public function canUseInPanelContext() { + return false; + } + public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); diff --git a/src/applications/maniphest/query/ManiphestTaskSearchEngine.php b/src/applications/maniphest/query/ManiphestTaskSearchEngine.php --- a/src/applications/maniphest/query/ManiphestTaskSearchEngine.php +++ b/src/applications/maniphest/query/ManiphestTaskSearchEngine.php @@ -31,7 +31,7 @@ } public function getResultTypeDescription() { - return pht('Tasks'); + return pht('Maniphest Tasks'); } public function getApplicationClassName() { diff --git a/src/applications/metamta/query/PhabricatorMetaMTAMailSearchEngine.php b/src/applications/metamta/query/PhabricatorMetaMTAMailSearchEngine.php --- a/src/applications/metamta/query/PhabricatorMetaMTAMailSearchEngine.php +++ b/src/applications/metamta/query/PhabricatorMetaMTAMailSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorMetaMTAApplication'; } + public function canUseInPanelContext() { + return false; + } + public function newQuery() { return new PhabricatorMetaMTAMailQuery(); } diff --git a/src/applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php b/src/applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php --- a/src/applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php +++ b/src/applications/oauthserver/query/PhabricatorOAuthServerClientSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorOAuthServerApplication'; } + public function canUseInPanelContext() { + return false; + } + public function newQuery() { return id(new PhabricatorOAuthServerClientQuery()); } diff --git a/src/applications/phrequent/query/PhrequentSearchEngine.php b/src/applications/phrequent/query/PhrequentSearchEngine.php --- a/src/applications/phrequent/query/PhrequentSearchEngine.php +++ b/src/applications/phrequent/query/PhrequentSearchEngine.php @@ -10,6 +10,11 @@ return 'PhabricatorPhrequentApplication'; } + public function canUseInPanelContext() { + return false; + } + + public function getPageSize(PhabricatorSavedQuery $saved) { return $saved->getParameter('limit', 1000); } diff --git a/src/applications/phurl/query/PhabricatorPhurlURLSearchEngine.php b/src/applications/phurl/query/PhabricatorPhurlURLSearchEngine.php --- a/src/applications/phurl/query/PhabricatorPhurlURLSearchEngine.php +++ b/src/applications/phurl/query/PhabricatorPhurlURLSearchEngine.php @@ -4,7 +4,7 @@ extends PhabricatorApplicationSearchEngine { public function getResultTypeDescription() { - return pht('Shortened URLs'); + return pht('Phurl URLs'); } public function getApplicationClassName() { diff --git a/src/applications/project/query/PhabricatorProjectColumnSearchEngine.php b/src/applications/project/query/PhabricatorProjectColumnSearchEngine.php --- a/src/applications/project/query/PhabricatorProjectColumnSearchEngine.php +++ b/src/applications/project/query/PhabricatorProjectColumnSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorProjectApplication'; } + public function canUseInPanelContext() { + return false; + } + public function newQuery() { return new PhabricatorProjectColumnQuery(); } @@ -25,7 +29,6 @@ ); } - protected function buildQueryFromParameters(array $map) { $query = $this->newQuery(); diff --git a/src/applications/releeph/query/ReleephBranchSearchEngine.php b/src/applications/releeph/query/ReleephBranchSearchEngine.php --- a/src/applications/releeph/query/ReleephBranchSearchEngine.php +++ b/src/applications/releeph/query/ReleephBranchSearchEngine.php @@ -9,6 +9,10 @@ return pht('Releeph Branches'); } + public function canUseInPanelContext() { + return false; + } + public function getApplicationClassName() { return 'PhabricatorReleephApplication'; } diff --git a/src/applications/releeph/query/ReleephProductSearchEngine.php b/src/applications/releeph/query/ReleephProductSearchEngine.php --- a/src/applications/releeph/query/ReleephProductSearchEngine.php +++ b/src/applications/releeph/query/ReleephProductSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorReleephApplication'; } + public function canUseInPanelContext() { + return false; + } + public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); diff --git a/src/applications/releeph/query/ReleephRequestSearchEngine.php b/src/applications/releeph/query/ReleephRequestSearchEngine.php --- a/src/applications/releeph/query/ReleephRequestSearchEngine.php +++ b/src/applications/releeph/query/ReleephRequestSearchEngine.php @@ -14,6 +14,10 @@ return 'PhabricatorReleephApplication'; } + public function canUseInPanelContext() { + return false; + } + public function setBranch(ReleephBranch $branch) { $this->branch = $branch; return $this; diff --git a/src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php b/src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php --- a/src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php +++ b/src/applications/search/query/PhabricatorSearchApplicationSearchEngine.php @@ -11,6 +11,10 @@ return 'PhabricatorSearchApplication'; } + public function canUseInPanelContext() { + return false; + } + public function buildSavedQueryFromRequest(AphrontRequest $request) { $saved = new PhabricatorSavedQuery(); diff --git a/src/infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobSearchEngine.php b/src/infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobSearchEngine.php --- a/src/infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobSearchEngine.php +++ b/src/infrastructure/daemon/workers/query/PhabricatorWorkerBulkJobSearchEngine.php @@ -4,7 +4,7 @@ extends PhabricatorApplicationSearchEngine { public function getResultTypeDescription() { - return pht('Bulk Jobs'); + return pht('Daemon Bulk Jobs'); } public function getApplicationClassName() { @@ -15,6 +15,10 @@ return id(new PhabricatorWorkerBulkJobQuery()); } + public function canUseInPanelContext() { + return false; + } + protected function buildQueryFromParameters(array $map) { $query = $this->newQuery();