|
<?php |
|
|
|
namespace Kanboard\Model; |
|
|
|
use Kanboard\Core\Base; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SwimlaneModel extends Base |
|
{ |
|
|
|
|
|
|
|
|
|
|
|
const TABLE = 'swimlanes'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
const ACTIVE = 1; |
|
|
|
|
|
|
|
|
|
|
|
|
|
const INACTIVE = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getById($swimlaneId) |
|
{ |
|
return $this->db->table(self::TABLE)->eq('id', $swimlaneId)->findOne(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getNameById($swimlaneId) |
|
{ |
|
return $this->db->table(self::TABLE) |
|
->eq('id', $swimlaneId) |
|
->findOneColumn('name'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getIdByName($projectId, $name) |
|
{ |
|
return (int) $this->db->table(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->eq('name', $name) |
|
->findOneColumn('id'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getByName($projectId, $name) |
|
{ |
|
return $this->db->table(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->eq('name', $name) |
|
->findOne(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getFirstActiveSwimlane($projectId) |
|
{ |
|
return $this->db->table(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->eq('is_active', 1) |
|
->asc('position') |
|
->findOne(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getFirstActiveSwimlaneId($projectId) |
|
{ |
|
return (int) $this->db->table(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->eq('is_active', 1) |
|
->asc('position') |
|
->findOneColumn('id'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getAll($projectId) |
|
{ |
|
return $this->db |
|
->table(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->orderBy('position', 'asc') |
|
->findAll(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getAllByStatus($projectId, $status = self::ACTIVE) |
|
{ |
|
$query = $this->db |
|
->table(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->eq('is_active', $status); |
|
|
|
if ($status == self::ACTIVE) { |
|
$query->asc('position'); |
|
} else { |
|
$query->asc('name'); |
|
} |
|
|
|
return $query->findAll(); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getAllWithTaskCount($project_id) |
|
{ |
|
$result = array( |
|
'active' => array(), |
|
'inactive' => array(), |
|
); |
|
|
|
$swimlanes = $this->db->table(self::TABLE) |
|
->columns('id', 'name', 'description', 'project_id', 'position', 'is_active', 'task_limit') |
|
->subquery("SELECT COUNT(*) FROM ".TaskModel::TABLE." WHERE swimlane_id=".self::TABLE.".id AND is_active='1'", 'nb_open_tasks') |
|
->subquery("SELECT COUNT(*) FROM ".TaskModel::TABLE." WHERE swimlane_id=".self::TABLE.".id AND is_active='0'", 'nb_closed_tasks') |
|
->eq('project_id', $project_id) |
|
->asc('position') |
|
->asc('name') |
|
->findAll(); |
|
|
|
foreach ($swimlanes as $swimlane) { |
|
if ($swimlane['is_active']) { |
|
$result['active'][] = $swimlane; |
|
} else { |
|
$result['inactive'][] = $swimlane; |
|
} |
|
} |
|
|
|
return $result; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getList($projectId, $prepend = false, $onlyActive = false) |
|
{ |
|
$swimlanes = array(); |
|
|
|
if ($prepend) { |
|
$swimlanes[-1] = t('All swimlanes'); |
|
} |
|
|
|
return $swimlanes + $this->db |
|
->hashtable(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->in('is_active', $onlyActive ? array(self::ACTIVE) : array(self::ACTIVE, self::INACTIVE)) |
|
->orderBy('position', 'asc') |
|
->getAll('id', 'name'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function create($projectId, $name, $description = '', $task_limit = 0) |
|
{ |
|
if (! $this->projectModel->exists($projectId)) { |
|
return 0; |
|
} |
|
|
|
return $this->db->table(self::TABLE)->persist(array( |
|
'project_id' => $projectId, |
|
'name' => $name, |
|
'description' => $description, |
|
'position' => $this->getLastPosition($projectId), |
|
'is_active' => 1, |
|
'task_limit' => intval($task_limit), |
|
)); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function update($swimlaneId, array $values) |
|
{ |
|
unset($values['id']); |
|
unset($values['project_id']); |
|
|
|
return $this->db |
|
->table(self::TABLE) |
|
->eq('id', $swimlaneId) |
|
->update($values); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getLastPosition($projectId) |
|
{ |
|
return $this->db |
|
->table(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->eq('is_active', 1) |
|
->count() + 1; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function disable($projectId, $swimlaneId) |
|
{ |
|
$result = $this->db |
|
->table(self::TABLE) |
|
->eq('id', $swimlaneId) |
|
->eq('project_id', $projectId) |
|
->update(array( |
|
'is_active' => self::INACTIVE, |
|
'position' => 0, |
|
)); |
|
|
|
if ($result) { |
|
$this->updatePositions($projectId); |
|
} |
|
|
|
return $result; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function enable($projectId, $swimlaneId) |
|
{ |
|
return $this->db |
|
->table(self::TABLE) |
|
->eq('id', $swimlaneId) |
|
->eq('project_id', $projectId) |
|
->update(array( |
|
'is_active' => self::ACTIVE, |
|
'position' => $this->getLastPosition($projectId), |
|
)); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function remove($projecId, $swimlaneId) |
|
{ |
|
$this->db->startTransaction(); |
|
|
|
if ($this->db->table(TaskModel::TABLE)->eq('swimlane_id', $swimlaneId)->exists()) { |
|
$this->db->cancelTransaction(); |
|
return false; |
|
} |
|
|
|
if (! $this->db->table(self::TABLE)->eq('id', $swimlaneId)->remove()) { |
|
$this->db->cancelTransaction(); |
|
return false; |
|
} |
|
|
|
$this->updatePositions($projecId); |
|
$this->db->closeTransaction(); |
|
|
|
return true; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function updatePositions($projectId) |
|
{ |
|
$position = 0; |
|
$swimlanes = $this->db |
|
->table(self::TABLE) |
|
->eq('project_id', $projectId) |
|
->eq('is_active', 1) |
|
->asc('position') |
|
->asc('id') |
|
->findAllByColumn('id'); |
|
|
|
if (! $swimlanes) { |
|
return false; |
|
} |
|
|
|
foreach ($swimlanes as $swimlane_id) { |
|
$this->db->table(self::TABLE) |
|
->eq('id', $swimlane_id) |
|
->update(array('position' => ++$position)); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function changePosition($projectId, $swimlaneId, $position) |
|
{ |
|
if ($position < 1 || $position > $this->db->table(self::TABLE)->eq('project_id', $projectId)->count()) { |
|
return false; |
|
} |
|
|
|
$swimlaneIds = $this->db->table(self::TABLE) |
|
->eq('is_active', 1) |
|
->eq('project_id', $projectId) |
|
->neq('id', $swimlaneId) |
|
->asc('position') |
|
->findAllByColumn('id'); |
|
|
|
$offset = 1; |
|
$results = array(); |
|
|
|
foreach ($swimlaneIds as $currentSwimlaneId) { |
|
if ($offset == $position) { |
|
$offset++; |
|
} |
|
|
|
$results[] = $this->db->table(self::TABLE)->eq('id', $currentSwimlaneId)->update(array('position' => $offset)); |
|
$offset++; |
|
} |
|
|
|
$results[] = $this->db->table(self::TABLE)->eq('id', $swimlaneId)->update(array('position' => $position)); |
|
|
|
return !in_array(false, $results, true); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function duplicate($projectSrcId, $projectDstId) |
|
{ |
|
$swimlanes = $this->getAll($projectSrcId); |
|
|
|
foreach ($swimlanes as $swimlane) { |
|
if (! $this->db->table(self::TABLE)->eq('project_id', $projectDstId)->eq('name', $swimlane['name'])->exists()) { |
|
$values = array( |
|
'name' => $swimlane['name'], |
|
'description' => $swimlane['description'], |
|
'position' => $swimlane['position'], |
|
'is_active' => $swimlane['is_active'] ? self::ACTIVE : self::INACTIVE, |
|
'project_id' => $projectDstId, |
|
); |
|
|
|
if (! $this->db->table(self::TABLE)->persist($values)) { |
|
return false; |
|
} |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
} |
|
|