Path: blob/master/src/applications/drydock/controller/DrydockResourceViewController.php
12256 views
<?php12final class DrydockResourceViewController extends DrydockResourceController {34public function handleRequest(AphrontRequest $request) {5$viewer = $request->getViewer();6$id = $request->getURIData('id');78$resource = id(new DrydockResourceQuery())9->setViewer($viewer)10->withIDs(array($id))11->needUnconsumedCommands(true)12->executeOne();13if (!$resource) {14return new Aphront404Response();15}1617$title = pht(18'Resource %s %s',19$resource->getID(),20$resource->getResourceName());2122$header = id(new PHUIHeaderView())23->setUser($viewer)24->setPolicyObject($resource)25->setHeader($title)26->setHeaderIcon('fa-map')27->setStatus(28$resource->getStatusIcon(),29$resource->getStatusColor(),30$resource->getStatusDisplayName());3132if ($resource->isReleasing()) {33$header->addTag(34id(new PHUITagView())35->setType(PHUITagView::TYPE_SHADE)36->setIcon('fa-exclamation-triangle')37->setColor('red')38->setName('Releasing'));39}4041$curtain = $this->buildCurtain($resource);42$properties = $this->buildPropertyListView($resource);4344$id = $resource->getID();45$resource_uri = $this->getApplicationURI("resource/{$id}/");4647$log_query = id(new DrydockLogQuery())48->withResourcePHIDs(array($resource->getPHID()));4950$log_table = $this->buildLogTable($log_query)51->setHideResources(true);5253$logs = $this->buildLogBox(54$log_table,55$this->getApplicationURI("resource/{$id}/logs/query/all/"));5657$crumbs = $this->buildApplicationCrumbs();58$crumbs->addTextCrumb(pht('Resource %d', $resource->getID()));59$crumbs->setBorder(true);6061$locks = $this->buildLocksTab($resource->getPHID());62$commands = $this->buildCommandsTab($resource->getPHID());6364$tab_group = id(new PHUITabGroupView())65->addTab(66id(new PHUITabView())67->setName(pht('Properties'))68->setKey('properties')69->appendChild($properties))70->addTab(71id(new PHUITabView())72->setName(pht('Slot Locks'))73->setKey('locks')74->appendChild($locks))75->addTab(76id(new PHUITabView())77->setName(pht('Commands'))78->setKey('commands')79->appendChild($commands));8081$object_box = id(new PHUIObjectBoxView())82->setHeaderText(pht('Properties'))83->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)84->addTabGroup($tab_group);8586$lease_box = $this->buildLeaseBox($resource);8788$view = id(new PHUITwoColumnView())89->setHeader($header)90->setCurtain($curtain)91->setMainColumn(92array(93$object_box,94$lease_box,95$logs,96));9798return $this->newPage()99->setTitle($title)100->setCrumbs($crumbs)101->appendChild(102array(103$view,104));105106}107108private function buildCurtain(DrydockResource $resource) {109$viewer = $this->getViewer();110111$curtain = $this->newCurtainView($resource);112113$can_release = $resource->canRelease();114if ($resource->isReleasing()) {115$can_release = false;116}117118$can_edit = PhabricatorPolicyFilter::hasCapability(119$viewer,120$resource,121PhabricatorPolicyCapability::CAN_EDIT);122123$uri = '/resource/'.$resource->getID().'/release/';124$uri = $this->getApplicationURI($uri);125126$curtain->addAction(127id(new PhabricatorActionView())128->setHref($uri)129->setName(pht('Release Resource'))130->setIcon('fa-times')131->setWorkflow(true)132->setDisabled(!$can_release || !$can_edit));133134return $curtain;135}136137private function buildPropertyListView(138DrydockResource $resource) {139$viewer = $this->getViewer();140141$view = new PHUIPropertyListView();142143$until = $resource->getUntil();144if ($until) {145$until_display = phabricator_datetime($until, $viewer);146} else {147$until_display = phutil_tag('em', array(), pht('Never'));148}149$view->addProperty(pht('Expires'), $until_display);150151$view->addProperty(152pht('Resource Type'),153$resource->getType());154155$view->addProperty(156pht('Blueprint'),157$viewer->renderHandle($resource->getBlueprintPHID()));158159$attributes = $resource->getAttributes();160if ($attributes) {161$view->addSectionHeader(162pht('Attributes'), 'fa-list-ul');163foreach ($attributes as $key => $value) {164$view->addProperty($key, $value);165}166}167168return $view;169}170171private function buildLeaseBox(DrydockResource $resource) {172$viewer = $this->getViewer();173174$leases = id(new DrydockLeaseQuery())175->setViewer($viewer)176->withResourcePHIDs(array($resource->getPHID()))177->withStatuses(178array(179DrydockLeaseStatus::STATUS_PENDING,180DrydockLeaseStatus::STATUS_ACQUIRED,181DrydockLeaseStatus::STATUS_ACTIVE,182))183->setLimit(100)184->execute();185186$id = $resource->getID();187$leases_uri = "resource/{$id}/leases/query/all/";188$leases_uri = $this->getApplicationURI($leases_uri);189190$lease_header = id(new PHUIHeaderView())191->setHeader(pht('Active Leases'))192->addActionLink(193id(new PHUIButtonView())194->setTag('a')195->setHref($leases_uri)196->setIcon('fa-search')197->setText(pht('View All')));198199$lease_list = id(new DrydockLeaseListView())200->setUser($viewer)201->setLeases($leases)202->render()203->setNoDataString(pht('This resource has no active leases.'));204205return id(new PHUIObjectBoxView())206->setHeader($lease_header)207->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)208->setObjectList($lease_list);209}210211}212213214