Fix issue move column up/down with non consecutive positions
This commit is contained in:
parent
94865a7c03
commit
7b7ea56460
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -289,4 +289,84 @@ class BoardTest extends Base
|
|||
$this->assertEquals(4, $columns[3]['position']);
|
||||
$this->assertEquals($columns_id[3], $columns[3]['id']);
|
||||
}
|
||||
|
||||
public function testMoveUpAndRemoveColumn()
|
||||
{
|
||||
$p = new Project($this->container);
|
||||
$b = new Board($this->container);
|
||||
|
||||
// We create a project
|
||||
$this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
|
||||
|
||||
// We remove the second column
|
||||
$this->assertTrue($b->removeColumn(2));
|
||||
|
||||
$columns = $b->getColumns(1);
|
||||
$this->assertNotEmpty($columns);
|
||||
$this->assertCount(3, $columns);
|
||||
|
||||
$this->assertEquals(1, $columns[0]['position']);
|
||||
$this->assertEquals(3, $columns[1]['position']);
|
||||
$this->assertEquals(4, $columns[2]['position']);
|
||||
|
||||
$this->assertEquals(1, $columns[0]['id']);
|
||||
$this->assertEquals(3, $columns[1]['id']);
|
||||
$this->assertEquals(4, $columns[2]['id']);
|
||||
|
||||
// We move up the second column
|
||||
$this->assertTrue($b->moveUp(1, $columns[1]['id']));
|
||||
|
||||
// Check the new positions
|
||||
$columns = $b->getColumns(1);
|
||||
$this->assertNotEmpty($columns);
|
||||
$this->assertCount(3, $columns);
|
||||
|
||||
$this->assertEquals(1, $columns[0]['position']);
|
||||
$this->assertEquals(2, $columns[1]['position']);
|
||||
$this->assertEquals(3, $columns[2]['position']);
|
||||
|
||||
$this->assertEquals(3, $columns[0]['id']);
|
||||
$this->assertEquals(1, $columns[1]['id']);
|
||||
$this->assertEquals(4, $columns[2]['id']);
|
||||
}
|
||||
|
||||
public function testMoveDownAndRemoveColumn()
|
||||
{
|
||||
$p = new Project($this->container);
|
||||
$b = new Board($this->container);
|
||||
|
||||
// We create a project
|
||||
$this->assertEquals(1, $p->create(array('name' => 'UnitTest1')));
|
||||
|
||||
// We remove the second column
|
||||
$this->assertTrue($b->removeColumn(2));
|
||||
|
||||
$columns = $b->getColumns(1);
|
||||
$this->assertNotEmpty($columns);
|
||||
$this->assertCount(3, $columns);
|
||||
|
||||
$this->assertEquals(1, $columns[0]['position']);
|
||||
$this->assertEquals(3, $columns[1]['position']);
|
||||
$this->assertEquals(4, $columns[2]['position']);
|
||||
|
||||
$this->assertEquals(1, $columns[0]['id']);
|
||||
$this->assertEquals(3, $columns[1]['id']);
|
||||
$this->assertEquals(4, $columns[2]['id']);
|
||||
|
||||
// We move up the second column
|
||||
$this->assertTrue($b->moveDown(1, $columns[0]['id']));
|
||||
|
||||
// Check the new positions
|
||||
$columns = $b->getColumns(1);
|
||||
$this->assertNotEmpty($columns);
|
||||
$this->assertCount(3, $columns);
|
||||
|
||||
$this->assertEquals(1, $columns[0]['position']);
|
||||
$this->assertEquals(2, $columns[1]['position']);
|
||||
$this->assertEquals(3, $columns[2]['position']);
|
||||
|
||||
$this->assertEquals(3, $columns[0]['id']);
|
||||
$this->assertEquals(1, $columns[1]['id']);
|
||||
$this->assertEquals(4, $columns[2]['id']);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ class ProjectActivityTest extends Base
|
|||
$this->assertNotEmpty($events);
|
||||
$this->assertTrue(is_array($events));
|
||||
$this->assertEquals(2, count($events));
|
||||
$this->assertEquals(time(), $events[0]['date_creation']);
|
||||
$this->assertEquals(time(), $events[0]['date_creation'], '', 1);
|
||||
$this->assertEquals(Task::EVENT_UPDATE, $events[0]['event_name']);
|
||||
$this->assertEquals(Task::EVENT_CLOSE, $events[1]['event_name']);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue