Fix issue move column up/down with non consecutive positions
This commit is contained in:
@@ -145,6 +145,46 @@ class Board extends Base
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get columns with consecutive positions
|
||||
*
|
||||
* If you remove a column, the positions are not anymore consecutives
|
||||
*
|
||||
* @access public
|
||||
* @param integer $project_id
|
||||
* @return array
|
||||
*/
|
||||
public function getNormalizedColumnPositions($project_id)
|
||||
{
|
||||
$columns = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'position');
|
||||
$position = 1;
|
||||
|
||||
foreach ($columns as $column_id => $column_position) {
|
||||
$columns[$column_id] = $position++;
|
||||
}
|
||||
|
||||
return $columns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the new positions for a set of columns
|
||||
*
|
||||
* @access public
|
||||
* @param array $columns Hashmap of column_id/column_position
|
||||
* @return boolean
|
||||
*/
|
||||
public function saveColumnPositions(array $columns)
|
||||
{
|
||||
return $this->db->transaction(function ($db) use ($columns) {
|
||||
|
||||
foreach ($columns as $column_id => $position) {
|
||||
if (! $db->table(self::TABLE)->eq('id', $column_id)->update(array('position' => $position))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Move a column down, increment the column position value
|
||||
*
|
||||
@@ -155,7 +195,7 @@ class Board extends Base
|
||||
*/
|
||||
public function moveDown($project_id, $column_id)
|
||||
{
|
||||
$columns = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'position');
|
||||
$columns = $this->getNormalizedColumnPositions($project_id);
|
||||
$positions = array_flip($columns);
|
||||
|
||||
if (isset($columns[$column_id]) && $columns[$column_id] < count($columns)) {
|
||||
@@ -163,12 +203,7 @@ class Board extends Base
|
||||
$position = ++$columns[$column_id];
|
||||
$columns[$positions[$position]]--;
|
||||
|
||||
$this->db->startTransaction();
|
||||
$this->db->table(self::TABLE)->eq('id', $column_id)->update(array('position' => $position));
|
||||
$this->db->table(self::TABLE)->eq('id', $positions[$position])->update(array('position' => $columns[$positions[$position]]));
|
||||
$this->db->closeTransaction();
|
||||
|
||||
return true;
|
||||
return $this->saveColumnPositions($columns);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -184,7 +219,7 @@ class Board extends Base
|
||||
*/
|
||||
public function moveUp($project_id, $column_id)
|
||||
{
|
||||
$columns = $this->db->hashtable(self::TABLE)->eq('project_id', $project_id)->asc('position')->getAll('id', 'position');
|
||||
$columns = $this->getNormalizedColumnPositions($project_id);
|
||||
$positions = array_flip($columns);
|
||||
|
||||
if (isset($columns[$column_id]) && $columns[$column_id] > 1) {
|
||||
@@ -192,12 +227,7 @@ class Board extends Base
|
||||
$position = --$columns[$column_id];
|
||||
$columns[$positions[$position]]++;
|
||||
|
||||
$this->db->startTransaction();
|
||||
$this->db->table(self::TABLE)->eq('id', $column_id)->update(array('position' => $position));
|
||||
$this->db->table(self::TABLE)->eq('id', $positions[$position])->update(array('position' => $columns[$positions[$position]]));
|
||||
$this->db->closeTransaction();
|
||||
|
||||
return true;
|
||||
return $this->saveColumnPositions($columns);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user