From 06bbf237fe56e8ee6ee64cbba7dd31fd658f1147 Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 13 Feb 2018 05:31:29 -0800 Subject: [PATCH] Give Drydock Resources more modern status treatment Summary: Ref T13073. Depends on D19074. Update icons and UI for resource status. Test Plan: Viewed resources in detail view and list view, saw better status icons. Subscribers: PHID-OPKG-gm6ozazyms6q6i22gyam Maniphest Tasks: T13073 Differential Revision: https://secure.phabricator.com/D19075 --- src/__phutil_library_map__.php | 4 +- .../drydock/constants/DrydockConstants.php | 3 - .../drydock/constants/DrydockLeaseStatus.php | 2 +- .../constants/DrydockResourceStatus.php | 86 ++++++++++++++++--- .../DrydockResourceViewController.php | 19 ++-- .../drydock/storage/DrydockResource.php | 62 ++++++------- .../drydock/view/DrydockResourceListView.php | 20 +---- 7 files changed, 124 insertions(+), 72 deletions(-) delete mode 100644 src/applications/drydock/constants/DrydockConstants.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 9a77727720..116aa31629 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -1041,7 +1041,6 @@ phutil_register_library_map(array( 'DrydockCommandInterface' => 'applications/drydock/interface/command/DrydockCommandInterface.php', 'DrydockCommandQuery' => 'applications/drydock/query/DrydockCommandQuery.php', 'DrydockConsoleController' => 'applications/drydock/controller/DrydockConsoleController.php', - 'DrydockConstants' => 'applications/drydock/constants/DrydockConstants.php', 'DrydockController' => 'applications/drydock/controller/DrydockController.php', 'DrydockCreateBlueprintsCapability' => 'applications/drydock/capability/DrydockCreateBlueprintsCapability.php', 'DrydockDAO' => 'applications/drydock/storage/DrydockDAO.php', @@ -6259,7 +6258,6 @@ phutil_register_library_map(array( 'DrydockCommandInterface' => 'DrydockInterface', 'DrydockCommandQuery' => 'DrydockQuery', 'DrydockConsoleController' => 'DrydockController', - 'DrydockConstants' => 'Phobject', 'DrydockController' => 'PhabricatorController', 'DrydockCreateBlueprintsCapability' => 'PhabricatorPolicyCapability', 'DrydockDAO' => 'PhabricatorLiskDAO', @@ -6347,7 +6345,7 @@ phutil_register_library_map(array( 'DrydockResourceReclaimLogType' => 'DrydockLogType', 'DrydockResourceReleaseController' => 'DrydockResourceController', 'DrydockResourceSearchEngine' => 'PhabricatorApplicationSearchEngine', - 'DrydockResourceStatus' => 'DrydockConstants', + 'DrydockResourceStatus' => 'PhabricatorObjectStatus', 'DrydockResourceUpdateWorker' => 'DrydockWorker', 'DrydockResourceViewController' => 'DrydockResourceController', 'DrydockSFTPFilesystemInterface' => 'DrydockFilesystemInterface', diff --git a/src/applications/drydock/constants/DrydockConstants.php b/src/applications/drydock/constants/DrydockConstants.php deleted file mode 100644 index 48d06329bf..0000000000 --- a/src/applications/drydock/constants/DrydockConstants.php +++ /dev/null @@ -1,3 +0,0 @@ - self::STATUS_DESTROYED, 'name' => pht('Destroyed'), 'icon' => 'fa-times', - 'color' => 'red', + 'color' => 'grey', 'isReleasable' => false, 'isCommandable' => false, 'isActivating' => false, diff --git a/src/applications/drydock/constants/DrydockResourceStatus.php b/src/applications/drydock/constants/DrydockResourceStatus.php index d8a860d6a0..197a220630 100644 --- a/src/applications/drydock/constants/DrydockResourceStatus.php +++ b/src/applications/drydock/constants/DrydockResourceStatus.php @@ -1,6 +1,7 @@ getStatusSpecification($key)); + } + public static function getStatusMap() { - return array( - self::STATUS_PENDING => pht('Pending'), - self::STATUS_ACTIVE => pht('Active'), - self::STATUS_RELEASED => pht('Released'), - self::STATUS_BROKEN => pht('Broken'), - self::STATUS_DESTROYED => pht('Destroyed'), - ); + $map = id(new self())->getStatusSpecifications(); + return ipull($map, 'name', 'key'); } public static function getNameForStatus($status) { - $map = self::getStatusMap(); - return idx($map, $status, pht('Unknown')); + $map = id(new self())->getStatusSpecification($status); + return $map['name']; } public static function getAllStatuses() { - return array_keys(self::getStatusMap()); + return array_keys(id(new self())->getStatusSpecifications()); + } + + public function isActive() { + return ($this->getKey() === self::STATUS_ACTIVE); + } + + public function canRelease() { + return $this->getStatusProperty('isReleasable'); + } + + public function canReceiveCommands() { + return $this->getStatusProperty('isCommandable'); + } + + protected function newStatusSpecifications() { + return array( + array( + 'key' => self::STATUS_PENDING, + 'name' => pht('Pending'), + 'icon' => 'fa-clock-o', + 'color' => 'blue', + 'isReleasable' => true, + 'isCommandable' => true, + ), + array( + 'key' => self::STATUS_ACTIVE, + 'name' => pht('Active'), + 'icon' => 'fa-check', + 'color' => 'green', + 'isReleasable' => true, + 'isCommandable' => true, + ), + array( + 'key' => self::STATUS_RELEASED, + 'name' => pht('Released'), + 'icon' => 'fa-circle-o', + 'color' => 'blue', + 'isReleasable' => false, + 'isCommandable' => false, + ), + array( + 'key' => self::STATUS_BROKEN, + 'name' => pht('Broken'), + 'icon' => 'fa-times', + 'color' => 'indigo', + 'isReleasable' => true, + 'isCommandable' => false, + ), + array( + 'key' => self::STATUS_DESTROYED, + 'name' => pht('Destroyed'), + 'icon' => 'fa-times', + 'color' => 'grey', + 'isReleasable' => false, + 'isCommandable' => false, + ), + ); + } + + protected function newUnknownStatusSpecification($status) { + return array( + 'isReleasable' => false, + 'isCommandable' => false, + ); } } diff --git a/src/applications/drydock/controller/DrydockResourceViewController.php b/src/applications/drydock/controller/DrydockResourceViewController.php index c6771007ba..8718caa9e2 100644 --- a/src/applications/drydock/controller/DrydockResourceViewController.php +++ b/src/applications/drydock/controller/DrydockResourceViewController.php @@ -24,10 +24,19 @@ final class DrydockResourceViewController extends DrydockResourceController { ->setUser($viewer) ->setPolicyObject($resource) ->setHeader($title) - ->setHeaderIcon('fa-map'); + ->setHeaderIcon('fa-map') + ->setStatus( + $resource->getStatusIcon(), + $resource->getStatusColor(), + $resource->getStatusDisplayName()); if ($resource->isReleasing()) { - $header->setStatus('fa-exclamation-triangle', 'red', pht('Releasing')); + $header->addTag( + id(new PHUITagView()) + ->setType(PHUITagView::TYPE_SHADE) + ->setIcon('fa-exclamation-triangle') + ->setColor('red') + ->setName('Releasing')); } $curtain = $this->buildCurtain($resource); @@ -127,12 +136,6 @@ final class DrydockResourceViewController extends DrydockResourceController { $viewer = $this->getViewer(); $view = new PHUIPropertyListView(); - $status = $resource->getStatus(); - $status = DrydockResourceStatus::getNameForStatus($status); - - $view->addProperty( - pht('Status'), - $status); $until = $resource->getUntil(); if ($until) { diff --git a/src/applications/drydock/storage/DrydockResource.php b/src/applications/drydock/storage/DrydockResource.php index 3eceec8b77..8ec63cb097 100644 --- a/src/applications/drydock/storage/DrydockResource.php +++ b/src/applications/drydock/storage/DrydockResource.php @@ -235,16 +235,6 @@ final class DrydockResource extends DrydockDAO return $this->isActivated; } - public function canRelease() { - switch ($this->getStatus()) { - case DrydockResourceStatus::STATUS_RELEASED: - case DrydockResourceStatus::STATUS_DESTROYED: - return false; - default: - return true; - } - } - public function scheduleUpdate($epoch = null) { PhabricatorWorker::scheduleTask( 'DrydockResourceUpdateWorker', @@ -282,26 +272,6 @@ final class DrydockResource extends DrydockDAO } } - public function canReceiveCommands() { - switch ($this->getStatus()) { - case DrydockResourceStatus::STATUS_RELEASED: - case DrydockResourceStatus::STATUS_BROKEN: - case DrydockResourceStatus::STATUS_DESTROYED: - return false; - default: - return true; - } - } - - public function isActive() { - switch ($this->getStatus()) { - case DrydockResourceStatus::STATUS_ACTIVE: - return true; - } - - return false; - } - public function logEvent($type, array $data = array()) { $log = id(new DrydockLog()) ->setEpoch(PhabricatorTime::getNow()) @@ -315,6 +285,38 @@ final class DrydockResource extends DrydockDAO } +/* -( Status )------------------------------------------------------------- */ + + + public function getStatusObject() { + return DrydockResourceStatus::newStatusObject($this->getStatus()); + } + + public function getStatusIcon() { + return $this->getStatusObject()->getIcon(); + } + + public function getStatusColor() { + return $this->getStatusObject()->getColor(); + } + + public function getStatusDisplayName() { + return $this->getStatusObject()->getDisplayName(); + } + + public function canRelease() { + return $this->getStatusObject()->canRelease(); + } + + public function canReceiveCommands() { + return $this->getStatusObject()->canReceiveCommands(); + } + + public function isActive() { + return $this->getStatusObject()->isActive(); + } + + /* -( PhabricatorPolicyInterface )----------------------------------------- */ diff --git a/src/applications/drydock/view/DrydockResourceListView.php b/src/applications/drydock/view/DrydockResourceListView.php index 739b464bdb..f2d105ecc8 100644 --- a/src/applications/drydock/view/DrydockResourceListView.php +++ b/src/applications/drydock/view/DrydockResourceListView.php @@ -23,23 +23,11 @@ final class DrydockResourceListView extends AphrontView { ->setObjectName(pht('Resource %d', $id)) ->setHeader($resource->getResourceName()); - $status = DrydockResourceStatus::getNameForStatus($resource->getStatus()); - $item->addAttribute($status); + $icon = $resource->getStatusIcon(); + $color = $resource->getStatusColor(); + $label = $resource->getStatusDisplayName(); - switch ($resource->getStatus()) { - case DrydockResourceStatus::STATUS_PENDING: - $item->setStatusIcon('fa-dot-circle-o yellow'); - break; - case DrydockResourceStatus::STATUS_ACTIVE: - $item->setStatusIcon('fa-dot-circle-o green'); - break; - case DrydockResourceStatus::STATUS_DESTROYED: - $item->setStatusIcon('fa-times-circle-o black'); - break; - default: - $item->setStatusIcon('fa-dot-circle-o red'); - break; - } + $item->setStatusIcon("{$icon} {$color}", $label); $view->addItem($item); }