diff --git a/src/applications/maniphest/constants/ManiphestTaskPriority.php b/src/applications/maniphest/constants/ManiphestTaskPriority.php index 8bc682f7e4..86c7adbcb7 100644 --- a/src/applications/maniphest/constants/ManiphestTaskPriority.php +++ b/src/applications/maniphest/constants/ManiphestTaskPriority.php @@ -43,6 +43,58 @@ final class ManiphestTaskPriority extends ManiphestConstants { return $map; } + /** + * Get the canonical keyword for a given priority constant. + * + * @return string|null Keyword, or `null` if no keyword is configured. + */ + public static function getKeywordForTaskPriority($priority) { + $map = self::getConfig(); + + $spec = idx($map, $priority); + if (!$spec) { + return null; + } + + $keywords = idx($spec, 'keywords'); + if (!$keywords) { + return null; + } + + return head($keywords); + } + + + /** + * Get a map of supported alternate names for each priority. + * + * Keys are aliases, like "wish" and "wishlist". Values are canonical + * priority keywords, like "wishlist". + * + * @return map Map of aliases to canonical priority keywords. + */ + public static function getTaskPriorityAliasMap() { + $keyword_map = self::getTaskPriorityKeywordsMap(); + + $result = array(); + foreach ($keyword_map as $key => $keywords) { + $target = self::getKeywordForTaskPriority($key); + if ($target === null) { + continue; + } + + // NOTE: Include the raw priority value, like "25", in the list of + // aliases. This supports legacy sources like saved EditEngine forms. + $result[$key] = $target; + + foreach ($keywords as $keyword) { + $result[$keyword] = $target; + } + } + + return $result; + } + /** * Get the priorities and their related short (one-word) descriptions. diff --git a/src/applications/maniphest/editor/ManiphestEditEngine.php b/src/applications/maniphest/editor/ManiphestEditEngine.php index acd27fc908..9f5e647ca9 100644 --- a/src/applications/maniphest/editor/ManiphestEditEngine.php +++ b/src/applications/maniphest/editor/ManiphestEditEngine.php @@ -77,6 +77,8 @@ final class ManiphestEditEngine $status_map = $this->getTaskStatusMap($object); $priority_map = $this->getTaskPriorityMap($object); + $alias_map = ManiphestTaskPriority::getTaskPriorityAliasMap(); + if ($object->isClosed()) { $default_status = ManiphestTaskStatus::getDefaultStatus(); } else { @@ -217,6 +219,7 @@ EODOCS ->setIsCopyable(true) ->setValue($object->getPriorityKeyword()) ->setOptions($priority_map) + ->setOptionAliases($alias_map) ->setCommentActionLabel(pht('Change Priority')), ); diff --git a/src/applications/maniphest/storage/ManiphestTask.php b/src/applications/maniphest/storage/ManiphestTask.php index 3b312fc9cc..d8a174bd0a 100644 --- a/src/applications/maniphest/storage/ManiphestTask.php +++ b/src/applications/maniphest/storage/ManiphestTask.php @@ -247,10 +247,13 @@ final class ManiphestTask extends ManiphestDAO public function getPriorityKeyword() { $priority = $this->getPriority(); - $map = ManiphestTaskPriority::getTaskPriorityKeywordsMap(); - $default = array(ManiphestTaskPriority::UNKNOWN_PRIORITY_KEYWORD); - $keywords = idx($map, $priority, $default); - return head($keywords); + + $keyword = ManiphestTaskPriority::getKeywordForTaskPriority($priority); + if ($keyword !== null) { + return $keyword; + } + + return ManiphestTaskPriority::UNKNOWN_PRIORITY_KEYWORD; } private function comparePriorityTo(ManiphestTask $other) { diff --git a/src/applications/transactions/editfield/PhabricatorSelectEditField.php b/src/applications/transactions/editfield/PhabricatorSelectEditField.php index d8e99d610c..b72cafc5d1 100644 --- a/src/applications/transactions/editfield/PhabricatorSelectEditField.php +++ b/src/applications/transactions/editfield/PhabricatorSelectEditField.php @@ -4,6 +4,7 @@ final class PhabricatorSelectEditField extends PhabricatorEditField { private $options; + private $optionAliases = array(); public function setOptions(array $options) { $this->options = $options; @@ -17,6 +18,29 @@ final class PhabricatorSelectEditField return $this->options; } + public function setOptionAliases(array $option_aliases) { + $this->optionAliases = $option_aliases; + return $this; + } + + public function getOptionAliases() { + return $this->optionAliases; + } + + protected function getValueForControl() { + $value = parent::getValueForControl(); + + $options = $this->getOptions(); + if (!isset($options[$value])) { + $aliases = $this->getOptionAliases(); + if (isset($aliases[$value])) { + $value = $aliases[$value]; + } + } + + return $value; + } + protected function newControl() { return id(new AphrontFormSelectControl()) ->setOptions($this->getOptions());