@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Show recent active leases on Drydock resource detail

Summary: Ref T9252. This is the same as D14157, just for Resources and their leases.

Test Plan: Viewed a resource, saw only active leases, clicked "View All Leases", queried, clicked around, used crumbs.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T9252

Differential Revision: https://secure.phabricator.com/D14158

+135 -28
+2
src/applications/drydock/application/PhabricatorDrydockApplication.php
··· 64 64 '(?P<id>[1-9]\d*)/' => array( 65 65 '' => 'DrydockResourceViewController', 66 66 'release/' => 'DrydockResourceReleaseController', 67 + 'leases/(?:query/(?P<queryKey>[^/]+)/)?' => 68 + 'DrydockLeaseListController', 67 69 ), 68 70 ), 69 71 'lease/' => array(
+41 -6
src/applications/drydock/controller/DrydockLeaseController.php
··· 3 3 abstract class DrydockLeaseController 4 4 extends DrydockController { 5 5 6 + private $resource; 7 + 8 + public function setResource($resource) { 9 + $this->resource = $resource; 10 + return $this; 11 + } 12 + 13 + public function getResource() { 14 + return $this->resource; 15 + } 16 + 6 17 public function buildSideNavView() { 7 18 $nav = new AphrontSideNavFilterView(); 8 19 $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); 9 20 10 - id(new DrydockLeaseSearchEngine()) 11 - ->setViewer($this->getRequest()->getUser()) 12 - ->addNavigationItems($nav->getMenu()); 21 + $engine = id(new DrydockLeaseSearchEngine()) 22 + ->setViewer($this->getRequest()->getUser()); 23 + 24 + if ($this->getResource()) { 25 + $engine->setResource($this->getResource()); 26 + } 27 + 28 + $engine->addNavigationItems($nav->getMenu()); 13 29 14 30 $nav->selectFilter(null); 15 31 ··· 18 34 19 35 protected function buildApplicationCrumbs() { 20 36 $crumbs = parent::buildApplicationCrumbs(); 21 - $crumbs->addTextCrumb( 22 - pht('Leases'), 23 - $this->getApplicationURI('lease/')); 37 + 38 + $resource = $this->getResource(); 39 + if ($resource) { 40 + $id = $resource->getID(); 41 + 42 + $crumbs->addTextCrumb( 43 + pht('Resources'), 44 + $this->getApplicationURI('resource/')); 45 + 46 + $crumbs->addTextCrumb( 47 + $resource->getName(), 48 + $this->getApplicationURI("resource/{$id}/")); 49 + 50 + $crumbs->addTextCrumb( 51 + pht('Leases'), 52 + $this->getApplicationURI("resource/{$id}/leases/")); 53 + 54 + } else { 55 + $crumbs->addTextCrumb( 56 + pht('Leases'), 57 + $this->getApplicationURI('lease/')); 58 + } 24 59 return $crumbs; 25 60 } 26 61
+18 -3
src/applications/drydock/controller/DrydockLeaseListController.php
··· 8 8 9 9 public function handleRequest(AphrontRequest $request) { 10 10 $viewer = $request->getViewer(); 11 - $querykey = $request->getURIData('queryKey'); 11 + $query_key = $request->getURIData('queryKey'); 12 + 13 + $engine = new DrydockLeaseSearchEngine(); 14 + 15 + $id = $request->getURIData('id'); 16 + if ($id) { 17 + $resource = id(new DrydockResourceQuery()) 18 + ->setViewer($viewer) 19 + ->withIDs(array($id)) 20 + ->executeOne(); 21 + if (!$resource) { 22 + return new Aphront404Response(); 23 + } 24 + $this->setResource($resource); 25 + $engine->setResource($resource); 26 + } 12 27 13 28 $controller = id(new PhabricatorApplicationSearchController()) 14 - ->setQueryKey($querykey) 15 - ->setSearchEngine(new DrydockLeaseSearchEngine()) 29 + ->setQueryKey($query_key) 30 + ->setSearchEngine($engine) 16 31 ->setNavigation($this->buildSideNavView()); 17 32 18 33 return $this->delegateToController($controller);
+8 -3
src/applications/drydock/controller/DrydockResourceController.php
··· 18 18 $nav = new AphrontSideNavFilterView(); 19 19 $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); 20 20 21 - id(new DrydockResourceSearchEngine()) 22 - ->setViewer($this->getViewer()) 23 - ->addNavigationItems($nav->getMenu()); 21 + $engine = id(new DrydockResourceSearchEngine()) 22 + ->setViewer($this->getViewer()); 23 + 24 + if ($this->getBlueprint()) { 25 + $engine->setBlueprint($this->getBlueprint()); 26 + } 27 + 28 + $engine->addNavigationItems($nav->getMenu()); 24 29 25 30 $nav->selectFilter(null); 26 31
+40 -14
src/applications/drydock/controller/DrydockResourceViewController.php
··· 27 27 $resource_uri = 'resource/'.$resource->getID().'/'; 28 28 $resource_uri = $this->getApplicationURI($resource_uri); 29 29 30 - $leases = id(new DrydockLeaseQuery()) 31 - ->setViewer($viewer) 32 - ->withResourcePHIDs(array($resource->getPHID())) 33 - ->execute(); 34 - 35 - $lease_list = id(new DrydockLeaseListView()) 36 - ->setUser($viewer) 37 - ->setLeases($leases) 38 - ->render(); 39 - $lease_list->setNoDataString(pht('This resource has no leases.')); 40 - 41 30 $pager = new PHUIPagerView(); 42 31 $pager->setURI(new PhutilURI($resource_uri), 'offset'); 43 32 $pager->setOffset($request->getInt('offset')); ··· 65 54 ->addPropertyList($locks, pht('Slot Locks')) 66 55 ->addPropertyList($commands, pht('Commands')); 67 56 68 - $lease_box = id(new PHUIObjectBoxView()) 69 - ->setHeaderText(pht('Leases')) 70 - ->setObjectList($lease_list); 57 + $lease_box = $this->buildLeaseBox($resource); 71 58 72 59 $log_box = id(new PHUIObjectBoxView()) 73 60 ->setHeaderText(pht('Resource Logs')) ··· 147 134 } 148 135 149 136 return $view; 137 + } 138 + 139 + private function buildLeaseBox(DrydockResource $resource) { 140 + $viewer = $this->getViewer(); 141 + 142 + $leases = id(new DrydockLeaseQuery()) 143 + ->setViewer($viewer) 144 + ->withResourcePHIDs(array($resource->getPHID())) 145 + ->withStatuses( 146 + array( 147 + DrydockLeaseStatus::STATUS_PENDING, 148 + DrydockLeaseStatus::STATUS_ACQUIRED, 149 + DrydockLeaseStatus::STATUS_ACTIVE, 150 + )) 151 + ->setLimit(100) 152 + ->execute(); 153 + 154 + $id = $resource->getID(); 155 + $leases_uri = "resource/{$id}/leases/query/all/"; 156 + $leases_uri = $this->getApplicationURI($leases_uri); 157 + 158 + $lease_header = id(new PHUIHeaderView()) 159 + ->setHeader(pht('Active Leases')) 160 + ->addActionLink( 161 + id(new PHUIButtonView()) 162 + ->setTag('a') 163 + ->setHref($leases_uri) 164 + ->setIconFont('fa-search') 165 + ->setText(pht('View All Leases'))); 166 + 167 + $lease_list = id(new DrydockLeaseListView()) 168 + ->setUser($viewer) 169 + ->setLeases($leases) 170 + ->render() 171 + ->setNoDataString(pht('This resource has no active leases.')); 172 + 173 + return id(new PHUIObjectBoxView()) 174 + ->setHeader($lease_header) 175 + ->setObjectList($lease_list); 150 176 } 151 177 152 178 }
+26 -2
src/applications/drydock/query/DrydockLeaseSearchEngine.php
··· 3 3 final class DrydockLeaseSearchEngine 4 4 extends PhabricatorApplicationSearchEngine { 5 5 6 + private $resource; 7 + 8 + public function setResource($resource) { 9 + $this->resource = $resource; 10 + return $this; 11 + } 12 + 13 + public function getResource() { 14 + return $this->resource; 15 + } 16 + 6 17 public function getResultTypeDescription() { 7 18 return pht('Drydock Leases'); 8 19 } ··· 12 23 } 13 24 14 25 public function newQuery() { 15 - return new DrydockLeaseQuery(); 26 + $query = new DrydockLeaseQuery(); 27 + 28 + $resource = $this->getResource(); 29 + if ($resource) { 30 + $query->withResourcePHIDs(array($resource->getPHID())); 31 + } 32 + 33 + return $query; 16 34 } 17 35 18 36 protected function buildQueryFromParameters(array $map) { ··· 35 53 } 36 54 37 55 protected function getURI($path) { 38 - return '/drydock/lease/'.$path; 56 + $resource = $this->getResource(); 57 + if ($resource) { 58 + $id = $resource->getID(); 59 + return "/drydock/resource/{$id}/leases/".$path; 60 + } else { 61 + return '/drydock/lease/'.$path; 62 + } 39 63 } 40 64 41 65 protected function getBuiltinQueryNames() {