diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 9bc8fe9ea7..f3ee3cf6c0 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -676,6 +676,7 @@ phutil_register_library_map(array( 'DrydockResourceCloseController' => 'applications/drydock/controller/DrydockResourceCloseController.php', 'DrydockResourceListController' => 'applications/drydock/controller/DrydockResourceListController.php', 'DrydockResourceQuery' => 'applications/drydock/query/DrydockResourceQuery.php', + 'DrydockResourceSearchEngine' => 'applications/drydock/query/DrydockResourceSearchEngine.php', 'DrydockResourceStatus' => 'applications/drydock/constants/DrydockResourceStatus.php', 'DrydockResourceViewController' => 'applications/drydock/controller/DrydockResourceViewController.php', 'DrydockSFTPFilesystemInterface' => 'applications/drydock/interface/filesystem/DrydockSFTPFilesystemInterface.php', @@ -3091,8 +3092,13 @@ phutil_register_library_map(array( 1 => 'PhabricatorPolicyInterface', ), 'DrydockResourceCloseController' => 'DrydockController', - 'DrydockResourceListController' => 'DrydockController', + 'DrydockResourceListController' => + array( + 0 => 'DrydockController', + 1 => 'PhabricatorApplicationSearchResultsControllerInterface', + ), 'DrydockResourceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DrydockResourceSearchEngine' => 'PhabricatorApplicationSearchEngine', 'DrydockResourceStatus' => 'DrydockConstants', 'DrydockResourceViewController' => 'DrydockController', 'DrydockSFTPFilesystemInterface' => 'DrydockFilesystemInterface', diff --git a/src/applications/drydock/application/PhabricatorApplicationDrydock.php b/src/applications/drydock/application/PhabricatorApplicationDrydock.php index 531e6b5a25..6b7df2c03d 100644 --- a/src/applications/drydock/application/PhabricatorApplicationDrydock.php +++ b/src/applications/drydock/application/PhabricatorApplicationDrydock.php @@ -41,7 +41,7 @@ final class PhabricatorApplicationDrydock extends PhabricatorApplication { 'edit/(?P[1-9]\d*)/' => 'DrydockBlueprintEditController', ), 'resource/' => array( - '' => 'DrydockResourceListController', + '(?:query/(?P[^/]+)/)?' => 'DrydockResourceListController', '(?P[1-9]\d*)/' => 'DrydockResourceViewController', '(?P[1-9]\d*)/close/' => 'DrydockResourceCloseController', ), diff --git a/src/applications/drydock/constants/DrydockResourceStatus.php b/src/applications/drydock/constants/DrydockResourceStatus.php index 0aa11c7b6f..7d11d93cba 100644 --- a/src/applications/drydock/constants/DrydockResourceStatus.php +++ b/src/applications/drydock/constants/DrydockResourceStatus.php @@ -9,15 +9,25 @@ final class DrydockResourceStatus extends DrydockConstants { const STATUS_DESTROYED = 4; public static function getNameForStatus($status) { - static $map = array( - self::STATUS_PENDING => 'Pending', - self::STATUS_OPEN => 'Open', - self::STATUS_CLOSED => 'Closed', - self::STATUS_BROKEN => 'Broken', - self::STATUS_DESTROYED => 'Destroyed', + $map = array( + self::STATUS_PENDING => pht('Pending'), + self::STATUS_OPEN => pht('Open'), + self::STATUS_CLOSED => pht('Closed'), + self::STATUS_BROKEN => pht('Broken'), + self::STATUS_DESTROYED => pht('Destroyed'), ); return idx($map, $status, 'Unknown'); } + public static function getAllStatuses() { + return array( + self::STATUS_PENDING, + self::STATUS_OPEN, + self::STATUS_CLOSED, + self::STATUS_BROKEN, + self::STATUS_DESTROYED, + ); + } + } diff --git a/src/applications/drydock/controller/DrydockController.php b/src/applications/drydock/controller/DrydockController.php index f23e3deeb5..c36251890d 100644 --- a/src/applications/drydock/controller/DrydockController.php +++ b/src/applications/drydock/controller/DrydockController.php @@ -14,8 +14,9 @@ abstract class DrydockController extends PhabricatorController { ->setViewer($this->getRequest()->getUser()) ->addNavigationItems($nav->getMenu(), pht('Leases')); - $nav->addLabel(pht('Resources')); - $nav->addFilter('resource', 'Resources'); + id(new DrydockResourceSearchEngine()) + ->setViewer($this->getRequest()->getUser()) + ->addNavigationItems($nav->getMenu(), pht('Resources')); $nav->addLabel(pht('Logs')); $nav->addFilter('log', 'Logs'); diff --git a/src/applications/drydock/controller/DrydockResourceListController.php b/src/applications/drydock/controller/DrydockResourceListController.php index a868eefc29..798d01cdb5 100644 --- a/src/applications/drydock/controller/DrydockResourceListController.php +++ b/src/applications/drydock/controller/DrydockResourceListController.php @@ -1,43 +1,34 @@ queryKey = idx($data, 'queryKey'); + } public function processRequest() { $request = $this->getRequest(); - $user = $request->getUser(); + $controller = id(new PhabricatorApplicationSearchController($request)) + ->setQueryKey($this->queryKey) + ->setSearchEngine(new DrydockResourceSearchEngine()) + ->setNavigation($this->buildSideNav()); - $title = pht('Resources'); + return $this->delegateToController($controller); + } - $resource_header = id(new PHUIHeaderView()) - ->setHeader($title); - - $pager = new AphrontPagerView(); - $pager->setURI(new PhutilURI('/drydock/resource/'), 'offset'); - $resources = id(new DrydockResourceQuery()) - ->setViewer($user) - ->executeWithOffsetPager($pager); - - $resource_list = $this->buildResourceListView($resources); - - $crumbs = $this->buildApplicationCrumbs(); - $crumbs->addTextCrumb($title, $request->getRequestURI()); - - $nav = $this->buildSideNav('resource'); - $nav->setCrumbs($crumbs); - $nav->appendChild( - array( - $resource_header, - $resource_list, - $pager, - )); - - return $this->buildApplicationPage( - $nav, - array( - 'title' => $title, - 'device' => true, - )); + public function renderResultsList( + array $resources, + PhabricatorSavedQuery $query) { + assert_instances_of($resources, 'DrydockResource'); + return $this->buildResourceListView($resources); } } diff --git a/src/applications/drydock/query/DrydockResourceSearchEngine.php b/src/applications/drydock/query/DrydockResourceSearchEngine.php new file mode 100644 index 0000000000..80a54212c9 --- /dev/null +++ b/src/applications/drydock/query/DrydockResourceSearchEngine.php @@ -0,0 +1,80 @@ +setParameter( + 'statuses', + $this->readListFromRequest($request, 'statuses')); + + return $saved; + } + + public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { + $query = id(new DrydockResourceQuery()); + + $statuses = $saved->getParameter('statuses', array()); + if ($statuses) { + $query->withStatuses($statuses); + } + + return $query; + } + + public function buildSearchForm( + AphrontFormView $form, + PhabricatorSavedQuery $saved) { + + $statuses = $saved->getParameter('statuses', array()); + + $status_control = id(new AphrontFormCheckboxControl()) + ->setLabel(pht('Status')); + foreach (DrydockResourceStatus::getAllStatuses() as $status) { + $status_control->addCheckbox( + 'statuses[]', + $status, + DrydockResourceStatus::getNameForStatus($status), + in_array($status, $statuses)); + } + + $form + ->appendChild($status_control); + + } + + protected function getURI($path) { + return '/drydock/resource/'.$path; + } + + public function getBuiltinQueryNames() { + $names = array( + 'active' => pht('Active Resources'), + 'all' => pht('All Resources'), + ); + + return $names; + } + + public function buildSavedQueryFromBuiltin($query_key) { + $query = $this->newSavedQuery(); + $query->setQueryKey($query_key); + + switch ($query_key) { + case 'active': + return $query->setParameter( + 'statuses', + array( + DrydockResourceStatus::STATUS_PENDING, + DrydockResourceStatus::STATUS_OPEN, + )); + case 'all': + return $query; + } + + return parent::buildSavedQueryFromBuiltin($query_key); + } + +}