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

Add a basic list view for repository operations

Summary: Ref T182. Nothing fancy, just make these slightly easier to work with.

Test Plan: {F884754}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T182

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

+173 -36
+4
src/__phutil_library_map__.php
··· 881 881 'DrydockObjectAuthorizationView' => 'applications/drydock/view/DrydockObjectAuthorizationView.php', 882 882 'DrydockQuery' => 'applications/drydock/query/DrydockQuery.php', 883 883 'DrydockRepositoryOperation' => 'applications/drydock/storage/DrydockRepositoryOperation.php', 884 + 'DrydockRepositoryOperationListController' => 'applications/drydock/controller/DrydockRepositoryOperationListController.php', 884 885 'DrydockRepositoryOperationPHIDType' => 'applications/drydock/phid/DrydockRepositoryOperationPHIDType.php', 885 886 'DrydockRepositoryOperationQuery' => 'applications/drydock/query/DrydockRepositoryOperationQuery.php', 887 + 'DrydockRepositoryOperationSearchEngine' => 'applications/drydock/query/DrydockRepositoryOperationSearchEngine.php', 886 888 'DrydockRepositoryOperationType' => 'applications/drydock/operation/DrydockRepositoryOperationType.php', 887 889 'DrydockRepositoryOperationUpdateWorker' => 'applications/drydock/worker/DrydockRepositoryOperationUpdateWorker.php', 888 890 'DrydockRepositoryOperationViewController' => 'applications/drydock/controller/DrydockRepositoryOperationViewController.php', ··· 4665 4667 'DrydockDAO', 4666 4668 'PhabricatorPolicyInterface', 4667 4669 ), 4670 + 'DrydockRepositoryOperationListController' => 'DrydockController', 4668 4671 'DrydockRepositoryOperationPHIDType' => 'PhabricatorPHIDType', 4669 4672 'DrydockRepositoryOperationQuery' => 'DrydockQuery', 4673 + 'DrydockRepositoryOperationSearchEngine' => 'PhabricatorApplicationSearchEngine', 4670 4674 'DrydockRepositoryOperationType' => 'Phobject', 4671 4675 'DrydockRepositoryOperationUpdateWorker' => 'DrydockWorker', 4672 4676 'DrydockRepositoryOperationViewController' => 'DrydockController',
+2
src/applications/drydock/application/PhabricatorDrydockApplication.php
··· 91 91 ), 92 92 ), 93 93 '(?P<type>operation)/' => array( 94 + '(?:query/(?P<queryKey>[^/]+)/)?' 95 + => 'DrydockRepositoryOperationListController', 94 96 '(?P<id>[1-9]\d*)/' => array( 95 97 '' => 'DrydockRepositoryOperationViewController', 96 98 ),
-10
src/applications/drydock/controller/DrydockAuthorizationAuthorizeController.php
··· 82 82 ->addCancelButton($authorization_uri); 83 83 } 84 84 85 - public function buildSideNavView() { 86 - // TODO: Get rid of this, but it's currently required by DrydockController. 87 - return null; 88 - } 89 - 90 - public function buildApplicationMenu() { 91 - // TODO: As above. 92 - return null; 93 - } 94 - 95 85 }
-10
src/applications/drydock/controller/DrydockAuthorizationViewController.php
··· 128 128 return $view; 129 129 } 130 130 131 - public function buildSideNavView() { 132 - // TODO: Get rid of this, but it's currently required by DrydockController. 133 - return null; 134 - } 135 - 136 - public function buildApplicationMenu() { 137 - // TODO: As above. 138 - return null; 139 - } 140 - 141 131 }
+8
src/applications/drydock/controller/DrydockConsoleController.php
··· 15 15 $nav->addFilter('blueprint', pht('Blueprints')); 16 16 $nav->addFilter('resource', pht('Resources')); 17 17 $nav->addFilter('lease', pht('Leases')); 18 + $nav->addFilter('operation', pht('Repository Operations')); 18 19 19 20 $nav->selectFilter(null); 20 21 ··· 51 52 ->setFontIcon('fa-link') 52 53 ->setHref($this->getApplicationURI('lease/')) 53 54 ->addAttribute(pht('Manage leases on resources.'))); 55 + 56 + $menu->addItem( 57 + id(new PHUIObjectItemView()) 58 + ->setHeader(pht('Repository Operations')) 59 + ->setFontIcon('fa-fighter-jet') 60 + ->setHref($this->getApplicationURI('operation/')) 61 + ->addAttribute(pht('Review the repository operation queue.'))); 54 62 55 63 $crumbs = $this->buildApplicationCrumbs(); 56 64 $crumbs->addTextCrumb(pht('Console'));
-6
src/applications/drydock/controller/DrydockController.php
··· 2 2 3 3 abstract class DrydockController extends PhabricatorController { 4 4 5 - abstract public function buildSideNavView(); 6 - 7 - public function buildApplicationMenu() { 8 - return $this->buildSideNavView()->getMenu(); 9 - } 10 - 11 5 protected function buildLocksTab($owner_phid) { 12 6 $locks = DrydockSlotLock::loadLocks($owner_phid); 13 7
+37
src/applications/drydock/controller/DrydockRepositoryOperationListController.php
··· 1 + <?php 2 + 3 + final class DrydockRepositoryOperationListController 4 + extends DrydockController { 5 + 6 + public function shouldAllowPublic() { 7 + return true; 8 + } 9 + 10 + public function handleRequest(AphrontRequest $request) { 11 + $query_key = $request->getURIData('queryKey'); 12 + 13 + $engine = new DrydockRepositoryOperationSearchEngine(); 14 + 15 + $controller = id(new PhabricatorApplicationSearchController()) 16 + ->setQueryKey($query_key) 17 + ->setSearchEngine($engine) 18 + ->setNavigation($this->buildSideNavView()); 19 + 20 + return $this->delegateToController($controller); 21 + } 22 + 23 + public function buildSideNavView() { 24 + $nav = new AphrontSideNavFilterView(); 25 + $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); 26 + 27 + $engine = id(new DrydockRepositoryOperationSearchEngine()) 28 + ->setViewer($this->getViewer()); 29 + 30 + $engine->addNavigationItems($nav->getMenu()); 31 + 32 + $nav->selectFilter(null); 33 + 34 + return $nav; 35 + } 36 + 37 + }
+7 -10
src/applications/drydock/controller/DrydockRepositoryOperationViewController.php
··· 3 3 final class DrydockRepositoryOperationViewController 4 4 extends DrydockController { 5 5 6 + public function shouldAllowPublic() { 7 + return true; 8 + } 9 + 6 10 public function handleRequest(AphrontRequest $request) { 7 11 $viewer = $request->getViewer(); 8 12 $id = $request->getURIData('id'); ··· 33 37 $properties->setActionList($actions); 34 38 35 39 $crumbs = $this->buildApplicationCrumbs(); 40 + $crumbs->addTextCrumb( 41 + pht('Operations'), 42 + $this->getApplicationURI('operation/')); 36 43 $crumbs->addTextCrumb($title); 37 44 38 45 $object_box = id(new PHUIObjectBoxView()) ··· 77 84 $viewer->renderHandle($operation->getObjectPHID())); 78 85 79 86 return $view; 80 - } 81 - 82 - public function buildSideNavView() { 83 - // TODO: Get rid of this, but it's currently required by DrydockController. 84 - return null; 85 - } 86 - 87 - public function buildApplicationMenu() { 88 - // TODO: As above. 89 - return null; 90 87 } 91 88 92 89 }
+6
src/applications/drydock/operation/DrydockLandRepositoryOperation.php
··· 5 5 6 6 const OPCONST = 'land'; 7 7 8 + public function getOperationDescription( 9 + DrydockRepositoryOperation $operation, 10 + PhabricatorUser $viewer) { 11 + return pht('Land Revision'); 12 + } 13 + 8 14 public function applyOperation( 9 15 DrydockRepositoryOperation $operation, 10 16 DrydockInterface $interface) {
+4
src/applications/drydock/operation/DrydockRepositoryOperationType.php
··· 8 8 DrydockRepositoryOperation $operation, 9 9 DrydockInterface $interface); 10 10 11 + abstract public function getOperationDescription( 12 + DrydockRepositoryOperation $operation, 13 + PhabricatorUser $viewer); 14 + 11 15 final public function setViewer(PhabricatorUser $viewer) { 12 16 $this->viewer = $viewer; 13 17 return $this;
+99
src/applications/drydock/query/DrydockRepositoryOperationSearchEngine.php
··· 1 + <?php 2 + 3 + final class DrydockRepositoryOperationSearchEngine 4 + extends PhabricatorApplicationSearchEngine { 5 + 6 + public function getResultTypeDescription() { 7 + return pht('Drydock Repository Operations'); 8 + } 9 + 10 + public function getApplicationClassName() { 11 + return 'PhabricatorDrydockApplication'; 12 + } 13 + 14 + public function newQuery() { 15 + return id(new DrydockRepositoryOperationQuery()); 16 + } 17 + 18 + protected function buildQueryFromParameters(array $map) { 19 + $query = $this->newQuery(); 20 + 21 + return $query; 22 + } 23 + 24 + protected function buildCustomSearchFields() { 25 + return array( 26 + ); 27 + } 28 + 29 + protected function getURI($path) { 30 + return '/drydock/operation/'.$path; 31 + } 32 + 33 + protected function getBuiltinQueryNames() { 34 + return array( 35 + 'all' => pht('All Operations'), 36 + ); 37 + } 38 + 39 + public function buildSavedQueryFromBuiltin($query_key) { 40 + $query = $this->newSavedQuery(); 41 + $query->setQueryKey($query_key); 42 + 43 + switch ($query_key) { 44 + case 'all': 45 + return $query; 46 + } 47 + 48 + return parent::buildSavedQueryFromBuiltin($query_key); 49 + } 50 + 51 + protected function renderResultList( 52 + array $operations, 53 + PhabricatorSavedQuery $query, 54 + array $handles) { 55 + assert_instances_of($operations, 'DrydockRepositoryOperation'); 56 + 57 + $viewer = $this->requireViewer(); 58 + 59 + $view = new PHUIObjectItemListView(); 60 + foreach ($operations as $operation) { 61 + $id = $operation->getID(); 62 + 63 + $item = id(new PHUIObjectItemView()) 64 + ->setHeader($operation->getOperationDescription($viewer)) 65 + ->setHref($this->getApplicationURI("operation/{$id}/")) 66 + ->setObjectName(pht('Repository Operation %d', $id)); 67 + 68 + $state = $operation->getOperationState(); 69 + 70 + $icon = DrydockRepositoryOperation::getOperationStateIcon($state); 71 + $name = DrydockRepositoryOperation::getOperationStateName($state); 72 + 73 + $item->addIcon($icon, $name); 74 + $item->addByline( 75 + array( 76 + pht('Via:'), 77 + ' ', 78 + $viewer->renderHandle($operation->getAuthorPHID()), 79 + )); 80 + 81 + $item->addAttribute( 82 + $viewer->renderHandle( 83 + $operation->getObjectPHID())); 84 + 85 + $item->addAttribute( 86 + $viewer->renderHandle( 87 + $operation->getRepositoryPHID())); 88 + 89 + $view->addItem($item); 90 + } 91 + 92 + $result = id(new PhabricatorApplicationSearchResultView()) 93 + ->setObjectList($view) 94 + ->setNoDataString(pht('No matching operations.')); 95 + 96 + return $result; 97 + } 98 + 99 + }
+6
src/applications/drydock/storage/DrydockRepositoryOperation.php
··· 136 136 $interface); 137 137 } 138 138 139 + public function getOperationDescription(PhabricatorUser $viewer) { 140 + return $this->getImplementation()->getOperationDescription( 141 + $this, 142 + $viewer); 143 + } 144 + 139 145 140 146 /* -( PhabricatorPolicyInterface )----------------------------------------- */ 141 147