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

Project work boards - make editing tasks from workboards work

Summary: This wasn't working. Create a little JS handler and server-side support for returning the Task in the "project card" format.

Test Plan: Edited tasks from the board - they worked!

Reviewers: epriestley

Reviewed By: epriestley

CC: Korvin, epriestley, aran, chad

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

+137 -46
+1
src/__phutil_library_map__.php
··· 2475 2475 'PonderVote' => 'applications/ponder/constants/PonderVote.php', 2476 2476 'PonderVoteEditor' => 'applications/ponder/editor/PonderVoteEditor.php', 2477 2477 'PonderVoteSaveController' => 'applications/ponder/controller/PonderVoteSaveController.php', 2478 + 'ProjectBoardTaskCard' => 'applications/project/view/ProjectBoardTaskCard.php', 2478 2479 'ProjectCapabilityCreateProjects' => 'applications/project/capability/ProjectCapabilityCreateProjects.php', 2479 2480 'ProjectRemarkupRule' => 'applications/project/remarkup/ProjectRemarkupRule.php', 2480 2481 'PublishFragmentBuildStepImplementation' => 'applications/harbormaster/step/PublishFragmentBuildStepImplementation.php',
-1
src/applications/maniphest/controller/ManiphestController.php
··· 66 66 return $view; 67 67 } 68 68 69 - 70 69 }
+25 -2
src/applications/maniphest/controller/ManiphestTaskEditController.php
··· 12 12 13 13 $request = $this->getRequest(); 14 14 $user = $request->getUser(); 15 + $response_type = $request->getStr('response_type', 'task'); 15 16 16 17 $can_edit_assign = $this->hasApplicationCapability( 17 18 ManiphestCapabilityEditAssign::CAPABILITY); ··· 335 336 } 336 337 337 338 if ($request->isAjax()) { 339 + switch ($response_type) { 340 + case 'card': 341 + $owner = null; 342 + if ($task->getOwnerPHID()) { 343 + $owner = id(new PhabricatorHandleQuery()) 344 + ->setViewer($user) 345 + ->withPHIDs(array($task->getOwnerPHID())) 346 + ->executeOne(); 347 + } 348 + $tasks = id(new ProjectBoardTaskCard()) 349 + ->setViewer($user) 350 + ->setTask($task) 351 + ->setOwner($owner) 352 + ->setCanEdit(true) 353 + ->getItem(); 354 + break; 355 + case 'task': 356 + default: 357 + $tasks = $this->renderSingleTask($task); 358 + break; 359 + } 338 360 return id(new AphrontAjaxResponse())->setContent( 339 361 array( 340 - 'tasks' => $this->renderSingleTask($task), 362 + 'tasks' => $tasks, 341 363 )); 342 364 } 343 365 ··· 463 485 $form = new AphrontFormView(); 464 486 $form 465 487 ->setUser($user) 466 - ->addHiddenInput('template', $template_id); 488 + ->addHiddenInput('template', $template_id) 489 + ->addHiddenInput('response_type', $response_type); 467 490 468 491 if ($parent_task) { 469 492 $form
+19 -43
src/applications/project/controller/PhabricatorProjectBoardController.php
··· 55 55 ->setOrderBy(ManiphestTaskQuery::ORDER_PRIORITY) 56 56 ->execute(); 57 57 $tasks = mpull($tasks, null, 'getPHID'); 58 + $task_phids = array_keys($tasks); 58 59 59 - if ($tasks) { 60 + if ($task_phids) { 60 61 $edge_type = PhabricatorEdgeConfig::TYPE_OBJECT_HAS_COLUMN; 61 62 $edge_query = id(new PhabricatorEdgeQuery()) 62 - ->withSourcePHIDs(mpull($tasks, 'getPHID')) 63 + ->withSourcePHIDs($task_phids) 63 64 ->withEdgeTypes(array($edge_type)) 64 65 ->withDestinationPHIDs(mpull($columns, 'getPHID')); 65 66 $edge_query->execute(); ··· 76 77 77 78 $task_map[$column_phid][] = $task_phid; 78 79 } 80 + 81 + $task_can_edit_map = id(new PhabricatorPolicyFilter()) 82 + ->setViewer($viewer) 83 + ->requireCapabilities(array(PhabricatorPolicyCapability::CAN_EDIT)) 84 + ->apply($tasks); 79 85 80 86 $board_id = celerity_generate_unique_node_id(); 81 87 ··· 113 119 )); 114 120 $task_phids = idx($task_map, $column->getPHID(), array()); 115 121 foreach (array_select_keys($tasks, $task_phids) as $task) { 116 - $cards->addItem($this->renderTaskCard($task)); 122 + $owner = null; 123 + if ($task->getOwnerPHID()) { 124 + $owner = $this->handles[$task->getOwnerPHID()]; 125 + } 126 + $can_edit = idx($task_can_edit_map, $task->getPHID(), false); 127 + $cards->addItem(id(new ProjectBoardTaskCard()) 128 + ->setViewer($viewer) 129 + ->setTask($task) 130 + ->setOwner($owner) 131 + ->setCanEdit($can_edit) 132 + ->getItem()); 117 133 } 118 134 $panel->setCards($cards); 119 135 ··· 181 197 'title' => pht('%s Board', $project->getName()), 182 198 'device' => true, 183 199 )); 184 - } 185 - 186 - private function renderTaskCard(ManiphestTask $task) { 187 - $request = $this->getRequest(); 188 - $viewer = $request->getUser(); 189 - $handles = $this->handles; 190 - 191 - $color_map = ManiphestTaskPriority::getColorMap(); 192 - $bar_color = idx($color_map, $task->getPriority(), 'grey'); 193 - 194 - // TODO: Batch this earlier on. 195 - $can_edit = PhabricatorPolicyFilter::hasCapability( 196 - $viewer, 197 - $task, 198 - PhabricatorPolicyCapability::CAN_EDIT); 199 - 200 - $card = id(new PHUIObjectItemView()) 201 - ->setObjectName('T'.$task->getID()) 202 - ->setHeader($task->getTitle()) 203 - ->setGrippable($can_edit) 204 - ->setHref('/T'.$task->getID()) 205 - ->addSigil('project-card') 206 - ->setMetadata( 207 - array( 208 - 'objectPHID' => $task->getPHID(), 209 - )) 210 - ->addAction( 211 - id(new PHUIListItemView()) 212 - ->setName(pht('Edit')) 213 - ->setIcon('edit') 214 - ->setHref('/maniphest/task/edit/'.$task->getID().'/') 215 - ->setWorkflow(true)) 216 - ->setBarColor($bar_color); 217 - 218 - if ($task->getOwnerPHID()) { 219 - $owner = $handles[$task->getOwnerPHID()]; 220 - $card->addAttribute($owner->renderLink()); 221 - } 222 - 223 - return $card; 224 200 } 225 201 226 202 }
+75
src/applications/project/view/ProjectBoardTaskCard.php
··· 1 + <?php 2 + 3 + final class ProjectBoardTaskCard { 4 + 5 + private $viewer; 6 + private $task; 7 + private $owner; 8 + private $canEdit; 9 + 10 + public function setViewer(PhabricatorUser $viewer) { 11 + $this->viewer = $viewer; 12 + return $this; 13 + } 14 + public function getViewer() { 15 + return $this->viewer; 16 + } 17 + 18 + public function setTask(ManiphestTask $task) { 19 + $this->task = $task; 20 + return $this; 21 + } 22 + public function getTask() { 23 + return $this->task; 24 + } 25 + 26 + public function setOwner(PhabricatorObjectHandle $owner = null) { 27 + $this->owner = $owner; 28 + return $this; 29 + } 30 + public function getOwner() { 31 + return $this->owner; 32 + } 33 + 34 + public function setCanEdit($can_edit) { 35 + $this->canEdit = $can_edit; 36 + return $this; 37 + } 38 + public function getCanEdit() { 39 + return $this->canEdit; 40 + } 41 + 42 + public function getItem() { 43 + $task = $this->getTask(); 44 + $owner = $this->getOwner(); 45 + $can_edit = $this->getCanEdit(); 46 + 47 + $color_map = ManiphestTaskPriority::getColorMap(); 48 + $bar_color = idx($color_map, $task->getPriority(), 'grey'); 49 + 50 + $card = id(new PHUIObjectItemView()) 51 + ->setObjectName('T'.$task->getID()) 52 + ->setHeader($task->getTitle()) 53 + ->setGrippable($can_edit) 54 + ->setHref('/T'.$task->getID()) 55 + ->addSigil('project-card') 56 + ->setMetadata( 57 + array( 58 + 'objectPHID' => $task->getPHID(), 59 + )) 60 + ->addAction( 61 + id(new PHUIListItemView()) 62 + ->setName(pht('Edit')) 63 + ->setIcon('edit') 64 + ->addSigil('edit-project-card') 65 + ->setHref('/maniphest/task/edit/'.$task->getID().'/')) 66 + ->setBarColor($bar_color); 67 + 68 + if ($owner) { 69 + $card->addAttribute($owner->renderLink()); 70 + } 71 + 72 + return $card; 73 + } 74 + 75 + }
+17
webroot/rsrc/js/application/projects/behavior-project-boards.js
··· 66 66 lists[ii].setGroup(lists); 67 67 } 68 68 69 + var onedit = function(card, r) { 70 + var nodes = JX.$H(r.tasks).getFragment().firstChild; 71 + var new_card = JX.$H(r.tasks); 72 + JX.DOM.replace(card, new_card); 73 + }; 74 + 75 + JX.Stratcom.listen( 76 + 'click', 77 + ['edit-project-card'], 78 + function(e) { 79 + e.kill(); 80 + var card = e.getNode('project-card'); 81 + new JX.Workflow(e.getNode('tag:a').href, { 'response_type' : 'card' }) 82 + .setHandler(JX.bind(null, onedit, card)) 83 + .start(); 84 + }); 85 + 69 86 });