mirror of
https://we.phorge.it/source/phorge.git
synced 2025-01-18 02:31:10 +01:00
When a task is removed from projects, remove its position on proxy columns for those projects
Summary: Fixes T11088. When a task is removed from a project, we don't normally delete its column positions. If you accidentally remove a project and then restore the project, it's nice for the task to stay where you put it. However, we do need to remove its positions in proxy columns to avoid the issue in T11088. Test Plan: - Added a failing unit test, made it pass. - Added a task to "X > Milestone 1", loaded workboard, used "Edit Projects" to move it to "X" instead, loaded workboard. - Before, it stayed in the "Milestone 1" column. - After, it moves to the "Backlog" column. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11088 Differential Revision: https://secure.phabricator.com/D16052
This commit is contained in:
parent
b4a07d528f
commit
f97d120c3f
2 changed files with 61 additions and 0 deletions
|
@ -1044,6 +1044,21 @@ final class PhabricatorProjectCoreTestCase extends PhabricatorTestCase {
|
|||
$this->moveToColumn($user, $board, $task_a, $column, $column, $a_options);
|
||||
$new_projects = $this->getTaskProjects($task_a);
|
||||
$this->assertEqual($old_projects, $new_projects);
|
||||
|
||||
|
||||
// Add the parent project to the task. This should move it out of the
|
||||
// milestone column and into the parent's backlog.
|
||||
$this->addProjectTags($user, $task, array($board->getPHID()));
|
||||
$expect_columns = array(
|
||||
$backlog->getPHID(),
|
||||
);
|
||||
$this->assertColumns($expect_columns, $user, $board, $task);
|
||||
|
||||
$new_projects = $this->getTaskProjects($task);
|
||||
$expect_projects = array(
|
||||
$board->getPHID(),
|
||||
);
|
||||
$this->assertEqual($expect_projects, $new_projects);
|
||||
}
|
||||
|
||||
public function testColumnExtendedPolicies() {
|
||||
|
|
|
@ -677,6 +677,8 @@ abstract class PhabricatorApplicationTransactionEditor
|
|||
}
|
||||
|
||||
$editor->save();
|
||||
|
||||
$this->updateWorkboardColumns($object, $const, $old, $new);
|
||||
break;
|
||||
case PhabricatorTransactions::TYPE_VIEW_POLICY:
|
||||
case PhabricatorTransactions::TYPE_SPACE:
|
||||
|
@ -3603,4 +3605,48 @@ abstract class PhabricatorApplicationTransactionEditor
|
|||
return true;
|
||||
}
|
||||
|
||||
private function updateWorkboardColumns($object, $const, $old, $new) {
|
||||
// If an object is removed from a project, remove it from any proxy
|
||||
// columns for that project. This allows a task which is moved up from a
|
||||
// milestone to the parent to move back into the "Backlog" column on the
|
||||
// parent workboard.
|
||||
|
||||
if ($const != PhabricatorProjectObjectHasProjectEdgeType::EDGECONST) {
|
||||
return;
|
||||
}
|
||||
|
||||
// TODO: This should likely be some future WorkboardInterface.
|
||||
$appears_on_workboards = ($object instanceof ManiphestTask);
|
||||
if (!$appears_on_workboards) {
|
||||
return;
|
||||
}
|
||||
|
||||
$removed_phids = array_keys(array_diff_key($old, $new));
|
||||
if (!$removed_phids) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Find any proxy columns for the removed projects.
|
||||
$proxy_columns = id(new PhabricatorProjectColumnQuery())
|
||||
->setViewer(PhabricatorUser::getOmnipotentUser())
|
||||
->withProxyPHIDs($removed_phids)
|
||||
->execute();
|
||||
if (!$proxy_columns) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$proxy_phids = mpull($proxy_columns, 'getPHID');
|
||||
|
||||
$position_table = new PhabricatorProjectColumnPosition();
|
||||
$conn_w = $position_table->establishConnection('w');
|
||||
|
||||
queryfx(
|
||||
$conn_w,
|
||||
'DELETE FROM %T WHERE objectPHID = %s AND columnPHID IN (%Ls)',
|
||||
$position_table->getTableName(),
|
||||
$object->getPHID(),
|
||||
$proxy_phids);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue