From cd651001b6c6533dc99fb0724c0e9a085ea4476a Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 14 Feb 2012 17:00:12 -0800 Subject: [PATCH] Add a contextual "scope" dropdown for searches Summary: Add a "Search for ... in (document group)" thing that picks the current scope based on the current application. Test Plan: Conducted searches in several browsers. Reviewers: btrahan, skrul Reviewed By: btrahan CC: aran, epriestley Maniphest Tasks: T858 Differential Revision: https://secure.phabricator.com/D1610 --- src/__phutil_library_map__.php | 1 + .../base/DifferentialController.php | 3 +- .../differential/controller/base/__init__.php | 1 + .../controller/base/DiffusionController.php | 1 + .../diffusion/controller/base/__init__.php | 1 + .../controller/base/ManiphestController.php | 3 +- .../maniphest/controller/base/__init__.php | 1 + .../controller/base/PhrictionController.php | 3 +- .../phriction/controller/base/__init__.php | 1 + .../scope/PhabricatorSearchScope.php | 40 +++++++++++++ .../search/constants/scope/__init__.php | 10 ++++ .../search/PhabricatorSearchController.php | 59 ++++++++++++++----- .../search/controller/search/__init__.php | 1 + .../select/AphrontFormSelectControl.php | 33 +++++++---- .../standard/PhabricatorStandardPageView.php | 18 ++++++ src/view/page/standard/__init__.php | 2 + 16 files changed, 149 insertions(+), 29 deletions(-) create mode 100644 src/applications/search/constants/scope/PhabricatorSearchScope.php create mode 100644 src/applications/search/constants/scope/__init__.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 8103052c22..5a99b73845 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -723,6 +723,7 @@ phutil_register_library_map(array( 'PhabricatorSearchQuery' => 'applications/search/storage/query', 'PhabricatorSearchRelationship' => 'applications/search/constants/relationship', 'PhabricatorSearchResultView' => 'applications/search/view/searchresult', + 'PhabricatorSearchScope' => 'applications/search/constants/scope', 'PhabricatorSearchSelectController' => 'applications/search/controller/select', 'PhabricatorSearchUserIndexer' => 'applications/search/index/indexer/user', 'PhabricatorSetup' => 'infrastructure/setup', diff --git a/src/applications/differential/controller/base/DifferentialController.php b/src/applications/differential/controller/base/DifferentialController.php index 3a95ab8659..07f6244324 100644 --- a/src/applications/differential/controller/base/DifferentialController.php +++ b/src/applications/differential/controller/base/DifferentialController.php @@ -1,7 +1,7 @@ setGlyph("\xE2\x9A\x99"); $page->appendChild($view); $page->setIsLoggedOut($viewer_is_anonymous); + $page->setSearchDefaultScope(PhabricatorSearchScope::SCOPE_OPEN_REVISIONS); $response = new AphrontWebpageResponse(); return $response->setContent($page->render()); diff --git a/src/applications/differential/controller/base/__init__.php b/src/applications/differential/controller/base/__init__.php index 00b02d92ec..91ef05e10e 100644 --- a/src/applications/differential/controller/base/__init__.php +++ b/src/applications/differential/controller/base/__init__.php @@ -8,6 +8,7 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); +phutil_require_module('phabricator', 'applications/search/constants/scope'); phutil_require_module('phabricator', 'infrastructure/celerity/api'); phutil_require_module('phabricator', 'infrastructure/env'); diff --git a/src/applications/diffusion/controller/base/DiffusionController.php b/src/applications/diffusion/controller/base/DiffusionController.php index 63a67124d1..6e8c736813 100644 --- a/src/applications/diffusion/controller/base/DiffusionController.php +++ b/src/applications/diffusion/controller/base/DiffusionController.php @@ -51,6 +51,7 @@ abstract class DiffusionController extends PhabricatorController { ), ), null); + $page->setSearchDefaultScope(PhabricatorSearchScope::SCOPE_COMMITS); $page->appendChild($view); diff --git a/src/applications/diffusion/controller/base/__init__.php b/src/applications/diffusion/controller/base/__init__.php index 2be5bb582b..fd585c8ff3 100644 --- a/src/applications/diffusion/controller/base/__init__.php +++ b/src/applications/diffusion/controller/base/__init__.php @@ -14,6 +14,7 @@ phutil_require_module('phabricator', 'applications/diffusion/query/pathid/base') phutil_require_module('phabricator', 'applications/diffusion/request/base'); phutil_require_module('phabricator', 'applications/diffusion/view/base'); phutil_require_module('phabricator', 'applications/phid/handle/data'); +phutil_require_module('phabricator', 'applications/search/constants/scope'); phutil_require_module('phabricator', 'infrastructure/env'); phutil_require_module('phabricator', 'view/layout/crumbs'); phutil_require_module('phabricator', 'view/layout/panel'); diff --git a/src/applications/maniphest/controller/base/ManiphestController.php b/src/applications/maniphest/controller/base/ManiphestController.php index 70067624a4..69e515651b 100644 --- a/src/applications/maniphest/controller/base/ManiphestController.php +++ b/src/applications/maniphest/controller/base/ManiphestController.php @@ -1,7 +1,7 @@ setTitle(idx($data, 'title')); $page->setGlyph("\xE2\x9A\x93"); $page->appendChild($view); + $page->setSearchDefaultScope(PhabricatorSearchScope::SCOPE_OPEN_TASKS); $response = new AphrontWebpageResponse(); return $response->setContent($page->render()); diff --git a/src/applications/maniphest/controller/base/__init__.php b/src/applications/maniphest/controller/base/__init__.php index 04b0fcd7dc..12d7fc510e 100644 --- a/src/applications/maniphest/controller/base/__init__.php +++ b/src/applications/maniphest/controller/base/__init__.php @@ -8,6 +8,7 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); +phutil_require_module('phabricator', 'applications/search/constants/scope'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/phriction/controller/base/PhrictionController.php b/src/applications/phriction/controller/base/PhrictionController.php index 7b8f7d8633..7f2e872223 100644 --- a/src/applications/phriction/controller/base/PhrictionController.php +++ b/src/applications/phriction/controller/base/PhrictionController.php @@ -1,7 +1,7 @@ setTabs($tabs, idx($data, 'tab')); $page->appendChild($view); + $page->setSearchDefaultScope(PhabricatorSearchScope::SCOPE_WIKI); $response = new AphrontWebpageResponse(); return $response->setContent($page->render()); diff --git a/src/applications/phriction/controller/base/__init__.php b/src/applications/phriction/controller/base/__init__.php index 73a0c10d5e..879aa4caad 100644 --- a/src/applications/phriction/controller/base/__init__.php +++ b/src/applications/phriction/controller/base/__init__.php @@ -8,6 +8,7 @@ phutil_require_module('phabricator', 'aphront/response/webpage'); phutil_require_module('phabricator', 'applications/base/controller/base'); +phutil_require_module('phabricator', 'applications/search/constants/scope'); phutil_require_module('phabricator', 'infrastructure/env'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/search/constants/scope/PhabricatorSearchScope.php b/src/applications/search/constants/scope/PhabricatorSearchScope.php new file mode 100644 index 0000000000..0ac4f7603d --- /dev/null +++ b/src/applications/search/constants/scope/PhabricatorSearchScope.php @@ -0,0 +1,40 @@ + 'All Documents', + self::SCOPE_OPEN_TASKS => 'Open Tasks', + self::SCOPE_WIKI => 'Wiki Documents', + self::SCOPE_OPEN_REVISIONS => 'Open Revisions', + self::SCOPE_COMMITS => 'Commits', + ); + } + +} diff --git a/src/applications/search/constants/scope/__init__.php b/src/applications/search/constants/scope/__init__.php new file mode 100644 index 0000000000..ee1b5df58f --- /dev/null +++ b/src/applications/search/constants/scope/__init__.php @@ -0,0 +1,10 @@ +isFormPost()) { $query->setQuery($request->getStr('query')); - if (strlen($request->getStr('type'))) { - $query->setParameter('type', $request->getStr('type')); - } + if ($request->getStr('scope')) { + switch ($request->getStr('scope')) { + case PhabricatorSearchScope::SCOPE_OPEN_REVISIONS: + $query->setParameter('open', 1); + $query->setParameter( + 'type', + PhabricatorPHIDConstants::PHID_TYPE_DREV); + break; + case PhabricatorSearchScope::SCOPE_OPEN_TASKS: + $query->setParameter('open', 1); + $query->setParameter( + 'type', + PhabricatorPHIDConstants::PHID_TYPE_TASK); + break; + case PhabricatorSearchScope::SCOPE_WIKI: + $query->setParameter( + 'type', + PhabricatorPHIDConstants::PHID_TYPE_WIKI); + break; + case PhabricatorSearchScope::SCOPE_COMMITS: + $query->setParameter( + 'type', + PhabricatorPHIDConstants::PHID_TYPE_CMIT); + break; + default: + break; + } + } else { + if (strlen($request->getStr('type'))) { + $query->setParameter('type', $request->getStr('type')); + } - if ($request->getArr('author')) { - $query->setParameter('author', $request->getArr('author')); - } + if ($request->getArr('author')) { + $query->setParameter('author', $request->getArr('author')); + } - if ($request->getArr('owner')) { - $query->setParameter('owner', $request->getArr('owner')); - } + if ($request->getArr('owner')) { + $query->setParameter('owner', $request->getArr('owner')); + } - if ($request->getInt('open')) { - $query->setParameter('open', $request->getInt('open')); - } + if ($request->getInt('open')) { + $query->setParameter('open', $request->getInt('open')); + } - if ($request->getArr('project')) { - $query->setParameter('project', $request->getArr('project')); + if ($request->getArr('project')) { + $query->setParameter('project', $request->getArr('project')); + } } $query->save(); @@ -215,7 +244,7 @@ class PhabricatorSearchController extends PhabricatorSearchBaseController { $results, ), array( - 'title' => 'Results: what', + 'title' => 'Search Results', )); } diff --git a/src/applications/search/controller/search/__init__.php b/src/applications/search/controller/search/__init__.php index 3754fb9f94..9285ceecd0 100644 --- a/src/applications/search/controller/search/__init__.php +++ b/src/applications/search/controller/search/__init__.php @@ -10,6 +10,7 @@ phutil_require_module('phabricator', 'aphront/response/404'); phutil_require_module('phabricator', 'aphront/response/redirect'); phutil_require_module('phabricator', 'applications/phid/constants'); phutil_require_module('phabricator', 'applications/phid/handle/data'); +phutil_require_module('phabricator', 'applications/search/constants/scope'); phutil_require_module('phabricator', 'applications/search/controller/base'); phutil_require_module('phabricator', 'applications/search/selector/base'); phutil_require_module('phabricator', 'applications/search/storage/query'); diff --git a/src/view/form/control/select/AphrontFormSelectControl.php b/src/view/form/control/select/AphrontFormSelectControl.php index fdb6a58080..0290a027ac 100644 --- a/src/view/form/control/select/AphrontFormSelectControl.php +++ b/src/view/form/control/select/AphrontFormSelectControl.php @@ -1,7 +1,7 @@ getOptions() as $value => $label) { - $options[] = phutil_render_tag( + return self::renderSelectTag( + $this->getValue(), + $this->getOptions(), + array( + 'name' => $this->getName(), + 'disabled' => $this->getDisabled() ? 'disabled' : null, + 'id' => $this->getID(), + )); + } + + public static function renderSelectTag( + $selected, + array $options, + array $attrs = array()) { + + $option_tags = array(); + foreach ($options as $value => $label) { + $option_tags[] = phutil_render_tag( 'option', array( - 'selected' => ($value == $this->getValue()) ? 'selected' : null, + 'selected' => ($value == $selected) ? 'selected' : null, 'value' => $value, ), phutil_escape_html($label)); @@ -47,12 +62,8 @@ class AphrontFormSelectControl extends AphrontFormControl { return phutil_render_tag( 'select', - array( - 'name' => $this->getName(), - 'disabled' => $this->getDisabled() ? 'disabled' : null, - 'id' => $this->getID(), - ), - implode("\n", $options)); + $attrs, + implode("\n", $option_tags)); } } diff --git a/src/view/page/standard/PhabricatorStandardPageView.php b/src/view/page/standard/PhabricatorStandardPageView.php index b8859dbf28..f5796eaa38 100644 --- a/src/view/page/standard/PhabricatorStandardPageView.php +++ b/src/view/page/standard/PhabricatorStandardPageView.php @@ -29,6 +29,7 @@ class PhabricatorStandardPageView extends AphrontPageView { private $showChrome = true; private $isFrameable = false; private $disableConsole; + private $searchDefaultScope; public function setIsAdminInterface($is_admin_interface) { $this->isAdminInterface = $is_admin_interface; @@ -103,6 +104,15 @@ class PhabricatorStandardPageView extends AphrontPageView { return $this->showChrome; } + public function setSearchDefaultScope($search_default_scope) { + $this->searchDefaultScope = $search_default_scope; + return $this; + } + + public function getSearchDefaultScope() { + return $this->searchDefaultScope; + } + public function getTitle() { $use_glyph = true; $request = $this->getRequest(); @@ -279,6 +289,14 @@ class PhabricatorStandardPageView extends AphrontPageView { 'style' => 'display: inline', ), ''. + ' in '. + AphrontFormSelectControl::renderSelectTag( + $this->getSearchDefaultScope(), + PhabricatorSearchScope::getScopeOptions(), + array( + 'name' => 'scope', + )). + ' '. ''); } } diff --git a/src/view/page/standard/__init__.php b/src/view/page/standard/__init__.php index f07d67355c..f66803a33a 100644 --- a/src/view/page/standard/__init__.php +++ b/src/view/page/standard/__init__.php @@ -9,10 +9,12 @@ phutil_require_module('phabricator', 'aphront/console/plugin/errorlog/api'); phutil_require_module('phabricator', 'aphront/request'); phutil_require_module('phabricator', 'applications/people/storage/preferences'); +phutil_require_module('phabricator', 'applications/search/constants/scope'); phutil_require_module('phabricator', 'infrastructure/celerity/api'); phutil_require_module('phabricator', 'infrastructure/env'); phutil_require_module('phabricator', 'infrastructure/javelin/api'); phutil_require_module('phabricator', 'infrastructure/javelin/markup'); +phutil_require_module('phabricator', 'view/form/control/select'); phutil_require_module('phabricator', 'view/page/base'); phutil_require_module('phutil', 'markup');