Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2896141
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Advanced/Developer...
View Handle
View Hovercard
Size
38 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/applications/drydock/controller/DrydockAuthorizationViewController.php b/src/applications/drydock/controller/DrydockAuthorizationViewController.php
index bc34154e4f..80a0e5d1ef 100644
--- a/src/applications/drydock/controller/DrydockAuthorizationViewController.php
+++ b/src/applications/drydock/controller/DrydockAuthorizationViewController.php
@@ -1,130 +1,131 @@
<?php
final class DrydockAuthorizationViewController
extends DrydockController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$id = $request->getURIData('id');
$authorization = id(new DrydockAuthorizationQuery())
->setViewer($viewer)
->withIDs(array($id))
->executeOne();
if (!$authorization) {
return new Aphront404Response();
}
$id = $authorization->getID();
$title = pht('Authorization %d', $id);
$blueprint = $authorization->getBlueprint();
$blueprint_id = $blueprint->getID();
$header = id(new PHUIHeaderView())
->setHeader($title)
->setUser($viewer)
->setPolicyObject($authorization);
-
$state = $authorization->getBlueprintAuthorizationState();
$icon = DrydockAuthorization::getBlueprintStateIcon($state);
$name = DrydockAuthorization::getBlueprintStateName($state);
$header->setStatus($icon, null, $name);
- $actions = $this->buildActionListView($authorization);
+ $curtain = $this->buildCurtain($authorization);
$properties = $this->buildPropertyListView($authorization);
- $properties->setActionList($actions);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(
pht('Blueprints'),
$this->getApplicationURI('blueprint/'));
$crumbs->addTextCrumb(
$blueprint->getBlueprintName(),
$this->getApplicationURI("blueprint/{$blueprint_id}/"));
$crumbs->addTextCrumb($title);
+ $crumbs->setBorder(true);
$object_box = id(new PHUIObjectBoxView())
->setHeader($header)
->addPropertyList($properties);
- return $this->buildApplicationPage(
- array(
- $crumbs,
- $object_box,
- ),
- array(
- 'title' => $title,
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->setCurtain($curtain)
+ ->addPropertySection(pht('Properties'), $properties);
+
+ return $this->newPage()
+ ->setTitle($title)
+ ->setCrumbs($crumbs)
+ ->appendChild(
+ array(
+ $view,
));
}
- private function buildActionListView(DrydockAuthorization $authorization) {
+ private function buildCurtain(DrydockAuthorization $authorization) {
$viewer = $this->getViewer();
$id = $authorization->getID();
- $view = id(new PhabricatorActionListView())
- ->setUser($viewer)
- ->setObject($authorization);
+ $curtain = $this->newCurtainView($authorization);
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$authorization,
PhabricatorPolicyCapability::CAN_EDIT);
$authorize_uri = $this->getApplicationURI("authorization/{$id}/authorize/");
$decline_uri = $this->getApplicationURI("authorization/{$id}/decline/");
$state_authorized = DrydockAuthorization::BLUEPRINTAUTH_AUTHORIZED;
$state_declined = DrydockAuthorization::BLUEPRINTAUTH_DECLINED;
$state = $authorization->getBlueprintAuthorizationState();
$can_authorize = $can_edit && ($state != $state_authorized);
$can_decline = $can_edit && ($state != $state_declined);
- $view->addAction(
+ $curtain->addAction(
id(new PhabricatorActionView())
->setHref($authorize_uri)
->setName(pht('Approve Authorization'))
->setIcon('fa-check')
->setWorkflow(true)
->setDisabled(!$can_authorize));
- $view->addAction(
+ $curtain->addAction(
id(new PhabricatorActionView())
->setHref($decline_uri)
->setName(pht('Decline Authorization'))
->setIcon('fa-times')
->setWorkflow(true)
->setDisabled(!$can_decline));
- return $view;
+ return $curtain;
}
private function buildPropertyListView(DrydockAuthorization $authorization) {
$viewer = $this->getViewer();
$object_phid = $authorization->getObjectPHID();
$handles = $viewer->loadHandles(array($object_phid));
$handle = $handles[$object_phid];
$view = new PHUIPropertyListView();
$view->addProperty(
pht('Authorized Object'),
$handle->renderLink($handle->getFullName()));
$view->addProperty(pht('Object Type'), $handle->getTypeName());
$object_state = $authorization->getObjectAuthorizationState();
$view->addProperty(
pht('Authorization State'),
DrydockAuthorization::getObjectStateName($object_state));
return $view;
}
}
diff --git a/src/applications/drydock/controller/DrydockBlueprintViewController.php b/src/applications/drydock/controller/DrydockBlueprintViewController.php
index 21f3a395d3..d3f73bf78c 100644
--- a/src/applications/drydock/controller/DrydockBlueprintViewController.php
+++ b/src/applications/drydock/controller/DrydockBlueprintViewController.php
@@ -1,250 +1,248 @@
<?php
final class DrydockBlueprintViewController extends DrydockBlueprintController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$id = $request->getURIData('id');
$blueprint = id(new DrydockBlueprintQuery())
->setViewer($viewer)
->withIDs(array($id))
->executeOne();
if (!$blueprint) {
return new Aphront404Response();
}
$title = $blueprint->getBlueprintName();
$header = id(new PHUIHeaderView())
->setHeader($title)
->setUser($viewer)
- ->setPolicyObject($blueprint);
+ ->setPolicyObject($blueprint)
+ ->setHeaderIcon('fa-map-o');
if ($blueprint->getIsDisabled()) {
$header->setStatus('fa-ban', 'red', pht('Disabled'));
} else {
$header->setStatus('fa-check', 'bluegrey', pht('Active'));
}
- $actions = $this->buildActionListView($blueprint);
- $properties = $this->buildPropertyListView($blueprint, $actions);
+ $curtain = $this->buildCurtain($blueprint);
+ $properties = $this->buildPropertyListView($blueprint);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Blueprint %d', $blueprint->getID()));
-
- $object_box = id(new PHUIObjectBoxView())
- ->setHeader($header)
- ->addPropertyList($properties);
+ $crumbs->setBorder(true);
$field_list = PhabricatorCustomField::getObjectFields(
$blueprint,
PhabricatorCustomField::ROLE_VIEW);
$field_list
->setViewer($viewer)
->readFieldsFromStorage($blueprint);
$field_list->appendFieldsToPropertyList(
$blueprint,
$viewer,
$properties);
- $resource_box = $this->buildResourceBox($blueprint);
-
- $authorizations_box = $this->buildAuthorizationsBox($blueprint);
+ $resources = $this->buildResourceBox($blueprint);
+ $authorizations = $this->buildAuthorizationsBox($blueprint);
$timeline = $this->buildTransactionTimeline(
$blueprint,
new DrydockBlueprintTransactionQuery());
$timeline->setShouldTerminate(true);
$log_query = id(new DrydockLogQuery())
->withBlueprintPHIDs(array($blueprint->getPHID()));
- $log_box = $this->buildLogBox(
+ $logs = $this->buildLogBox(
$log_query,
$this->getApplicationURI("blueprint/{$id}/logs/query/all/"));
- return $this->buildApplicationPage(
- array(
- $crumbs,
- $object_box,
- $resource_box,
- $authorizations_box,
- $log_box,
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->setCurtain($curtain)
+ ->addPropertySection(pht('Properties'), $properties)
+ ->setMainColumn(array(
+ $resources,
+ $authorizations,
+ $logs,
$timeline,
- ),
- array(
- 'title' => $title,
+ ));
+
+ return $this->newPage()
+ ->setTitle($title)
+ ->setCrumbs($crumbs)
+ ->appendChild(
+ array(
+ $view,
));
}
- private function buildActionListView(DrydockBlueprint $blueprint) {
+ private function buildCurtain(DrydockBlueprint $blueprint) {
$viewer = $this->getViewer();
$id = $blueprint->getID();
- $view = id(new PhabricatorActionListView())
- ->setUser($viewer)
- ->setObject($blueprint);
-
+ $curtain = $this->newCurtainView($blueprint);
$edit_uri = $this->getApplicationURI("blueprint/edit/{$id}/");
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$blueprint,
PhabricatorPolicyCapability::CAN_EDIT);
- $view->addAction(
+ $curtain->addAction(
id(new PhabricatorActionView())
->setHref($edit_uri)
->setName(pht('Edit Blueprint'))
->setIcon('fa-pencil')
->setWorkflow(!$can_edit)
->setDisabled(!$can_edit));
if (!$blueprint->getIsDisabled()) {
$disable_name = pht('Disable Blueprint');
$disable_icon = 'fa-ban';
$disable_uri = $this->getApplicationURI("blueprint/{$id}/disable/");
} else {
$disable_name = pht('Enable Blueprint');
$disable_icon = 'fa-check';
$disable_uri = $this->getApplicationURI("blueprint/{$id}/enable/");
}
- $view->addAction(
+ $curtain->addAction(
id(new PhabricatorActionView())
->setHref($disable_uri)
->setName($disable_name)
->setIcon($disable_icon)
->setWorkflow(true)
->setDisabled(!$can_edit));
- return $view;
+ return $curtain;
}
private function buildPropertyListView(
- DrydockBlueprint $blueprint,
- PhabricatorActionListView $actions) {
+ DrydockBlueprint $blueprint) {
$viewer = $this->getViewer();
$view = id(new PHUIPropertyListView())
- ->setUser($viewer)
- ->setObject($blueprint);
-
- $view->setActionList($actions);
+ ->setUser($viewer);
$view->addProperty(
pht('Type'),
$blueprint->getImplementation()->getBlueprintName());
return $view;
}
private function buildResourceBox(DrydockBlueprint $blueprint) {
$viewer = $this->getViewer();
$resources = id(new DrydockResourceQuery())
->setViewer($viewer)
->withBlueprintPHIDs(array($blueprint->getPHID()))
->withStatuses(
array(
DrydockResourceStatus::STATUS_PENDING,
DrydockResourceStatus::STATUS_ACTIVE,
))
->setLimit(100)
->execute();
$resource_list = id(new DrydockResourceListView())
->setUser($viewer)
->setResources($resources)
->render()
->setNoDataString(pht('This blueprint has no active resources.'));
$id = $blueprint->getID();
$resources_uri = "blueprint/{$id}/resources/query/all/";
$resources_uri = $this->getApplicationURI($resources_uri);
$resource_header = id(new PHUIHeaderView())
->setHeader(pht('Active Resources'))
->addActionLink(
id(new PHUIButtonView())
->setTag('a')
->setHref($resources_uri)
->setIcon('fa-search')
->setText(pht('View All')));
return id(new PHUIObjectBoxView())
->setHeader($resource_header)
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
->setObjectList($resource_list);
}
private function buildAuthorizationsBox(DrydockBlueprint $blueprint) {
$viewer = $this->getViewer();
$limit = 25;
// If there are pending authorizations against this blueprint, make sure
// we show them first.
$pending_authorizations = id(new DrydockAuthorizationQuery())
->setViewer($viewer)
->withBlueprintPHIDs(array($blueprint->getPHID()))
->withObjectStates(
array(
DrydockAuthorization::OBJECTAUTH_ACTIVE,
))
->withBlueprintStates(
array(
DrydockAuthorization::BLUEPRINTAUTH_REQUESTED,
))
->setLimit($limit)
->execute();
$all_authorizations = id(new DrydockAuthorizationQuery())
->setViewer($viewer)
->withBlueprintPHIDs(array($blueprint->getPHID()))
->withObjectStates(
array(
DrydockAuthorization::OBJECTAUTH_ACTIVE,
))
->withBlueprintStates(
array(
DrydockAuthorization::BLUEPRINTAUTH_REQUESTED,
DrydockAuthorization::BLUEPRINTAUTH_AUTHORIZED,
))
->setLimit($limit)
->execute();
$authorizations =
mpull($pending_authorizations, null, 'getPHID') +
mpull($all_authorizations, null, 'getPHID');
$authorization_list = id(new DrydockAuthorizationListView())
->setUser($viewer)
->setAuthorizations($authorizations)
->setNoDataString(
pht('No objects have active authorizations to use this blueprint.'));
$id = $blueprint->getID();
$authorizations_uri = "blueprint/{$id}/authorizations/query/all/";
$authorizations_uri = $this->getApplicationURI($authorizations_uri);
$authorizations_header = id(new PHUIHeaderView())
->setHeader(pht('Active Authorizations'))
->addActionLink(
id(new PHUIButtonView())
->setTag('a')
->setHref($authorizations_uri)
->setIcon('fa-search')
->setText(pht('View All')));
return id(new PHUIObjectBoxView())
->setHeader($authorizations_header)
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
->setObjectList($authorization_list);
}
}
diff --git a/src/applications/drydock/controller/DrydockController.php b/src/applications/drydock/controller/DrydockController.php
index 17b8d34916..872a78f66f 100644
--- a/src/applications/drydock/controller/DrydockController.php
+++ b/src/applications/drydock/controller/DrydockController.php
@@ -1,109 +1,110 @@
<?php
abstract class DrydockController extends PhabricatorController {
protected function buildLocksTab($owner_phid) {
$locks = DrydockSlotLock::loadLocks($owner_phid);
$rows = array();
foreach ($locks as $lock) {
$rows[] = array(
$lock->getID(),
$lock->getLockKey(),
);
}
$table = id(new AphrontTableView($rows))
->setNoDataString(pht('No slot locks held.'))
->setHeaders(
array(
pht('ID'),
pht('Lock Key'),
))
->setColumnClasses(
array(
null,
'wide',
));
return id(new PHUIPropertyListView())
->addRawContent($table);
}
protected function buildCommandsTab($target_phid) {
$viewer = $this->getViewer();
$commands = id(new DrydockCommandQuery())
->setViewer($viewer)
->withTargetPHIDs(array($target_phid))
->execute();
$consumed_yes = id(new PHUIIconView())
->setIcon('fa-check green');
$consumed_no = id(new PHUIIconView())
->setIcon('fa-clock-o grey');
$rows = array();
foreach ($commands as $command) {
$rows[] = array(
$command->getID(),
$viewer->renderHandle($command->getAuthorPHID()),
$command->getCommand(),
($command->getIsConsumed()
? $consumed_yes
: $consumed_no),
phabricator_datetime($command->getDateCreated(), $viewer),
);
}
$table = id(new AphrontTableView($rows))
->setNoDataString(pht('No commands issued.'))
->setHeaders(
array(
pht('ID'),
pht('From'),
pht('Command'),
null,
pht('Date'),
))
->setColumnClasses(
array(
null,
null,
'wide',
null,
null,
));
return id(new PHUIPropertyListView())
->addRawContent($table);
}
protected function buildLogBox(DrydockLogQuery $query, $all_uri) {
$viewer = $this->getViewer();
$logs = $query
->setViewer($viewer)
->setLimit(100)
->execute();
$log_table = id(new DrydockLogListView())
->setUser($viewer)
->setLogs($logs)
->render();
$log_header = id(new PHUIHeaderView())
->setHeader(pht('Logs'))
->addActionLink(
id(new PHUIButtonView())
->setTag('a')
->setHref($all_uri)
->setIcon('fa-search')
->setText(pht('View All')));
return id(new PHUIObjectBoxView())
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
->setHeader($log_header)
->setTable($log_table);
}
}
diff --git a/src/applications/drydock/controller/DrydockLeaseViewController.php b/src/applications/drydock/controller/DrydockLeaseViewController.php
index 088b197a5f..7166b0bef6 100644
--- a/src/applications/drydock/controller/DrydockLeaseViewController.php
+++ b/src/applications/drydock/controller/DrydockLeaseViewController.php
@@ -1,154 +1,158 @@
<?php
final class DrydockLeaseViewController extends DrydockLeaseController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$id = $request->getURIData('id');
$lease = id(new DrydockLeaseQuery())
->setViewer($viewer)
->withIDs(array($id))
->needUnconsumedCommands(true)
->executeOne();
if (!$lease) {
return new Aphront404Response();
}
$id = $lease->getID();
$lease_uri = $this->getApplicationURI("lease/{$id}/");
$title = pht('Lease %d', $lease->getID());
$header = id(new PHUIHeaderView())
- ->setHeader($title);
+ ->setHeader($title)
+ ->setHeaderIcon('fa-link');
if ($lease->isReleasing()) {
$header->setStatus('fa-exclamation-triangle', 'red', pht('Releasing'));
}
- $actions = $this->buildActionListView($lease);
- $properties = $this->buildPropertyListView($lease, $actions);
+ $curtain = $this->buildCurtain($lease);
+ $properties = $this->buildPropertyListView($lease);
$log_query = id(new DrydockLogQuery())
->withLeasePHIDs(array($lease->getPHID()));
- $log_box = $this->buildLogBox(
+ $logs = $this->buildLogBox(
$log_query,
$this->getApplicationURI("lease/{$id}/logs/query/all/"));
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb($title, $lease_uri);
+ $crumbs->setBorder(true);
$locks = $this->buildLocksTab($lease->getPHID());
$commands = $this->buildCommandsTab($lease->getPHID());
$object_box = id(new PHUIObjectBoxView())
- ->setHeader($header)
+ ->setHeaderText(pht('Properties'))
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
->addPropertyList($properties, pht('Properties'))
->addPropertyList($locks, pht('Slot Locks'))
->addPropertyList($commands, pht('Commands'));
- return $this->buildApplicationPage(
- array(
- $crumbs,
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->setCurtain($curtain)
+ ->setMainColumn(array(
$object_box,
- $log_box,
- ),
- array(
- 'title' => $title,
+ $logs,
+ ));
+
+ return $this->newPage()
+ ->setTitle($title)
+ ->setCrumbs($crumbs)
+ ->appendChild(
+ array(
+ $view,
));
}
- private function buildActionListView(DrydockLease $lease) {
+ private function buildCurtain(DrydockLease $lease) {
$viewer = $this->getViewer();
- $view = id(new PhabricatorActionListView())
- ->setUser($viewer)
- ->setObject($lease);
-
+ $curtain = $this->newCurtainView($lease);
$id = $lease->getID();
$can_release = $lease->canRelease();
if ($lease->isReleasing()) {
$can_release = false;
}
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$lease,
PhabricatorPolicyCapability::CAN_EDIT);
- $view->addAction(
+ $curtain->addAction(
id(new PhabricatorActionView())
->setName(pht('Release Lease'))
->setIcon('fa-times')
->setHref($this->getApplicationURI("/lease/{$id}/release/"))
->setWorkflow(true)
->setDisabled(!$can_release || !$can_edit));
- return $view;
+ return $curtain;
}
private function buildPropertyListView(
- DrydockLease $lease,
- PhabricatorActionListView $actions) {
+ DrydockLease $lease) {
$viewer = $this->getViewer();
$view = new PHUIPropertyListView();
- $view->setActionList($actions);
$view->addProperty(
pht('Status'),
DrydockLeaseStatus::getNameForStatus($lease->getStatus()));
$view->addProperty(
pht('Resource Type'),
$lease->getResourceType());
$owner_phid = $lease->getOwnerPHID();
if ($owner_phid) {
$owner_display = $viewer->renderHandle($owner_phid);
} else {
$owner_display = phutil_tag('em', array(), pht('No Owner'));
}
$view->addProperty(pht('Owner'), $owner_display);
$authorizing_phid = $lease->getAuthorizingPHID();
if ($authorizing_phid) {
$authorizing_display = $viewer->renderHandle($authorizing_phid);
} else {
$authorizing_display = phutil_tag('em', array(), pht('None'));
}
$view->addProperty(pht('Authorized By'), $authorizing_display);
$resource_phid = $lease->getResourcePHID();
if ($resource_phid) {
$resource_display = $viewer->renderHandle($resource_phid);
} else {
$resource_display = phutil_tag('em', array(), pht('No Resource'));
}
$view->addProperty(pht('Resource'), $resource_display);
$until = $lease->getUntil();
if ($until) {
$until_display = phabricator_datetime($until, $viewer);
} else {
$until_display = phutil_tag('em', array(), pht('Never'));
}
$view->addProperty(pht('Expires'), $until_display);
$attributes = $lease->getAttributes();
if ($attributes) {
$view->addSectionHeader(
pht('Attributes'), 'fa-list-ul');
foreach ($attributes as $key => $value) {
$view->addProperty($key, $value);
}
}
return $view;
}
}
diff --git a/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php b/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php
index f8c210368a..e7fbf07b35 100644
--- a/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php
+++ b/src/applications/drydock/controller/DrydockRepositoryOperationViewController.php
@@ -1,100 +1,102 @@
<?php
final class DrydockRepositoryOperationViewController
extends DrydockRepositoryOperationController {
public function shouldAllowPublic() {
return true;
}
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$id = $request->getURIData('id');
$operation = id(new DrydockRepositoryOperationQuery())
->setViewer($viewer)
->withIDs(array($id))
->executeOne();
if (!$operation) {
return new Aphront404Response();
}
$id = $operation->getID();
$title = pht('Repository Operation %d', $id);
$header = id(new PHUIHeaderView())
->setHeader($title)
->setUser($viewer)
- ->setPolicyObject($operation);
+ ->setPolicyObject($operation)
+ ->setHeaderIcon('fa-fighter-jet');
$state = $operation->getOperationState();
$icon = DrydockRepositoryOperation::getOperationStateIcon($state);
$name = DrydockRepositoryOperation::getOperationStateName($state);
$header->setStatus($icon, null, $name);
- $actions = $this->buildActionListView($operation);
+ $curtain = $this->buildCurtain($operation);
$properties = $this->buildPropertyListView($operation);
- $properties->setActionList($actions);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(
pht('Operations'),
$this->getApplicationURI('operation/'));
$crumbs->addTextCrumb($title);
-
- $object_box = id(new PHUIObjectBoxView())
- ->setHeader($header)
- ->addPropertyList($properties);
+ $crumbs->setBorder(true);
$status_view = id(new DrydockRepositoryOperationStatusView())
->setUser($viewer)
->setOperation($operation);
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->setCurtain($curtain)
+ ->addPropertySection(pht('Properties'), $properties)
+ ->setMainColumn(array(
+ $status_view,
+ ));
+
return $this->newPage()
->setTitle($title)
->setCrumbs($crumbs)
->appendChild(
array(
- $object_box,
- $status_view,
- ));
+ $view,
+ ));
}
- private function buildActionListView(DrydockRepositoryOperation $operation) {
+ private function buildCurtain(DrydockRepositoryOperation $operation) {
$viewer = $this->getViewer();
$id = $operation->getID();
- $view = id(new PhabricatorActionListView())
- ->setUser($viewer)
- ->setObject($operation);
+ $curtain = $this->newCurtainView($operation);
- return $view;
+ return $curtain;
}
private function buildPropertyListView(
DrydockRepositoryOperation $operation) {
$viewer = $this->getViewer();
$view = new PHUIPropertyListView();
$view->addProperty(
pht('Repository'),
$viewer->renderHandle($operation->getRepositoryPHID()));
$view->addProperty(
pht('Object'),
$viewer->renderHandle($operation->getObjectPHID()));
$lease_phid = $operation->getWorkingCopyLeasePHID();
if ($lease_phid) {
$lease_display = $viewer->renderHandle($lease_phid);
} else {
$lease_display = phutil_tag('em', array(), pht('None'));
}
$view->addProperty(pht('Working Copy'), $lease_display);
return $view;
}
}
diff --git a/src/applications/drydock/controller/DrydockResourceViewController.php b/src/applications/drydock/controller/DrydockResourceViewController.php
index 61319fbdbc..c2ab4337f5 100644
--- a/src/applications/drydock/controller/DrydockResourceViewController.php
+++ b/src/applications/drydock/controller/DrydockResourceViewController.php
@@ -1,185 +1,189 @@
<?php
final class DrydockResourceViewController extends DrydockResourceController {
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$id = $request->getURIData('id');
$resource = id(new DrydockResourceQuery())
->setViewer($viewer)
->withIDs(array($id))
->needUnconsumedCommands(true)
->executeOne();
if (!$resource) {
return new Aphront404Response();
}
$title = pht(
'Resource %s %s',
$resource->getID(),
$resource->getResourceName());
$header = id(new PHUIHeaderView())
->setUser($viewer)
->setPolicyObject($resource)
- ->setHeader($title);
+ ->setHeader($title)
+ ->setHeaderIcon('fa-map');
if ($resource->isReleasing()) {
$header->setStatus('fa-exclamation-triangle', 'red', pht('Releasing'));
}
- $actions = $this->buildActionListView($resource);
- $properties = $this->buildPropertyListView($resource, $actions);
+ $curtain = $this->buildCurtain($resource);
+ $properties = $this->buildPropertyListView($resource);
$id = $resource->getID();
$resource_uri = $this->getApplicationURI("resource/{$id}/");
$log_query = id(new DrydockLogQuery())
->withResourcePHIDs(array($resource->getPHID()));
$log_box = $this->buildLogBox(
$log_query,
$this->getApplicationURI("resource/{$id}/logs/query/all/"));
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Resource %d', $resource->getID()));
+ $crumbs->setBorder(true);
$locks = $this->buildLocksTab($resource->getPHID());
$commands = $this->buildCommandsTab($resource->getPHID());
+ $lease_box = $this->buildLeaseBox($resource);
$object_box = id(new PHUIObjectBoxView())
- ->setHeader($header)
+ ->setHeaderText(pht('Properties'))
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
->addPropertyList($properties, pht('Properties'))
->addPropertyList($locks, pht('Slot Locks'))
->addPropertyList($commands, pht('Commands'));
- $lease_box = $this->buildLeaseBox($resource);
-
- return $this->buildApplicationPage(
- array(
- $crumbs,
+ $view = id(new PHUITwoColumnView())
+ ->setHeader($header)
+ ->setCurtain($curtain)
+ ->setMainColumn(array(
$object_box,
$lease_box,
$log_box,
- ),
- array(
- 'title' => $title,
+ ));
+
+ return $this->newPage()
+ ->setTitle($title)
+ ->setCrumbs($crumbs)
+ ->appendChild(
+ array(
+ $view,
));
}
- private function buildActionListView(DrydockResource $resource) {
+ private function buildCurtain(DrydockResource $resource) {
$viewer = $this->getViewer();
- $view = id(new PhabricatorActionListView())
- ->setUser($viewer)
- ->setObject($resource);
+ $curtain = $this->newCurtainView($resource);
$can_release = $resource->canRelease();
if ($resource->isReleasing()) {
$can_release = false;
}
$can_edit = PhabricatorPolicyFilter::hasCapability(
$viewer,
$resource,
PhabricatorPolicyCapability::CAN_EDIT);
$uri = '/resource/'.$resource->getID().'/release/';
$uri = $this->getApplicationURI($uri);
- $view->addAction(
+ $curtain->addAction(
id(new PhabricatorActionView())
->setHref($uri)
->setName(pht('Release Resource'))
->setIcon('fa-times')
->setWorkflow(true)
->setDisabled(!$can_release || !$can_edit));
- return $view;
+ return $curtain;
}
private function buildPropertyListView(
- DrydockResource $resource,
- PhabricatorActionListView $actions) {
+ DrydockResource $resource) {
$viewer = $this->getViewer();
- $view = id(new PHUIPropertyListView())
- ->setActionList($actions);
-
+ $view = new PHUIPropertyListView();
$status = $resource->getStatus();
$status = DrydockResourceStatus::getNameForStatus($status);
$view->addProperty(
pht('Status'),
$status);
$until = $resource->getUntil();
if ($until) {
$until_display = phabricator_datetime($until, $viewer);
} else {
$until_display = phutil_tag('em', array(), pht('Never'));
}
$view->addProperty(pht('Expires'), $until_display);
$view->addProperty(
pht('Resource Type'),
$resource->getType());
$view->addProperty(
pht('Blueprint'),
$viewer->renderHandle($resource->getBlueprintPHID()));
$attributes = $resource->getAttributes();
if ($attributes) {
$view->addSectionHeader(
pht('Attributes'), 'fa-list-ul');
foreach ($attributes as $key => $value) {
$view->addProperty($key, $value);
}
}
return $view;
}
private function buildLeaseBox(DrydockResource $resource) {
$viewer = $this->getViewer();
$leases = id(new DrydockLeaseQuery())
->setViewer($viewer)
->withResourcePHIDs(array($resource->getPHID()))
->withStatuses(
array(
DrydockLeaseStatus::STATUS_PENDING,
DrydockLeaseStatus::STATUS_ACQUIRED,
DrydockLeaseStatus::STATUS_ACTIVE,
))
->setLimit(100)
->execute();
$id = $resource->getID();
$leases_uri = "resource/{$id}/leases/query/all/";
$leases_uri = $this->getApplicationURI($leases_uri);
$lease_header = id(new PHUIHeaderView())
->setHeader(pht('Active Leases'))
->addActionLink(
id(new PHUIButtonView())
->setTag('a')
->setHref($leases_uri)
->setIcon('fa-search')
->setText(pht('View All')));
$lease_list = id(new DrydockLeaseListView())
->setUser($viewer)
->setLeases($leases)
->render()
->setNoDataString(pht('This resource has no active leases.'));
return id(new PHUIObjectBoxView())
->setHeader($lease_header)
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
->setObjectList($lease_list);
}
}
diff --git a/src/applications/drydock/view/DrydockRepositoryOperationStatusView.php b/src/applications/drydock/view/DrydockRepositoryOperationStatusView.php
index d84b4cc0e7..aa7d1e3873 100644
--- a/src/applications/drydock/view/DrydockRepositoryOperationStatusView.php
+++ b/src/applications/drydock/view/DrydockRepositoryOperationStatusView.php
@@ -1,220 +1,221 @@
<?php
final class DrydockRepositoryOperationStatusView
extends AphrontView {
private $operation;
private $boxView;
public function setOperation(DrydockRepositoryOperation $operation) {
$this->operation = $operation;
return $this;
}
public function getOperation() {
return $this->operation;
}
public function setBoxView(PHUIObjectBoxView $box_view) {
$this->boxView = $box_view;
return $this;
}
public function getBoxView() {
return $this->boxView;
}
public function render() {
$viewer = $this->getUser();
$operation = $this->getOperation();
$list = $this->renderUnderwayState();
// If the operation is currently underway, refresh the status view.
if ($operation->isUnderway()) {
$status_id = celerity_generate_unique_node_id();
$id = $operation->getID();
$list->setID($status_id);
Javelin::initBehavior(
'drydock-live-operation-status',
array(
'statusID' => $status_id,
'updateURI' => "/drydock/operation/{$id}/status/",
));
}
$box_view = $this->getBoxView();
if (!$box_view) {
$box_view = id(new PHUIObjectBoxView())
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
->setHeaderText(pht('Operation Status'));
}
$box_view->setObjectList($list);
return $box_view;
}
public function renderUnderwayState() {
$viewer = $this->getUser();
$operation = $this->getOperation();
$id = $operation->getID();
$state = $operation->getOperationState();
$icon = DrydockRepositoryOperation::getOperationStateIcon($state);
$name = DrydockRepositoryOperation::getOperationStateName($state);
$item = id(new PHUIObjectItemView())
->setHref("/drydock/operation/{$id}/")
->setObjectName(pht('Operation %d', $id))
->setHeader($operation->getOperationDescription($viewer))
->setStatusIcon($icon, $name);
if ($state != DrydockRepositoryOperation::STATE_FAIL) {
$item->addAttribute($operation->getOperationCurrentStatus($viewer));
} else {
$vcs_error = $operation->getCommandError();
if ($vcs_error) {
switch ($vcs_error['phase']) {
case DrydockWorkingCopyBlueprintImplementation::PHASE_SQUASHMERGE:
$message = pht(
'This change did not merge cleanly. This usually indicates '.
'that the change is out of date and needs to be updated.');
break;
case DrydockWorkingCopyBlueprintImplementation::PHASE_REMOTEFETCH:
$message = pht(
'This change could not be fetched from the remote.');
break;
case DrydockWorkingCopyBlueprintImplementation::PHASE_MERGEFETCH:
$message = pht(
'This change could not be fetched from the remote staging '.
'area. It may not have been pushed, or may have been removed.');
break;
case DrydockLandRepositoryOperation::PHASE_COMMIT:
$message = pht(
'Committing this change failed. It may already have been '.
'merged.');
break;
case DrydockLandRepositoryOperation::PHASE_PUSH:
$message = pht(
'The push failed. This usually indicates '.
'that the change is breaking some rules or '.
'some custom commit hook has failed.');
break;
default:
$message = pht(
'Operation encountered an error while performing repository '.
'operations.');
break;
}
$item->addAttribute($message);
$table = $this->renderVCSErrorTable($vcs_error);
list($links, $info) = $this->renderDetailToggles($table);
$item->addAttribute($links);
$item->appendChild($info);
} else {
$item->addAttribute(pht('Operation encountered an error.'));
}
$is_dismissed = $operation->getIsDismissed();
$item->addAction(
id(new PHUIListItemView())
->setName('Dismiss')
->setIcon('fa-times')
->setDisabled($is_dismissed)
->setWorkflow(true)
->setHref("/drydock/operation/{$id}/dismiss/"));
}
return id(new PHUIObjectItemListView())
->addItem($item);
}
private function renderVCSErrorTable(array $vcs_error) {
$rows = array();
$rows[] = array(
pht('Command'),
phutil_censor_credentials($vcs_error['command']),
);
$rows[] = array(pht('Error'), $vcs_error['err']);
$rows[] = array(
pht('Stdout'),
phutil_censor_credentials($vcs_error['stdout']),
);
$rows[] = array(
pht('Stderr'),
phutil_censor_credentials($vcs_error['stderr']),
);
$table = id(new AphrontTableView($rows))
->setColumnClasses(
array(
'header',
'wide prewrap',
));
return $table;
}
private function renderDetailToggles(AphrontTableView $table) {
$show_id = celerity_generate_unique_node_id();
$hide_id = celerity_generate_unique_node_id();
$info_id = celerity_generate_unique_node_id();
Javelin::initBehavior('phabricator-reveal-content');
$show_details = javelin_tag(
'a',
array(
'id' => $show_id,
'href' => '#',
'sigil' => 'reveal-content',
'mustcapture' => true,
'meta' => array(
'hideIDs' => array($show_id),
'showIDs' => array($hide_id, $info_id),
),
),
pht('Show Details'));
$hide_details = javelin_tag(
'a',
array(
'id' => $hide_id,
'href' => '#',
'sigil' => 'reveal-content',
'mustcapture' => true,
'style' => 'display: none',
'meta' => array(
'hideIDs' => array($hide_id, $info_id),
'showIDs' => array($show_id),
),
),
pht('Hide Details'));
$info = javelin_tag(
'div',
array(
'id' => $info_id,
'style' => 'display: none',
),
$table);
$links = array(
$show_details,
$hide_details,
);
return array($links, $info);
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Jan 19 2025, 22:36 (6 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1129469
Default Alt Text
(38 KB)
Attached To
Mode
rP Phorge
Attached
Detach File
Event Timeline
Log In to Comment