Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15428465
D8366.id19884.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
10 KB
Referenced Files
None
Subscribers
None
D8366.id19884.diff
View Options
diff --git a/src/applications/maniphest/editor/ManiphestTransactionEditor.php b/src/applications/maniphest/editor/ManiphestTransactionEditor.php
--- a/src/applications/maniphest/editor/ManiphestTransactionEditor.php
+++ b/src/applications/maniphest/editor/ManiphestTransactionEditor.php
@@ -17,6 +17,7 @@
$types[] = ManiphestTransaction::TYPE_ATTACH;
$types[] = ManiphestTransaction::TYPE_EDGE;
$types[] = ManiphestTransaction::TYPE_SUBPRIORITY;
+ $types[] = ManiphestTransaction::TYPE_PROJECT_COLUMN;
$types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
$types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
@@ -59,6 +60,9 @@
case ManiphestTransaction::TYPE_EDGE:
// These are pre-populated.
return $xaction->getOldValue();
+ case ManiphestTransaction::TYPE_PROJECT_COLUMN:
+ $new = $xaction->getNewValue();
+ return $new['oldColumnPHIDs'];
case ManiphestTransaction::TYPE_SUBPRIORITY:
return $object->getSubpriority();
}
@@ -83,6 +87,7 @@
case ManiphestTransaction::TYPE_ATTACH:
case ManiphestTransaction::TYPE_EDGE:
case ManiphestTransaction::TYPE_SUBPRIORITY:
+ case ManiphestTransaction::TYPE_PROJECT_COLUMN:
return $xaction->getNewValue();
}
}
@@ -101,6 +106,15 @@
sort($old);
sort($new);
return ($old !== $new);
+ case ManiphestTransaction::TYPE_PROJECT_COLUMN:
+ $new_column_phid = $new['columnPHID'];
+ $old_column_phids = $new['oldColumnPHIDs'];
+ if (count($old_column_phids) == 1) {
+ $old_column_phid = head($old_column_phids);
+ return $old_column_phid != $new_column_phid;
+ }
+ // this means we have stray edges we should clean up
+ return true;
}
return parent::transactionHasEffect($object, $xaction);
@@ -157,6 +171,9 @@
$data['newSubpriorityBase']);
$object->setSubpriority($new_sub);
return;
+ case ManiphestTransaction::TYPE_PROJECT_COLUMN:
+ // these do external (edge) updates
+ return;
}
}
@@ -186,11 +203,58 @@
protected function applyCustomExternalTransaction(
PhabricatorLiskDAO $object,
PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case ManiphestTransaction::TYPE_PROJECT_COLUMN:
+ $new = $xaction->getNewValue();
+ $src = $object->getPHID();
+ $dst = $new['columnPHID'];
+ $edges = $new['oldColumnPHIDs'];
+ $edge_type = PhabricatorEdgeConfig::TYPE_OBJECT_HAS_COLUMN;
+ // NOTE: Normally, we expect only one edge to exist, but this works in
+ // a general way so it will repair any stray edges.
+ $remove = array();
+ $edge_missing = true;
+ foreach ($edges as $phid) {
+ if ($phid == $dst) {
+ $edge_missing = false;
+ } else {
+ $remove[] = $phid;
+ }
+ }
+
+ $add = array();
+ if ($edge_missing) {
+ $add[] = $dst;
+ }
+
+ // This should never happen because of the code in
+ // transactionHasEffect, but keep it for maximum conservativeness
+ if (!$add && !$remove) {
+ return;
+ }
+
+ $editor = id(new PhabricatorEdgeEditor())
+ ->setActor($this->getActor())
+ ->setSuppressEvents(true);
+
+ foreach ($add as $phid) {
+ $editor->addEdge($src, $edge_type, $phid);
+ }
+ foreach ($remove as $phid) {
+ $editor->removeEdge($src, $edge_type, $phid);
+ }
+ $editor->save();
+ break;
+ default:
+ break;
+ }
}
protected function shouldSendMail(
PhabricatorLiskDAO $object,
array $xactions) {
+
$should_mail = true;
if (count($xactions) == 1) {
$xaction = head($xactions);
diff --git a/src/applications/maniphest/storage/ManiphestTransaction.php b/src/applications/maniphest/storage/ManiphestTransaction.php
--- a/src/applications/maniphest/storage/ManiphestTransaction.php
+++ b/src/applications/maniphest/storage/ManiphestTransaction.php
@@ -13,6 +13,7 @@
const TYPE_EDGE = 'edge';
const TYPE_ATTACH = 'attach';
const TYPE_SUBPRIORITY = 'subpriority';
+ const TYPE_PROJECT_COLUMN = 'projectcolumn';
public function getApplicationName() {
return 'maniphest';
@@ -51,6 +52,10 @@
nonempty($new, array()),
));
break;
+ case self::TYPE_PROJECT_COLUMN:
+ $phids[] = $new['projectPHID'];
+ $phids[] = $new['columnPHID'];
+ break;
case self::TYPE_EDGE:
$phids = array_mergev(
array(
@@ -188,6 +193,9 @@
case self::TYPE_PROJECTS:
return pht('Changed Projects');
+ case self::TYPE_PROJECT_COLUMN:
+ return pht('Changed Project Column');
+
case self::TYPE_PRIORITY:
if ($old == ManiphestTaskPriority::getDefaultPriority()) {
return pht('Triaged');
@@ -237,6 +245,9 @@
case self::TYPE_PROJECTS:
return 'project';
+ case self::TYPE_PROJECT_COLUMN:
+ return 'workboard';
+
case self::TYPE_PRIORITY:
if ($old == ManiphestTaskPriority::getDefaultPriority()) {
return 'normal-priority';
@@ -428,6 +439,16 @@
$this->renderHandleList($removed));
}
+ case self::TYPE_PROJECT_COLUMN:
+ $project_phid = $new['projectPHID'];
+ $column_phid = $new['columnPHID'];
+ return pht(
+ '%s moved this task to %s on the %s workboard.',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($column_phid),
+ $this->renderHandleLink($project_phid));
+ break;
+
}
@@ -620,6 +641,15 @@
$this->renderHandleList($removed));
}
+ case self::TYPE_PROJECT_COLUMN:
+ $project_phid = $new['projectPHID'];
+ $column_phid = $new['columnPHID'];
+ return pht(
+ '%s moved this task to %s on the %s workboard.',
+ $this->renderHandleLink($author_phid),
+ $this->renderHandleLink($column_phid),
+ $this->renderHandleLink($project_phid));
+ break;
}
return parent::getTitleForFeed($story);
diff --git a/src/applications/project/controller/PhabricatorProjectMoveController.php b/src/applications/project/controller/PhabricatorProjectMoveController.php
--- a/src/applications/project/controller/PhabricatorProjectMoveController.php
+++ b/src/applications/project/controller/PhabricatorProjectMoveController.php
@@ -49,12 +49,15 @@
->execute();
$columns = mpull($columns, null, 'getPHID');
- if (empty($columns[$column_phid])) {
+ $column = idx($columns, $column_phid);
+ if (!$column) {
// User is trying to drop this object into a nonexistent column, just kick
// them out.
return new Aphront404Response();
}
+ $xactions = array();
+
$edge_type = PhabricatorEdgeConfig::TYPE_OBJECT_HAS_COLUMN;
$query = id(new PhabricatorEdgeQuery())
@@ -66,11 +69,12 @@
$edge_phids = $query->getDestinationPHIDs();
- $this->rewriteEdges(
- $object->getPHID(),
- $edge_type,
- $column_phid,
- $edge_phids);
+ $xactions[] = id(new ManiphestTransaction())
+ ->setTransactionType(ManiphestTransaction::TYPE_PROJECT_COLUMN)
+ ->setNewValue(array(
+ 'columnPHID' => $column->getPHID(),
+ 'projectPHID' => $column->getProjectPHID(),
+ 'oldColumnPHIDs' => $edge_phids));
if ($after_phid) {
$after_task = id(new ManiphestTaskQuery())
@@ -84,60 +88,22 @@
$after_pri = $after_task->getPriority();
$after_sub = $after_task->getSubpriority();
- $xactions = array(id(new ManiphestTransaction())
+ $xactions[] = id(new ManiphestTransaction())
->setTransactionType(ManiphestTransaction::TYPE_SUBPRIORITY)
->setNewValue(array(
'newPriority' => $after_pri,
- 'newSubpriorityBase' => $after_sub)));
- $editor = id(new ManiphestTransactionEditor())
- ->setActor($viewer)
- ->setContinueOnMissingFields(true)
- ->setContinueOnNoEffect(true)
- ->setContentSourceFromRequest($request);
-
- $editor->applyTransactions($object, $xactions);
- }
-
- return id(new AphrontAjaxResponse())->setContent(array());
- }
-
- private function rewriteEdges($src, $edge_type, $dst, array $edges) {
- $viewer = $this->getRequest()->getUser();
-
- // NOTE: Normally, we expect only one edge to exist, but this works in a
- // general way so it will repair any stray edges.
-
- $remove = array();
- $edge_missing = true;
- foreach ($edges as $phid) {
- if ($phid == $dst) {
- $edge_missing = false;
- } else {
- $remove[] = $phid;
- }
- }
-
- $add = array();
- if ($edge_missing) {
- $add[] = $dst;
- }
-
- if (!$add && !$remove) {
- return;
+ 'newSubpriorityBase' => $after_sub));
}
- $editor = id(new PhabricatorEdgeEditor())
+ $editor = id(new ManiphestTransactionEditor())
->setActor($viewer)
- ->setSuppressEvents(true);
+ ->setContinueOnMissingFields(true)
+ ->setContinueOnNoEffect(true)
+ ->setContentSourceFromRequest($request);
- foreach ($add as $phid) {
- $editor->addEdge($src, $edge_type, $phid);
- }
- foreach ($remove as $phid) {
- $editor->removeEdge($src, $edge_type, $phid);
- }
+ $editor->applyTransactions($object, $xactions);
- $editor->save();
+ return id(new AphrontAjaxResponse())->setContent(array());
}
}
diff --git a/webroot/rsrc/js/application/projects/behavior-project-boards.js b/webroot/rsrc/js/application/projects/behavior-project-boards.js
--- a/webroot/rsrc/js/application/projects/behavior-project-boards.js
+++ b/webroot/rsrc/js/application/projects/behavior-project-boards.js
@@ -28,10 +28,13 @@
var data = {
objectPHID: JX.Stratcom.getData(item).objectPHID,
- columnPHID: JX.Stratcom.getData(list.getRootNode()).columnPHID,
- afterPHID: after && JX.Stratcom.getData(after).objectPHID
+ columnPHID: JX.Stratcom.getData(list.getRootNode()).columnPHID
};
+ if (after) {
+ data.afterPHID = JX.Stratcom.getData(after).objectPHID;
+ }
+
var workflow = new JX.Workflow(config.moveURI, data)
.setHandler(function(response) {
onresponse(response);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Mar 24, 8:32 PM (6 d, 19 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7720697
Default Alt Text
D8366.id19884.diff (10 KB)
Attached To
Mode
D8366: Workboards - add transactions for column changes
Attached
Detach File
Event Timeline
Log In to Comment