From fc0dc02bb92d8d11259cab2a2dbfd68990d1c9ea Mon Sep 17 00:00:00 2001 From: epriestley Date: Thu, 3 Mar 2016 05:52:21 -0800 Subject: [PATCH] Allow Drydock blueprints to be tagged and searched, and give types some little icons Summary: Ref T10457. - Let blueprints be tagged so you can search and annotate them a little more easily. - Give each blueprint type an optional icon to make things a little easier to parse visually. Test Plan: - Tagged blueprints. - Searched by tags. - Looked at nice little icons. {F1139712} Reviewers: chad Reviewed By: chad Subscribers: yelirekim Maniphest Tasks: T10457 Differential Revision: https://secure.phabricator.com/D15392 --- .../autopatches/20160303.drydock.3.edge.sql | 16 ++++++++ src/__phutil_library_map__.php | 3 ++ ...anacServiceHostBlueprintImplementation.php | 4 ++ .../DrydockBlueprintImplementation.php | 4 ++ ...dockWorkingCopyBlueprintImplementation.php | 4 ++ .../DrydockBlueprintEditController.php | 8 +++- .../DrydockBlueprintViewController.php | 6 ++- .../query/DrydockBlueprintSearchEngine.php | 37 +++++++++++++++++-- .../drydock/storage/DrydockBlueprint.php | 8 +++- .../drydock/storage/DrydockSchemaSpec.php | 9 +++++ .../HarbormasterBuildPlanSearchEngine.php | 1 - 11 files changed, 93 insertions(+), 7 deletions(-) create mode 100644 resources/sql/autopatches/20160303.drydock.3.edge.sql create mode 100644 src/applications/drydock/storage/DrydockSchemaSpec.php diff --git a/resources/sql/autopatches/20160303.drydock.3.edge.sql b/resources/sql/autopatches/20160303.drydock.3.edge.sql new file mode 100644 index 0000000000..2de8506ba9 --- /dev/null +++ b/resources/sql/autopatches/20160303.drydock.3.edge.sql @@ -0,0 +1,16 @@ +CREATE TABLE {$NAMESPACE}_drydock.edge ( + src VARBINARY(64) NOT NULL, + type INT UNSIGNED NOT NULL, + dst VARBINARY(64) NOT NULL, + dateCreated INT UNSIGNED NOT NULL, + seq INT UNSIGNED NOT NULL, + dataID INT UNSIGNED, + PRIMARY KEY (src, type, dst), + KEY `src` (src, type, dateCreated, seq), + UNIQUE KEY `key_dst` (dst, type, src) +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; + +CREATE TABLE {$NAMESPACE}_drydock.edgedata ( + id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, + data LONGTEXT NOT NULL COLLATE {$COLLATE_TEXT} +) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT}; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 73d24c3d7d..7ca4586375 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -966,6 +966,7 @@ phutil_register_library_map(array( 'DrydockResourceViewController' => 'applications/drydock/controller/DrydockResourceViewController.php', 'DrydockSFTPFilesystemInterface' => 'applications/drydock/interface/filesystem/DrydockSFTPFilesystemInterface.php', 'DrydockSSHCommandInterface' => 'applications/drydock/interface/command/DrydockSSHCommandInterface.php', + 'DrydockSchemaSpec' => 'applications/drydock/storage/DrydockSchemaSpec.php', 'DrydockSlotLock' => 'applications/drydock/storage/DrydockSlotLock.php', 'DrydockSlotLockException' => 'applications/drydock/exception/DrydockSlotLockException.php', 'DrydockSlotLockFailureLogType' => 'applications/drydock/logtype/DrydockSlotLockFailureLogType.php', @@ -4975,6 +4976,7 @@ phutil_register_library_map(array( 'PhabricatorPolicyInterface', 'PhabricatorCustomFieldInterface', 'PhabricatorNgramsInterface', + 'PhabricatorProjectInterface', ), 'DrydockBlueprintController' => 'DrydockController', 'DrydockBlueprintCoreCustomField' => array( @@ -5094,6 +5096,7 @@ phutil_register_library_map(array( 'DrydockResourceViewController' => 'DrydockResourceController', 'DrydockSFTPFilesystemInterface' => 'DrydockFilesystemInterface', 'DrydockSSHCommandInterface' => 'DrydockCommandInterface', + 'DrydockSchemaSpec' => 'PhabricatorConfigSchemaSpec', 'DrydockSlotLock' => 'DrydockDAO', 'DrydockSlotLockException' => 'Exception', 'DrydockSlotLockFailureLogType' => 'DrydockLogType', diff --git a/src/applications/drydock/blueprint/DrydockAlmanacServiceHostBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockAlmanacServiceHostBlueprintImplementation.php index 443b0e8965..ef904e1019 100644 --- a/src/applications/drydock/blueprint/DrydockAlmanacServiceHostBlueprintImplementation.php +++ b/src/applications/drydock/blueprint/DrydockAlmanacServiceHostBlueprintImplementation.php @@ -15,6 +15,10 @@ final class DrydockAlmanacServiceHostBlueprintImplementation return pht('Almanac Hosts'); } + public function getBlueprintIcon() { + return 'fa-server'; + } + public function getDescription() { return pht( 'Allows Drydock to lease existing hosts defined in an Almanac service '. diff --git a/src/applications/drydock/blueprint/DrydockBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockBlueprintImplementation.php index 01c2067280..76a81d7ef1 100644 --- a/src/applications/drydock/blueprint/DrydockBlueprintImplementation.php +++ b/src/applications/drydock/blueprint/DrydockBlueprintImplementation.php @@ -15,6 +15,10 @@ abstract class DrydockBlueprintImplementation extends Phobject { abstract public function getBlueprintName(); abstract public function getDescription(); + public function getBlueprintIcon() { + return 'fa-map-o'; + } + public function getFieldSpecifications() { $fields = array(); diff --git a/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php b/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php index d2f7191c06..8b138405eb 100644 --- a/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php +++ b/src/applications/drydock/blueprint/DrydockWorkingCopyBlueprintImplementation.php @@ -13,6 +13,10 @@ final class DrydockWorkingCopyBlueprintImplementation return pht('Working Copy'); } + public function getBlueprintIcon() { + return 'fa-folder-open'; + } + public function getDescription() { return pht('Allows Drydock to check out working copies of repositories.'); } diff --git a/src/applications/drydock/controller/DrydockBlueprintEditController.php b/src/applications/drydock/controller/DrydockBlueprintEditController.php index fbda9d0d29..f25dc01bff 100644 --- a/src/applications/drydock/controller/DrydockBlueprintEditController.php +++ b/src/applications/drydock/controller/DrydockBlueprintEditController.php @@ -52,9 +52,15 @@ final class DrydockBlueprintEditController extends DrydockBlueprintController { foreach ($implementations as $implementation_name => $implementation) { $disabled = !$implementation->isEnabled(); + $impl_icon = $implementation->getBlueprintIcon(); + $impl_name = $implementation->getBlueprintName(); + + $impl_icon = id(new PHUIIconView()) + ->setIcon($impl_icon, 'lightgreytext'); + $control->addButton( $implementation_name, - $implementation->getBlueprintName(), + array($impl_icon, ' ', $impl_name), array( pht('Provides: %s', $implementation->getType()), phutil_tag('br'), diff --git a/src/applications/drydock/controller/DrydockBlueprintViewController.php b/src/applications/drydock/controller/DrydockBlueprintViewController.php index b23b869fd4..21f3a395d3 100644 --- a/src/applications/drydock/controller/DrydockBlueprintViewController.php +++ b/src/applications/drydock/controller/DrydockBlueprintViewController.php @@ -127,8 +127,12 @@ final class DrydockBlueprintViewController extends DrydockBlueprintController { private function buildPropertyListView( DrydockBlueprint $blueprint, PhabricatorActionListView $actions) { + $viewer = $this->getViewer(); + + $view = id(new PHUIPropertyListView()) + ->setUser($viewer) + ->setObject($blueprint); - $view = new PHUIPropertyListView(); $view->setActionList($actions); $view->addProperty( diff --git a/src/applications/drydock/query/DrydockBlueprintSearchEngine.php b/src/applications/drydock/query/DrydockBlueprintSearchEngine.php index bb7bd02cc9..3c80ca2700 100644 --- a/src/applications/drydock/query/DrydockBlueprintSearchEngine.php +++ b/src/applications/drydock/query/DrydockBlueprintSearchEngine.php @@ -77,15 +77,29 @@ final class DrydockBlueprintSearchEngine assert_instances_of($blueprints, 'DrydockBlueprint'); $viewer = $this->requireViewer(); + + if ($blueprints) { + $edge_query = id(new PhabricatorEdgeQuery()) + ->withSourcePHIDs(mpull($blueprints, 'getPHID')) + ->withEdgeTypes( + array( + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, + )); + + $edge_query->execute(); + } + $view = new PHUIObjectItemListView(); foreach ($blueprints as $blueprint) { + $impl = $blueprint->getImplementation(); + $item = id(new PHUIObjectItemView()) ->setHeader($blueprint->getBlueprintName()) - ->setHref($this->getApplicationURI('/blueprint/'.$blueprint->getID())) + ->setHref($blueprint->getURI()) ->setObjectName(pht('Blueprint %d', $blueprint->getID())); - if (!$blueprint->getImplementation()->isEnabled()) { + if (!$impl->isEnabled()) { $item->setDisabled(true); $item->addIcon('fa-chain-broken grey', pht('Implementation')); } @@ -95,7 +109,24 @@ final class DrydockBlueprintSearchEngine $item->addIcon('fa-ban grey', pht('Disabled')); } - $item->addAttribute($blueprint->getImplementation()->getBlueprintName()); + $impl_icon = $impl->getBlueprintIcon(); + $impl_name = $impl->getBlueprintName(); + + $impl_icon = id(new PHUIIconView()) + ->setIcon($impl_icon, 'lightgreytext'); + + $item->addAttribute(array($impl_icon, ' ', $impl_name)); + + $phid = $blueprint->getPHID(); + $project_phids = $edge_query->getDestinationPHIDs(array($phid)); + if ($project_phids) { + $project_handles = $viewer->loadHandles($project_phids); + $item->addAttribute( + id(new PHUIHandleTagListView()) + ->setLimit(4) + ->setSlim(true) + ->setHandles($project_handles)); + } $view->addItem($item); } diff --git a/src/applications/drydock/storage/DrydockBlueprint.php b/src/applications/drydock/storage/DrydockBlueprint.php index dd50c29820..a7deb73cc3 100644 --- a/src/applications/drydock/storage/DrydockBlueprint.php +++ b/src/applications/drydock/storage/DrydockBlueprint.php @@ -9,7 +9,8 @@ final class DrydockBlueprint extends DrydockDAO PhabricatorApplicationTransactionInterface, PhabricatorPolicyInterface, PhabricatorCustomFieldInterface, - PhabricatorNgramsInterface { + PhabricatorNgramsInterface, + PhabricatorProjectInterface { protected $className; protected $blueprintName; @@ -119,6 +120,11 @@ final class DrydockBlueprint extends DrydockDAO return $log->save(); } + public function getURI() { + $id = $this->getID(); + return "/drydock/blueprint/{$id}/"; + } + /* -( Allocating Resources )----------------------------------------------- */ diff --git a/src/applications/drydock/storage/DrydockSchemaSpec.php b/src/applications/drydock/storage/DrydockSchemaSpec.php new file mode 100644 index 0000000000..d8a99f6ee4 --- /dev/null +++ b/src/applications/drydock/storage/DrydockSchemaSpec.php @@ -0,0 +1,9 @@ +buildEdgeSchemata(new DrydockBlueprint()); + } + +} diff --git a/src/applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php b/src/applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php index 36f86b9ec5..709df7f94c 100644 --- a/src/applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php +++ b/src/applications/harbormaster/query/HarbormasterBuildPlanSearchEngine.php @@ -84,7 +84,6 @@ final class HarbormasterBuildPlanSearchEngine $viewer = $this->requireViewer(); - if ($plans) { $edge_query = id(new PhabricatorEdgeQuery()) ->withSourcePHIDs(mpull($plans, 'getPHID'))