Page MenuHomePhabricator

D17098.diff
No OneTemporary

D17098.diff

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 @@
+<?php
+
+final class PhabricatorEditEngineProfileMenuItem
+ extends PhabricatorProfileMenuItem {
+
+ const MENUITEMKEY = 'editengine';
+
+ private $form;
+
+ public function getMenuItemTypeIcon() {
+ return 'fa-plus';
+ }
+
+ public function getMenuItemTypeName() {
+ return pht('Forms');
+ }
+
+ public function canAddToObject($object) {
+ return true;
+ }
+
+ public function attachForm($form) {
+ $this->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;
}
}

File Metadata

Mime Type
text/plain
Expires
Mon, Jun 16, 4:52 AM (13 h, 30 m)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
8129749
Default Alt Text
D17098.diff (8 KB)

Event Timeline