@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.

Use EditEngine for Almanac Services, Devices, and Networks

Summary:
Ref T10411. This cleans up / modernizes things and lets me get an `almanac.network.edit` API in the future.

This is mostly straightforward, except that Services have an extra "choose type" screen in front of them.

Test Plan:
- Created and edited Almanac networks, services, and devices.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10411

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

+103 -149
+3 -1
src/__phutil_library_map__.php
··· 79 79 'AlmanacNetwork' => 'applications/almanac/storage/AlmanacNetwork.php', 80 80 'AlmanacNetworkController' => 'applications/almanac/controller/AlmanacNetworkController.php', 81 81 'AlmanacNetworkEditController' => 'applications/almanac/controller/AlmanacNetworkEditController.php', 82 + 'AlmanacNetworkEditEngine' => 'applications/almanac/editor/AlmanacNetworkEditEngine.php', 82 83 'AlmanacNetworkEditor' => 'applications/almanac/editor/AlmanacNetworkEditor.php', 83 84 'AlmanacNetworkListController' => 'applications/almanac/controller/AlmanacNetworkListController.php', 84 85 'AlmanacNetworkNameNgrams' => 'applications/almanac/storage/AlmanacNetworkNameNgrams.php', ··· 4072 4073 'PhabricatorNgramsInterface', 4073 4074 ), 4074 4075 'AlmanacNamespaceController' => 'AlmanacController', 4075 - 'AlmanacNamespaceEditController' => 'AlmanacController', 4076 + 'AlmanacNamespaceEditController' => 'AlmanacNamespaceController', 4076 4077 'AlmanacNamespaceEditEngine' => 'PhabricatorEditEngine', 4077 4078 'AlmanacNamespaceEditor' => 'PhabricatorApplicationTransactionEditor', 4078 4079 'AlmanacNamespaceListController' => 'AlmanacNamespaceController', ··· 4092 4093 ), 4093 4094 'AlmanacNetworkController' => 'AlmanacController', 4094 4095 'AlmanacNetworkEditController' => 'AlmanacNetworkController', 4096 + 'AlmanacNetworkEditEngine' => 'PhabricatorEditEngine', 4095 4097 'AlmanacNetworkEditor' => 'PhabricatorApplicationTransactionEditor', 4096 4098 'AlmanacNetworkListController' => 'AlmanacNetworkController', 4097 4099 'AlmanacNetworkNameNgrams' => 'PhabricatorSearchNgrams',
+1 -1
src/applications/almanac/controller/AlmanacNamespaceEditController.php
··· 1 1 <?php 2 2 3 - final class AlmanacNamespaceEditController extends AlmanacController { 3 + final class AlmanacNamespaceEditController extends AlmanacNamespaceController { 4 4 5 5 public function handleRequest(AphrontRequest $request) { 6 6 return id(new AlmanacNamespaceEditEngine())
+4 -135
src/applications/almanac/controller/AlmanacNetworkEditController.php
··· 1 1 <?php 2 2 3 - final class AlmanacNetworkEditController 4 - extends AlmanacNetworkController { 3 + final class AlmanacNetworkEditController extends AlmanacNetworkController { 5 4 6 5 public function handleRequest(AphrontRequest $request) { 7 - $viewer = $request->getViewer(); 8 - 9 - $list_uri = $this->getApplicationURI('network/'); 10 - 11 - $id = $request->getURIData('id'); 12 - if ($id) { 13 - $network = id(new AlmanacNetworkQuery()) 14 - ->setViewer($viewer) 15 - ->withIDs(array($id)) 16 - ->requireCapabilities( 17 - array( 18 - PhabricatorPolicyCapability::CAN_VIEW, 19 - PhabricatorPolicyCapability::CAN_EDIT, 20 - )) 21 - ->executeOne(); 22 - if (!$network) { 23 - return new Aphront404Response(); 24 - } 25 - 26 - $is_new = false; 27 - $network_uri = $this->getApplicationURI('network/'.$network->getID().'/'); 28 - $cancel_uri = $network_uri; 29 - $title = pht('Edit Network'); 30 - $save_button = pht('Save Changes'); 31 - } else { 32 - $this->requireApplicationCapability( 33 - AlmanacCreateNetworksCapability::CAPABILITY); 34 - 35 - $network = AlmanacNetwork::initializeNewNetwork(); 36 - $is_new = true; 37 - 38 - $cancel_uri = $list_uri; 39 - $title = pht('Create Network'); 40 - $save_button = pht('Create Network'); 41 - } 42 - 43 - $v_name = $network->getName(); 44 - $e_name = true; 45 - $validation_exception = null; 46 - 47 - if ($request->isFormPost()) { 48 - $v_name = $request->getStr('name'); 49 - $v_view = $request->getStr('viewPolicy'); 50 - $v_edit = $request->getStr('editPolicy'); 51 - 52 - $type_name = AlmanacNetworkTransaction::TYPE_NAME; 53 - $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 54 - $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; 55 - 56 - $xactions = array(); 57 - 58 - $xactions[] = id(new AlmanacNetworkTransaction()) 59 - ->setTransactionType($type_name) 60 - ->setNewValue($v_name); 61 - 62 - $xactions[] = id(new AlmanacNetworkTransaction()) 63 - ->setTransactionType($type_view) 64 - ->setNewValue($v_view); 65 - 66 - $xactions[] = id(new AlmanacNetworkTransaction()) 67 - ->setTransactionType($type_edit) 68 - ->setNewValue($v_edit); 69 - 70 - $editor = id(new AlmanacNetworkEditor()) 71 - ->setActor($viewer) 72 - ->setContentSourceFromRequest($request) 73 - ->setContinueOnNoEffect(true); 74 - 75 - try { 76 - $editor->applyTransactions($network, $xactions); 77 - 78 - $id = $network->getID(); 79 - $network_uri = $this->getApplicationURI("network/{$id}/"); 80 - return id(new AphrontRedirectResponse())->setURI($network_uri); 81 - } catch (PhabricatorApplicationTransactionValidationException $ex) { 82 - $validation_exception = $ex; 83 - $e_name = $ex->getShortMessage($type_name); 84 - 85 - $network->setViewPolicy($v_view); 86 - $network->setEditPolicy($v_edit); 87 - } 88 - } 89 - 90 - $policies = id(new PhabricatorPolicyQuery()) 91 - ->setViewer($viewer) 92 - ->setObject($network) 93 - ->execute(); 94 - 95 - $form = id(new AphrontFormView()) 96 - ->setUser($viewer) 97 - ->appendChild( 98 - id(new AphrontFormTextControl()) 99 - ->setLabel(pht('Name')) 100 - ->setName('name') 101 - ->setValue($v_name) 102 - ->setError($e_name)) 103 - ->appendChild( 104 - id(new AphrontFormPolicyControl()) 105 - ->setName('viewPolicy') 106 - ->setPolicyObject($network) 107 - ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) 108 - ->setPolicies($policies)) 109 - ->appendChild( 110 - id(new AphrontFormPolicyControl()) 111 - ->setName('editPolicy') 112 - ->setPolicyObject($network) 113 - ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) 114 - ->setPolicies($policies)) 115 - ->appendChild( 116 - id(new AphrontFormSubmitControl()) 117 - ->addCancelButton($cancel_uri) 118 - ->setValue($save_button)); 119 - 120 - $box = id(new PHUIObjectBoxView()) 121 - ->setValidationException($validation_exception) 122 - ->setHeaderText($title) 123 - ->setForm($form); 124 - 125 - $crumbs = $this->buildApplicationCrumbs(); 126 - if ($is_new) { 127 - $crumbs->addTextCrumb(pht('Create Network')); 128 - } else { 129 - $crumbs->addTextCrumb($network->getName(), $network_uri); 130 - $crumbs->addTextCrumb(pht('Edit')); 131 - } 132 - 133 - return $this->newPage() 134 - ->setTitle($title) 135 - ->setCrumbs($crumbs) 136 - ->appendChild( 137 - array( 138 - $box, 139 - )); 6 + return id(new AlmanacNetworkEditEngine()) 7 + ->setController($this) 8 + ->buildResponse(); 140 9 } 141 10 142 11 }
+86
src/applications/almanac/editor/AlmanacNetworkEditEngine.php
··· 1 + <?php 2 + 3 + final class AlmanacNetworkEditEngine 4 + extends PhabricatorEditEngine { 5 + 6 + const ENGINECONST = 'almanac.network'; 7 + 8 + public function isEngineConfigurable() { 9 + return false; 10 + } 11 + 12 + public function getEngineName() { 13 + return pht('Almanac Networks'); 14 + } 15 + 16 + public function getSummaryHeader() { 17 + return pht('Edit Almanac Network Configurations'); 18 + } 19 + 20 + public function getSummaryText() { 21 + return pht('This engine is used to edit Almanac networks.'); 22 + } 23 + 24 + public function getEngineApplicationClass() { 25 + return 'PhabricatorAlmanacApplication'; 26 + } 27 + 28 + protected function newEditableObject() { 29 + return AlmanacNetwork::initializeNewNetwork(); 30 + } 31 + 32 + protected function newObjectQuery() { 33 + return new AlmanacNetworkQuery(); 34 + } 35 + 36 + protected function getObjectCreateTitleText($object) { 37 + return pht('Create Network'); 38 + } 39 + 40 + protected function getObjectCreateButtonText($object) { 41 + return pht('Create Network'); 42 + } 43 + 44 + protected function getObjectEditTitleText($object) { 45 + return pht('Edit Network: %s', $object->getName()); 46 + } 47 + 48 + protected function getObjectEditShortText($object) { 49 + return pht('Edit Network'); 50 + } 51 + 52 + protected function getObjectCreateShortText() { 53 + return pht('Create Network'); 54 + } 55 + 56 + protected function getEditorURI() { 57 + return '/almanac/network/edit/'; 58 + } 59 + 60 + protected function getObjectCreateCancelURI($object) { 61 + return '/almanac/network/'; 62 + } 63 + 64 + protected function getObjectViewURI($object) { 65 + $id = $object->getID(); 66 + return "/almanac/network/{$id}/"; 67 + } 68 + 69 + protected function getCreateNewObjectPolicy() { 70 + return $this->getApplication()->getPolicy( 71 + AlmanacCreateNetworksCapability::CAPABILITY); 72 + } 73 + 74 + protected function buildCustomEditFields($object) { 75 + return array( 76 + id(new PhabricatorTextEditField()) 77 + ->setKey('name') 78 + ->setLabel(pht('Name')) 79 + ->setDescription(pht('Name of the network.')) 80 + ->setTransactionType(AlmanacNetworkTransaction::TYPE_NAME) 81 + ->setIsRequired(true) 82 + ->setValue($object->getName()), 83 + ); 84 + } 85 + 86 + }
+9 -12
src/applications/almanac/storage/AlmanacNetworkTransaction.php
··· 24 24 $new = $this->getNewValue(); 25 25 26 26 switch ($this->getTransactionType()) { 27 + case PhabricatorTransactions::TYPE_CREATE: 28 + return pht( 29 + '%s created this network.', 30 + $this->renderHandleLink($author_phid)); 27 31 case self::TYPE_NAME: 28 - if ($old === null) { 29 - return pht( 30 - '%s created this network.', 31 - $this->renderHandleLink($author_phid)); 32 - } else { 33 - return pht( 34 - '%s renamed this network from "%s" to "%s".', 35 - $this->renderHandleLink($author_phid), 36 - $old, 37 - $new); 38 - } 39 - break; 32 + return pht( 33 + '%s renamed this network from "%s" to "%s".', 34 + $this->renderHandleLink($author_phid), 35 + $old, 36 + $new); 40 37 } 41 38 42 39 return parent::getTitle();