@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Allow EditEngine configurations to be disabled and marked as "Default"

Summary:
Ref T9132.

Let configurations be enabled/disabled. This doesn't do much right now.

Let configurations be marked as default entries in the application "Create" menu. This makes them show up in the application in a dropdown, so you can replace the default form and/or provide several forms.

In Maniphest, we'll do this to provide a menu something like this:

- New Bug Report
- New Feature Request
- ADVANCED TASK CREATION!!11~ (only available for Community members)

Test Plan: {F1005679}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T9132

Differential Revision: https://secure.phabricator.com/D14584

+377 -24
+4
src/__phutil_library_map__.php
··· 2114 2114 'PhabricatorEditEngine' => 'applications/transactions/editengine/PhabricatorEditEngine.php', 2115 2115 'PhabricatorEditEngineAPIMethod' => 'applications/transactions/editengine/PhabricatorEditEngineAPIMethod.php', 2116 2116 'PhabricatorEditEngineConfiguration' => 'applications/transactions/storage/PhabricatorEditEngineConfiguration.php', 2117 + 'PhabricatorEditEngineConfigurationDefaultCreateController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultCreateController.php', 2117 2118 'PhabricatorEditEngineConfigurationDefaultsController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultsController.php', 2119 + 'PhabricatorEditEngineConfigurationDisableController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationDisableController.php', 2118 2120 'PhabricatorEditEngineConfigurationEditController' => 'applications/transactions/controller/PhabricatorEditEngineConfigurationEditController.php', 2119 2121 'PhabricatorEditEngineConfigurationEditEngine' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditEngine.php', 2120 2122 'PhabricatorEditEngineConfigurationEditor' => 'applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php', ··· 6210 6212 'PhabricatorApplicationTransactionInterface', 6211 6213 'PhabricatorPolicyInterface', 6212 6214 ), 6215 + 'PhabricatorEditEngineConfigurationDefaultCreateController' => 'PhabricatorEditEngineController', 6213 6216 'PhabricatorEditEngineConfigurationDefaultsController' => 'PhabricatorEditEngineController', 6217 + 'PhabricatorEditEngineConfigurationDisableController' => 'PhabricatorEditEngineController', 6214 6218 'PhabricatorEditEngineConfigurationEditController' => 'PhabricatorEditEngineController', 6215 6219 'PhabricatorEditEngineConfigurationEditEngine' => 'PhabricatorEditEngine', 6216 6220 'PhabricatorEditEngineConfigurationEditor' => 'PhabricatorApplicationTransactionEditor',
+1 -1
src/applications/base/PhabricatorApplication.php
··· 640 640 '(?P<id>[0-9]\d*)/)?'. 641 641 '(?:'. 642 642 '(?:'. 643 - '(?P<editAction>parameters)'. 643 + '(?P<editAction>parameters|nodefault)'. 644 644 '|'. 645 645 '(?:form/(?P<formKey>[^/]+))'. 646 646 ')'.
+3 -5
src/applications/paste/controller/PhabricatorPasteListController.php
··· 15 15 protected function buildApplicationCrumbs() { 16 16 $crumbs = parent::buildApplicationCrumbs(); 17 17 18 - $crumbs->addAction( 19 - id(new PHUIListItemView()) 20 - ->setName(pht('Create Paste')) 21 - ->setHref($this->getApplicationURI('edit/')) 22 - ->setIcon('fa-plus-square')); 18 + id(new PhabricatorPasteEditEngine()) 19 + ->setViewer($this->getViewer()) 20 + ->addActionToCrumbs($crumbs); 23 21 24 22 return $crumbs; 25 23 }
+4
src/applications/transactions/application/PhabricatorTransactionsApplication.php
··· 51 51 'PhabricatorEditEngineConfigurationDefaultsController', 52 52 'lock/(?P<key>[^/]+)/' => 53 53 'PhabricatorEditEngineConfigurationLockController', 54 + 'defaultcreate/(?P<key>[^/]+)/' => 55 + 'PhabricatorEditEngineConfigurationDefaultCreateController', 56 + 'disable/(?P<key>[^/]+)/' => 57 + 'PhabricatorEditEngineConfigurationDisableController', 54 58 ), 55 59 ), 56 60 ),
+61
src/applications/transactions/controller/PhabricatorEditEngineConfigurationDefaultCreateController.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineConfigurationDefaultCreateController 4 + extends PhabricatorEditEngineController { 5 + 6 + public function handleRequest(AphrontRequest $request) { 7 + $viewer = $this->getViewer(); 8 + 9 + $config = $this->loadConfigForEdit(); 10 + if (!$config) { 11 + return id(new Aphront404Response()); 12 + } 13 + 14 + $engine_key = $config->getEngineKey(); 15 + $key = $config->getIdentifier(); 16 + $cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/"; 17 + 18 + $type = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE; 19 + 20 + if ($request->isFormPost()) { 21 + $xactions = array(); 22 + 23 + $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction()) 24 + ->setTransactionType($type) 25 + ->setNewValue(!$config->getIsDefault()); 26 + 27 + $editor = id(new PhabricatorEditEngineConfigurationEditor()) 28 + ->setActor($viewer) 29 + ->setContentSourceFromRequest($request) 30 + ->setContinueOnMissingFields(true) 31 + ->setContinueOnNoEffect(true); 32 + 33 + $editor->applyTransactions($config, $xactions); 34 + 35 + return id(new AphrontRedirectResponse()) 36 + ->setURI($cancel_uri); 37 + } 38 + 39 + if ($config->getIsDefault()) { 40 + $title = pht('Remove From "Create" Menu'); 41 + $body = pht( 42 + 'Remove this form from the application "Create" menu? It will still '. 43 + 'function properly, but no longer be reachable directly from the '. 44 + 'application.'); 45 + $button = pht('Remove From Menu'); 46 + } else { 47 + $title = pht('Add To "Create" Menu'); 48 + $body = pht( 49 + 'Add this form to the application "Create" menu? Users will '. 50 + 'be able to choose it when creating new objects.'); 51 + $button = pht('Add To Menu'); 52 + } 53 + 54 + return $this->newDialog() 55 + ->setTitle($title) 56 + ->appendParagraph($body) 57 + ->addSubmitButton($button) 58 + ->addCancelbutton($cancel_uri); 59 + } 60 + 61 + }
+59
src/applications/transactions/controller/PhabricatorEditEngineConfigurationDisableController.php
··· 1 + <?php 2 + 3 + final class PhabricatorEditEngineConfigurationDisableController 4 + extends PhabricatorEditEngineController { 5 + 6 + public function handleRequest(AphrontRequest $request) { 7 + $viewer = $this->getViewer(); 8 + 9 + $config = $this->loadConfigForEdit(); 10 + if (!$config) { 11 + return id(new Aphront404Response()); 12 + } 13 + 14 + $engine_key = $config->getEngineKey(); 15 + $key = $config->getIdentifier(); 16 + $cancel_uri = "/transactions/editengine/{$engine_key}/view/{$key}/"; 17 + 18 + $type = PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE; 19 + 20 + if ($request->isFormPost()) { 21 + $xactions = array(); 22 + 23 + $xactions[] = id(new PhabricatorEditEngineConfigurationTransaction()) 24 + ->setTransactionType($type) 25 + ->setNewValue(!$config->getIsDisabled()); 26 + 27 + $editor = id(new PhabricatorEditEngineConfigurationEditor()) 28 + ->setActor($viewer) 29 + ->setContentSourceFromRequest($request) 30 + ->setContinueOnMissingFields(true) 31 + ->setContinueOnNoEffect(true); 32 + 33 + $editor->applyTransactions($config, $xactions); 34 + 35 + return id(new AphrontRedirectResponse()) 36 + ->setURI($cancel_uri); 37 + } 38 + 39 + if ($config->getIsDisabled()) { 40 + $title = pht('Enable Form'); 41 + $body = pht( 42 + 'Enable this form? Users who can see it will be able to use it to '. 43 + 'create objects.'); 44 + $button = pht('Enable Form'); 45 + } else { 46 + $title = pht('Disable Form'); 47 + $body = pht( 48 + 'Disable this form? Users will no longer be able to use it.'); 49 + $button = pht('Disable Form'); 50 + } 51 + 52 + return $this->newDialog() 53 + ->setTitle($title) 54 + ->appendParagraph($body) 55 + ->addSubmitButton($button) 56 + ->addCancelbutton($cancel_uri); 57 + } 58 + 59 + }
+7 -7
src/applications/transactions/controller/PhabricatorEditEngineConfigurationListController.php
··· 17 17 } 18 18 19 19 protected function buildApplicationCrumbs() { 20 + $viewer = $this->getViewer(); 20 21 $crumbs = parent::buildApplicationCrumbs(); 21 22 22 - $engine_key = $this->getEngineKey(); 23 - $edit_uri = "/transactions/editengine/{$engine_key}/edit/"; 23 + $target_key = $this->getEngineKey(); 24 + $target_engine = PhabricatorEditEngine::getByKey($viewer, $target_key); 24 25 25 - $crumbs->addAction( 26 - id(new PHUIListItemView()) 27 - ->setName(pht('New Form')) 28 - ->setHref($edit_uri) 29 - ->setIcon('fa-plus-square')); 26 + id(new PhabricatorEditEngineConfigurationEditEngine()) 27 + ->setTargetEngine($target_engine) 28 + ->setViewer($viewer) 29 + ->addActionToCrumbs($crumbs); 30 30 31 31 return $crumbs; 32 32 }
+37 -9
src/applications/transactions/controller/PhabricatorEditEngineConfigurationViewController.php
··· 8 8 } 9 9 10 10 public function handleRequest(AphrontRequest $request) { 11 - $engine_key = $request->getURIData('engineKey'); 12 - $this->setEngineKey($engine_key); 13 - 14 - $key = $request->getURIData('key'); 15 11 $viewer = $this->getViewer(); 16 12 17 - $config = id(new PhabricatorEditEngineConfigurationQuery()) 18 - ->setViewer($viewer) 19 - ->withEngineKeys(array($engine_key)) 20 - ->withIdentifiers(array($key)) 21 - ->executeOne(); 13 + $config = $this->loadConfigForEdit(); 22 14 if (!$config) { 23 15 return id(new Aphront404Response()); 24 16 } ··· 146 138 ->setName(pht('Lock / Hide Fields')) 147 139 ->setIcon('fa-lock') 148 140 ->setHref($lock_uri) 141 + ->setWorkflow(true) 142 + ->setDisabled(!$can_edit)); 143 + 144 + $disable_uri = "{$base_uri}/disable/{$form_key}/"; 145 + 146 + if ($config->getIsDisabled()) { 147 + $disable_name = pht('Enable Form'); 148 + $disable_icon = 'fa-check'; 149 + } else { 150 + $disable_name = pht('Disable Form'); 151 + $disable_icon = 'fa-ban'; 152 + } 153 + 154 + $view->addAction( 155 + id(new PhabricatorActionView()) 156 + ->setName($disable_name) 157 + ->setIcon($disable_icon) 158 + ->setHref($disable_uri) 159 + ->setWorkflow(true) 160 + ->setDisabled(!$can_edit)); 161 + 162 + $defaultcreate_uri = "{$base_uri}/defaultcreate/{$form_key}/"; 163 + 164 + if ($config->getIsDefault()) { 165 + $defaultcreate_name = pht('Remove from "Create" Menu'); 166 + $defaultcreate_icon = 'fa-minus'; 167 + } else { 168 + $defaultcreate_name = pht('Add to "Create" Menu'); 169 + $defaultcreate_icon = 'fa-plus'; 170 + } 171 + 172 + $view->addAction( 173 + id(new PhabricatorActionView()) 174 + ->setName($defaultcreate_name) 175 + ->setIcon($defaultcreate_icon) 176 + ->setHref($defaultcreate_uri) 149 177 ->setWorkflow(true) 150 178 ->setDisabled(!$can_edit)); 151 179
+35
src/applications/transactions/controller/PhabricatorEditEngineController.php
··· 34 34 return $crumbs; 35 35 } 36 36 37 + protected function loadConfigForEdit() { 38 + $request = $this->getRequest(); 39 + $viewer = $this->getViewer(); 40 + 41 + $engine_key = $request->getURIData('engineKey'); 42 + $this->setEngineKey($engine_key); 43 + 44 + $key = $request->getURIData('key'); 45 + 46 + $config = id(new PhabricatorEditEngineConfigurationQuery()) 47 + ->setViewer($viewer) 48 + ->withEngineKeys(array($engine_key)) 49 + ->withIdentifiers(array($key)) 50 + ->requireCapabilities( 51 + array( 52 + PhabricatorPolicyCapability::CAN_VIEW, 53 + PhabricatorPolicyCapability::CAN_EDIT, 54 + )) 55 + ->executeOne(); 56 + 57 + if ($config) { 58 + $engine = $config->getEngine(); 59 + 60 + // TODO: When we're editing the meta-engine, we need to set the engine 61 + // itself as its own target. This is hacky and it would be nice to find 62 + // a cleaner approach later. 63 + if ($engine instanceof PhabricatorEditEngineConfigurationEditEngine) { 64 + $engine->setTargetEngine($engine); 65 + } 66 + } 67 + 68 + return $config; 69 + } 70 + 71 + 37 72 }
+86 -1
src/applications/transactions/editengine/PhabricatorEditEngine.php
··· 352 352 if (!$has_default) { 353 353 $first = head($configurations); 354 354 if (!$first->getBuiltinKey()) { 355 - $first->setBuiltinKey(self::EDITENGINECONFIG_DEFAULT); 355 + $first 356 + ->setBuiltinKey(self::EDITENGINECONFIG_DEFAULT) 357 + ->setIsDefault(true); 356 358 357 359 if (!strlen($first->getName())) { 358 360 $first->setName($this->getObjectCreateShortText()); ··· 629 631 switch ($action) { 630 632 case 'parameters': 631 633 return $this->buildParametersResponse($object); 634 + case 'nodefault': 635 + return $this->buildNoDefaultResponse($object); 632 636 default: 633 637 return $this->buildEditResponse($object); 634 638 } ··· 820 824 return $actions; 821 825 } 822 826 827 + final public function addActionToCrumbs(PHUICrumbsView $crumbs) { 828 + $viewer = $this->getViewer(); 829 + 830 + $configs = id(new PhabricatorEditEngineConfigurationQuery()) 831 + ->setViewer($viewer) 832 + ->withEngineKeys(array($this->getEngineKey())) 833 + ->withIsDefault(true) 834 + ->withIsDisabled(false) 835 + ->execute(); 836 + 837 + $dropdown = null; 838 + $disabled = false; 839 + $workflow = false; 840 + 841 + $menu_icon = 'fa-plus-square'; 842 + 843 + if (!$configs) { 844 + if ($viewer->isLoggedIn()) { 845 + $disabled = true; 846 + } else { 847 + // If the viewer isn't logged in, assume they'll get hit with a login 848 + // dialog and are likely able to create objects after they log in. 849 + $disabled = false; 850 + } 851 + $workflow = true; 852 + $create_uri = $this->getEditURI(null, 'nodefault/'); 853 + } else { 854 + $config = head($configs); 855 + $form_key = $config->getIdentifier(); 856 + $create_uri = $this->getEditURI(null, "form/{$form_key}/"); 857 + 858 + if (count($configs) > 1) { 859 + $configs = msort($configs, 'getDisplayName'); 860 + 861 + $menu_icon = 'fa-caret-square-o-down'; 862 + 863 + $dropdown = id(new PhabricatorActionListView()) 864 + ->setUser($viewer); 865 + 866 + foreach ($configs as $config) { 867 + $form_key = $config->getIdentifier(); 868 + $config_uri = $this->getEditURI(null, "form/{$form_key}/"); 869 + 870 + $item_icon = 'fa-plus'; 871 + 872 + $dropdown->addAction( 873 + id(new PhabricatorActionView()) 874 + ->setName($config->getDisplayName()) 875 + ->setIcon($item_icon) 876 + ->setHref($config_uri)); 877 + } 878 + } 879 + } 880 + 881 + $action = id(new PHUIListItemView()) 882 + ->setName($this->getObjectCreateShortText()) 883 + ->setHref($create_uri) 884 + ->setIcon($menu_icon) 885 + ->setWorkflow($workflow) 886 + ->setDisabled($disabled); 887 + 888 + if ($dropdown) { 889 + $action->setDropdownMenu($dropdown); 890 + } 891 + 892 + $crumbs->addAction($action); 893 + } 894 + 823 895 824 896 /* -( Responding to HTTP Parameter Requests )------------------------------ */ 825 897 ··· 863 935 ->appendChild($document); 864 936 } 865 937 938 + 939 + private function buildNoDefaultResponse($object) { 940 + $cancel_uri = $this->getObjectCreateCancelURI($object); 941 + 942 + return $this->getController() 943 + ->newDialog() 944 + ->setTitle(pht('No Default Create Forms')) 945 + ->appendParagraph( 946 + pht( 947 + 'This application is not configured with any visible, enabled '. 948 + 'forms for creating objects.')) 949 + ->addCancelButton($cancel_uri); 950 + } 866 951 867 952 /* -( Conduit )------------------------------------------------------------ */ 868 953
+3
src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditEngine.php
··· 13 13 } 14 14 15 15 public function getTargetEngine() { 16 + if (!$this->targetEngine) { 17 + throw new PhutilInvalidStateException('setTargetEngine'); 18 + } 16 19 return $this->targetEngine; 17 20 } 18 21
+19
src/applications/transactions/editor/PhabricatorEditEngineConfigurationEditor.php
··· 22 22 $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER; 23 23 $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT; 24 24 $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS; 25 + $types[] = 26 + PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE; 27 + $types[] = PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE; 28 + 25 29 26 30 return $types; 27 31 } ··· 70 74 return $object->getFieldDefault($field_key); 71 75 case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS: 72 76 return $object->getFieldLocks(); 77 + case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE: 78 + return (int)$object->getIsDefault(); 79 + case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE: 80 + return (int)$object->getIsDisabled(); 73 81 } 74 82 } 75 83 ··· 84 92 case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT: 85 93 case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS: 86 94 return $xaction->getNewValue(); 95 + case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE: 96 + case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE: 97 + return (int)$xaction->getNewValue(); 87 98 } 88 99 } 89 100 ··· 108 119 case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS: 109 120 $object->setFieldLocks($xaction->getNewValue()); 110 121 return; 122 + case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE: 123 + $object->setIsDefault($xaction->getNewValue()); 124 + return; 125 + case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE: 126 + $object->setIsDisabled($xaction->getNewValue()); 127 + return; 111 128 } 112 129 113 130 return parent::applyCustomInternalTransaction($object, $xaction); ··· 123 140 case PhabricatorEditEngineConfigurationTransaction::TYPE_ORDER; 124 141 case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULT: 125 142 case PhabricatorEditEngineConfigurationTransaction::TYPE_LOCKS: 143 + case PhabricatorEditEngineConfigurationTransaction::TYPE_DEFAULTCREATE: 144 + case PhabricatorEditEngineConfigurationTransaction::TYPE_DISABLE: 126 145 return; 127 146 } 128 147
+28
src/applications/transactions/query/PhabricatorEditEngineConfigurationQuery.php
··· 8 8 private $engineKeys; 9 9 private $builtinKeys; 10 10 private $identifiers; 11 + private $default; 12 + private $disabled; 11 13 12 14 public function withIDs(array $ids) { 13 15 $this->ids = $ids; ··· 31 33 32 34 public function withIdentifiers(array $identifiers) { 33 35 $this->identifiers = $identifiers; 36 + return $this; 37 + } 38 + 39 + public function withIsDefault($default) { 40 + $this->default = $default; 41 + return $this; 42 + } 43 + 44 + public function withIsDisabled($disabled) { 45 + $this->disabled = $disabled; 34 46 return $this; 35 47 } 36 48 ··· 113 125 $builtin_keys = array_fuse($this->builtinKeys); 114 126 foreach ($page as $key => $config) { 115 127 if (empty($builtin_keys[$config->getBuiltinKey()])) { 128 + unset($page[$key]); 129 + } 130 + } 131 + } 132 + 133 + if ($this->default !== null) { 134 + foreach ($page as $key => $config) { 135 + if ($config->getIsDefault() != $this->default) { 136 + unset($page[$key]); 137 + } 138 + } 139 + } 140 + 141 + if ($this->disabled !== null) { 142 + foreach ($page as $key => $config) { 143 + if ($config->getIsDisabled() != $this->disabled) { 116 144 unset($page[$key]); 117 145 } 118 146 }
+7
src/applications/transactions/query/PhabricatorEditEngineConfigurationSearchEngine.php
··· 92 92 } 93 93 $item->setHref("/transactions/editengine/{$engine_key}/view/{$key}/"); 94 94 95 + if ($config->getIsDefault()) { 96 + $item->addIcon('fa-plus', pht('Default')); 97 + } 98 + 99 + if ($config->getIsDisabled()) { 100 + $item->addIcon('fa-ban', pht('Disabled')); 101 + } 95 102 96 103 $list->addItem($item); 97 104 }
+1 -1
src/applications/transactions/storage/PhabricatorEditEngineConfiguration.php
··· 29 29 PhabricatorUser $actor, 30 30 PhabricatorEditEngine $engine) { 31 31 32 - // TODO: This should probably be controlled by a new defualt capability. 32 + // TODO: This should probably be controlled by a new default capability. 33 33 $edit_policy = PhabricatorPolicies::POLICY_ADMIN; 34 34 35 35 return id(new PhabricatorEditEngineConfiguration())
+22
src/applications/transactions/storage/PhabricatorEditEngineConfigurationTransaction.php
··· 8 8 const TYPE_ORDER = 'editengine.config.order'; 9 9 const TYPE_DEFAULT = 'editengine.config.default'; 10 10 const TYPE_LOCKS = 'editengine.config.locks'; 11 + const TYPE_DEFAULTCREATE = 'editengine.config.default.create'; 12 + const TYPE_DISABLE = 'editengine.config.disable'; 11 13 12 14 public function getApplicationName() { 13 15 return 'search'; ··· 60 62 return pht( 61 63 '%s changed locked and hidden fields.', 62 64 $this->renderHandleLink($author_phid)); 65 + case self::TYPE_DEFAULTCREATE: 66 + if ($new) { 67 + return pht( 68 + '%s added this form to the "Create" menu.', 69 + $this->renderHandleLink($author_phid)); 70 + } else { 71 + return pht( 72 + '%s removed this form from the "Create" menu.', 73 + $this->renderHandleLink($author_phid)); 74 + } 75 + case self::TYPE_DISABLE: 76 + if ($new) { 77 + return pht( 78 + '%s disabled this form.', 79 + $this->renderHandleLink($author_phid)); 80 + } else { 81 + return pht( 82 + '%s enabled this form.', 83 + $this->renderHandleLink($author_phid)); 84 + } 63 85 } 64 86 65 87 return parent::getTitle();