From 9d3f09ab478e44d30b6a58688c470239b44efb02 Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 17 Jan 2017 14:17:24 -0800 Subject: [PATCH] Modularize global quick create builtin items Summary: Ref T5867. Instead of hard-coding projects, tasks and repositories, let EditEngines say "I want a quick create item" so third-party code can also hook into the menu without upstream changes. Test Plan: Saw same default items in menu. Reviewers: chad Reviewed By: chad Maniphest Tasks: T5867 Differential Revision: https://secure.phabricator.com/D17215 --- src/__phutil_library_map__.php | 2 - .../editor/DiffusionRepositoryEditEngine.php | 4 + .../PhabricatorFavoritesConstants.php | 11 --- .../PhabricatorFavoritesProfileMenuEngine.php | 45 ++++----- .../maniphest/editor/ManiphestEditEngine.php | 4 + .../engine/PhabricatorProjectEditEngine.php | 4 + .../editengine/PhabricatorEditEngine.php | 93 +++++-------------- 7 files changed, 51 insertions(+), 112 deletions(-) delete mode 100644 src/applications/favorites/constants/PhabricatorFavoritesConstants.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index ee6508226a..1e1ae93e85 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2668,7 +2668,6 @@ phutil_register_library_map(array( 'PhabricatorFactSpec' => 'applications/fact/spec/PhabricatorFactSpec.php', 'PhabricatorFactUpdateIterator' => 'applications/fact/extract/PhabricatorFactUpdateIterator.php', 'PhabricatorFavoritesApplication' => 'applications/favorites/application/PhabricatorFavoritesApplication.php', - 'PhabricatorFavoritesConstants' => 'applications/favorites/constants/PhabricatorFavoritesConstants.php', 'PhabricatorFavoritesController' => 'applications/favorites/controller/PhabricatorFavoritesController.php', 'PhabricatorFavoritesMainController' => 'applications/favorites/controller/PhabricatorFavoritesMainController.php', 'PhabricatorFavoritesMenuItemController' => 'applications/favorites/controller/PhabricatorFavoritesMenuItemController.php', @@ -7683,7 +7682,6 @@ phutil_register_library_map(array( 'PhabricatorFactSpec' => 'Phobject', 'PhabricatorFactUpdateIterator' => 'PhutilBufferedIterator', 'PhabricatorFavoritesApplication' => 'PhabricatorApplication', - 'PhabricatorFavoritesConstants' => 'PhabricatorFavoritesController', 'PhabricatorFavoritesController' => 'PhabricatorController', 'PhabricatorFavoritesMainController' => 'PhabricatorFavoritesController', 'PhabricatorFavoritesMenuItemController' => 'PhabricatorFavoritesController', diff --git a/src/applications/diffusion/editor/DiffusionRepositoryEditEngine.php b/src/applications/diffusion/editor/DiffusionRepositoryEditEngine.php index 933cdbb597..4f45357956 100644 --- a/src/applications/diffusion/editor/DiffusionRepositoryEditEngine.php +++ b/src/applications/diffusion/editor/DiffusionRepositoryEditEngine.php @@ -20,6 +20,10 @@ final class DiffusionRepositoryEditEngine return false; } + public function isDefaultQuickCreateEngine() { + return true; + } + public function getEngineName() { return pht('Repositories'); } diff --git a/src/applications/favorites/constants/PhabricatorFavoritesConstants.php b/src/applications/favorites/constants/PhabricatorFavoritesConstants.php deleted file mode 100644 index 2beb4fd1cc..0000000000 --- a/src/applications/favorites/constants/PhabricatorFavoritesConstants.php +++ /dev/null @@ -1,11 +0,0 @@ -getViewer(); - $create_task = array( - 'name' => null, - 'formKey' => - id(new ManiphestEditEngine())->getProfileMenuItemDefault(), - ); + $engines = PhabricatorEditEngine::getAllEditEngines(); + $engines = msortv($engines, 'getQuickCreateOrderVector'); - $create_project = array( - 'name' => null, - 'formKey' => - id(new PhabricatorProjectEditEngine())->getProfileMenuItemDefault(), - ); + foreach ($engines as $engine) { + foreach ($engine->getDefaultQuickCreateFormKeys() as $form_key) { + $form_hash = PhabricatorHash::digestForIndex($form_key); + $builtin_key = "editengine.form({$form_hash})"; - $create_repository = array( - 'name' => null, - 'formKey' => - id(new DiffusionRepositoryEditEngine())->getProfileMenuItemDefault(), - ); + $properties = array( + 'name' => null, + 'formKey' => $form_key, + ); - $items[] = $this->newItem() - ->setBuiltinKey(PhabricatorFavoritesConstants::ITEM_TASK) - ->setMenuItemKey(PhabricatorEditEngineProfileMenuItem::MENUITEMKEY) - ->setMenuItemProperties($create_task); - - $items[] = $this->newItem() - ->setBuiltinKey(PhabricatorFavoritesConstants::ITEM_PROJECT) - ->setMenuItemKey(PhabricatorEditEngineProfileMenuItem::MENUITEMKEY) - ->setMenuItemProperties($create_project); - - $items[] = $this->newItem() - ->setBuiltinKey(PhabricatorFavoritesConstants::ITEM_REPOSITORY) - ->setMenuItemKey(PhabricatorEditEngineProfileMenuItem::MENUITEMKEY) - ->setMenuItemProperties($create_repository); + $items[] = $this->newItem() + ->setBuiltinKey($builtin_key) + ->setMenuItemKey(PhabricatorEditEngineProfileMenuItem::MENUITEMKEY) + ->setMenuItemProperties($properties); + } + } return $items; } diff --git a/src/applications/maniphest/editor/ManiphestEditEngine.php b/src/applications/maniphest/editor/ManiphestEditEngine.php index 8e5893a9b8..0433e8200a 100644 --- a/src/applications/maniphest/editor/ManiphestEditEngine.php +++ b/src/applications/maniphest/editor/ManiphestEditEngine.php @@ -21,6 +21,10 @@ final class ManiphestEditEngine return 'PhabricatorManiphestApplication'; } + public function isDefaultQuickCreateEngine() { + return true; + } + protected function newEditableObject() { return ManiphestTask::initializeNewTask($this->getViewer()); } diff --git a/src/applications/project/engine/PhabricatorProjectEditEngine.php b/src/applications/project/engine/PhabricatorProjectEditEngine.php index 760fad39d0..7a0c11be0e 100644 --- a/src/applications/project/engine/PhabricatorProjectEditEngine.php +++ b/src/applications/project/engine/PhabricatorProjectEditEngine.php @@ -26,6 +26,10 @@ final class PhabricatorProjectEditEngine return $this->milestoneProject; } + public function isDefaultQuickCreateEngine() { + return true; + } + public function getEngineName() { return pht('Projects'); } diff --git a/src/applications/transactions/editengine/PhabricatorEditEngine.php b/src/applications/transactions/editengine/PhabricatorEditEngine.php index 434fcc5091..65901e1294 100644 --- a/src/applications/transactions/editengine/PhabricatorEditEngine.php +++ b/src/applications/transactions/editengine/PhabricatorEditEngine.php @@ -77,6 +77,29 @@ abstract class PhabricatorEditEngine return true; } + public function isDefaultQuickCreateEngine() { + return false; + } + + public function getDefaultQuickCreateFormKeys() { + $keys = array(); + + if ($this->isDefaultQuickCreateEngine()) { + $keys[] = self::EDITENGINECONFIG_DEFAULT; + } + + foreach ($keys as $idx => $key) { + $keys[$idx] = $this->getEngineKey().'/'.$key; + } + + return $keys; + } + + public function getQuickCreateOrderVector() { + return id(new PhutilSortVector()) + ->addString($this->getObjectCreateShortText()); + } + /** * Force the engine to edit a particular object. */ @@ -107,10 +130,6 @@ abstract class PhabricatorEditEngine return $this->hideHeader; } - public function getProfileMenuItemDefault() { - return $this->getEngineKey().'/'.self::EDITENGINECONFIG_DEFAULT; - } - /* -( Managing Fields )---------------------------------------------------- */ @@ -283,14 +302,6 @@ abstract class PhabricatorEditEngine } - /** - * @task text - */ - protected function getQuickCreateMenuHeaderText() { - return $this->getObjectCreateShortText(); - } - - /** * Return a human-readable header describing what this engine is used to do, * like "Configure Maniphest Task Forms". @@ -2100,50 +2111,6 @@ abstract class PhabricatorEditEngine return $application->getIcon(); } - public function hasQuickCreateActions() { - if (!$this->isEngineConfigurable()) { - return false; - } - - return true; - } - - public function newQuickCreateActions(array $configs) { - $items = array(); - - if (!$configs) { - return array(); - } - - // If the viewer is logged in and can't create objects, don't show the - // menu item. If they're logged out, we assume they could create objects - // if they logged in, so we show the item as a hint about how to - // accomplish the action. - if ($this->getViewer()->isLoggedIn()) { - if (!$this->hasCreateCapability()) { - return array(); - } - } - - if (count($configs) == 1) { - $config = head($configs); - $items[] = $this->newQuickCreateAction($config); - } else { - $group_name = $this->getQuickCreateMenuHeaderText(); - - $items[] = id(new PHUIListItemView()) - ->setType(PHUIListItemView::TYPE_LABEL) - ->setName($group_name); - - foreach ($configs as $config) { - $items[] = $this->newQuickCreateAction($config) - ->setIndented(true); - } - } - - return $items; - } - private function loadUsableConfigurationsForCreate() { $viewer = $this->getViewer(); @@ -2159,20 +2126,6 @@ abstract class PhabricatorEditEngine return $configs; } - private function newQuickCreateAction( - PhabricatorEditEngineConfiguration $config) { - - $item_name = $config->getName(); - $item_icon = $config->getIcon(); - $form_key = $config->getIdentifier(); - $item_uri = $this->getEditURI(null, "form/{$form_key}/"); - - return id(new PHUIListItemView()) - ->setName($item_name) - ->setIcon($item_icon) - ->setHref($item_uri); - } - protected function getValidationExceptionShortMessage( PhabricatorApplicationTransactionValidationException $ex, PhabricatorEditField $field) {