From e9243f22b92c2bacfed3b46e5618e9061c6cd62d Mon Sep 17 00:00:00 2001 From: Chad Little Date: Tue, 3 Jan 2017 14:41:09 -0800 Subject: [PATCH] Add Form MenuItem, Fix EditEngine Typeahead Summary: Adds a FormEditEngine MenuItem for adding forms to Projects, Home, QuickCreate. Also adds an EditEngine typeahead that has token rendering issues currently. Test Plan: Set a normal form as a menu item, edit it, set the name. Set a custom form as a menu item, edit it, set a name. Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Differential Revision: https://secure.phabricator.com/D17098 --- src/__phutil_library_map__.php | 2 + .../PhabricatorEditEngineProfileMenuItem.php | 122 ++++++++++++++++++ .../editengine/PhabricatorEditEngine.php | 9 +- .../PhabricatorEditEngineConfiguration.php | 8 ++ .../PhabricatorEditEngineDatasource.php | 30 ++++- 5 files changed, 166 insertions(+), 5 deletions(-) create mode 100644 src/applications/search/menuitem/PhabricatorEditEngineProfileMenuItem.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 44b31ecb5b..43ab0407e6 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2582,6 +2582,7 @@ phutil_register_library_map(array( 'PhabricatorEditEngineExtensionModule' => 'applications/transactions/engineextension/PhabricatorEditEngineExtensionModule.php', 'PhabricatorEditEngineListController' => 'applications/transactions/controller/PhabricatorEditEngineListController.php', 'PhabricatorEditEnginePointsCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEnginePointsCommentAction.php', + 'PhabricatorEditEngineProfileMenuItem' => 'applications/search/menuitem/PhabricatorEditEngineProfileMenuItem.php', 'PhabricatorEditEngineQuery' => 'applications/transactions/query/PhabricatorEditEngineQuery.php', 'PhabricatorEditEngineSearchEngine' => 'applications/transactions/query/PhabricatorEditEngineSearchEngine.php', 'PhabricatorEditEngineSelectCommentAction' => 'applications/transactions/commentaction/PhabricatorEditEngineSelectCommentAction.php', @@ -7571,6 +7572,7 @@ phutil_register_library_map(array( 'PhabricatorEditEngineExtensionModule' => 'PhabricatorConfigModule', 'PhabricatorEditEngineListController' => 'PhabricatorEditEngineController', 'PhabricatorEditEnginePointsCommentAction' => 'PhabricatorEditEngineCommentAction', + 'PhabricatorEditEngineProfileMenuItem' => 'PhabricatorProfileMenuItem', 'PhabricatorEditEngineQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'PhabricatorEditEngineSearchEngine' => 'PhabricatorApplicationSearchEngine', 'PhabricatorEditEngineSelectCommentAction' => 'PhabricatorEditEngineCommentAction', diff --git a/src/applications/search/menuitem/PhabricatorEditEngineProfileMenuItem.php b/src/applications/search/menuitem/PhabricatorEditEngineProfileMenuItem.php new file mode 100644 index 0000000000..6622bb7506 --- /dev/null +++ b/src/applications/search/menuitem/PhabricatorEditEngineProfileMenuItem.php @@ -0,0 +1,122 @@ +form = $form; + return $this; + } + + public function getForm() { + $form = $this->form; + if (!$form) { + return null; + } + return $form; + } + + public function willBuildNavigationItems(array $items) { + $viewer = $this->getViewer(); + $engines = PhabricatorEditEngine::getAllEditEngines(); + $engine_keys = array_keys($engines); + $forms = id(new PhabricatorEditEngineConfigurationQuery()) + ->setViewer($viewer) + ->withEngineKeys($engine_keys) + ->withIsDisabled(false) + ->execute(); + $form_engines = mgroup($forms, 'getEngineKey'); + $form_ids = $forms; + + $builtin_map = array(); + foreach ($form_engines as $engine_key => $form_engine) { + $builtin_map[$engine_key] = mpull($form_engine, null, 'getBuiltinKey'); + } + + foreach ($items as $item) { + $key = $item->getMenuItemProperty('formKey'); + list($engine_key, $form_key) = explode('/', $key); + if (is_numeric($form_key)) { + $form = idx($form_ids, $form_key, null); + $item->getMenuItem()->attachForm($form); + } else if (isset($builtin_map[$engine_key][$form_key])) { + $form = $builtin_map[$engine_key][$form_key]; + $item->getMenuItem()->attachForm($form); + } + } + } + + public function getDisplayName( + PhabricatorProfileMenuItemConfiguration $config) { + $form = $this->getForm(); + if (!$form) { + return pht('(Restricted/Invalid Form)'); + } + if (strlen($this->getName($config))) { + return $this->getName($config); + } else { + return $form->getName(); + } + } + + public function buildEditEngineFields( + PhabricatorProfileMenuItemConfiguration $config) { + return array( + id(new PhabricatorTextEditField()) + ->setKey('name') + ->setLabel(pht('Name')) + ->setValue($this->getName($config)), + id(new PhabricatorDatasourceEditField()) + ->setKey('formKey') + ->setLabel(pht('Form')) + ->setDatasource(new PhabricatorEditEngineDatasource()) + ->setSingleValue($config->getMenuItemProperty('formKey')), + ); + } + + private function getName( + PhabricatorProfileMenuItemConfiguration $config) { + return $config->getMenuItemProperty('name'); + } + + protected function newNavigationMenuItems( + PhabricatorProfileMenuItemConfiguration $config) { + + $form = $this->getForm(); + if (!$form) { + return array(); + } + $engine = $form->getEngine(); + $form_key = $form->getIdentifier(); + + $icon = $form->getIcon(); + $name = $this->getDisplayName($config); + $href = $engine->getEditURI(null, "form/{$form_key}/"); + + $item = $this->newItem() + ->setHref($href) + ->setName($name) + ->setIcon($icon); + + return array( + $item, + ); + } + +} diff --git a/src/applications/transactions/editengine/PhabricatorEditEngine.php b/src/applications/transactions/editengine/PhabricatorEditEngine.php index 7626f67b0a..29c78a4e9f 100644 --- a/src/applications/transactions/editengine/PhabricatorEditEngine.php +++ b/src/applications/transactions/editengine/PhabricatorEditEngine.php @@ -49,7 +49,14 @@ abstract class PhabricatorEditEngine } final public function getEngineKey() { - return $this->getPhobjectClassConstant('ENGINECONST', 64); + $key = $this->getPhobjectClassConstant('ENGINECONST', 64); + if (strpos($key, '/') !== false) { + throw new Exception( + pht( + 'EditEngine ("%s") contains an invalid key character "/".', + get_class($this))); + } + return $key; } final public function getApplication() { diff --git a/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php b/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php index 65359bb0dd..457e9afca8 100644 --- a/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php +++ b/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php @@ -109,6 +109,14 @@ final class PhabricatorEditEngineConfiguration return $this; } + public function setBuiltinKey($key) { + if (strpos($key, '/') !== false) { + throw new Exception( + pht('EditEngine BuiltinKey contains an invalid key character "/".')); + } + return parent::setBuiltinKey($key); + } + public function attachEngine(PhabricatorEditEngine $engine) { $this->engine = $engine; return $this; diff --git a/src/applications/transactions/typeahead/PhabricatorEditEngineDatasource.php b/src/applications/transactions/typeahead/PhabricatorEditEngineDatasource.php index 725716bdaf..ba1e693de8 100644 --- a/src/applications/transactions/typeahead/PhabricatorEditEngineDatasource.php +++ b/src/applications/transactions/typeahead/PhabricatorEditEngineDatasource.php @@ -15,25 +15,47 @@ final class PhabricatorEditEngineDatasource return 'PhabricatorTransactionsApplication'; } + protected function renderSpecialTokens(array $values) { + return $this->renderTokensFromResults($this->buildResults(), $values); + } + public function loadResults() { + $results = $this->buildResults(); + return $this->filterResultsAgainstTokens($results); + } + + private function buildResults() { $query = id(new PhabricatorEditEngineConfigurationQuery()); $forms = $this->executeQuery($query); $results = array(); foreach ($forms as $form) { - + if ($form->getID()) { + $key = $form->getEngineKey().'/'.$form->getID(); + } else { + $key = $form->getEngineKey().'/'.$form->getBuiltinKey(); + } $result = id(new PhabricatorTypeaheadResult()) ->setName($form->getName()) - ->setPHID($form->getPHID()); + ->setPHID($key) + ->setIcon($form->getIcon()); if ($form->getIsDisabled()) { $result->setClosed(pht('Archived')); } - $results[] = $result; + if ($form->getIsDefault()) { + $result->addAttribute(pht('Create Form')); + } + + if ($form->getIsEdit()) { + $result->addAttribute(pht('Edit Form')); + } + + $results[$key] = $result; } - return $this->filterResultsAgainstTokens($results); + return $results; } }