Create TaskPosition model

This commit is contained in:
Frédéric Guillot
2014-11-23 14:42:49 -05:00
parent 4d007ec39f
commit 9ae83c639e
9 changed files with 605 additions and 461 deletions

View File

@@ -109,12 +109,6 @@ class Task extends Base
if (isset($updated_task['owner_id']) && $original_task['owner_id'] != $updated_task['owner_id']) {
$events[] = self::EVENT_ASSIGNEE_CHANGE;
}
else if (isset($updated_task['column_id']) && $original_task['column_id'] != $updated_task['column_id']) {
$events[] = self::EVENT_MOVE_COLUMN;
}
else if (isset($updated_task['position']) && $original_task['position'] != $updated_task['position']) {
$events[] = self::EVENT_MOVE_POSITION;
}
else {
$events[] = self::EVENT_CREATE_UPDATE;
$events[] = self::EVENT_UPDATE;
@@ -146,93 +140,6 @@ class Task extends Base
return $this->db->table(self::TABLE)->eq('id', $task_id)->remove();
}
/**
* Move a task to another column or to another position
*
* @access public
* @param integer $project_id Project id
* @param integer $task_id Task id
* @param integer $column_id Column id
* @param integer $position Position (must be >= 1)
* @return boolean
*/
public function movePosition($project_id, $task_id, $column_id, $position)
{
// The position can't be lower than 1
if ($position < 1) {
return false;
}
$board = $this->db->table(Board::TABLE)->eq('project_id', $project_id)->asc('position')->findAllByColumn('id');
$columns = array();
// Prepare the columns
foreach ($board as $board_column_id) {
$columns[$board_column_id] = $this->db->table(self::TABLE)
->eq('is_active', 1)
->eq('project_id', $project_id)
->eq('column_id', $board_column_id)
->neq('id', $task_id)
->asc('position')
->findAllByColumn('id');
}
// The column must exists
if (! isset($columns[$column_id])) {
return false;
}
// We put our task to the new position
array_splice($columns[$column_id], $position - 1, 0, $task_id); // print_r($columns);
// We save the new positions for all tasks
return $this->savePositions($task_id, $columns);
}
/**
* Save task positions
*
* @access private
* @param integer $moved_task_id Id of the moved task
* @param array $columns Sorted tasks
* @return boolean
*/
private function savePositions($moved_task_id, array $columns)
{
foreach ($columns as $column_id => $column) {
$position = 1;
foreach ($column as $task_id) {
if ($task_id == $moved_task_id) {
// Events will be triggered only for that task
$result = $this->update(array(
'id' => $task_id,
'position' => $position,
'column_id' => $column_id
));
}
else {
$result = $this->db->table(self::TABLE)->eq('id', $task_id)->update(array(
'position' => $position,
'column_id' => $column_id
));
}
$position++;
if (! $result) {
return false;
}
}
}
return true;
}
/**
* Move a task to another project
*