Skip to content

Commit 70244d3

Browse files
author
epriestley
committedDec 26, 2013
Use ApplicationSearch to manage DrydockLeases
Summary: Ref T2015. Applies ApplicationSearch to DrydockLease. This makes the left nav in Drydock a little funky. It will probably get worse for a bit before it gets better, since I want to bring everything to ApplicationSearch and then sort out the details. Test Plan: Queried leases in Drydock. Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T2015 Differential Revision: https://secure.phabricator.com/D7827
1 parent 6b2d480 commit 70244d3

8 files changed

+161
-54
lines changed
 

‎src/__phutil_library_map__.php

+13-3
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,7 @@
653653
'DrydockLeaseListController' => 'applications/drydock/controller/DrydockLeaseListController.php',
654654
'DrydockLeaseQuery' => 'applications/drydock/query/DrydockLeaseQuery.php',
655655
'DrydockLeaseReleaseController' => 'applications/drydock/controller/DrydockLeaseReleaseController.php',
656+
'DrydockLeaseSearchEngine' => 'applications/drydock/query/DrydockLeaseSearchEngine.php',
656657
'DrydockLeaseStatus' => 'applications/drydock/constants/DrydockLeaseStatus.php',
657658
'DrydockLeaseViewController' => 'applications/drydock/controller/DrydockLeaseViewController.php',
658659
'DrydockLocalCommandInterface' => 'applications/drydock/interface/command/DrydockLocalCommandInterface.php',
@@ -3046,10 +3047,19 @@
30463047
'DrydockController' => 'PhabricatorController',
30473048
'DrydockDAO' => 'PhabricatorLiskDAO',
30483049
'DrydockFilesystemInterface' => 'DrydockInterface',
3049-
'DrydockLease' => 'DrydockDAO',
3050-
'DrydockLeaseListController' => 'DrydockController',
3051-
'DrydockLeaseQuery' => 'PhabricatorOffsetPagedQuery',
3050+
'DrydockLease' =>
3051+
array(
3052+
0 => 'DrydockDAO',
3053+
1 => 'PhabricatorPolicyInterface',
3054+
),
3055+
'DrydockLeaseListController' =>
3056+
array(
3057+
0 => 'DrydockController',
3058+
1 => 'PhabricatorApplicationSearchResultsControllerInterface',
3059+
),
3060+
'DrydockLeaseQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
30523061
'DrydockLeaseReleaseController' => 'DrydockController',
3062+
'DrydockLeaseSearchEngine' => 'PhabricatorApplicationSearchEngine',
30533063
'DrydockLeaseStatus' => 'DrydockConstants',
30543064
'DrydockLeaseViewController' => 'DrydockController',
30553065
'DrydockLocalCommandInterface' => 'DrydockCommandInterface',

‎src/applications/drydock/application/PhabricatorApplicationDrydock.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public function getRoutes() {
4646
'(?P<id>[1-9]\d*)/close/' => 'DrydockResourceCloseController',
4747
),
4848
'lease/' => array(
49-
'' => 'DrydockLeaseListController',
49+
'(?:query/(?P<queryKey>[^/]+)/)?' => 'DrydockLeaseListController',
5050
'(?P<id>[1-9]\d*)/' => 'DrydockLeaseViewController',
5151
'(?P<id>[1-9]\d*)/release/' => 'DrydockLeaseReleaseController',
5252
),

‎src/applications/drydock/constants/DrydockLeaseStatus.php

+19-8
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,27 @@ final class DrydockLeaseStatus extends DrydockConstants {
1010
const STATUS_EXPIRED = 4;
1111

1212
public static function getNameForStatus($status) {
13-
static $map = array(
14-
self::STATUS_PENDING => 'Pending',
15-
self::STATUS_ACQUIRING => 'Acquiring',
16-
self::STATUS_ACTIVE => 'Active',
17-
self::STATUS_RELEASED => 'Released',
18-
self::STATUS_BROKEN => 'Broken',
19-
self::STATUS_EXPIRED => 'Expired',
13+
$map = array(
14+
self::STATUS_PENDING => pht('Pending'),
15+
self::STATUS_ACQUIRING => pht('Acquiring'),
16+
self::STATUS_ACTIVE => pht('Active'),
17+
self::STATUS_RELEASED => pht('Released'),
18+
self::STATUS_BROKEN => pht('Broken'),
19+
self::STATUS_EXPIRED => pht('Expired'),
2020
);
2121

22-
return idx($map, $status, 'Unknown');
22+
return idx($map, $status, pht('Unknown'));
23+
}
24+
25+
public static function getAllStatuses() {
26+
return array(
27+
self::STATUS_PENDING,
28+
self::STATUS_ACQUIRING,
29+
self::STATUS_ACTIVE,
30+
self::STATUS_RELEASED,
31+
self::STATUS_BROKEN,
32+
self::STATUS_EXPIRED,
33+
);
2334
}
2435

2536
}

‎src/applications/drydock/controller/DrydockController.php

+10-6
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@
22

33
abstract class DrydockController extends PhabricatorController {
44

5-
final protected function buildSideNav($selected) {
5+
final protected function buildSideNav($selected = null) {
66
$nav = new AphrontSideNavFilterView();
77
$nav->setBaseURI(new PhutilURI('/drydock/'));
88
$nav->addFilter('blueprint', 'Blueprints');
99
$nav->addFilter('resource', 'Resources');
10-
$nav->addFilter('lease', 'Leases');
10+
11+
id(new DrydockLeaseSearchEngine())
12+
->setViewer($this->getRequest()->getUser())
13+
->addNavigationItems($nav->getMenu(), pht('Leases'));
14+
15+
$nav->addLabel(pht('Logs'));
1116
$nav->addFilter('log', 'Logs');
1217

1318
$nav->selectFilter($selected, 'resource');
@@ -80,11 +85,12 @@ protected function buildLogTableView(array $logs) {
8085
protected function buildLeaseListView(array $leases) {
8186
assert_instances_of($leases, 'DrydockLease');
8287

83-
$user = $this->getRequest()->getUser();
88+
$viewer = $this->getRequest()->getUser();
8489
$view = new PHUIObjectItemListView();
8590

8691
foreach ($leases as $lease) {
8792
$item = id(new PHUIObjectItemView())
93+
->setUser($viewer)
8894
->setHeader($lease->getLeaseName())
8995
->setHref($this->getApplicationURI('/lease/'.$lease->getID().'/'));
9096

@@ -107,9 +113,7 @@ protected function buildLeaseListView(array $leases) {
107113

108114
$status = DrydockLeaseStatus::getNameForStatus($lease->getStatus());
109115
$item->addAttribute($status);
110-
111-
$date_created = phabricator_date($lease->getDateCreated(), $user);
112-
$item->addAttribute(pht('Created on %s', $date_created));
116+
$item->setEpoch($lease->getDateCreated());
113117

114118
if ($lease->isActive()) {
115119
$item->setBarColor('green');
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,34 @@
11
<?php
22

3-
final class DrydockLeaseListController extends DrydockController {
3+
final class DrydockLeaseListController extends DrydockController
4+
implements PhabricatorApplicationSearchResultsControllerInterface {
45

5-
public function processRequest() {
6-
$request = $this->getRequest();
7-
$user = $request->getUser();
8-
9-
$nav = $this->buildSideNav('lease');
10-
11-
$pager = new AphrontPagerView();
12-
$pager->setURI(new PhutilURI('/drydock/lease/'), 'offset');
13-
$pager->setOffset($request->getInt('offset'));
14-
15-
$leases = id(new DrydockLeaseQuery())
16-
->setViewer($user)
17-
->executeWithOffsetPager($pager);
18-
19-
$title = pht('Leases');
6+
private $queryKey;
207

21-
$header = id(new PHUIHeaderView())
22-
->setHeader($title);
8+
public function shouldAllowPublic() {
9+
return true;
10+
}
2311

24-
$lease_list = $this->buildLeaseListView($leases);
12+
public function willProcessRequest(array $data) {
13+
$this->queryKey = idx($data, 'queryKey');
14+
}
2515

26-
$nav->appendChild(
27-
array(
28-
$header,
29-
$lease_list,
30-
$pager,
31-
));
16+
public function processRequest() {
17+
$request = $this->getRequest();
18+
$controller = id(new PhabricatorApplicationSearchController($request))
19+
->setQueryKey($this->queryKey)
20+
->setSearchEngine(new DrydockLeaseSearchEngine())
21+
->setNavigation($this->buildSideNav());
3222

33-
$crumbs = $this->buildApplicationCrumbs();
34-
$crumbs->addTextCrumb($title, $request->getRequestURI());
35-
$nav->setCrumbs($crumbs);
23+
return $this->delegateToController($controller);
24+
}
3625

37-
return $this->buildApplicationPage(
38-
$nav,
39-
array(
40-
'device' => true,
41-
'title' => $title,
42-
));
26+
public function renderResultsList(
27+
array $leases,
28+
PhabricatorSavedQuery $query) {
29+
assert_instances_of($leases, 'DrydockLease');
4330

31+
return $this->buildLeaseListView($leases);
4432
}
4533

4634
}

‎src/applications/drydock/query/DrydockLeaseQuery.php

+13
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ final class DrydockLeaseQuery
55

66
private $ids;
77
private $resourceIDs;
8+
private $statuses;
89

910
public function withIDs(array $ids) {
1011
$this->ids = $ids;
@@ -16,6 +17,11 @@ public function withResourceIDs(array $ids) {
1617
return $this;
1718
}
1819

20+
public function withStatuses(array $statuses) {
21+
$this->statuses = $statuses;
22+
return $this;
23+
}
24+
1925
public function loadPage() {
2026
$table = new DrydockLease();
2127
$conn_r = $table->establishConnection('r');
@@ -67,6 +73,13 @@ private function buildWhereClause(AphrontDatabaseConnection $conn_r) {
6773
$this->ids);
6874
}
6975

76+
if ($this->statuses) {
77+
$where[] = qsprintf(
78+
$conn_r,
79+
'status IN (%Ld)',
80+
$this->statuses);
81+
}
82+
7083
$where[] = $this->buildPagingClause($conn_r);
7184

7285
return $this->formatWhereClause($where);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
final class DrydockLeaseSearchEngine
4+
extends PhabricatorApplicationSearchEngine {
5+
6+
public function buildSavedQueryFromRequest(AphrontRequest $request) {
7+
$saved = new PhabricatorSavedQuery();
8+
9+
$saved->setParameter(
10+
'statuses',
11+
$this->readListFromRequest($request, 'statuses'));
12+
13+
return $saved;
14+
}
15+
16+
public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
17+
$query = id(new DrydockLeaseQuery());
18+
19+
$statuses = $saved->getParameter('statuses', array());
20+
if ($statuses) {
21+
$query->withStatuses($statuses);
22+
}
23+
24+
return $query;
25+
}
26+
27+
public function buildSearchForm(
28+
AphrontFormView $form,
29+
PhabricatorSavedQuery $saved) {
30+
31+
$statuses = $saved->getParameter('statuses', array());
32+
33+
$status_control = id(new AphrontFormCheckboxControl())
34+
->setLabel(pht('Status'));
35+
foreach (DrydockLeaseStatus::getAllStatuses() as $status) {
36+
$status_control->addCheckbox(
37+
'statuses[]',
38+
$status,
39+
DrydockLeaseStatus::getNameForStatus($status),
40+
in_array($status, $statuses));
41+
}
42+
43+
$form
44+
->appendChild($status_control);
45+
46+
}
47+
48+
protected function getURI($path) {
49+
return '/drydock/lease/'.$path;
50+
}
51+
52+
public function getBuiltinQueryNames() {
53+
$names = array(
54+
'active' => pht('Active Leases'),
55+
'all' => pht('All Leases'),
56+
);
57+
58+
return $names;
59+
}
60+
61+
public function buildSavedQueryFromBuiltin($query_key) {
62+
$query = $this->newSavedQuery();
63+
$query->setQueryKey($query_key);
64+
65+
switch ($query_key) {
66+
case 'active':
67+
return $query->setParameter(
68+
'statuses',
69+
array(
70+
DrydockLeaseStatus::STATUS_PENDING,
71+
DrydockLeaseStatus::STATUS_ACQUIRING,
72+
DrydockLeaseStatus::STATUS_ACTIVE,
73+
));
74+
case 'all':
75+
return $query;
76+
}
77+
78+
return parent::buildSavedQueryFromBuiltin($query_key);
79+
}
80+
81+
}

‎src/applications/search/engine/PhabricatorApplicationSearchEngine.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ public function newSavedQuery() {
108108
}
109109

110110

111-
public function addNavigationItems(PHUIListView $menu) {
111+
public function addNavigationItems(PHUIListView $menu, $label = null) {
112112
$viewer = $this->requireViewer();
113113

114-
$menu->newLabel(pht('Queries'));
114+
$menu->newLabel(coalesce($label, pht('Queries')));
115115

116116
$named_queries = $this->loadEnabledNamedQueries();
117117

0 commit comments

Comments
 (0)
Failed to load comments.