@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Modernize Drydock SearchEngine implementations

Summary:
Ref T9252. Move these to the more modern stuff to pick up ordering and interface support for free.

Also work around the blueprint / custom field integration a little more gracefully.

Test Plan: Searched for blueprints, resources and leases.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T9252

Differential Revision: https://secure.phabricator.com/D14155

+57 -106
+6 -10
src/applications/drydock/constants/DrydockLeaseStatus.php
··· 9 9 const STATUS_BROKEN = 'broken'; 10 10 const STATUS_DESTROYED = 'destroyed'; 11 11 12 - public static function getNameForStatus($status) { 13 - $map = array( 12 + public static function getStatusMap() { 13 + return array( 14 14 self::STATUS_PENDING => pht('Pending'), 15 15 self::STATUS_ACQUIRED => pht('Acquired'), 16 16 self::STATUS_ACTIVE => pht('Active'), ··· 18 18 self::STATUS_BROKEN => pht('Broken'), 19 19 self::STATUS_DESTROYED => pht('Destroyed'), 20 20 ); 21 + } 21 22 23 + public static function getNameForStatus($status) { 24 + $map = self::getStatusMap(); 22 25 return idx($map, $status, pht('Unknown')); 23 26 } 24 27 25 28 public static function getAllStatuses() { 26 - return array( 27 - self::STATUS_PENDING, 28 - self::STATUS_ACQUIRED, 29 - self::STATUS_ACTIVE, 30 - self::STATUS_RELEASED, 31 - self::STATUS_BROKEN, 32 - self::STATUS_DESTROYED, 33 - ); 29 + return array_keys(self::getStatusMap()); 34 30 } 35 31 36 32 }
+6 -9
src/applications/drydock/constants/DrydockResourceStatus.php
··· 8 8 const STATUS_BROKEN = 'broken'; 9 9 const STATUS_DESTROYED = 'destroyed'; 10 10 11 - public static function getNameForStatus($status) { 12 - $map = array( 11 + public static function getStatusMap() { 12 + return array( 13 13 self::STATUS_PENDING => pht('Pending'), 14 14 self::STATUS_ACTIVE => pht('Active'), 15 15 self::STATUS_RELEASED => pht('Released'), 16 16 self::STATUS_BROKEN => pht('Broken'), 17 17 self::STATUS_DESTROYED => pht('Destroyed'), 18 18 ); 19 + } 19 20 21 + public static function getNameForStatus($status) { 22 + $map = self::getStatusMap(); 20 23 return idx($map, $status, pht('Unknown')); 21 24 } 22 25 23 26 public static function getAllStatuses() { 24 - return array( 25 - self::STATUS_PENDING, 26 - self::STATUS_ACTIVE, 27 - self::STATUS_RELEASED, 28 - self::STATUS_BROKEN, 29 - self::STATUS_DESTROYED, 30 - ); 27 + return array_keys(self::getStatusMap()); 31 28 } 32 29 33 30 }
+6
src/applications/drydock/customfield/DrydockBlueprintCoreCustomField.php
··· 9 9 } 10 10 11 11 public function createFields($object) { 12 + // If this is a generic object without an attached implementation (for 13 + // example, via ApplicationSearch), just don't build any custom fields. 14 + if (!$object->hasImplementation()) { 15 + return array(); 16 + } 17 + 12 18 $impl = $object->getImplementation(); 13 19 $specs = $impl->getFieldSpecifications(); 14 20
-17
src/applications/drydock/query/DrydockBlueprintQuery.php
··· 85 85 return $where; 86 86 } 87 87 88 - public function getOrderableColumns() { 89 - // TODO: Blueprints implement CustomFields, but can not be ordered by 90 - // custom field classes because the custom fields are not global. There 91 - // is no graceful way to handle this in ApplicationSearch at the moment. 92 - // Just brute force around it until we can clean this up. 93 - 94 - return array( 95 - 'id' => array( 96 - 'table' => $this->getPrimaryTableAlias(), 97 - 'column' => 'id', 98 - 'reverse' => false, 99 - 'type' => 'int', 100 - 'unique' => true, 101 - ), 102 - ); 103 - } 104 - 105 88 }
+9 -7
src/applications/drydock/query/DrydockBlueprintSearchEngine.php
··· 11 11 return 'PhabricatorDrydockApplication'; 12 12 } 13 13 14 - public function buildSavedQueryFromRequest(AphrontRequest $request) { 15 - return new PhabricatorSavedQuery(); 14 + public function newQuery() { 15 + return id(new DrydockBlueprintQuery()); 16 16 } 17 17 18 - public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 19 - return new DrydockBlueprintQuery(); 18 + protected function buildQueryFromParameters(array $map) { 19 + $query = $this->newQuery(); 20 + 21 + return $query; 20 22 } 21 23 22 - public function buildSearchForm( 23 - AphrontFormView $form, 24 - PhabricatorSavedQuery $saved) {} 24 + protected function buildCustomSearchFields() { 25 + return array(); 26 + } 25 27 26 28 protected function getURI($path) { 27 29 return '/drydock/blueprint/'.$path;
+13 -32
src/applications/drydock/query/DrydockLeaseSearchEngine.php
··· 11 11 return 'PhabricatorDrydockApplication'; 12 12 } 13 13 14 - public function buildSavedQueryFromRequest(AphrontRequest $request) { 15 - $saved = new PhabricatorSavedQuery(); 16 - 17 - $saved->setParameter( 18 - 'statuses', 19 - $this->readListFromRequest($request, 'statuses')); 20 - 21 - return $saved; 14 + public function newQuery() { 15 + return new DrydockLeaseQuery(); 22 16 } 23 17 24 - public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 25 - $query = id(new DrydockLeaseQuery()); 18 + protected function buildQueryFromParameters(array $map) { 19 + $query = $this->newQuery(); 26 20 27 - $statuses = $saved->getParameter('statuses', array()); 28 - if ($statuses) { 29 - $query->withStatuses($statuses); 21 + if ($map['statuses']) { 22 + $query->withStatuses($map['statuses']); 30 23 } 31 24 32 25 return $query; 33 26 } 34 27 35 - public function buildSearchForm( 36 - AphrontFormView $form, 37 - PhabricatorSavedQuery $saved) { 38 - 39 - $statuses = $saved->getParameter('statuses', array()); 40 - 41 - $status_control = id(new AphrontFormCheckboxControl()) 42 - ->setLabel(pht('Status')); 43 - foreach (DrydockLeaseStatus::getAllStatuses() as $status) { 44 - $status_control->addCheckbox( 45 - 'statuses[]', 46 - $status, 47 - DrydockLeaseStatus::getNameForStatus($status), 48 - in_array($status, $statuses)); 49 - } 50 - 51 - $form 52 - ->appendChild($status_control); 53 - 28 + protected function buildCustomSearchFields() { 29 + return array( 30 + id(new PhabricatorSearchCheckboxesField()) 31 + ->setLabel(pht('Statuses')) 32 + ->setKey('statuses') 33 + ->setOptions(DrydockLeaseStatus::getStatusMap()), 34 + ); 54 35 } 55 36 56 37 protected function getURI($path) {
+13 -31
src/applications/drydock/query/DrydockResourceSearchEngine.php
··· 11 11 return 'PhabricatorDrydockApplication'; 12 12 } 13 13 14 - public function buildSavedQueryFromRequest(AphrontRequest $request) { 15 - $saved = new PhabricatorSavedQuery(); 16 - 17 - $saved->setParameter( 18 - 'statuses', 19 - $this->readListFromRequest($request, 'statuses')); 20 - 21 - return $saved; 14 + public function newQuery() { 15 + return new DrydockResourceQuery(); 22 16 } 23 17 24 - public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 25 - $query = id(new DrydockResourceQuery()); 18 + protected function buildQueryFromParameters(array $map) { 19 + $query = $this->newQuery(); 26 20 27 - $statuses = $saved->getParameter('statuses', array()); 28 - if ($statuses) { 29 - $query->withStatuses($statuses); 21 + if ($map['statuses']) { 22 + $query->withStatuses($map['statuses']); 30 23 } 31 24 32 25 return $query; 33 26 } 34 27 35 - public function buildSearchForm( 36 - AphrontFormView $form, 37 - PhabricatorSavedQuery $saved) { 38 - 39 - $statuses = $saved->getParameter('statuses', array()); 40 - 41 - $status_control = id(new AphrontFormCheckboxControl()) 42 - ->setLabel(pht('Status')); 43 - foreach (DrydockResourceStatus::getAllStatuses() as $status) { 44 - $status_control->addCheckbox( 45 - 'statuses[]', 46 - $status, 47 - DrydockResourceStatus::getNameForStatus($status), 48 - in_array($status, $statuses)); 49 - } 50 - 51 - $form 52 - ->appendChild($status_control); 28 + protected function buildCustomSearchFields() { 29 + return array( 30 + id(new PhabricatorSearchCheckboxesField()) 31 + ->setLabel(pht('Statuses')) 32 + ->setKey('statuses') 33 + ->setOptions(DrydockResourceStatus::getStatusMap()), 34 + ); 53 35 } 54 36 55 37 protected function getURI($path) {
+4
src/applications/drydock/storage/DrydockBlueprint.php
··· 64 64 return $this; 65 65 } 66 66 67 + public function hasImplementation() { 68 + return ($this->implementation !== self::ATTACHABLE); 69 + } 70 + 67 71 public function getDetail($key, $default = null) { 68 72 return idx($this->details, $key, $default); 69 73 }