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 @@ -2582,6 +2582,7 @@ '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 @@ '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 --- /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 --- a/src/applications/transactions/editengine/PhabricatorEditEngine.php +++ b/src/applications/transactions/editengine/PhabricatorEditEngine.php @@ -49,7 +49,14 @@ } 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 --- a/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php +++ b/src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php @@ -109,6 +109,14 @@ 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 --- a/src/applications/transactions/typeahead/PhabricatorEditEngineDatasource.php +++ b/src/applications/transactions/typeahead/PhabricatorEditEngineDatasource.php @@ -15,25 +15,47 @@ 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; } }