@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 Nuance item types to provide actions for items

Summary:
Ref T10537. This allows item types to expose item actions. Eventually these actions might be things like "promote to task", "tweet reply", "ban user forever", etc.

For now, provide a simple action which shows a raw item in a dialog.

Test Plan: {F1185573}

Reviewers: chad

Reviewed By: chad

Subscribers: Luke081515.2

Maniphest Tasks: T10537

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

+115
+2
src/__phutil_library_map__.php
··· 1439 1439 'NuanceImportCursorDataQuery' => 'applications/nuance/query/NuanceImportCursorDataQuery.php', 1440 1440 'NuanceImportCursorPHIDType' => 'applications/nuance/phid/NuanceImportCursorPHIDType.php', 1441 1441 'NuanceItem' => 'applications/nuance/storage/NuanceItem.php', 1442 + 'NuanceItemActionController' => 'applications/nuance/controller/NuanceItemActionController.php', 1442 1443 'NuanceItemController' => 'applications/nuance/controller/NuanceItemController.php', 1443 1444 'NuanceItemEditor' => 'applications/nuance/editor/NuanceItemEditor.php', 1444 1445 'NuanceItemListController' => 'applications/nuance/controller/NuanceItemListController.php', ··· 5726 5727 'PhabricatorPolicyInterface', 5727 5728 'PhabricatorApplicationTransactionInterface', 5728 5729 ), 5730 + 'NuanceItemActionController' => 'NuanceController', 5729 5731 'NuanceItemController' => 'NuanceController', 5730 5732 'NuanceItemEditor' => 'PhabricatorApplicationTransactionEditor', 5731 5733 'NuanceItemListController' => 'NuanceItemController',
+2
src/applications/nuance/application/PhabricatorNuanceApplication.php
··· 43 43 $this->getQueryRoutePattern() => 'NuanceItemListController', 44 44 'view/(?P<id>[1-9]\d*)/' => 'NuanceItemViewController', 45 45 'manage/(?P<id>[1-9]\d*)/' => 'NuanceItemManageController', 46 + 'action/(?P<id>[1-9]\d*)/(?P<action>[^/]+)/' 47 + => 'NuanceItemActionController', 46 48 ), 47 49 'source/' => array( 48 50 $this->getQueryRoutePattern() => 'NuanceSourceListController',
+26
src/applications/nuance/controller/NuanceItemActionController.php
··· 1 + <?php 2 + 3 + final class NuanceItemActionController extends NuanceController { 4 + 5 + public function handleRequest(AphrontRequest $request) { 6 + $viewer = $this->getViewer(); 7 + $id = $request->getURIData('id'); 8 + 9 + $item = id(new NuanceItemQuery()) 10 + ->setViewer($viewer) 11 + ->withIDs(array($id)) 12 + ->executeOne(); 13 + if (!$item) { 14 + return new Aphront404Response(); 15 + } 16 + 17 + $action = $request->getURIData('action'); 18 + 19 + $impl = $item->getImplementation(); 20 + $impl->setViewer($viewer); 21 + $impl->setController($this); 22 + 23 + return $impl->buildActionResponse($item, $action); 24 + } 25 + 26 + }
+7
src/applications/nuance/controller/NuanceItemViewController.php
··· 58 58 ->setIcon('fa-cogs') 59 59 ->setHref($this->getApplicationURI("item/manage/{$id}/"))); 60 60 61 + $impl = $item->getImplementation(); 62 + $impl->setViewer($viewer); 63 + 64 + foreach ($impl->getItemActions($item) as $action) { 65 + $curtain->addAction($action); 66 + } 67 + 61 68 return $curtain; 62 69 } 63 70
+42
src/applications/nuance/item/NuanceGitHubEventItemType.php
··· 144 144 return NuanceGitHubRawEvent::newEvent($type, $raw); 145 145 } 146 146 147 + public function getItemActions(NuanceItem $item) { 148 + $actions = array(); 149 + 150 + $actions[] = $this->newItemAction($item, 'raw') 151 + ->setName(pht('View Raw Event')) 152 + ->setWorkflow(true) 153 + ->setIcon('fa-code'); 154 + 155 + return $actions; 156 + } 157 + 158 + protected function handleAction(NuanceItem $item, $action) { 159 + $controller = $this->getController(); 160 + 161 + switch ($action) { 162 + case 'raw': 163 + $raw = array( 164 + 'api.type' => $item->getItemProperty('api.type'), 165 + 'api.raw' => $item->getItemProperty('api.raw'), 166 + ); 167 + 168 + $raw_output = id(new PhutilJSON())->encodeFormatted($raw); 169 + 170 + $raw_box = id(new AphrontFormTextAreaControl()) 171 + ->setCustomClass('PhabricatorMonospaced') 172 + ->setLabel(pht('Raw Event')) 173 + ->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_TALL) 174 + ->setValue($raw_output); 175 + 176 + $form = id(new AphrontFormView()) 177 + ->appendChild($raw_box); 178 + 179 + return $controller->newDialog() 180 + ->setWidth(AphrontDialogView::WIDTH_FULL) 181 + ->setTitle(pht('GitHub Raw Event')) 182 + ->appendForm($form) 183 + ->addCancelButton($item->getURI(), pht('Done')); 184 + } 185 + 186 + return null; 187 + } 188 + 147 189 }
+36
src/applications/nuance/item/NuanceItemType.php
··· 4 4 extends Phobject { 5 5 6 6 private $viewer; 7 + private $controller; 7 8 8 9 public function setViewer(PhabricatorUser $viewer) { 9 10 $this->viewer = $viewer; ··· 14 15 return $this->viewer; 15 16 } 16 17 18 + public function setController(PhabricatorController $controller) { 19 + $this->controller = $controller; 20 + return $this; 21 + } 22 + 23 + public function getController() { 24 + return $this->controller; 25 + } 26 + 17 27 public function canUpdateItems() { 18 28 return false; 19 29 } ··· 28 38 29 39 public function getItemTypeDisplayIcon() { 30 40 return null; 41 + } 42 + 43 + public function getItemActions(NuanceItem $item) { 44 + return array(); 31 45 } 32 46 33 47 abstract public function getItemTypeDisplayName(); ··· 58 72 ->setAncestorClass(__CLASS__) 59 73 ->setUniqueMethod('getItemTypeConstant') 60 74 ->execute(); 75 + } 76 + 77 + final protected function newItemAction(NuanceItem $item, $key) { 78 + $id = $item->getID(); 79 + $action_uri = "/nuance/item/action/{$id}/{$key}/"; 80 + 81 + return id(new PhabricatorActionView()) 82 + ->setHref($action_uri); 83 + } 84 + 85 + final public function buildActionResponse(NuanceItem $item, $action) { 86 + $response = $this->handleAction($item, $action); 87 + 88 + if ($response === null) { 89 + return new Aphront404Response(); 90 + } 91 + 92 + return $response; 93 + } 94 + 95 + protected function handleAction(NuanceItem $item, $action) { 96 + return null; 61 97 } 62 98 63 99 }