diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2976,6 +2976,7 @@ 'PhabricatorEditEngineStaticCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineStaticCommentAction.php', 'PhabricatorEditEngineSubtype' => 'applications/transactions/editengine/PhabricatorEditEngineSubtype.php', 'PhabricatorEditEngineSubtypeInterface' => 'applications/transactions/editengine/PhabricatorEditEngineSubtypeInterface.php', + 'PhabricatorEditEngineSubtypeMap' => 'applications/transactions/editengine/PhabricatorEditEngineSubtypeMap.php', 'PhabricatorEditEngineSubtypeTestCase' => 'applications/transactions/editengine/__tests__/PhabricatorEditEngineSubtypeTestCase.php', 'PhabricatorEditEngineTokenizerCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineTokenizerCommentAction.php', 'PhabricatorEditField' => 'applications/transactions/editfield/PhabricatorEditField.php', @@ -8729,6 +8730,7 @@ 'PhabricatorEditEngineSettingsPanel' => 'PhabricatorSettingsPanel', 'PhabricatorEditEngineStaticCommentAction' => 'PhabricatorEditEngineCommentAction', 'PhabricatorEditEngineSubtype' => 'Phobject', + 'PhabricatorEditEngineSubtypeMap' => 'Phobject', 'PhabricatorEditEngineSubtypeTestCase' => 'PhabricatorTestCase', 'PhabricatorEditEngineTokenizerCommentAction' => 'PhabricatorEditEngineCommentAction', 'PhabricatorEditField' => 'Phobject', diff --git a/src/applications/maniphest/query/ManiphestTaskSearchEngine.php b/src/applications/maniphest/query/ManiphestTaskSearchEngine.php --- a/src/applications/maniphest/query/ManiphestTaskSearchEngine.php +++ b/src/applications/maniphest/query/ManiphestTaskSearchEngine.php @@ -47,7 +47,7 @@ // Hide the "Subtypes" constraint from the web UI if the install only // defines one task subtype, since it isn't of any use in this case. $subtype_map = id(new ManiphestTask())->newEditEngineSubtypeMap(); - $hide_subtypes = (count($subtype_map) == 1); + $hide_subtypes = ($subtype_map->getCount() == 1); return array( id(new PhabricatorOwnersSearchField()) diff --git a/src/applications/maniphest/storage/ManiphestTask.php b/src/applications/maniphest/storage/ManiphestTask.php --- a/src/applications/maniphest/storage/ManiphestTask.php +++ b/src/applications/maniphest/storage/ManiphestTask.php @@ -573,7 +573,7 @@ public function newSubtypeObject() { $subtype_key = $this->getEditEngineSubtype(); $subtype_map = $this->newEditEngineSubtypeMap(); - return idx($subtype_map, $subtype_key); + return $subtype_map->getSubtype($subtype_key); } /* -( PhabricatorFulltextInterface )--------------------------------------- */ diff --git a/src/applications/maniphest/storage/ManiphestTransaction.php b/src/applications/maniphest/storage/ManiphestTransaction.php --- a/src/applications/maniphest/storage/ManiphestTransaction.php +++ b/src/applications/maniphest/storage/ManiphestTransaction.php @@ -214,11 +214,12 @@ public function renderSubtypeName($value) { $object = $this->getObject(); $map = $object->newEditEngineSubtypeMap(); - if (!isset($map[$value])) { + + if (!$map->isValidSubtype($value)) { return $value; } - return $map[$value]->getName(); + return $map->getSubtype($value)->getName(); } } diff --git a/src/applications/maniphest/typeahead/ManiphestTaskSubtypeDatasource.php b/src/applications/maniphest/typeahead/ManiphestTaskSubtypeDatasource.php --- a/src/applications/maniphest/typeahead/ManiphestTaskSubtypeDatasource.php +++ b/src/applications/maniphest/typeahead/ManiphestTaskSubtypeDatasource.php @@ -28,7 +28,7 @@ $results = array(); $subtype_map = id(new ManiphestTask())->newEditEngineSubtypeMap(); - foreach ($subtype_map as $key => $subtype) { + foreach ($subtype_map->getSubtypes() as $key => $subtype) { $result = id(new PhabricatorTypeaheadResult()) ->setIcon($subtype->getIcon()) diff --git a/src/applications/maniphest/view/ManiphestTaskListView.php b/src/applications/maniphest/view/ManiphestTaskListView.php --- a/src/applications/maniphest/view/ManiphestTaskListView.php +++ b/src/applications/maniphest/view/ManiphestTaskListView.php @@ -56,9 +56,6 @@ Javelin::initBehavior('maniphest-list-editor'); } - $subtype_map = id(new ManiphestTask()) - ->newEditEngineSubtypeMap(); - foreach ($this->tasks as $task) { $item = id(new PHUIObjectItemView()) ->setUser($this->getUser()) diff --git a/src/applications/transactions/controller/PhabricatorEditEngineConfigurationSubtypeController.php b/src/applications/transactions/controller/PhabricatorEditEngineConfigurationSubtypeController.php --- a/src/applications/transactions/controller/PhabricatorEditEngineConfigurationSubtypeController.php +++ b/src/applications/transactions/controller/PhabricatorEditEngineConfigurationSubtypeController.php @@ -61,8 +61,7 @@ EOTEXT ); - $map = $engine->newSubtypeMap(); - $map = mpull($map, 'getName'); + $map = $engine->newSubtypeMap()->getDisplayMap(); $form = id(new AphrontFormView()) ->setUser($viewer) diff --git a/src/applications/transactions/editengine/PhabricatorEditEngineSubtype.php b/src/applications/transactions/editengine/PhabricatorEditEngineSubtype.php --- a/src/applications/transactions/editengine/PhabricatorEditEngineSubtype.php +++ b/src/applications/transactions/editengine/PhabricatorEditEngineSubtype.php @@ -182,7 +182,7 @@ $map[$key] = $subtype; } - return $map; + return new PhabricatorEditEngineSubtypeMap($map); } } diff --git a/src/applications/transactions/editengine/PhabricatorEditEngineSubtypeMap.php b/src/applications/transactions/editengine/PhabricatorEditEngineSubtypeMap.php new file mode 100644 --- /dev/null +++ b/src/applications/transactions/editengine/PhabricatorEditEngineSubtypeMap.php @@ -0,0 +1,42 @@ +subtypes = $subtypes; + } + + public function getDisplayMap() { + return mpull($this->subtypes, 'getName'); + } + + public function getCount() { + return count($this->subtypes); + } + + public function isValidSubtype($subtype_key) { + return isset($this->subtypes[$subtype_key]); + } + + public function getSubtypes() { + return $this->subtypes; + } + + public function getSubtype($subtype_key) { + if (!$this->isValidSubtype($subtype_key)) { + throw new Exception( + pht( + 'Subtype key "%s" does not identify a valid subtype.', + $subtype_key)); + } + + return $this->subtypes[$subtype_key]; + } + +} diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php --- a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php +++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php @@ -2541,7 +2541,7 @@ continue; } - if (!isset($map[$new])) { + if (!$map->isValidSubtype($new)) { $errors[] = new PhabricatorApplicationTransactionValidationError( $transaction_type, pht('Invalid'), diff --git a/src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php b/src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php --- a/src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php +++ b/src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php @@ -64,7 +64,7 @@ foreach ($xactions as $xaction) { $new = $xaction->getNewValue(); - if (isset($map[$new])) { + if ($map->isValidSubtype($new)) { continue; } diff --git a/src/applications/transactions/engineextension/PhabricatorSubtypeEditEngineExtension.php b/src/applications/transactions/engineextension/PhabricatorSubtypeEditEngineExtension.php --- a/src/applications/transactions/engineextension/PhabricatorSubtypeEditEngineExtension.php +++ b/src/applications/transactions/engineextension/PhabricatorSubtypeEditEngineExtension.php @@ -31,7 +31,7 @@ $subtype_type = PhabricatorTransactions::TYPE_SUBTYPE; $map = $object->newEditEngineSubtypeMap(); - $options = mpull($map, 'getName'); + $options = $map->getDisplayMap(); $subtype_field = id(new PhabricatorSelectEditField()) ->setKey(self::EDITKEY) @@ -45,7 +45,7 @@ // If subtypes are configured, enable changing them from the bulk editor // and comment action stack. - if (count($map) > 1) { + if ($map->getCount() > 1) { $subtype_field ->setBulkEditLabel(pht('Change subtype to')) ->setCommentActionLabel(pht('Change Subtype'))