@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 Nuance Queue list/edit/detail views

Summary: Ref T8434. Throw these together.

Test Plan: Created a new Queue.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T8434

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

+378 -29
+4
src/__phutil_library_map__.php
··· 1120 1120 'NuanceQueueEditController' => 'applications/nuance/controller/NuanceQueueEditController.php', 1121 1121 'NuanceQueueEditor' => 'applications/nuance/editor/NuanceQueueEditor.php', 1122 1122 'NuanceQueueItem' => 'applications/nuance/storage/NuanceQueueItem.php', 1123 + 'NuanceQueueListController' => 'applications/nuance/controller/NuanceQueueListController.php', 1123 1124 'NuanceQueuePHIDType' => 'applications/nuance/phid/NuanceQueuePHIDType.php', 1124 1125 'NuanceQueueQuery' => 'applications/nuance/query/NuanceQueueQuery.php', 1126 + 'NuanceQueueSearchEngine' => 'applications/nuance/query/NuanceQueueSearchEngine.php', 1125 1127 'NuanceQueueTransaction' => 'applications/nuance/storage/NuanceQueueTransaction.php', 1126 1128 'NuanceQueueTransactionComment' => 'applications/nuance/storage/NuanceQueueTransactionComment.php', 1127 1129 'NuanceQueueTransactionQuery' => 'applications/nuance/query/NuanceQueueTransactionQuery.php', ··· 4463 4465 'NuanceQueueEditController' => 'NuanceController', 4464 4466 'NuanceQueueEditor' => 'PhabricatorApplicationTransactionEditor', 4465 4467 'NuanceQueueItem' => 'NuanceDAO', 4468 + 'NuanceQueueListController' => 'NuanceController', 4466 4469 'NuanceQueuePHIDType' => 'PhabricatorPHIDType', 4467 4470 'NuanceQueueQuery' => 'NuanceQuery', 4471 + 'NuanceQueueSearchEngine' => 'PhabricatorApplicationSearchEngine', 4468 4472 'NuanceQueueTransaction' => 'NuanceTransaction', 4469 4473 'NuanceQueueTransactionComment' => 'PhabricatorApplicationTransactionComment', 4470 4474 'NuanceQueueTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
+1
src/applications/nuance/application/PhabricatorNuanceApplication.php
··· 51 51 'create/' => 'NuanceSourceCreateController', 52 52 ), 53 53 'queue/' => array( 54 + '(?:query/(?P<queryKey>[^/]+)/)?' => 'NuanceQueueListController', 54 55 'view/(?P<id>[1-9]\d*)/' => 'NuanceQueueViewController', 55 56 'edit/(?P<id>[1-9]\d*)/' => 'NuanceQueueEditController', 56 57 'new/' => 'NuanceQueueEditController',
+96 -4
src/applications/nuance/controller/NuanceQueueEditController.php
··· 4 4 5 5 public function handleRequest(AphrontRequest $request) { 6 6 $viewer = $this->getViewer(); 7 + $queues_uri = $this->getApplicationURI('queue/'); 7 8 8 9 $queue_id = $request->getURIData('id'); 9 10 $is_new = !$queue_id; 10 11 if ($is_new) { 11 12 $queue = NuanceQueue::initializeNewQueue(); 13 + $cancel_uri = $queues_uri; 12 14 } else { 13 15 $queue = id(new NuanceQueueQuery()) 14 16 ->setViewer($viewer) ··· 17 19 if (!$queue) { 18 20 return new Aphront404Response(); 19 21 } 22 + $cancel_uri = $queue->getURI(); 23 + } 24 + 25 + $v_name = $queue->getName(); 26 + $e_name = true; 27 + $v_edit = $queue->getEditPolicy(); 28 + $v_view = $queue->getViewPolicy(); 29 + 30 + $validation_exception = null; 31 + if ($request->isFormPost()) { 32 + $e_name = null; 33 + 34 + $v_name = $request->getStr('name'); 35 + $v_edit = $request->getStr('editPolicy'); 36 + $v_view = $request->getStr('viewPolicy'); 37 + 38 + $type_name = NuanceQueueTransaction::TYPE_NAME; 39 + $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 40 + $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; 41 + 42 + $xactions = array(); 43 + 44 + $xactions[] = id(new NuanceQueueTransaction()) 45 + ->setTransactionType($type_name) 46 + ->setNewValue($v_name); 47 + 48 + $xactions[] = id(new NuanceQueueTransaction()) 49 + ->setTransactionType($type_view) 50 + ->setNewValue($v_view); 51 + 52 + $xactions[] = id(new NuanceQueueTransaction()) 53 + ->setTransactionType($type_edit) 54 + ->setNewValue($v_edit); 55 + 56 + $editor = id(new NuanceQueueEditor()) 57 + ->setActor($viewer) 58 + ->setContentSourceFromRequest($request) 59 + ->setContinueOnNoEffect(true); 60 + 61 + try { 62 + 63 + $editor->applyTransactions($queue, $xactions); 64 + 65 + $uri = $queue->getURI(); 66 + return id(new AphrontRedirectResponse())->setURI($uri); 67 + } catch (PhabricatorApplicationTransactionValidationException $ex) { 68 + $validation_exception = $ex; 69 + 70 + $e_name = $ex->getShortMessage($type_name); 71 + } 20 72 } 21 73 22 74 $crumbs = $this->buildApplicationCrumbs(); 23 - $crumbs->addTextCrumb( 24 - pht('Queues'), 25 - $this->getApplicationURI('queue/')); 75 + $crumbs->addTextCrumb(pht('Queues'), $queues_uri); 26 76 27 77 if ($is_new) { 28 78 $title = pht('Create Queue'); ··· 33 83 $crumbs->addTextCrumb(pht('Edit')); 34 84 } 35 85 86 + $policies = id(new PhabricatorPolicyQuery()) 87 + ->setViewer($viewer) 88 + ->setObject($queue) 89 + ->execute(); 90 + 91 + $form = id(new AphrontFormView()) 92 + ->setUser($viewer) 93 + ->appendChild( 94 + id(new AphrontFormTextControl()) 95 + ->setLabel(pht('Name')) 96 + ->setName('name') 97 + ->setError($e_name) 98 + ->setValue($v_name)) 99 + ->appendChild( 100 + id(new AphrontFormPolicyControl()) 101 + ->setUser($viewer) 102 + ->setCapability(PhabricatorPolicyCapability::CAN_VIEW) 103 + ->setPolicyObject($queue) 104 + ->setPolicies($policies) 105 + ->setValue($v_view) 106 + ->setName('viewPolicy')) 107 + ->appendChild( 108 + id(new AphrontFormPolicyControl()) 109 + ->setUser($viewer) 110 + ->setCapability(PhabricatorPolicyCapability::CAN_EDIT) 111 + ->setPolicyObject($queue) 112 + ->setPolicies($policies) 113 + ->setValue($v_edit) 114 + ->setName('editPolicy')) 115 + ->appendChild( 116 + id(new AphrontFormSubmitControl()) 117 + ->addCancelButton($cancel_uri) 118 + ->setValue(pht('Save'))); 119 + 120 + $box = id(new PHUIObjectBoxView()) 121 + ->setHeaderText($title) 122 + ->setValidationException($validation_exception) 123 + ->appendChild($form); 124 + 36 125 return $this->buildApplicationPage( 37 - $crumbs, 126 + array( 127 + $crumbs, 128 + $box, 129 + ), 38 130 array( 39 131 'title' => $title, 40 132 ));
+48
src/applications/nuance/controller/NuanceQueueListController.php
··· 1 + <?php 2 + 3 + final class NuanceQueueListController 4 + extends NuanceController { 5 + 6 + public function handleRequest(AphrontRequest $request) { 7 + $request = $this->getRequest(); 8 + $controller = id(new PhabricatorApplicationSearchController($request)) 9 + ->setQueryKey($request->getURIData('queryKey')) 10 + ->setSearchEngine(new NuanceQueueSearchEngine()) 11 + ->setNavigation($this->buildSideNavView()); 12 + 13 + return $this->delegateToController($controller); 14 + } 15 + 16 + public function buildSideNavView($for_app = false) { 17 + $user = $this->getRequest()->getUser(); 18 + 19 + $nav = new AphrontSideNavFilterView(); 20 + $nav->setBaseURI(new PhutilURI($this->getApplicationURI())); 21 + 22 + id(new NuanceQueueSearchEngine()) 23 + ->setViewer($user) 24 + ->addNavigationItems($nav->getMenu()); 25 + 26 + $nav->selectFilter(null); 27 + 28 + return $nav; 29 + } 30 + 31 + protected function buildApplicationCrumbs() { 32 + $crumbs = parent::buildApplicationCrumbs(); 33 + 34 + // TODO: Maybe use SourceManage capability? 35 + $can_create = true; 36 + 37 + $crumbs->addAction( 38 + id(new PHUIListItemView()) 39 + ->setName(pht('Create Queue')) 40 + ->setHref($this->getApplicationURI('queue/new/')) 41 + ->setIcon('fa-plus-square') 42 + ->setDisabled(!$can_create) 43 + ->setWorkflow(!$can_create)); 44 + 45 + return $crumbs; 46 + } 47 + 48 + }
+74 -23
src/applications/nuance/controller/NuanceQueueViewController.php
··· 2 2 3 3 final class NuanceQueueViewController extends NuanceController { 4 4 5 - private $queueID; 5 + public function handleRequest(AphrontRequest $request) { 6 + $viewer = $this->getViewer(); 6 7 7 - public function setQueueID($queue_id) { 8 - $this->queueID = $queue_id; 9 - return $this; 10 - } 11 - public function getQueueID() { 12 - return $this->queueID; 13 - } 14 - 15 - public function willProcessRequest(array $data) { 16 - $this->setQueueID($data['id']); 17 - } 18 - 19 - public function processRequest() { 20 - $request = $this->getRequest(); 21 - $user = $request->getUser(); 22 - 23 - $queue_id = $this->getQueueID(); 24 8 $queue = id(new NuanceQueueQuery()) 25 - ->setViewer($user) 26 - ->withIDs(array($queue_id)) 9 + ->setViewer($viewer) 10 + ->withIDs(array($request->getURIData('id'))) 27 11 ->executeOne(); 28 - 29 12 if (!$queue) { 30 13 return new Aphront404Response(); 31 14 } 32 15 16 + $title = $queue->getName(); 17 + 33 18 $crumbs = $this->buildApplicationCrumbs(); 34 - $title = pht('TODO'); 19 + $crumbs->addTextCrumb(pht('Queues'), $this->getApplicationURI('queue/')); 20 + $crumbs->addTextCrumb($queue->getName()); 21 + 22 + $header = $this->buildHeaderView($queue); 23 + $actions = $this->buildActionView($queue); 24 + $properties = $this->buildPropertyView($queue, $actions); 25 + 26 + $box = id(new PHUIObjectBoxView()) 27 + ->setHeader($header) 28 + ->addPropertyList($properties); 29 + 30 + $timeline = $this->buildTransactionTimeline( 31 + $queue, 32 + new NuanceQueueTransactionQuery()); 33 + $timeline->setShouldTerminate(true); 35 34 36 35 return $this->buildApplicationPage( 37 - $crumbs, 36 + array( 37 + $crumbs, 38 + $box, 39 + $timeline, 40 + ), 38 41 array( 39 42 'title' => $title, 40 43 )); 44 + } 45 + 46 + private function buildHeaderView(NuanceQueue $queue) { 47 + $viewer = $this->getViewer(); 48 + 49 + $header = id(new PHUIHeaderView()) 50 + ->setUser($viewer) 51 + ->setHeader($queue->getName()) 52 + ->setPolicyObject($queue); 53 + 54 + return $header; 55 + } 56 + 57 + private function buildActionView(NuanceQueue $queue) { 58 + $viewer = $this->getViewer(); 59 + $id = $queue->getID(); 60 + 61 + $actions = id(new PhabricatorActionListView()) 62 + ->setObjectURI($queue->getURI()) 63 + ->setUser($viewer); 64 + 65 + $can_edit = PhabricatorPolicyFilter::hasCapability( 66 + $viewer, 67 + $queue, 68 + PhabricatorPolicyCapability::CAN_EDIT); 69 + 70 + $actions->addAction( 71 + id(new PhabricatorActionView()) 72 + ->setName(pht('Edit Queue')) 73 + ->setIcon('fa-pencil') 74 + ->setHref($this->getApplicationURI("queue/edit/{$id}/")) 75 + ->setDisabled(!$can_edit) 76 + ->setWorkflow(!$can_edit)); 77 + 78 + return $actions; 79 + } 80 + 81 + private function buildPropertyView( 82 + NuanceQueue $queue, 83 + PhabricatorActionListView $actions) { 84 + $viewer = $this->getViewer(); 85 + 86 + $properties = id(new PHUIPropertyListView()) 87 + ->setUser($viewer) 88 + ->setObject($queue) 89 + ->setActionList($actions); 90 + 91 + return $properties; 41 92 } 42 93 }
+78 -2
src/applications/nuance/editor/NuanceQueueEditor.php
··· 14 14 public function getTransactionTypes() { 15 15 $types = parent::getTransactionTypes(); 16 16 17 - $types[] = PhabricatorTransactions::TYPE_EDGE; 18 - $types[] = PhabricatorTransactions::TYPE_COMMENT; 17 + $types[] = NuanceQueueTransaction::TYPE_NAME; 18 + 19 19 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 20 20 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 21 21 22 22 return $types; 23 23 } 24 + 25 + protected function getCustomTransactionOldValue( 26 + PhabricatorLiskDAO $object, 27 + PhabricatorApplicationTransaction $xaction) { 28 + 29 + switch ($xaction->getTransactionType()) { 30 + case NuanceQueueTransaction::TYPE_NAME: 31 + return $object->getName(); 32 + } 33 + 34 + return parent::getCustomTransactionOldValue($object, $xaction); 35 + } 36 + 37 + protected function getCustomTransactionNewValue( 38 + PhabricatorLiskDAO $object, 39 + PhabricatorApplicationTransaction $xaction) { 40 + 41 + switch ($xaction->getTransactionType()) { 42 + case NuanceQueueTransaction::TYPE_NAME: 43 + return $xaction->getNewValue(); 44 + } 45 + 46 + return parent::getCustomTransactionNewValue($object, $xaction); 47 + } 48 + 49 + protected function applyCustomInternalTransaction( 50 + PhabricatorLiskDAO $object, 51 + PhabricatorApplicationTransaction $xaction) { 52 + 53 + switch ($xaction->getTransactionType()) { 54 + case NuanceQueueTransaction::TYPE_NAME: 55 + $object->setName($xaction->getNewValue()); 56 + break; 57 + } 58 + } 59 + 60 + protected function applyCustomExternalTransaction( 61 + PhabricatorLiskDAO $object, 62 + PhabricatorApplicationTransaction $xaction) { 63 + 64 + switch ($xaction->getTransactionType()) { 65 + case NuanceQueueTransaction::TYPE_NAME: 66 + return; 67 + } 68 + 69 + return parent::applyCustomExternalTransaction($object, $xaction); 70 + } 71 + protected function validateTransaction( 72 + PhabricatorLiskDAO $object, 73 + $type, 74 + array $xactions) { 75 + 76 + $errors = parent::validateTransaction($object, $type, $xactions); 77 + 78 + switch ($type) { 79 + case NuanceQueueTransaction::TYPE_NAME: 80 + $missing = $this->validateIsEmptyTextField( 81 + $object->getName(), 82 + $xactions); 83 + 84 + if ($missing) { 85 + $error = new PhabricatorApplicationTransactionValidationError( 86 + $type, 87 + pht('Required'), 88 + pht('A queue must have a name.'), 89 + nonempty(last($xactions), null)); 90 + 91 + $error->setIsMissingFieldError(true); 92 + $errors[] = $error; 93 + } 94 + break; 95 + } 96 + 97 + return $errors; 98 + } 99 + 24 100 25 101 }
+75
src/applications/nuance/query/NuanceQueueSearchEngine.php
··· 1 + <?php 2 + 3 + final class NuanceQueueSearchEngine 4 + extends PhabricatorApplicationSearchEngine { 5 + 6 + public function getApplicationClassName() { 7 + return 'PhabricatorNuanceApplication'; 8 + } 9 + 10 + public function getResultTypeDescription() { 11 + return pht('Nuance Queues'); 12 + } 13 + 14 + public function buildSavedQueryFromRequest(AphrontRequest $request) { 15 + $saved = new PhabricatorSavedQuery(); 16 + 17 + return $saved; 18 + } 19 + 20 + public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) { 21 + $query = id(new NuanceQueueQuery()); 22 + 23 + return $query; 24 + } 25 + 26 + public function buildSearchForm( 27 + AphrontFormView $form, 28 + PhabricatorSavedQuery $saved_query) {} 29 + 30 + protected function getURI($path) { 31 + return '/nuance/queue/'.$path; 32 + } 33 + 34 + protected function getBuiltinQueryNames() { 35 + $names = array( 36 + 'all' => pht('All Queues'), 37 + ); 38 + 39 + return $names; 40 + } 41 + 42 + public function buildSavedQueryFromBuiltin($query_key) { 43 + $query = $this->newSavedQuery(); 44 + $query->setQueryKey($query_key); 45 + 46 + switch ($query_key) { 47 + case 'all': 48 + return $query; 49 + } 50 + 51 + return parent::buildSavedQueryFromBuiltin($query_key); 52 + } 53 + 54 + protected function renderResultList( 55 + array $queues, 56 + PhabricatorSavedQuery $query, 57 + array $handles) { 58 + assert_instances_of($queues, 'NuanceQueue'); 59 + 60 + $viewer = $this->requireViewer(); 61 + 62 + $list = new PHUIObjectItemListView(); 63 + $list->setUser($viewer); 64 + foreach ($queues as $queue) { 65 + $item = id(new PHUIObjectItemView()) 66 + ->setObjectName(pht('Queue %d', $queue->getID())) 67 + ->setHeader($queue->getName()) 68 + ->setHref($queue->getURI()); 69 + $list->addItem($item); 70 + } 71 + 72 + return $list; 73 + } 74 + 75 + }
+2
src/applications/nuance/storage/NuanceQueueTransaction.php
··· 2 2 3 3 final class NuanceQueueTransaction extends NuanceTransaction { 4 4 5 + const TYPE_NAME = 'nuance.queue.name'; 6 + 5 7 public function getApplicationTransactionType() { 6 8 return NuanceQueuePHIDType::TYPECONST; 7 9 }