id = $data['id']; } public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $nav = $this->buildSideNav('resource'); $resource = id(new DrydockResource())->load($this->id); if (!$resource) { return new Aphront404Response(); } $title = 'Resource '.$resource->getID().' '.$resource->getName(); $header = id(new PhabricatorHeaderView()) ->setHeader($title); $actions = $this->buildActionListView($resource); $properties = $this->buildPropertyListView($resource); $resource_uri = 'resource/'.$resource->getID().'/'; $resource_uri = $this->getApplicationURI($resource_uri); $leases = id(new DrydockLeaseQuery()) ->withResourceIDs(array($resource->getID())) ->execute(); $lease_list = $this->buildLeaseListView($leases); $lease_list->setNoDataString(pht('This resource has no leases.')); $pager = new AphrontPagerView(); $pager->setURI(new PhutilURI($resource_uri), 'offset'); $pager->setOffset($request->getInt('offset')); $logs = id(new DrydockLogQuery()) ->withResourceIDs(array($resource->getID())) ->executeWithOffsetPager($pager); $log_table = $this->buildLogTableView($logs); $log_table->appendChild($pager); $nav->appendChild( array( $header, $actions, $properties, $lease_list, $log_table, )); return $this->buildApplicationPage( $nav, array( 'device' => true, 'title' => $title, )); } private function buildActionListView(DrydockResource $resource) { $view = id(new PhabricatorActionListView()) ->setUser($this->getRequest()->getUser()) ->setObject($resource); $can_close = ($resource->getStatus() == DrydockResourceStatus::STATUS_OPEN); $uri = '/resource/'.$resource->getID().'/close/'; $uri = $this->getApplicationURI($uri); $view->addAction( id(new PhabricatorActionView()) ->setHref($uri) ->setName(pht('Close Resource')) ->setIcon('delete') ->setWorkflow(true) ->setDisabled(!$can_close)); return $view; } private function buildPropertyListView(DrydockResource $resource) { $view = new PhabricatorPropertyListView(); $status = $resource->getStatus(); $status = DrydockResourceStatus::getNameForStatus($status); $status = phutil_escape_html($status); $view->addProperty( pht('Status'), $status); $view->addProperty( pht('Resource Type'), phutil_escape_html($resource->getType())); $attributes = $resource->getAttributes(); if ($attributes) { $view->addSectionHeader(pht('Attributes')); foreach ($attributes as $key => $value) { $view->addProperty( phutil_escape_html($key), phutil_escape_html($value)); } } return $view; } private function buildLeaseListView(array $leases) { assert_instances_of($leases, 'DrydockLease'); $user = $this->getRequest()->getUser(); $view = new PhabricatorObjectItemListView(); foreach ($leases as $lease) { $item = id(new PhabricatorObjectItemView()) ->setHeader($lease->getLeaseName()) ->setHref($this->getApplicationURI('/lease/'.$lease->getID().'/')); $status = DrydockLeaseStatus::getNameForStatus($lease->getStatus()); $item->addAttribute(phutil_escape_html($status)); $date_created = phabricator_date($lease->getDateCreated(), $user); $item->addAttribute(pht('Created on %s', $date_created)); if ($lease->isActive()) { $item->setBarColor('green'); } else { $item->setBarColor('red'); } $view->addItem($item); } return $view; } }