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

Workboards - make priority changes less aggressive and generally better

Summary: Fixes T4641.

Test Plan: Dragged a "normal" task between "high" and "low" tasks and it stayed as "normal". Generally seems correct when playing around.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: mbishopim3, Beltran-rubo, epriestley, Korvin

Maniphest Tasks: T4641

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

+127 -34
+11 -11
resources/celerity/map.php
··· 404 404 'rsrc/js/application/policy/behavior-policy-control.js' => 'c01153ea', 405 405 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '263aeb8c', 406 406 'rsrc/js/application/ponder/behavior-votebox.js' => '327dbe61', 407 - 'rsrc/js/application/projects/behavior-project-boards.js' => '04c59172', 407 + 'rsrc/js/application/projects/behavior-project-boards.js' => 'd8e135db', 408 408 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 409 409 'rsrc/js/application/releeph/releeph-preview-branch.js' => '9eb2cedb', 410 410 'rsrc/js/application/releeph/releeph-request-state-change.js' => 'fe7fc914', ··· 614 614 'javelin-behavior-policy-control' => 'c01153ea', 615 615 'javelin-behavior-policy-rule-editor' => '263aeb8c', 616 616 'javelin-behavior-ponder-votebox' => '327dbe61', 617 - 'javelin-behavior-project-boards' => '04c59172', 617 + 'javelin-behavior-project-boards' => 'd8e135db', 618 618 'javelin-behavior-project-create' => '065227cc', 619 619 'javelin-behavior-refresh-csrf' => 'c4b31646', 620 620 'javelin-behavior-releeph-preview-branch' => '9eb2cedb', ··· 842 842 2 => 'javelin-dom', 843 843 3 => 'javelin-vector', 844 844 4 => 'javelin-install', 845 - ), 846 - '04c59172' => 847 - array( 848 - 0 => 'javelin-behavior', 849 - 1 => 'javelin-dom', 850 - 2 => 'javelin-util', 851 - 3 => 'javelin-stratcom', 852 - 4 => 'javelin-workflow', 853 - 5 => 'phabricator-draggable-list', 854 845 ), 855 846 '065227cc' => 856 847 array( ··· 1751 1742 2 => 'javelin-json', 1752 1743 3 => 'javelin-dom', 1753 1744 4 => 'phabricator-keyboard-shortcut', 1745 + ), 1746 + 'd8e135db' => 1747 + array( 1748 + 0 => 'javelin-behavior', 1749 + 1 => 'javelin-dom', 1750 + 2 => 'javelin-util', 1751 + 3 => 'javelin-stratcom', 1752 + 4 => 'javelin-workflow', 1753 + 5 => 'phabricator-draggable-list', 1754 1754 ), 1755 1755 'd8ef8659' => 1756 1756 array(
+2 -1
src/applications/maniphest/controller/ManiphestSubpriorityController.php
··· 45 45 ->setTransactionType(ManiphestTransaction::TYPE_SUBPRIORITY) 46 46 ->setNewValue(array( 47 47 'newPriority' => $after_pri, 48 - 'newSubpriorityBase' => $after_sub))); 48 + 'newSubpriorityBase' => $after_sub, 49 + 'direction' => '>'))); 49 50 $editor = id(new ManiphestTransactionEditor()) 50 51 ->setActor($user) 51 52 ->setContinueOnMissingFields(true)
+38 -8
src/applications/maniphest/editor/ManiphestTransactionEditor.php
··· 165 165 $data = $xaction->getNewValue(); 166 166 $new_sub = $this->getNextSubpriority( 167 167 $data['newPriority'], 168 - $data['newSubpriorityBase']); 168 + $data['newSubpriorityBase'], 169 + $data['direction']); 169 170 $object->setSubpriority($new_sub); 170 171 return; 171 172 case ManiphestTransaction::TYPE_PROJECT_COLUMN: ··· 441 442 return $copy; 442 443 } 443 444 444 - private function getNextSubpriority($pri, $sub) { 445 + private function getNextSubpriority($pri, $sub, $dir = '>') { 446 + 447 + switch ($dir) { 448 + case '>': 449 + $order = 'ASC'; 450 + break; 451 + case '<': 452 + $order = 'DESC'; 453 + break; 454 + default: 455 + throw new Exception('$dir must be ">" or "<".'); 456 + break; 457 + } 458 + 459 + if ($sub === null) { 460 + $base = 0; 461 + } else { 462 + $base = $sub; 463 + } 445 464 446 465 if ($sub === null) { 447 466 $next = id(new ManiphestTask())->loadOneWhere( 448 - 'priority = %d ORDER BY subpriority ASC LIMIT 1', 449 - $pri); 467 + 'priority = %d ORDER BY subpriority %Q LIMIT 1', 468 + $pri, 469 + $order); 450 470 if ($next) { 451 - return $next->getSubpriority() - ((double)(2 << 16)); 471 + if ($dir == '>') { 472 + return $next->getSubpriority() - ((double)(2 << 16)); 473 + } else { 474 + return $next->getSubpriority() + ((double)(2 << 16)); 475 + } 452 476 } 453 477 } else { 454 478 $next = id(new ManiphestTask())->loadOneWhere( 455 - 'priority = %d AND subpriority > %s ORDER BY subpriority ASC LIMIT 1', 479 + 'priority = %d AND subpriority %Q %f ORDER BY subpriority %Q LIMIT 1', 456 480 $pri, 457 - $sub); 481 + $dir, 482 + $sub, 483 + $order); 458 484 if ($next) { 459 485 return ($sub + $next->getSubpriority()) / 2; 460 486 } 461 487 } 462 488 463 - return (double)(2 << 32); 489 + if ($dir == '>') { 490 + return $base + (double)(2 << 32); 491 + } else { 492 + return $base - (double)(2 << 32); 493 + } 464 494 } 465 495 466 496 }
+47 -12
src/applications/project/controller/PhabricatorProjectMoveController.php
··· 16 16 $column_phid = $request->getStr('columnPHID'); 17 17 $object_phid = $request->getStr('objectPHID'); 18 18 $after_phid = $request->getStr('afterPHID'); 19 + $before_phid = $request->getStr('beforePHID'); 19 20 20 21 $project = id(new PhabricatorProjectQuery()) 21 22 ->setViewer($viewer) ··· 78 79 'columnPHIDs' => $edge_phids, 79 80 'projectPHID' => $column->getProjectPHID())); 80 81 82 + $task_phids = array(); 81 83 if ($after_phid) { 82 - $after_task = id(new ManiphestTaskQuery()) 84 + $task_phids[] = $after_phid; 85 + } 86 + if ($before_phid) { 87 + $task_phids[] = $before_phid; 88 + } 89 + if ($task_phids) { 90 + $tasks = id(new ManiphestTaskQuery()) 83 91 ->setViewer($viewer) 84 - ->withPHIDs(array($after_phid)) 92 + ->withPHIDs($task_phids) 85 93 ->requireCapabilities(array(PhabricatorPolicyCapability::CAN_EDIT)) 86 - ->executeOne(); 87 - if (!$after_task) { 94 + ->execute(); 95 + if (count($tasks) != count($task_phids)) { 88 96 return new Aphront404Response(); 89 97 } 90 - $after_pri = $after_task->getPriority(); 91 - $after_sub = $after_task->getSubpriority(); 98 + $tasks = mpull($tasks, null, 'getPHID'); 92 99 93 - $xactions[] = id(new ManiphestTransaction()) 94 - ->setTransactionType(ManiphestTransaction::TYPE_SUBPRIORITY) 95 - ->setNewValue(array( 96 - 'newPriority' => $after_pri, 97 - 'newSubpriorityBase' => $after_sub)); 98 - } 100 + $a_task = idx($tasks, $after_phid); 101 + $b_task = idx($tasks, $before_phid); 102 + 103 + if ($a_task && 104 + (($a_task->getPriority() < $object->getPriority()) || 105 + ($a_task->getPriority() == $object->getPriority() && 106 + $a_task->getSubpriority() >= $object->getSubpriority()))) { 107 + 108 + $after_pri = $a_task->getPriority(); 109 + $after_sub = $a_task->getSubpriority(); 110 + 111 + $xactions[] = id(new ManiphestTransaction()) 112 + ->setTransactionType(ManiphestTransaction::TYPE_SUBPRIORITY) 113 + ->setNewValue(array( 114 + 'newPriority' => $after_pri, 115 + 'newSubpriorityBase' => $after_sub, 116 + 'direction' => '>')); 117 + 118 + } else if ($b_task && 119 + (($b_task->getPriority() > $object->getPriority()) || 120 + ($b_task->getPriority() == $object->getPriority() && 121 + $b_task->getSubpriority() <= $object->getSubpriority()))) { 122 + 123 + $before_pri = $b_task->getPriority(); 124 + $before_sub = $b_task->getSubpriority(); 125 + 126 + $xactions[] = id(new ManiphestTransaction()) 127 + ->setTransactionType(ManiphestTransaction::TYPE_SUBPRIORITY) 128 + ->setNewValue(array( 129 + 'newPriority' => $before_pri, 130 + 'newSubpriorityBase' => $before_sub, 131 + 'direction' => '<')); 132 + } 133 + } 99 134 100 135 $editor = id(new ManiphestTransactionEditor()) 101 136 ->setActor($viewer)
+29 -2
webroot/rsrc/js/application/projects/behavior-project-boards.js
··· 28 28 list.lock(); 29 29 JX.DOM.alterClass(item, 'drag-sending', true); 30 30 31 + var item_phid = JX.Stratcom.getData(item).objectPHID; 31 32 var data = { 32 - objectPHID: JX.Stratcom.getData(item).objectPHID, 33 + objectPHID: item_phid, 33 34 columnPHID: JX.Stratcom.getData(list.getRootNode()).columnPHID 34 35 }; 35 36 37 + var after_phid = null; 38 + var items = finditems(list.getRootNode()); 36 39 if (after) { 37 - data.afterPHID = JX.Stratcom.getData(after).objectPHID; 40 + after_phid = JX.Stratcom.getData(after).objectPHID; 41 + data.afterPHID = after_phid; 42 + } 43 + var ii; 44 + var ii_item; 45 + var ii_item_phid; 46 + var ii_prev_item_phid = null; 47 + var before_phid = null; 48 + for (ii = 0; ii < items.length; ii++) { 49 + ii_item = items[ii]; 50 + ii_item_phid = JX.Stratcom.getData(ii_item).objectPHID; 51 + if (ii_item_phid == item_phid) { 52 + // skip the item we just dropped 53 + continue; 54 + } 55 + // note this handles when there is no after phid - we are at the top of 56 + // the list - quite nicely 57 + if (ii_prev_item_phid == after_phid) { 58 + before_phid = ii_item_phid; 59 + break; 60 + } 61 + ii_prev_item_phid = ii_item_phid; 62 + } 63 + if (before_phid) { 64 + data.beforePHID = before_phid; 38 65 } 39 66 40 67 var workflow = new JX.Workflow(config.moveURI, data)