Remove default swimlane

This commit is contained in:
Frederic Guillot 2017-02-18 09:42:01 -05:00
parent 0430a09c06
commit de128dbad8
77 changed files with 885 additions and 1159 deletions

View File

@ -9,6 +9,13 @@ Improvements:
* Use contextual menu instead of action column in users management * Use contextual menu instead of action column in users management
Breaking changes:
* The concept of "default swimlane" is removed
* Previous default swimlanes are migrated to an independent swimlane
* Columns "default_swimlane" and "show_default_swimlane" from "projects" table are not used anymore
* Remove API method "getDefaultSwimlane()"
Bug fixes: Bug fixes:
* Hiding subtasks from hidden tasks in dashboard * Hiding subtasks from hidden tasks in dashboard

View File

@ -3,6 +3,7 @@
namespace Kanboard\Api\Procedure; namespace Kanboard\Api\Procedure;
use Kanboard\Api\Authorization\ProjectAuthorization; use Kanboard\Api\Authorization\ProjectAuthorization;
use Kanboard\Model\SwimlaneModel;
/** /**
* Swimlane API controller * Swimlane API controller
@ -15,7 +16,7 @@ class SwimlaneProcedure extends BaseProcedure
public function getActiveSwimlanes($project_id) public function getActiveSwimlanes($project_id)
{ {
ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getActiveSwimlanes', $project_id); ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getActiveSwimlanes', $project_id);
return $this->swimlaneModel->getSwimlanes($project_id); return $this->swimlaneModel->getAllByStatus($project_id, SwimlaneModel::ACTIVE);
} }
public function getAllSwimlanes($project_id) public function getAllSwimlanes($project_id)
@ -42,16 +43,10 @@ class SwimlaneProcedure extends BaseProcedure
return $this->swimlaneModel->getById($swimlane_id); return $this->swimlaneModel->getById($swimlane_id);
} }
public function getDefaultSwimlane($project_id)
{
ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getDefaultSwimlane', $project_id);
return $this->swimlaneModel->getDefault($project_id);
}
public function addSwimlane($project_id, $name, $description = '') public function addSwimlane($project_id, $name, $description = '')
{ {
ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'addSwimlane', $project_id); ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'addSwimlane', $project_id);
return $this->swimlaneModel->create(array('project_id' => $project_id, 'name' => $name, 'description' => $description)); return $this->swimlaneModel->create($project_id, $name, $description);
} }
public function updateSwimlane($swimlane_id, $name, $description = null) public function updateSwimlane($swimlane_id, $name, $description = null)

View File

@ -68,7 +68,7 @@ class TaskProcedure extends BaseProcedure
return $this->taskModel->remove($task_id); return $this->taskModel->remove($task_id);
} }
public function moveTaskPosition($project_id, $task_id, $column_id, $position, $swimlane_id = 0) public function moveTaskPosition($project_id, $task_id, $column_id, $position, $swimlane_id)
{ {
ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'moveTaskPosition', $project_id); ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'moveTaskPosition', $project_id);
return $this->taskPositionModel->movePosition($project_id, $task_id, $column_id, $position, $swimlane_id); return $this->taskPositionModel->movePosition($project_id, $task_id, $column_id, $position, $swimlane_id);
@ -87,7 +87,7 @@ class TaskProcedure extends BaseProcedure
} }
public function createTask($title, $project_id, $color_id = '', $column_id = 0, $owner_id = 0, $creator_id = 0, public function createTask($title, $project_id, $color_id = '', $column_id = 0, $owner_id = 0, $creator_id = 0,
$date_due = '', $description = '', $category_id = 0, $score = 0, $swimlane_id = 0, $priority = 0, $date_due = '', $description = '', $category_id = 0, $score = 0, $swimlane_id = null, $priority = 0,
$recurrence_status = 0, $recurrence_trigger = 0, $recurrence_factor = 0, $recurrence_timeframe = 0, $recurrence_status = 0, $recurrence_trigger = 0, $recurrence_factor = 0, $recurrence_timeframe = 0,
$recurrence_basedate = 0, $reference = '', array $tags = array(), $date_started = '') $recurrence_basedate = 0, $reference = '', array $tags = array(), $date_started = '')
{ {

View File

@ -25,7 +25,7 @@ class BoardPopoverController extends BaseController
'project' => $project, 'project' => $project,
'nb_tasks' => $this->taskFinderModel->countByColumnAndSwimlaneId($project['id'], $column_id, $swimlane_id), 'nb_tasks' => $this->taskFinderModel->countByColumnAndSwimlaneId($project['id'], $column_id, $swimlane_id),
'column' => $this->columnModel->getColumnTitleById($column_id), 'column' => $this->columnModel->getColumnTitleById($column_id),
'swimlane' => $this->swimlaneModel->getNameById($swimlane_id) ?: t($project['default_swimlane']), 'swimlane' => $this->swimlaneModel->getNameById($swimlane_id),
'values' => array('column_id' => $column_id, 'swimlane_id' => $swimlane_id), 'values' => array('column_id' => $column_id, 'swimlane_id' => $swimlane_id),
))); )));
} }
@ -41,7 +41,7 @@ class BoardPopoverController extends BaseController
$values = $this->request->getValues(); $values = $this->request->getValues();
$this->taskStatusModel->closeTasksBySwimlaneAndColumn($values['swimlane_id'], $values['column_id']); $this->taskStatusModel->closeTasksBySwimlaneAndColumn($values['swimlane_id'], $values['column_id']);
$this->flash->success(t('All tasks of the column "%s" and the swimlane "%s" have been closed successfully.', $this->columnModel->getColumnTitleById($values['column_id']), $this->swimlaneModel->getNameById($values['swimlane_id']) ?: t($project['default_swimlane']))); $this->flash->success(t('All tasks of the column "%s" and the swimlane "%s" have been closed successfully.', $this->columnModel->getColumnTitleById($values['column_id']), $this->swimlaneModel->getNameById($values['swimlane_id'])));
$this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id']))); $this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id'])));
} }
} }

View File

@ -42,7 +42,6 @@ class SwimlaneController extends BaseController
$project = $this->getProject(); $project = $this->getProject();
$this->response->html($this->helper->layout->project('swimlane/index', array( $this->response->html($this->helper->layout->project('swimlane/index', array(
'default_swimlane' => $this->swimlaneModel->getDefault($project['id']),
'active_swimlanes' => $this->swimlaneModel->getAllByStatus($project['id'], SwimlaneModel::ACTIVE), 'active_swimlanes' => $this->swimlaneModel->getAllByStatus($project['id'], SwimlaneModel::ACTIVE),
'inactive_swimlanes' => $this->swimlaneModel->getAllByStatus($project['id'], SwimlaneModel::INACTIVE), 'inactive_swimlanes' => $this->swimlaneModel->getAllByStatus($project['id'], SwimlaneModel::INACTIVE),
'project' => $project, 'project' => $project,
@ -81,59 +80,16 @@ class SwimlaneController extends BaseController
list($valid, $errors) = $this->swimlaneValidator->validateCreation($values); list($valid, $errors) = $this->swimlaneValidator->validateCreation($values);
if ($valid) { if ($valid) {
if ($this->swimlaneModel->create($values) !== false) { if ($this->swimlaneModel->create($project['id'], $values['name'], $values['description']) !== false) {
$this->flash->success(t('Your swimlane have been created successfully.')); $this->flash->success(t('Your swimlane have been created successfully.'));
return $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id']))); $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])), true);
return;
} else { } else {
$errors = array('name' => array(t('Another swimlane with the same name exists in the project'))); $errors = array('name' => array(t('Another swimlane with the same name exists in the project')));
} }
} }
return $this->create($values, $errors); $this->create($values, $errors);
}
/**
* Edit default swimlane (display the form)
*
* @access public
* @param array $values
* @param array $errors
* @throws \Kanboard\Core\Controller\PageNotFoundException
*/
public function editDefault(array $values = array(), array $errors = array())
{
$project = $this->getProject();
$swimlane = $this->swimlaneModel->getDefault($project['id']);
$this->response->html($this->helper->layout->project('swimlane/edit_default', array(
'values' => empty($values) ? $swimlane : $values,
'errors' => $errors,
'project' => $project,
)));
}
/**
* Change the default swimlane
*
* @access public
*/
public function updateDefault()
{
$project = $this->getProject();
$values = $this->request->getValues() + array('show_default_swimlane' => 0);
list($valid, $errors) = $this->swimlaneValidator->validateDefaultModification($values);
if ($valid) {
if ($this->swimlaneModel->updateDefault($values)) {
$this->flash->success(t('The default swimlane have been updated successfully.'));
return $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])), true);
} else {
$this->flash->failure(t('Unable to update this swimlane.'));
}
}
return $this->editDefault($values, $errors);
} }
/** /**
@ -236,25 +192,6 @@ class SwimlaneController extends BaseController
$this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id']))); $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));
} }
/**
* Disable default swimlane
*
* @access public
*/
public function disableDefault()
{
$this->checkCSRFParam();
$project = $this->getProject();
if ($this->swimlaneModel->disableDefault($project['id'])) {
$this->flash->success(t('Swimlane updated successfully.'));
} else {
$this->flash->failure(t('Unable to update this swimlane.'));
}
$this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));
}
/** /**
* Enable a swimlane * Enable a swimlane
* *
@ -275,25 +212,6 @@ class SwimlaneController extends BaseController
$this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id']))); $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));
} }
/**
* Enable default swimlane
*
* @access public
*/
public function enableDefault()
{
$this->checkCSRFParam();
$project = $this->getProject();
if ($this->swimlaneModel->enableDefault($project['id'])) {
$this->flash->success(t('Swimlane updated successfully.'));
} else {
$this->flash->failure(t('Unable to update this swimlane.'));
}
$this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));
}
/** /**
* Move swimlane position * Move swimlane position
* *

View File

@ -60,8 +60,14 @@ class TaskCreationController extends BaseController
$this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id'])), true); $this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id'])), true);
} else { } else {
$task_id = $this->taskCreationModel->create($values); $task_id = $this->taskCreationModel->create($values);
$this->flash->success(t('Task created successfully.'));
$this->afterSave($project, $values, $task_id); if ($task_id > 0) {
$this->flash->success(t('Task created successfully.'));
$this->afterSave($project, $values, $task_id);
} else {
$this->flash->failure(t('Unable to create this task.'));
$this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id'])), true);
}
} }
} }

View File

@ -31,11 +31,10 @@ class TaskExport extends Base
{ {
$tasks = $this->getTasks($project_id, $from, $to); $tasks = $this->getTasks($project_id, $from, $to);
$colors = $this->colorModel->getList(); $colors = $this->colorModel->getList();
$defaultSwimlane = $this->swimlaneModel->getDefault($project_id);
$results = array($this->getColumns()); $results = array($this->getColumns());
foreach ($tasks as &$task) { foreach ($tasks as &$task) {
$task = $this->format($task, $defaultSwimlane['default_swimlane'], $colors); $task = $this->format($task, $colors);
$results[] = array_values($task); $results[] = array_values($task);
} }
@ -104,16 +103,14 @@ class TaskExport extends Base
* *
* @access protected * @access protected
* @param array $task * @param array $task
* @param string $defaultSwimlaneName
* @param array $colors * @param array $colors
* @return array * @return array
*/ */
protected function format(array &$task, $defaultSwimlaneName, array $colors) protected function format(array &$task, array $colors)
{ {
$task['is_active'] = $task['is_active'] == TaskModel::STATUS_OPEN ? e('Open') : e('Closed'); $task['is_active'] = $task['is_active'] == TaskModel::STATUS_OPEN ? e('Open') : e('Closed');
$task['color_id'] = $colors[$task['color_id']]; $task['color_id'] = $colors[$task['color_id']];
$task['score'] = $task['score'] ?: 0; $task['score'] = $task['score'] ?: 0;
$task['swimlane_name'] = $task['swimlane_name'] ?: $defaultSwimlaneName;
$task = $this->dateParser->format( $task = $this->dateParser->format(
$task, $task,

View File

@ -36,12 +36,9 @@ class TaskSwimlaneFilter extends BaseFilter implements FilterInterface
{ {
if (is_int($this->value) || ctype_digit($this->value)) { if (is_int($this->value) || ctype_digit($this->value)) {
$this->query->eq(TaskModel::TABLE.'.swimlane_id', $this->value); $this->query->eq(TaskModel::TABLE.'.swimlane_id', $this->value);
} elseif ($this->value === 'default') {
$this->query->eq(TaskModel::TABLE.'.swimlane_id', 0);
} else { } else {
$this->query->beginOr(); $this->query->beginOr();
$this->query->ilike(SwimlaneModel::TABLE.'.name', $this->value); $this->query->ilike(SwimlaneModel::TABLE.'.name', $this->value);
$this->query->ilike(ProjectModel::TABLE.'.default_swimlane', $this->value);
$this->query->closeOr(); $this->query->closeOr();
} }

View File

@ -3,6 +3,7 @@
namespace Kanboard\Formatter; namespace Kanboard\Formatter;
use Kanboard\Core\Filter\FormatterInterface; use Kanboard\Core\Filter\FormatterInterface;
use Kanboard\Model\SwimlaneModel;
use Kanboard\Model\TaskModel; use Kanboard\Model\TaskModel;
/** /**
@ -42,7 +43,7 @@ class BoardFormatter extends BaseFormatter implements FormatterInterface
*/ */
public function format() public function format()
{ {
$swimlanes = $this->swimlaneModel->getSwimlanes($this->projectId); $swimlanes = $this->swimlaneModel->getAllByStatus($this->projectId, SwimlaneModel::ACTIVE);
$columns = $this->columnModel->getAll($this->projectId); $columns = $this->columnModel->getAll($this->projectId);
if (empty($swimlanes) || empty($columns)) { if (empty($swimlanes) || empty($columns)) {

View File

@ -123,7 +123,7 @@ class TaskHelper extends Base
$attributes = array_merge(array('tabindex="5"'), $attributes); $attributes = array_merge(array('tabindex="5"'), $attributes);
$html = ''; $html = '';
if (! (count($swimlanes) === 1 && key($swimlanes) == 0)) { if (count($swimlanes) > 1) {
$html .= $this->helper->form->label(t('Swimlane'), 'swimlane_id'); $html .= $this->helper->form->label(t('Swimlane'), 'swimlane_id');
$html .= $this->helper->form->select('swimlane_id', $swimlanes, $values, $errors, $attributes); $html .= $this->helper->form->select('swimlane_id', $swimlanes, $values, $errors, $attributes);
} }

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Ovaj izvoz sadržava broj zadataka po koloni grupisanih po danima.', 'This export contains the number of tasks per column grouped per day.' => 'Ovaj izvoz sadržava broj zadataka po koloni grupisanih po danima.',
'Active swimlanes' => 'Aktivne swimline trake', 'Active swimlanes' => 'Aktivne swimline trake',
'Add a new swimlane' => 'Dodaj novu swimline traku', 'Add a new swimlane' => 'Dodaj novu swimline traku',
'Change default swimlane' => 'Preimenuj podrazumijevanu swimline traku',
'Default swimlane' => 'Podrazumijevana swimline traka', 'Default swimlane' => 'Podrazumijevana swimline traka',
'Do you really want to remove this swimlane: "%s"?' => 'Da li zaista želiš ukloniti ovu swimline traku: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Da li zaista želiš ukloniti ovu swimline traku: "%s"?',
'Inactive swimlanes' => 'Neaktivne swimline trake', 'Inactive swimlanes' => 'Neaktivne swimline trake',
'Remove a swimlane' => 'Ukloni swimline traku', 'Remove a swimlane' => 'Ukloni swimline traku',
'Show default swimlane' => 'Prikaži podrazumijevanu swimline traku',
'Swimlane modification for the project "%s"' => 'Izmjene swimline trake za projekat "%s"', 'Swimlane modification for the project "%s"' => 'Izmjene swimline trake za projekat "%s"',
'Swimlane removed successfully.' => 'Swimline traka uspješno uklonjena.', 'Swimlane removed successfully.' => 'Swimline traka uspješno uklonjena.',
'Swimlanes' => 'Swimline trake', 'Swimlanes' => 'Swimline trake',
'Swimlane updated successfully.' => 'Swimline traka uspjeno ažurirana.', 'Swimlane updated successfully.' => 'Swimline traka uspjeno ažurirana.',
'The default swimlane have been updated successfully.' => 'Podrazumijevana swimline traka uspješno ažurirana.',
'Unable to remove this swimlane.' => 'Nemoguće ukloniti swimline traku.', 'Unable to remove this swimlane.' => 'Nemoguće ukloniti swimline traku.',
'Unable to update this swimlane.' => 'Nemoguće ažurirati swimline traku.', 'Unable to update this swimlane.' => 'Nemoguće ažurirati swimline traku.',
'Your swimlane have been created successfully.' => 'Swimline traka je uspješno kreirana.', 'Your swimlane have been created successfully.' => 'Swimline traka je uspješno kreirana.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Tento export obsahuje počet úkolů pro jednotlivé sloupce seskupených podle dní.', 'This export contains the number of tasks per column grouped per day.' => 'Tento export obsahuje počet úkolů pro jednotlivé sloupce seskupených podle dní.',
'Active swimlanes' => 'Aktivní dráhy', 'Active swimlanes' => 'Aktivní dráhy',
'Add a new swimlane' => 'Přidat novou dráhu', 'Add a new swimlane' => 'Přidat novou dráhu',
'Change default swimlane' => 'Změnit výchozí dráhu',
'Default swimlane' => 'Výchozí dráha', 'Default swimlane' => 'Výchozí dráha',
'Do you really want to remove this swimlane: "%s"?' => 'Opravdu si přejete odstranit tuto dráhu: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Opravdu si přejete odstranit tuto dráhu: "%s"?',
'Inactive swimlanes' => 'Neaktivní dráha', 'Inactive swimlanes' => 'Neaktivní dráha',
'Remove a swimlane' => 'Odstranit dráhu', 'Remove a swimlane' => 'Odstranit dráhu',
'Show default swimlane' => 'Zobrazit výchozí dráhu',
'Swimlane modification for the project "%s"' => 'Změny dráhy pro projekt "%s"', 'Swimlane modification for the project "%s"' => 'Změny dráhy pro projekt "%s"',
'Swimlane removed successfully.' => 'Dráha byla odstraněna.', 'Swimlane removed successfully.' => 'Dráha byla odstraněna.',
'Swimlanes' => 'Dráhy', 'Swimlanes' => 'Dráhy',
'Swimlane updated successfully.' => 'Dráha byla upravena.', 'Swimlane updated successfully.' => 'Dráha byla upravena.',
'The default swimlane have been updated successfully.' => 'Výchozí dráha byla upravena',
'Unable to remove this swimlane.' => 'Tuto dráhu nelze odstranit.', 'Unable to remove this swimlane.' => 'Tuto dráhu nelze odstranit.',
'Unable to update this swimlane.' => 'Tuto dráhu nelze upravit.', 'Unable to update this swimlane.' => 'Tuto dráhu nelze upravit.',
'Your swimlane have been created successfully.' => 'Dráha byla vytvořena.', 'Your swimlane have been created successfully.' => 'Dráha byla vytvořena.',

View File

@ -441,17 +441,14 @@ return array(
// 'This export contains the number of tasks per column grouped per day.' => '', // 'This export contains the number of tasks per column grouped per day.' => '',
// 'Active swimlanes' => '', // 'Active swimlanes' => '',
// 'Add a new swimlane' => '', // 'Add a new swimlane' => '',
// 'Change default swimlane' => '',
// 'Default swimlane' => '', // 'Default swimlane' => '',
// 'Do you really want to remove this swimlane: "%s"?' => '', // 'Do you really want to remove this swimlane: "%s"?' => '',
// 'Inactive swimlanes' => '', // 'Inactive swimlanes' => '',
// 'Remove a swimlane' => '', // 'Remove a swimlane' => '',
// 'Show default swimlane' => '',
// 'Swimlane modification for the project "%s"' => '', // 'Swimlane modification for the project "%s"' => '',
// 'Swimlane removed successfully.' => '', // 'Swimlane removed successfully.' => '',
// 'Swimlanes' => '', // 'Swimlanes' => '',
// 'Swimlane updated successfully.' => '', // 'Swimlane updated successfully.' => '',
// 'The default swimlane have been updated successfully.' => '',
// 'Unable to remove this swimlane.' => '', // 'Unable to remove this swimlane.' => '',
// 'Unable to update this swimlane.' => '', // 'Unable to update this swimlane.' => '',
// 'Your swimlane have been created successfully.' => '', // 'Your swimlane have been created successfully.' => '',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Dieser Export enthält die Anzahl der Aufgaben pro Spalte nach Tagen gruppiert.', 'This export contains the number of tasks per column grouped per day.' => 'Dieser Export enthält die Anzahl der Aufgaben pro Spalte nach Tagen gruppiert.',
'Active swimlanes' => 'Aktive Swimlane', 'Active swimlanes' => 'Aktive Swimlane',
'Add a new swimlane' => 'Eine neue Swimlane hinzufügen', 'Add a new swimlane' => 'Eine neue Swimlane hinzufügen',
'Change default swimlane' => 'Standard-Swimlane ändern',
'Default swimlane' => 'Standard-Swimlane', 'Default swimlane' => 'Standard-Swimlane',
'Do you really want to remove this swimlane: "%s"?' => 'Diese Swimlane wirklich ändern: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Diese Swimlane wirklich ändern: "%s"?',
'Inactive swimlanes' => 'Inaktive Swimlane', 'Inactive swimlanes' => 'Inaktive Swimlane',
'Remove a swimlane' => 'Swimlane entfernen', 'Remove a swimlane' => 'Swimlane entfernen',
'Show default swimlane' => 'Standard-Swimlane anzeigen',
'Swimlane modification for the project "%s"' => 'Swimlane-Änderung für das Projekt "%s"', 'Swimlane modification for the project "%s"' => 'Swimlane-Änderung für das Projekt "%s"',
'Swimlane removed successfully.' => 'Swimlane erfolgreich entfernt.', 'Swimlane removed successfully.' => 'Swimlane erfolgreich entfernt.',
'Swimlanes' => 'Swimlanes', 'Swimlanes' => 'Swimlanes',
'Swimlane updated successfully.' => 'Swimlane erfolgreich geändert.', 'Swimlane updated successfully.' => 'Swimlane erfolgreich geändert.',
'The default swimlane have been updated successfully.' => 'Die Standard-Swimlane wurden erfolgreich aktualisiert. Die Standard-Swimlane wurden erfolgreich aktualisiert.',
'Unable to remove this swimlane.' => 'Es ist nicht möglich, die Swimlane zu entfernen.', 'Unable to remove this swimlane.' => 'Es ist nicht möglich, die Swimlane zu entfernen.',
'Unable to update this swimlane.' => 'Es ist nicht möglich, die Swimlane zu ändern.', 'Unable to update this swimlane.' => 'Es ist nicht möglich, die Swimlane zu ändern.',
'Your swimlane have been created successfully.' => 'Die Swimlane wurde erfolgreich angelegt.', 'Your swimlane have been created successfully.' => 'Die Swimlane wurde erfolgreich angelegt.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Αυτή η κατάσταση περιέχει τον αριθμό των εργασιών ανά στήλη ομαδοποιημένα ανά ημέρα.', 'This export contains the number of tasks per column grouped per day.' => 'Αυτή η κατάσταση περιέχει τον αριθμό των εργασιών ανά στήλη ομαδοποιημένα ανά ημέρα.',
'Active swimlanes' => 'Ενεργές λωρίδες', 'Active swimlanes' => 'Ενεργές λωρίδες',
'Add a new swimlane' => 'Προσθήκη λωρίδας', 'Add a new swimlane' => 'Προσθήκη λωρίδας',
'Change default swimlane' => 'Αλλαγή της εξ\' ορισμού λωρίδας',
'Default swimlane' => 'Εξ\' ορισμού λωρίδα', 'Default swimlane' => 'Εξ\' ορισμού λωρίδα',
'Do you really want to remove this swimlane: "%s"?' => 'Σίγουρα θέλετε να αφαιρέσετε τη λωρίδα : « %s » ?', 'Do you really want to remove this swimlane: "%s"?' => 'Σίγουρα θέλετε να αφαιρέσετε τη λωρίδα : « %s » ?',
'Inactive swimlanes' => 'Ανενεργές Λωρίδες', 'Inactive swimlanes' => 'Ανενεργές Λωρίδες',
'Remove a swimlane' => 'Αφαίρεση λωρίδας', 'Remove a swimlane' => 'Αφαίρεση λωρίδας',
'Show default swimlane' => 'Εμφάνιση προεπιλεγμένων λωρίδων',
'Swimlane modification for the project "%s"' => 'Τροποποίηση λωρίδας για το έργο « %s »', 'Swimlane modification for the project "%s"' => 'Τροποποίηση λωρίδας για το έργο « %s »',
'Swimlane removed successfully.' => 'Η λωρίδα αφαιρέθηκε με επιτυχία.', 'Swimlane removed successfully.' => 'Η λωρίδα αφαιρέθηκε με επιτυχία.',
'Swimlanes' => 'Λωρίδες', 'Swimlanes' => 'Λωρίδες',
'Swimlane updated successfully.' => 'Η λωρίδα ενημερώθηκε με επιτυχία.', 'Swimlane updated successfully.' => 'Η λωρίδα ενημερώθηκε με επιτυχία.',
'The default swimlane have been updated successfully.' => 'Η προεπιλεγμένη λωρίδα ενημερώθηκε με επιτυχία.',
'Unable to remove this swimlane.' => 'Αδύνατο να αφαιρεθεί η λωρίδα.', 'Unable to remove this swimlane.' => 'Αδύνατο να αφαιρεθεί η λωρίδα.',
'Unable to update this swimlane.' => 'Αδύνατο να ενημερωθεί η λωρίδα.', 'Unable to update this swimlane.' => 'Αδύνατο να ενημερωθεί η λωρίδα.',
'Your swimlane have been created successfully.' => 'Η λωρίδα δημιουργήθηκε με επιτυχία.', 'Your swimlane have been created successfully.' => 'Η λωρίδα δημιουργήθηκε με επιτυχία.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Esta exportación contiene el número de tareas por columna agrupadas por día.', 'This export contains the number of tasks per column grouped per day.' => 'Esta exportación contiene el número de tareas por columna agrupadas por día.',
'Active swimlanes' => 'Calles activas', 'Active swimlanes' => 'Calles activas',
'Add a new swimlane' => 'Añadir nueva calle', 'Add a new swimlane' => 'Añadir nueva calle',
'Change default swimlane' => 'Cambiar la calle por defecto',
'Default swimlane' => 'Calle por defecto', 'Default swimlane' => 'Calle por defecto',
'Do you really want to remove this swimlane: "%s"?' => '¿Realmente desea eliminar esta calle: «%s»?', 'Do you really want to remove this swimlane: "%s"?' => '¿Realmente desea eliminar esta calle: «%s»?',
'Inactive swimlanes' => 'Calles inactivas', 'Inactive swimlanes' => 'Calles inactivas',
'Remove a swimlane' => 'Eliminar una calle', 'Remove a swimlane' => 'Eliminar una calle',
'Show default swimlane' => 'Mostrar calle por defecto',
'Swimlane modification for the project "%s"' => 'Modificación de la calle para el proyecto «%s»', 'Swimlane modification for the project "%s"' => 'Modificación de la calle para el proyecto «%s»',
'Swimlane removed successfully.' => 'Calle eliminada correctamente.', 'Swimlane removed successfully.' => 'Calle eliminada correctamente.',
'Swimlanes' => 'Calles', 'Swimlanes' => 'Calles',
'Swimlane updated successfully.' => 'Calle actualizada correctamente.', 'Swimlane updated successfully.' => 'Calle actualizada correctamente.',
'The default swimlane have been updated successfully.' => 'La calle por defecto ha sido actualizada correctamente.',
'Unable to remove this swimlane.' => 'No es posible eliminar esta calle.', 'Unable to remove this swimlane.' => 'No es posible eliminar esta calle.',
'Unable to update this swimlane.' => 'No es posible actualizar esta calle.', 'Unable to update this swimlane.' => 'No es posible actualizar esta calle.',
'Your swimlane have been created successfully.' => 'Su calle ha sido creada correctamente.', 'Your swimlane have been created successfully.' => 'Su calle ha sido creada correctamente.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Tämä tiedosto sisältää tehtäviä sarakkeisiin päiväkohtaisesti ryhmilteltyinä', 'This export contains the number of tasks per column grouped per day.' => 'Tämä tiedosto sisältää tehtäviä sarakkeisiin päiväkohtaisesti ryhmilteltyinä',
'Active swimlanes' => 'Aktiiviset kaistat', 'Active swimlanes' => 'Aktiiviset kaistat',
'Add a new swimlane' => 'Lisää uusi kaista', 'Add a new swimlane' => 'Lisää uusi kaista',
'Change default swimlane' => 'Vaihda oletuskaistaa',
'Default swimlane' => 'Oletuskaista', 'Default swimlane' => 'Oletuskaista',
'Do you really want to remove this swimlane: "%s"?' => 'Haluatko varmasti poistaa tämän kaistan: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Haluatko varmasti poistaa tämän kaistan: "%s"?',
'Inactive swimlanes' => 'Passiiviset kaistat', 'Inactive swimlanes' => 'Passiiviset kaistat',
'Remove a swimlane' => 'Poista kaista', 'Remove a swimlane' => 'Poista kaista',
'Show default swimlane' => 'Näytä oletuskaista',
'Swimlane modification for the project "%s"' => 'Kaistamuutos projektille "%s"', 'Swimlane modification for the project "%s"' => 'Kaistamuutos projektille "%s"',
'Swimlane removed successfully.' => 'Kaista poistettu onnistuneesti.', 'Swimlane removed successfully.' => 'Kaista poistettu onnistuneesti.',
'Swimlanes' => 'Kaistat', 'Swimlanes' => 'Kaistat',
'Swimlane updated successfully.' => 'Kaista päivitetty onnistuneesti.', 'Swimlane updated successfully.' => 'Kaista päivitetty onnistuneesti.',
'The default swimlane have been updated successfully.' => 'Oletuskaista päivitetty onnistuneesti.',
'Unable to remove this swimlane.' => 'Kaistan poisto epäonnistui.', 'Unable to remove this swimlane.' => 'Kaistan poisto epäonnistui.',
'Unable to update this swimlane.' => 'Kaistan päivittäminen epäonnistui.', 'Unable to update this swimlane.' => 'Kaistan päivittäminen epäonnistui.',
'Your swimlane have been created successfully.' => 'Kaista luotu onnistuneesti.', 'Your swimlane have been created successfully.' => 'Kaista luotu onnistuneesti.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Cet export contient le nombre de tâches par colonne groupé par jour.', 'This export contains the number of tasks per column grouped per day.' => 'Cet export contient le nombre de tâches par colonne groupé par jour.',
'Active swimlanes' => 'Swimlanes actives', 'Active swimlanes' => 'Swimlanes actives',
'Add a new swimlane' => 'Ajouter une nouvelle swimlane', 'Add a new swimlane' => 'Ajouter une nouvelle swimlane',
'Change default swimlane' => 'Modifier la swimlane par défaut',
'Default swimlane' => 'Swimlane par défaut', 'Default swimlane' => 'Swimlane par défaut',
'Do you really want to remove this swimlane: "%s"?' => 'Voulez-vous vraiment supprimer cette swimlane : « %s » ?', 'Do you really want to remove this swimlane: "%s"?' => 'Voulez-vous vraiment supprimer cette swimlane : « %s » ?',
'Inactive swimlanes' => 'Swimlanes inactives', 'Inactive swimlanes' => 'Swimlanes inactives',
'Remove a swimlane' => 'Supprimer une swimlane', 'Remove a swimlane' => 'Supprimer une swimlane',
'Show default swimlane' => 'Afficher la swimlane par défaut',
'Swimlane modification for the project "%s"' => 'Modification d\'une swimlane pour le projet « %s »', 'Swimlane modification for the project "%s"' => 'Modification d\'une swimlane pour le projet « %s »',
'Swimlane removed successfully.' => 'Swimlane supprimée avec succès.', 'Swimlane removed successfully.' => 'Swimlane supprimée avec succès.',
'Swimlanes' => 'Swimlanes', 'Swimlanes' => 'Swimlanes',
'Swimlane updated successfully.' => 'Swimlane mise à jour avec succès.', 'Swimlane updated successfully.' => 'Swimlane mise à jour avec succès.',
'The default swimlane have been updated successfully.' => 'La swimlane par défaut a été mise à jour avec succès.',
'Unable to remove this swimlane.' => 'Impossible de supprimer cette swimlane.', 'Unable to remove this swimlane.' => 'Impossible de supprimer cette swimlane.',
'Unable to update this swimlane.' => 'Impossible de mettre à jour cette swimlane.', 'Unable to update this swimlane.' => 'Impossible de mettre à jour cette swimlane.',
'Your swimlane have been created successfully.' => 'Votre swimlane a été créée avec succès.', 'Your swimlane have been created successfully.' => 'Votre swimlane a été créée avec succès.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Ez az export tartalmazza a feladatok számát oszloponként összesítve, napokra lebontva.', 'This export contains the number of tasks per column grouped per day.' => 'Ez az export tartalmazza a feladatok számát oszloponként összesítve, napokra lebontva.',
'Active swimlanes' => 'Aktív sávok', 'Active swimlanes' => 'Aktív sávok',
'Add a new swimlane' => 'Új sáv', 'Add a new swimlane' => 'Új sáv',
'Change default swimlane' => 'Alapértelmezett sáv megváltoztatása',
'Default swimlane' => 'Alapértelmezett folyamat', 'Default swimlane' => 'Alapértelmezett folyamat',
'Do you really want to remove this swimlane: "%s"?' => 'Valóban törölni akarja ezt a sávot: %s ?', 'Do you really want to remove this swimlane: "%s"?' => 'Valóban törölni akarja ezt a sávot: %s ?',
'Inactive swimlanes' => 'Inaktív sávok', 'Inactive swimlanes' => 'Inaktív sávok',
'Remove a swimlane' => 'Sáv törlés', 'Remove a swimlane' => 'Sáv törlés',
'Show default swimlane' => 'Alapértelmezett sáv megjelenítése',
'Swimlane modification for the project "%s"' => '%s projekt sávjainak módosítása', 'Swimlane modification for the project "%s"' => '%s projekt sávjainak módosítása',
'Swimlane removed successfully.' => 'Sáv sikeresen törölve.', 'Swimlane removed successfully.' => 'Sáv sikeresen törölve.',
'Swimlanes' => 'Sávok', 'Swimlanes' => 'Sávok',
'Swimlane updated successfully.' => 'Sáv sikeresen frissítve', 'Swimlane updated successfully.' => 'Sáv sikeresen frissítve',
'The default swimlane have been updated successfully.' => 'Az alapértelmezett sáv sikeresen frissítve.',
'Unable to remove this swimlane.' => 'A sáv törlése sikertelen.', 'Unable to remove this swimlane.' => 'A sáv törlése sikertelen.',
'Unable to update this swimlane.' => 'A sáv frissítése sikertelen.', 'Unable to update this swimlane.' => 'A sáv frissítése sikertelen.',
'Your swimlane have been created successfully.' => 'A sáv sikeresen létrehozva.', 'Your swimlane have been created successfully.' => 'A sáv sikeresen létrehozva.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom yang dikelompokan per hari.', 'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom yang dikelompokan per hari.',
'Active swimlanes' => 'Swimlanes aktif', 'Active swimlanes' => 'Swimlanes aktif',
'Add a new swimlane' => 'Tambah swimlane baru', 'Add a new swimlane' => 'Tambah swimlane baru',
'Change default swimlane' => 'Ganti swimlane default',
'Default swimlane' => 'Swimlane default', 'Default swimlane' => 'Swimlane default',
'Do you really want to remove this swimlane: "%s"?' => 'Apakah Anda yakin mau menghapus swimlane ini: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Apakah Anda yakin mau menghapus swimlane ini: "%s"?',
'Inactive swimlanes' => 'Swimlanes tidak aktif', 'Inactive swimlanes' => 'Swimlanes tidak aktif',
'Remove a swimlane' => 'Hapus swimlane', 'Remove a swimlane' => 'Hapus swimlane',
'Show default swimlane' => 'Lihat swimlane default',
'Swimlane modification for the project "%s"' => 'Modifikasi swimlane untuk proyek "%s"', 'Swimlane modification for the project "%s"' => 'Modifikasi swimlane untuk proyek "%s"',
'Swimlane removed successfully.' => 'Swimlane berhasil dihapus.', 'Swimlane removed successfully.' => 'Swimlane berhasil dihapus.',
'Swimlanes' => 'Swimlanes', 'Swimlanes' => 'Swimlanes',
'Swimlane updated successfully.' => 'Swimlane berhasil diperbarui.', 'Swimlane updated successfully.' => 'Swimlane berhasil diperbarui.',
'The default swimlane have been updated successfully.' => 'Swimlane default berhasil diperbarui.',
'Unable to remove this swimlane.' => 'Tidak dapat menghapus swimlane ini.', 'Unable to remove this swimlane.' => 'Tidak dapat menghapus swimlane ini.',
'Unable to update this swimlane.' => 'Tidak dapat memperbarui swimlane ini.', 'Unable to update this swimlane.' => 'Tidak dapat memperbarui swimlane ini.',
'Your swimlane have been created successfully.' => 'Swimlane Anda berhasil dibuat.', 'Your swimlane have been created successfully.' => 'Swimlane Anda berhasil dibuat.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Questo export contiene il numero di task per colonna raggruppati per giorno', 'This export contains the number of tasks per column grouped per day.' => 'Questo export contiene il numero di task per colonna raggruppati per giorno',
'Active swimlanes' => 'Corsie attive', 'Active swimlanes' => 'Corsie attive',
'Add a new swimlane' => 'Aggiungi una corsia', 'Add a new swimlane' => 'Aggiungi una corsia',
'Change default swimlane' => 'Cambia la corsia predefinita',
'Default swimlane' => 'Corsia predefinita', 'Default swimlane' => 'Corsia predefinita',
'Do you really want to remove this swimlane: "%s"?' => 'Vuoi davvero rimuovere la seguente corsia: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Vuoi davvero rimuovere la seguente corsia: "%s"?',
'Inactive swimlanes' => 'Corsie inattive', 'Inactive swimlanes' => 'Corsie inattive',
'Remove a swimlane' => 'Rimuovi una corsia', 'Remove a swimlane' => 'Rimuovi una corsia',
'Show default swimlane' => 'Mostra la corsia predefinita',
'Swimlane modification for the project "%s"' => 'Modifica corsia per il progetto "%s"', 'Swimlane modification for the project "%s"' => 'Modifica corsia per il progetto "%s"',
'Swimlane removed successfully.' => 'Corsia rimossa con successo.', 'Swimlane removed successfully.' => 'Corsia rimossa con successo.',
'Swimlanes' => 'Corsie', 'Swimlanes' => 'Corsie',
'Swimlane updated successfully.' => 'Corsia aggiornata con successo.', 'Swimlane updated successfully.' => 'Corsia aggiornata con successo.',
'The default swimlane have been updated successfully.' => 'La corsia predefinita è stata aggiornata con successo.',
'Unable to remove this swimlane.' => 'Impossibile rimuovere questa corsia.', 'Unable to remove this swimlane.' => 'Impossibile rimuovere questa corsia.',
'Unable to update this swimlane.' => 'Impossibile aggiornare questa corsia.', 'Unable to update this swimlane.' => 'Impossibile aggiornare questa corsia.',
'Your swimlane have been created successfully.' => 'La tua corsia è stata creata con successo', 'Your swimlane have been created successfully.' => 'La tua corsia è stata creata con successo',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'この出力は日時のカラムごとのタスク数を集計したものです', 'This export contains the number of tasks per column grouped per day.' => 'この出力は日時のカラムごとのタスク数を集計したものです',
'Active swimlanes' => 'アクティブなスイムレーン', 'Active swimlanes' => 'アクティブなスイムレーン',
'Add a new swimlane' => '新しいスイムレーン', 'Add a new swimlane' => '新しいスイムレーン',
'Change default swimlane' => 'デフォルトスイムレーンの変更',
'Default swimlane' => 'デフォルトスイムレーン', 'Default swimlane' => 'デフォルトスイムレーン',
'Do you really want to remove this swimlane: "%s"?' => 'このスイムレーン「%s」を本当に削除しますか', 'Do you really want to remove this swimlane: "%s"?' => 'このスイムレーン「%s」を本当に削除しますか',
'Inactive swimlanes' => 'インタラクティブなスイムレーン', 'Inactive swimlanes' => 'インタラクティブなスイムレーン',
'Remove a swimlane' => 'スイムレーンの削除', 'Remove a swimlane' => 'スイムレーンの削除',
'Show default swimlane' => 'デフォルトスイムレーンの表示',
'Swimlane modification for the project "%s"' => '「%s」に対するスイムレーン変更', 'Swimlane modification for the project "%s"' => '「%s」に対するスイムレーン変更',
'Swimlane removed successfully.' => 'スイムレーンを削除しました。', 'Swimlane removed successfully.' => 'スイムレーンを削除しました。',
'Swimlanes' => 'スイムレーン', 'Swimlanes' => 'スイムレーン',
'Swimlane updated successfully.' => 'スイムレーンを更新しました。', 'Swimlane updated successfully.' => 'スイムレーンを更新しました。',
'The default swimlane have been updated successfully.' => 'デフォルトスイムレーンを更新しました。',
'Unable to remove this swimlane.' => 'スイムレーンを削除できませんでした。', 'Unable to remove this swimlane.' => 'スイムレーンを削除できませんでした。',
'Unable to update this swimlane.' => 'スイムレーンを更新できませんでした。', 'Unable to update this swimlane.' => 'スイムレーンを更新できませんでした。',
'Your swimlane have been created successfully.' => 'スイムレーンが作成されました。', 'Your swimlane have been created successfully.' => 'スイムレーンが作成されました。',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => '이 출력은 날짜의 칼람별 할일 수를 집계한 것입니다', 'This export contains the number of tasks per column grouped per day.' => '이 출력은 날짜의 칼람별 할일 수를 집계한 것입니다',
'Active swimlanes' => '액티브한 스윔레인', 'Active swimlanes' => '액티브한 스윔레인',
'Add a new swimlane' => ' 새로운 스윔레인', 'Add a new swimlane' => ' 새로운 스윔레인',
'Change default swimlane' => '기본 스윔레인의 변경',
'Default swimlane' => '기본 스윔레인', 'Default swimlane' => '기본 스윔레인',
'Do you really want to remove this swimlane: "%s"?' => '스웜레인을 삭제하시겠습니까: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => '스웜레인을 삭제하시겠습니까: "%s"?',
'Inactive swimlanes' => '인터랙티브한 스윔레인', 'Inactive swimlanes' => '인터랙티브한 스윔레인',
'Remove a swimlane' => '스윔레인의 삭제', 'Remove a swimlane' => '스윔레인의 삭제',
'Show default swimlane' => '기본 스윔레인의 표시',
'Swimlane modification for the project "%s"' => '"%s" 프로젝트의 스웜레인 수정', 'Swimlane modification for the project "%s"' => '"%s" 프로젝트의 스웜레인 수정',
'Swimlane removed successfully.' => '스윔레인을 삭제했습니다.', 'Swimlane removed successfully.' => '스윔레인을 삭제했습니다.',
'Swimlanes' => '스윔레인', 'Swimlanes' => '스윔레인',
'Swimlane updated successfully.' => '스윔레인을 갱신했습니다.', 'Swimlane updated successfully.' => '스윔레인을 갱신했습니다.',
'The default swimlane have been updated successfully.' => '기본 스윔레인을 갱신했습니다.',
'Unable to remove this swimlane.' => '스윔레인을 삭제할 수 없었습니다.', 'Unable to remove this swimlane.' => '스윔레인을 삭제할 수 없었습니다.',
'Unable to update this swimlane.' => '스윔레인을 갱신할 수 없었습니다.', 'Unable to update this swimlane.' => '스윔레인을 갱신할 수 없었습니다.',
'Your swimlane have been created successfully.' => '스윔레인이 작성되었습니다.', 'Your swimlane have been created successfully.' => '스윔레인이 작성되었습니다.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom dikelompokan perhari.', 'This export contains the number of tasks per column grouped per day.' => 'Ekspor ini berisi jumlah dari tugas per kolom dikelompokan perhari.',
'Active swimlanes' => 'Swimlanes aktif', 'Active swimlanes' => 'Swimlanes aktif',
'Add a new swimlane' => 'Tambah swimlane baharu', 'Add a new swimlane' => 'Tambah swimlane baharu',
'Change default swimlane' => 'Tukar piawai swimlane',
'Default swimlane' => 'Piawai swimlane', 'Default swimlane' => 'Piawai swimlane',
'Do you really want to remove this swimlane: "%s"?' => 'Anda yakin untuk menghapus swimlane ini : « %s » ?', 'Do you really want to remove this swimlane: "%s"?' => 'Anda yakin untuk menghapus swimlane ini : « %s » ?',
'Inactive swimlanes' => 'Swimlanes tidak aktif', 'Inactive swimlanes' => 'Swimlanes tidak aktif',
'Remove a swimlane' => 'Padam swimlane', 'Remove a swimlane' => 'Padam swimlane',
'Show default swimlane' => 'Tampilkan piawai swimlane',
'Swimlane modification for the project "%s"' => 'Modifikasi swimlane untuk projek « %s »', 'Swimlane modification for the project "%s"' => 'Modifikasi swimlane untuk projek « %s »',
'Swimlane removed successfully.' => 'Swimlane telah dipadamkan.', 'Swimlane removed successfully.' => 'Swimlane telah dipadamkan.',
'Swimlanes' => 'Swimlanes', 'Swimlanes' => 'Swimlanes',
'Swimlane updated successfully.' => 'Swimlane telah dikemaskini.', 'Swimlane updated successfully.' => 'Swimlane telah dikemaskini.',
'The default swimlane have been updated successfully.' => 'Standar swimlane berhasil diperbaharui.',
'Unable to remove this swimlane.' => 'Tidak dapat menghapus swimlane ini.', 'Unable to remove this swimlane.' => 'Tidak dapat menghapus swimlane ini.',
'Unable to update this swimlane.' => 'Tidak dapat memperbaharui swimlane ini.', 'Unable to update this swimlane.' => 'Tidak dapat memperbaharui swimlane ini.',
'Your swimlane have been created successfully.' => 'Swimlane anda berhasil dibuat.', 'Your swimlane have been created successfully.' => 'Swimlane anda berhasil dibuat.',

View File

@ -441,17 +441,14 @@ return array(
// 'This export contains the number of tasks per column grouped per day.' => '', // 'This export contains the number of tasks per column grouped per day.' => '',
'Active swimlanes' => 'Aktive svømmebaner', 'Active swimlanes' => 'Aktive svømmebaner',
'Add a new swimlane' => 'Legg til en ny svømmebane', 'Add a new swimlane' => 'Legg til en ny svømmebane',
'Change default swimlane' => 'Endre standard svømmebane',
'Default swimlane' => 'Standard svømmebane', 'Default swimlane' => 'Standard svømmebane',
// 'Do you really want to remove this swimlane: "%s"?' => '', // 'Do you really want to remove this swimlane: "%s"?' => '',
// 'Inactive swimlanes' => '', // 'Inactive swimlanes' => '',
'Remove a swimlane' => 'Fjern en svømmebane', 'Remove a swimlane' => 'Fjern en svømmebane',
'Show default swimlane' => 'Vis standard svømmebane',
// 'Swimlane modification for the project "%s"' => '', // 'Swimlane modification for the project "%s"' => '',
'Swimlane removed successfully.' => 'Svømmebane fjernet', 'Swimlane removed successfully.' => 'Svømmebane fjernet',
'Swimlanes' => 'Svømmebaner', 'Swimlanes' => 'Svømmebaner',
'Swimlane updated successfully.' => 'Svømmebane oppdatert', 'Swimlane updated successfully.' => 'Svømmebane oppdatert',
// 'The default swimlane have been updated successfully.' => '',
// 'Unable to remove this swimlane.' => '', // 'Unable to remove this swimlane.' => '',
// 'Unable to update this swimlane.' => '', // 'Unable to update this swimlane.' => '',
// 'Your swimlane have been created successfully.' => '', // 'Your swimlane have been created successfully.' => '',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Dit rapport bevat het aantal taken per kolom gegroupeerd per dag.', 'This export contains the number of tasks per column grouped per day.' => 'Dit rapport bevat het aantal taken per kolom gegroupeerd per dag.',
'Active swimlanes' => 'Actieve swinlanes', 'Active swimlanes' => 'Actieve swinlanes',
'Add a new swimlane' => 'Nieuwe swimlane toevoegen', 'Add a new swimlane' => 'Nieuwe swimlane toevoegen',
'Change default swimlane' => 'Standaard swimlane aapassen',
'Default swimlane' => 'Standaard swinlane', 'Default swimlane' => 'Standaard swinlane',
'Do you really want to remove this swimlane: "%s"?' => 'Weet u zeker dat u deze swimlane wil verwijderen : « %s » ?', 'Do you really want to remove this swimlane: "%s"?' => 'Weet u zeker dat u deze swimlane wil verwijderen : « %s » ?',
'Inactive swimlanes' => 'Inactieve swinlanes', 'Inactive swimlanes' => 'Inactieve swinlanes',
'Remove a swimlane' => 'Verwijder swinlane', 'Remove a swimlane' => 'Verwijder swinlane',
'Show default swimlane' => 'Standaard swimlane tonen',
'Swimlane modification for the project "%s"' => 'Swinlane aanpassing voor project « %s »', 'Swimlane modification for the project "%s"' => 'Swinlane aanpassing voor project « %s »',
'Swimlane removed successfully.' => 'Swimlane succesvol verwijderd.', 'Swimlane removed successfully.' => 'Swimlane succesvol verwijderd.',
'Swimlanes' => 'Swimlanes', 'Swimlanes' => 'Swimlanes',
'Swimlane updated successfully.' => 'Swimlane succesvol aangepast.', 'Swimlane updated successfully.' => 'Swimlane succesvol aangepast.',
'The default swimlane have been updated successfully.' => 'De standaard swimlane is succesvol aangepast.',
'Unable to remove this swimlane.' => 'Swimlane verwijderen niet gelukt.', 'Unable to remove this swimlane.' => 'Swimlane verwijderen niet gelukt.',
'Unable to update this swimlane.' => 'Swimlane aanpassen niet gelukt.', 'Unable to update this swimlane.' => 'Swimlane aanpassen niet gelukt.',
'Your swimlane have been created successfully.' => 'Swimlane succesvol aangemaakt.', 'Your swimlane have been created successfully.' => 'Swimlane succesvol aangemaakt.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Ten eksport zawiera ilość zadań zgrupowanych w kolumnach na dzień', 'This export contains the number of tasks per column grouped per day.' => 'Ten eksport zawiera ilość zadań zgrupowanych w kolumnach na dzień',
'Active swimlanes' => 'Aktywne tory', 'Active swimlanes' => 'Aktywne tory',
'Add a new swimlane' => 'Dodaj tor', 'Add a new swimlane' => 'Dodaj tor',
'Change default swimlane' => 'Zmień domyślny tor',
'Default swimlane' => 'Domyślny tor', 'Default swimlane' => 'Domyślny tor',
'Do you really want to remove this swimlane: "%s"?' => 'Czy na pewno chcesz usunąć tor: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Czy na pewno chcesz usunąć tor: "%s"?',
'Inactive swimlanes' => 'Nieaktywne tory', 'Inactive swimlanes' => 'Nieaktywne tory',
'Remove a swimlane' => 'Usuń tor', 'Remove a swimlane' => 'Usuń tor',
'Show default swimlane' => 'Pokaż domyślny tor',
'Swimlane modification for the project "%s"' => 'Edycja torów dla projektu "%s"', 'Swimlane modification for the project "%s"' => 'Edycja torów dla projektu "%s"',
'Swimlane removed successfully.' => 'Tor usunięty pomyślnie.', 'Swimlane removed successfully.' => 'Tor usunięty pomyślnie.',
'Swimlanes' => 'Tory', 'Swimlanes' => 'Tory',
'Swimlane updated successfully.' => 'Zaktualizowano tor.', 'Swimlane updated successfully.' => 'Zaktualizowano tor.',
'The default swimlane have been updated successfully.' => 'Domyślny tor zaktualizowany pomyślnie.',
'Unable to remove this swimlane.' => 'Nie można usunąć toru.', 'Unable to remove this swimlane.' => 'Nie można usunąć toru.',
'Unable to update this swimlane.' => 'Nie można zaktualizować toru.', 'Unable to update this swimlane.' => 'Nie można zaktualizować toru.',
'Your swimlane have been created successfully.' => 'Tor utworzony pomyślnie.', 'Your swimlane have been created successfully.' => 'Tor utworzony pomyślnie.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Esta exportação contém o número de tarefas por coluna agrupada por dia.', 'This export contains the number of tasks per column grouped per day.' => 'Esta exportação contém o número de tarefas por coluna agrupada por dia.',
'Active swimlanes' => 'Ativar swimlanes', 'Active swimlanes' => 'Ativar swimlanes',
'Add a new swimlane' => 'Adicionar swimlane', 'Add a new swimlane' => 'Adicionar swimlane',
'Change default swimlane' => 'Alterar swimlane padrão',
'Default swimlane' => 'Swimlane padrão', 'Default swimlane' => 'Swimlane padrão',
'Do you really want to remove this swimlane: "%s"?' => 'Você realmente deseja remover esta swimlane: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Você realmente deseja remover esta swimlane: "%s"?',
'Inactive swimlanes' => 'Desativar swimlanes', 'Inactive swimlanes' => 'Desativar swimlanes',
'Remove a swimlane' => 'Remover uma swimlane', 'Remove a swimlane' => 'Remover uma swimlane',
'Show default swimlane' => 'Exibir swimlane padrão',
'Swimlane modification for the project "%s"' => 'Modificação de swimlane para o projeto "%s"', 'Swimlane modification for the project "%s"' => 'Modificação de swimlane para o projeto "%s"',
'Swimlane removed successfully.' => 'Swimlane removida com sucesso.', 'Swimlane removed successfully.' => 'Swimlane removida com sucesso.',
'Swimlanes' => 'Swimlanes', 'Swimlanes' => 'Swimlanes',
'Swimlane updated successfully.' => 'Swimlane atualizada com sucesso.', 'Swimlane updated successfully.' => 'Swimlane atualizada com sucesso.',
'The default swimlane have been updated successfully.' => 'A swimlane padrão foi atualizada com sucesso.',
'Unable to remove this swimlane.' => 'Não foi possível remover esta swimlane.', 'Unable to remove this swimlane.' => 'Não foi possível remover esta swimlane.',
'Unable to update this swimlane.' => 'Não foi possível atualizar esta swimlane.', 'Unable to update this swimlane.' => 'Não foi possível atualizar esta swimlane.',
'Your swimlane have been created successfully.' => 'Sua swimlane foi criada com sucesso.', 'Your swimlane have been created successfully.' => 'Sua swimlane foi criada com sucesso.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Esta exportação contém o número de tarefas por coluna agrupada por dia.', 'This export contains the number of tasks per column grouped per day.' => 'Esta exportação contém o número de tarefas por coluna agrupada por dia.',
'Active swimlanes' => 'Activar swimlanes', 'Active swimlanes' => 'Activar swimlanes',
'Add a new swimlane' => 'Adicionar novo swimlane', 'Add a new swimlane' => 'Adicionar novo swimlane',
'Change default swimlane' => 'Alterar swimlane padrão',
'Default swimlane' => 'Swimlane padrão', 'Default swimlane' => 'Swimlane padrão',
'Do you really want to remove this swimlane: "%s"?' => 'Tem a certeza que quer remover este swimlane: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Tem a certeza que quer remover este swimlane: "%s"?',
'Inactive swimlanes' => 'Desactivar swimlanes', 'Inactive swimlanes' => 'Desactivar swimlanes',
'Remove a swimlane' => 'Remover um swimlane', 'Remove a swimlane' => 'Remover um swimlane',
'Show default swimlane' => 'Mostrar swimlane padrão',
'Swimlane modification for the project "%s"' => 'Modificação de swimlane para o projeto "%s"', 'Swimlane modification for the project "%s"' => 'Modificação de swimlane para o projeto "%s"',
'Swimlane removed successfully.' => 'Swimlane removido com sucesso.', 'Swimlane removed successfully.' => 'Swimlane removido com sucesso.',
'Swimlanes' => 'Swimlanes', 'Swimlanes' => 'Swimlanes',
'Swimlane updated successfully.' => 'Swimlane atualizado com sucesso.', 'Swimlane updated successfully.' => 'Swimlane atualizado com sucesso.',
'The default swimlane have been updated successfully.' => 'O swimlane padrão foi atualizado com sucesso.',
'Unable to remove this swimlane.' => 'Não foi possível remover este swimlane.', 'Unable to remove this swimlane.' => 'Não foi possível remover este swimlane.',
'Unable to update this swimlane.' => 'Não foi possível atualizar este swimlane.', 'Unable to update this swimlane.' => 'Não foi possível atualizar este swimlane.',
'Your swimlane have been created successfully.' => 'Seu swimlane foi criado com sucesso.', 'Your swimlane have been created successfully.' => 'Seu swimlane foi criado com sucesso.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Этот экспорт содержит ряд задач в колонках, сгруппированные по дням.', 'This export contains the number of tasks per column grouped per day.' => 'Этот экспорт содержит ряд задач в колонках, сгруппированные по дням.',
'Active swimlanes' => 'Активные дорожки', 'Active swimlanes' => 'Активные дорожки',
'Add a new swimlane' => 'Добавить новую дорожку', 'Add a new swimlane' => 'Добавить новую дорожку',
'Change default swimlane' => 'Сменить стандартную дорожку',
'Default swimlane' => 'Стандартная дорожка', 'Default swimlane' => 'Стандартная дорожка',
'Do you really want to remove this swimlane: "%s"?' => 'Вы действительно хотите удалить дорожку "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Вы действительно хотите удалить дорожку "%s"?',
'Inactive swimlanes' => 'Неактивные дорожки', 'Inactive swimlanes' => 'Неактивные дорожки',
'Remove a swimlane' => 'Удалить дорожку', 'Remove a swimlane' => 'Удалить дорожку',
'Show default swimlane' => 'Показать стандартную дорожку',
'Swimlane modification for the project "%s"' => 'Редактирование дорожки для проекта "%s"', 'Swimlane modification for the project "%s"' => 'Редактирование дорожки для проекта "%s"',
'Swimlane removed successfully.' => 'Дорожка успешно удалена', 'Swimlane removed successfully.' => 'Дорожка успешно удалена',
'Swimlanes' => 'Дорожки', 'Swimlanes' => 'Дорожки',
'Swimlane updated successfully.' => 'Дорожка успешно обновлена.', 'Swimlane updated successfully.' => 'Дорожка успешно обновлена.',
'The default swimlane have been updated successfully.' => 'Стандартная swimlane был успешно обновлен.',
'Unable to remove this swimlane.' => 'Невозможно удалить дорожку.', 'Unable to remove this swimlane.' => 'Невозможно удалить дорожку.',
'Unable to update this swimlane.' => 'Невозможно обновить дорожку.', 'Unable to update this swimlane.' => 'Невозможно обновить дорожку.',
'Your swimlane have been created successfully.' => 'Ваша дорожка была успешно создан.', 'Your swimlane have been created successfully.' => 'Ваша дорожка была успешно создан.',

View File

@ -441,17 +441,14 @@ return array(
// 'This export contains the number of tasks per column grouped per day.' => '', // 'This export contains the number of tasks per column grouped per day.' => '',
'Active swimlanes' => 'Aktivni razdelnik', 'Active swimlanes' => 'Aktivni razdelnik',
'Add a new swimlane' => 'Dodaj razdelnik', 'Add a new swimlane' => 'Dodaj razdelnik',
'Change default swimlane' => 'Zameni osnovni razdelnik',
'Default swimlane' => 'Osnovni razdelnik', 'Default swimlane' => 'Osnovni razdelnik',
'Do you really want to remove this swimlane: "%s"?' => 'Da li da uklonim razdelnik: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Da li da uklonim razdelnik: "%s"?',
'Inactive swimlanes' => 'Neaktivni razdelniki', 'Inactive swimlanes' => 'Neaktivni razdelniki',
'Remove a swimlane' => 'Ukloni razdelnik', 'Remove a swimlane' => 'Ukloni razdelnik',
'Show default swimlane' => 'Prikaži osnovni razdelnik',
'Swimlane modification for the project "%s"' => 'Izmena razdelnika za projekat "%s"', 'Swimlane modification for the project "%s"' => 'Izmena razdelnika za projekat "%s"',
'Swimlane removed successfully.' => 'Razdelnik uspešno uklonjen.', 'Swimlane removed successfully.' => 'Razdelnik uspešno uklonjen.',
'Swimlanes' => 'Razdelnici', 'Swimlanes' => 'Razdelnici',
'Swimlane updated successfully.' => 'Razdelnik zaktualizowany pomyślnie.', 'Swimlane updated successfully.' => 'Razdelnik zaktualizowany pomyślnie.',
// 'The default swimlane have been updated successfully.' => '',
// 'Unable to remove this swimlane.' => '', // 'Unable to remove this swimlane.' => '',
// 'Unable to update this swimlane.' => '', // 'Unable to update this swimlane.' => '',
'Your swimlane have been created successfully.' => 'Razdelnik je uspešno kreiran.', 'Your swimlane have been created successfully.' => 'Razdelnik je uspešno kreiran.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Denna export innehåller antalet uppgifter per kolumn grupperade per dag.', 'This export contains the number of tasks per column grouped per day.' => 'Denna export innehåller antalet uppgifter per kolumn grupperade per dag.',
'Active swimlanes' => 'Aktiva swimlanes', 'Active swimlanes' => 'Aktiva swimlanes',
'Add a new swimlane' => 'Lägg till en nytt swimlane', 'Add a new swimlane' => 'Lägg till en nytt swimlane',
'Change default swimlane' => 'Ändra standard swimlane',
'Default swimlane' => 'Standard swimlane', 'Default swimlane' => 'Standard swimlane',
'Do you really want to remove this swimlane: "%s"?' => 'Vill du verkligen ta bort denna swimlane: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Vill du verkligen ta bort denna swimlane: "%s"?',
'Inactive swimlanes' => 'Inaktiv swimlane', 'Inactive swimlanes' => 'Inaktiv swimlane',
'Remove a swimlane' => 'Ta bort en swimlane', 'Remove a swimlane' => 'Ta bort en swimlane',
'Show default swimlane' => 'Visa standard swimlane',
'Swimlane modification for the project "%s"' => 'Ändra swimlane för projektet "%s"', 'Swimlane modification for the project "%s"' => 'Ändra swimlane för projektet "%s"',
'Swimlane removed successfully.' => 'Swimlane togs bort', 'Swimlane removed successfully.' => 'Swimlane togs bort',
'Swimlanes' => 'Swimlanes', 'Swimlanes' => 'Swimlanes',
'Swimlane updated successfully.' => 'Swimlane uppdaterad', 'Swimlane updated successfully.' => 'Swimlane uppdaterad',
'The default swimlane have been updated successfully.' => 'Standardswimlane har uppdaterats',
'Unable to remove this swimlane.' => 'Kunde inte ta bort swimlane', 'Unable to remove this swimlane.' => 'Kunde inte ta bort swimlane',
'Unable to update this swimlane.' => 'Kunde inte uppdatera swimlane', 'Unable to update this swimlane.' => 'Kunde inte uppdatera swimlane',
'Your swimlane have been created successfully.' => 'Din swimlane har skapats', 'Your swimlane have been created successfully.' => 'Din swimlane har skapats',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'การส่งออกนี้เป็นการนับจำนวนงานในแต่ละคอลัมน์ในแต่ละวัน', 'This export contains the number of tasks per column grouped per day.' => 'การส่งออกนี้เป็นการนับจำนวนงานในแต่ละคอลัมน์ในแต่ละวัน',
'Active swimlanes' => 'สวิมเลนพร้อมใช้งาน', 'Active swimlanes' => 'สวิมเลนพร้อมใช้งาน',
'Add a new swimlane' => 'เพิ่มสวิมเลนใหม่', 'Add a new swimlane' => 'เพิ่มสวิมเลนใหม่',
'Change default swimlane' => 'เปลี่ยนสวิมเลนเริ่มต้น',
'Default swimlane' => 'สวิมเลนเริ่มต้น', 'Default swimlane' => 'สวิมเลนเริ่มต้น',
'Do you really want to remove this swimlane: "%s"?' => 'คุณต้องการลบสวิมเลนนี้ : "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'คุณต้องการลบสวิมเลนนี้ : "%s"?',
'Inactive swimlanes' => 'สวิมเลนไม่ทำงาน', 'Inactive swimlanes' => 'สวิมเลนไม่ทำงาน',
'Remove a swimlane' => 'ลบสวิมเลน', 'Remove a swimlane' => 'ลบสวิมเลน',
'Show default swimlane' => 'แสดงสวิมเลนเริ่มต้น',
'Swimlane modification for the project "%s"' => 'แก้ไขสวิมเลนสำหรับโปรเจค "%s"', 'Swimlane modification for the project "%s"' => 'แก้ไขสวิมเลนสำหรับโปรเจค "%s"',
'Swimlane removed successfully.' => 'ลบสวิมเลนเรียบร้อยแล้ว', 'Swimlane removed successfully.' => 'ลบสวิมเลนเรียบร้อยแล้ว',
'Swimlanes' => 'สวิมเลน', 'Swimlanes' => 'สวิมเลน',
'Swimlane updated successfully.' => 'ปรับปรุงสวิมเลนเรียบร้อยแล้ว', 'Swimlane updated successfully.' => 'ปรับปรุงสวิมเลนเรียบร้อยแล้ว',
'The default swimlane have been updated successfully.' => 'สวิมเลนเริ่มต้นปรับปรุงเรียบร้อยแล้ว',
'Unable to remove this swimlane.' => 'ไม่สามารถลบสวิมเลนนี้', 'Unable to remove this swimlane.' => 'ไม่สามารถลบสวิมเลนนี้',
'Unable to update this swimlane.' => 'ไม่สามารถปรับปรุงสวิมเลนนี้', 'Unable to update this swimlane.' => 'ไม่สามารถปรับปรุงสวิมเลนนี้',
'Your swimlane have been created successfully.' => 'สวิมเลนของคุณถูกสร้างเรียบร้อยแล้ว', 'Your swimlane have been created successfully.' => 'สวิมเลนของคุณถูกสร้างเรียบร้อยแล้ว',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => 'Bu dışa aktarım günlük gruplanmış olarak her sütundaki görev sayısını içerir.', 'This export contains the number of tasks per column grouped per day.' => 'Bu dışa aktarım günlük gruplanmış olarak her sütundaki görev sayısını içerir.',
'Active swimlanes' => 'Aktif Kulvar', 'Active swimlanes' => 'Aktif Kulvar',
'Add a new swimlane' => 'Yeni bir Kulvar ekle', 'Add a new swimlane' => 'Yeni bir Kulvar ekle',
'Change default swimlane' => 'Varsayılan Kulvarı değiştir',
'Default swimlane' => 'Varsayılan Kulvar', 'Default swimlane' => 'Varsayılan Kulvar',
'Do you really want to remove this swimlane: "%s"?' => 'Bu Kulvarı silmek istediğinize emin misiniz?: "%s"?', 'Do you really want to remove this swimlane: "%s"?' => 'Bu Kulvarı silmek istediğinize emin misiniz?: "%s"?',
'Inactive swimlanes' => 'Pasif Kulvarlar', 'Inactive swimlanes' => 'Pasif Kulvarlar',
'Remove a swimlane' => 'Kulvarı sil', 'Remove a swimlane' => 'Kulvarı sil',
'Show default swimlane' => 'Varsayılan Kulvarı göster',
'Swimlane modification for the project "%s"' => '"%s" Projesi için Kulvar değişikliği', 'Swimlane modification for the project "%s"' => '"%s" Projesi için Kulvar değişikliği',
'Swimlane removed successfully.' => 'Kulvar başarıyla kaldırıldı.', 'Swimlane removed successfully.' => 'Kulvar başarıyla kaldırıldı.',
'Swimlanes' => 'Kulvarlar', 'Swimlanes' => 'Kulvarlar',
'Swimlane updated successfully.' => 'Kulvar başarıyla güncellendi.', 'Swimlane updated successfully.' => 'Kulvar başarıyla güncellendi.',
'The default swimlane have been updated successfully.' => 'Varsayılan Kulvarlar başarıyla güncellendi.',
'Unable to remove this swimlane.' => 'Bu Kulvarı silmek mümkün değil.', 'Unable to remove this swimlane.' => 'Bu Kulvarı silmek mümkün değil.',
'Unable to update this swimlane.' => 'Bu Kulvarı değiştirmek mümkün değil.', 'Unable to update this swimlane.' => 'Bu Kulvarı değiştirmek mümkün değil.',
'Your swimlane have been created successfully.' => 'Kulvar başarıyla oluşturuldu.', 'Your swimlane have been created successfully.' => 'Kulvar başarıyla oluşturuldu.',

View File

@ -441,17 +441,14 @@ return array(
'This export contains the number of tasks per column grouped per day.' => '此导出包含每列的任务数,按天分组', 'This export contains the number of tasks per column grouped per day.' => '此导出包含每列的任务数,按天分组',
'Active swimlanes' => '活动里程碑', 'Active swimlanes' => '活动里程碑',
'Add a new swimlane' => '添加新里程碑', 'Add a new swimlane' => '添加新里程碑',
'Change default swimlane' => '修改默认里程碑',
'Default swimlane' => '默认里程碑', 'Default swimlane' => '默认里程碑',
'Do you really want to remove this swimlane: "%s"?' => '确定要删除里程碑:"%s"?', 'Do you really want to remove this swimlane: "%s"?' => '确定要删除里程碑:"%s"?',
'Inactive swimlanes' => '非活动里程碑', 'Inactive swimlanes' => '非活动里程碑',
'Remove a swimlane' => '删除里程碑', 'Remove a swimlane' => '删除里程碑',
'Show default swimlane' => '显示默认里程碑',
'Swimlane modification for the project "%s"' => '项目"%s"的里程碑变更', 'Swimlane modification for the project "%s"' => '项目"%s"的里程碑变更',
'Swimlane removed successfully.' => '成功删除里程碑', 'Swimlane removed successfully.' => '成功删除里程碑',
'Swimlanes' => '里程碑', 'Swimlanes' => '里程碑',
'Swimlane updated successfully.' => '成功更新了里程碑。', 'Swimlane updated successfully.' => '成功更新了里程碑。',
'The default swimlane have been updated successfully.' => '成功更新了默认里程碑。',
'Unable to remove this swimlane.' => '无法删除此里程碑', 'Unable to remove this swimlane.' => '无法删除此里程碑',
'Unable to update this swimlane.' => '无法更新此里程碑', 'Unable to update this swimlane.' => '无法更新此里程碑',
'Your swimlane have been created successfully.' => '已经成功创建里程碑。', 'Your swimlane have been created successfully.' => '已经成功创建里程碑。',

View File

@ -26,7 +26,6 @@ class ProjectDuplicationModel extends Base
'categoryModel', 'categoryModel',
'projectPermissionModel', 'projectPermissionModel',
'actionModel', 'actionModel',
'swimlaneModel',
'tagDuplicationModel', 'tagDuplicationModel',
'projectMetadataModel', 'projectMetadataModel',
'projectTaskDuplicationModel', 'projectTaskDuplicationModel',
@ -42,6 +41,7 @@ class ProjectDuplicationModel extends Base
public function getPossibleSelection() public function getPossibleSelection()
{ {
return array( return array(
'swimlaneModel',
'boardModel', 'boardModel',
'categoryModel', 'categoryModel',
'projectPermissionModel', 'projectPermissionModel',
@ -94,7 +94,7 @@ class ProjectDuplicationModel extends Base
return false; return false;
} }
// Clone Columns, Categories, Permissions and Actions // Clone Swimlanes, Columns, Categories, Permissions and Actions
foreach ($this->getPossibleSelection() as $model) { foreach ($this->getPossibleSelection() as $model) {
// Skip if optional part has not been selected // Skip if optional part has not been selected
@ -151,11 +151,7 @@ class ProjectDuplicationModel extends Base
'priority_end' => $project['priority_end'], 'priority_end' => $project['priority_end'],
); );
if (! $this->db->table(ProjectModel::TABLE)->save($values)) { return $this->db->table(ProjectModel::TABLE)->persist($values);
return false;
}
return $this->db->getLastId();
} }
/** /**

View File

@ -321,19 +321,19 @@ class ProjectModel extends Base
* Create a project * Create a project
* *
* @access public * @access public
* @param array $values Form values * @param array $values Form values
* @param integer $user_id User who create the project * @param integer $userId User who create the project
* @param bool $add_user Automatically add the user * @param bool $addUser Automatically add the user
* @return integer Project id * @return int Project id
*/ */
public function create(array $values, $user_id = 0, $add_user = false) public function create(array $values, $userId = 0, $addUser = false)
{ {
$this->db->startTransaction(); $this->db->startTransaction();
$values['token'] = ''; $values['token'] = '';
$values['last_modified'] = time(); $values['last_modified'] = time();
$values['is_private'] = empty($values['is_private']) ? 0 : 1; $values['is_private'] = empty($values['is_private']) ? 0 : 1;
$values['owner_id'] = $user_id; $values['owner_id'] = $userId;
if (! empty($values['identifier'])) { if (! empty($values['identifier'])) {
$values['identifier'] = strtoupper($values['identifier']); $values['identifier'] = strtoupper($values['identifier']);
@ -353,8 +353,13 @@ class ProjectModel extends Base
return false; return false;
} }
if ($add_user && $user_id) { if (! $this->swimlaneModel->create($project_id, t('Default swimlane'))) {
$this->projectUserRoleModel->addUser($project_id, $user_id, Role::PROJECT_MANAGER); $this->db->cancelTransaction();
return false;
}
if ($addUser && $userId) {
$this->projectUserRoleModel->addUser($project_id, $userId, Role::PROJECT_MANAGER);
} }
$this->categoryModel->createDefaultCategories($project_id); $this->categoryModel->createDefaultCategories($project_id);

View File

@ -37,38 +37,40 @@ class SwimlaneModel extends Base
* Get a swimlane by the id * Get a swimlane by the id
* *
* @access public * @access public
* @param integer $swimlane_id Swimlane id * @param integer $swimlaneId
* @return array * @return array
*/ */
public function getById($swimlane_id) public function getById($swimlaneId)
{ {
return $this->db->table(self::TABLE)->eq('id', $swimlane_id)->findOne(); return $this->db->table(self::TABLE)->eq('id', $swimlaneId)->findOne();
} }
/** /**
* Get the swimlane name by the id * Get the swimlane name by the id
* *
* @access public * @access public
* @param integer $swimlane_id Swimlane id * @param integer $swimlaneId
* @return string * @return string
*/ */
public function getNameById($swimlane_id) public function getNameById($swimlaneId)
{ {
return $this->db->table(self::TABLE)->eq('id', $swimlane_id)->findOneColumn('name') ?: ''; return $this->db->table(self::TABLE)
->eq('id', $swimlaneId)
->findOneColumn('name');
} }
/** /**
* Get a swimlane id by the project and the name * Get a swimlane id by the project and the name
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projectId Project id
* @param string $name Name * @param string $name Name
* @return integer * @return integer
*/ */
public function getIdByName($project_id, $name) public function getIdByName($projectId, $name)
{ {
return (int) $this->db->table(self::TABLE) return (int) $this->db->table(self::TABLE)
->eq('project_id', $project_id) ->eq('project_id', $projectId)
->eq('name', $name) ->eq('name', $name)
->findOneColumn('id'); ->findOneColumn('id');
} }
@ -77,14 +79,14 @@ class SwimlaneModel extends Base
* Get a swimlane by the project and the name * Get a swimlane by the project and the name
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projectId Project id
* @param string $name Swimlane name * @param string $name Swimlane name
* @return array * @return array
*/ */
public function getByName($project_id, $name) public function getByName($projectId, $name)
{ {
return $this->db->table(self::TABLE) return $this->db->table(self::TABLE)
->eq('project_id', $project_id) ->eq('project_id', $projectId)
->eq('name', $name) ->eq('name', $name)
->findOne(); ->findOne();
} }
@ -93,54 +95,46 @@ class SwimlaneModel extends Base
* Get first active swimlane for a project * Get first active swimlane for a project
* *
* @access public * @access public
* @param integer $project_id * @param integer $projectId
* @return array|null * @return array|null
*/ */
public function getFirstActiveSwimlane($project_id) public function getFirstActiveSwimlane($projectId)
{ {
$swimlanes = $this->getSwimlanes($project_id); return $this->db->table(self::TABLE)
->eq('project_id', $projectId)
if (empty($swimlanes)) { ->eq('is_active', 1)
return null; ->asc('position')
} ->findOne();
return $swimlanes[0];
} }
/** /**
* Get default swimlane properties * Get first active swimlaneId
* *
* @access public * @access public
* @param integer $project_id Project id * @param int $projectId
* @return array * @return int
*/ */
public function getDefault($project_id) public function getFirstActiveSwimlaneId($projectId)
{ {
$result = $this->db return (int) $this->db->table(self::TABLE)
->table(ProjectModel::TABLE) ->eq('project_id', $projectId)
->eq('id', $project_id) ->eq('is_active', 1)
->columns('id', 'default_swimlane', 'show_default_swimlane') ->asc('position')
->findOne(); ->findOneColumn('id');
if ($result['default_swimlane'] === 'Default swimlane') {
$result['default_swimlane'] = t($result['default_swimlane']);
}
return $result;
} }
/** /**
* Get all swimlanes for a given project * Get all swimlanes for a given project
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projectId
* @return array * @return array
*/ */
public function getAll($project_id) public function getAll($projectId)
{ {
return $this->db return $this->db
->table(self::TABLE) ->table(self::TABLE)
->eq('project_id', $project_id) ->eq('project_id', $projectId)
->orderBy('position', 'asc') ->orderBy('position', 'asc')
->findAll(); ->findAll();
} }
@ -149,15 +143,15 @@ class SwimlaneModel extends Base
* Get the list of swimlanes by status * Get the list of swimlanes by status
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projectId
* @param integer $status Status * @param integer $status
* @return array * @return array
*/ */
public function getAllByStatus($project_id, $status = self::ACTIVE) public function getAllByStatus($projectId, $status = self::ACTIVE)
{ {
$query = $this->db $query = $this->db
->table(self::TABLE) ->table(self::TABLE)
->eq('project_id', $project_id) ->eq('project_id', $projectId)
->eq('is_active', $status); ->eq('is_active', $status);
if ($status == self::ACTIVE) { if ($status == self::ACTIVE) {
@ -169,66 +163,27 @@ class SwimlaneModel extends Base
return $query->findAll(); return $query->findAll();
} }
/**
* Get active swimlanes
*
* @access public
* @param integer $project_id Project id
* @return array
*/
public function getSwimlanes($project_id)
{
$swimlanes = $this->db
->table(self::TABLE)
->columns('id', 'name', 'description')
->eq('project_id', $project_id)
->eq('is_active', self::ACTIVE)
->orderBy('position', 'asc')
->findAll();
$defaultSwimlane = $this->db
->table(ProjectModel::TABLE)
->eq('id', $project_id)
->eq('show_default_swimlane', 1)
->findOneColumn('default_swimlane');
if ($defaultSwimlane) {
if ($defaultSwimlane === 'Default swimlane') {
$defaultSwimlane = t($defaultSwimlane);
}
array_unshift($swimlanes, array('id' => 0, 'name' => $defaultSwimlane));
}
return $swimlanes;
}
/** /**
* Get list of all swimlanes * Get list of all swimlanes
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projectId Project id
* @param boolean $prepend Prepend default value * @param boolean $prepend Prepend default value
* @param boolean $only_active Return only active swimlanes * @param boolean $onlyActive Return only active swimlanes
* @return array * @return array
*/ */
public function getList($project_id, $prepend = false, $only_active = false) public function getList($projectId, $prepend = false, $onlyActive = false)
{ {
$swimlanes = array(); $swimlanes = array();
$default = $this->db->table(ProjectModel::TABLE)->eq('id', $project_id)->eq('show_default_swimlane', 1)->findOneColumn('default_swimlane');
if ($prepend) { if ($prepend) {
$swimlanes[-1] = t('All swimlanes'); $swimlanes[-1] = t('All swimlanes');
} }
if (! empty($default)) {
$swimlanes[0] = $default === 'Default swimlane' ? t($default) : $default;
}
return $swimlanes + $this->db return $swimlanes + $this->db
->hashtable(self::TABLE) ->hashtable(self::TABLE)
->eq('project_id', $project_id) ->eq('project_id', $projectId)
->in('is_active', $only_active ? array(self::ACTIVE) : array(self::ACTIVE, self::INACTIVE)) ->in('is_active', $onlyActive ? array(self::ACTIVE) : array(self::ACTIVE, self::INACTIVE))
->orderBy('position', 'asc') ->orderBy('position', 'asc')
->getAll('id', 'name'); ->getAll('id', 'name');
} }
@ -237,17 +192,24 @@ class SwimlaneModel extends Base
* Add a new swimlane * Add a new swimlane
* *
* @access public * @access public
* @param array $values Form values * @param int $projectId
* @return integer|boolean * @param string $name
* @param string $description
* @return bool|int
*/ */
public function create($values) public function create($projectId, $name, $description = '')
{ {
if (! $this->projectModel->exists($values['project_id'])) { if (! $this->projectModel->exists($projectId)) {
return 0; return 0;
} }
$values['position'] = $this->getLastPosition($values['project_id']); return $this->db->table(self::TABLE)->persist(array(
return $this->db->table(self::TABLE)->persist($values); 'project_id' => $projectId,
'name' => $name,
'description' => $description,
'position' => $this->getLastPosition($projectId),
'is_active' => 1,
));
} }
/** /**
@ -265,70 +227,18 @@ class SwimlaneModel extends Base
->update($values); ->update($values);
} }
/**
* Update the default swimlane
*
* @access public
* @param array $values Form values
* @return bool
*/
public function updateDefault(array $values)
{
return $this->db
->table(ProjectModel::TABLE)
->eq('id', $values['id'])
->update(array(
'default_swimlane' => $values['default_swimlane'],
'show_default_swimlane' => $values['show_default_swimlane'],
));
}
/**
* Enable the default swimlane
*
* @access public
* @param integer $project_id
* @return bool
*/
public function enableDefault($project_id)
{
return $this->db
->table(ProjectModel::TABLE)
->eq('id', $project_id)
->update(array(
'show_default_swimlane' => 1,
));
}
/**
* Disable the default swimlane
*
* @access public
* @param integer $project_id
* @return bool
*/
public function disableDefault($project_id)
{
return $this->db
->table(ProjectModel::TABLE)
->eq('id', $project_id)
->update(array(
'show_default_swimlane' => 0,
));
}
/** /**
* Get the last position of a swimlane * Get the last position of a swimlane
* *
* @access public * @access public
* @param integer $project_id * @param integer $projectId
* @return integer * @return integer
*/ */
public function getLastPosition($project_id) public function getLastPosition($projectId)
{ {
return $this->db return $this->db
->table(self::TABLE) ->table(self::TABLE)
->eq('project_id', $project_id) ->eq('project_id', $projectId)
->eq('is_active', 1) ->eq('is_active', 1)
->count() + 1; ->count() + 1;
} }
@ -337,23 +247,23 @@ class SwimlaneModel extends Base
* Disable a swimlane * Disable a swimlane
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projectId
* @param integer $swimlane_id Swimlane id * @param integer $swimlaneId
* @return bool * @return bool
*/ */
public function disable($project_id, $swimlane_id) public function disable($projectId, $swimlaneId)
{ {
$result = $this->db $result = $this->db
->table(self::TABLE) ->table(self::TABLE)
->eq('id', $swimlane_id) ->eq('id', $swimlaneId)
->eq('project_id', $projectId)
->update(array( ->update(array(
'is_active' => self::INACTIVE, 'is_active' => self::INACTIVE,
'position' => 0, 'position' => 0,
)); ));
if ($result) { if ($result) {
// Re-order positions $this->updatePositions($projectId);
$this->updatePositions($project_id);
} }
return $result; return $result;
@ -363,18 +273,19 @@ class SwimlaneModel extends Base
* Enable a swimlane * Enable a swimlane
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projectId
* @param integer $swimlane_id Swimlane id * @param integer $swimlaneId
* @return bool * @return bool
*/ */
public function enable($project_id, $swimlane_id) public function enable($projectId, $swimlaneId)
{ {
return $this->db return $this->db
->table(self::TABLE) ->table(self::TABLE)
->eq('id', $swimlane_id) ->eq('id', $swimlaneId)
->eq('project_id', $projectId)
->update(array( ->update(array(
'is_active' => self::ACTIVE, 'is_active' => self::ACTIVE,
'position' => $this->getLastPosition($project_id), 'position' => $this->getLastPosition($projectId),
)); ));
} }
@ -382,25 +293,25 @@ class SwimlaneModel extends Base
* Remove a swimlane * Remove a swimlane
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projecId
* @param integer $swimlane_id Swimlane id * @param integer $swimlaneId
* @return bool * @return bool
*/ */
public function remove($project_id, $swimlane_id) public function remove($projecId, $swimlaneId)
{ {
$this->db->startTransaction(); $this->db->startTransaction();
// Tasks should not be assigned anymore to this swimlane if ($this->db->table(TaskModel::TABLE)->eq('swimlane_id', $swimlaneId)->exists()) {
$this->db->table(TaskModel::TABLE)->eq('swimlane_id', $swimlane_id)->update(array('swimlane_id' => 0));
if (! $this->db->table(self::TABLE)->eq('id', $swimlane_id)->remove()) {
$this->db->cancelTransaction(); $this->db->cancelTransaction();
return false; return false;
} }
// Re-order positions if (! $this->db->table(self::TABLE)->eq('id', $swimlaneId)->remove()) {
$this->updatePositions($project_id); $this->db->cancelTransaction();
return false;
}
$this->updatePositions($projecId);
$this->db->closeTransaction(); $this->db->closeTransaction();
return true; return true;
@ -410,15 +321,15 @@ class SwimlaneModel extends Base
* Update swimlane positions after disabling or removing a swimlane * Update swimlane positions after disabling or removing a swimlane
* *
* @access public * @access public
* @param integer $project_id Project id * @param integer $projectId
* @return boolean * @return boolean
*/ */
public function updatePositions($project_id) public function updatePositions($projectId)
{ {
$position = 0; $position = 0;
$swimlanes = $this->db $swimlanes = $this->db
->table(self::TABLE) ->table(self::TABLE)
->eq('project_id', $project_id) ->eq('project_id', $projectId)
->eq('is_active', 1) ->eq('is_active', 1)
->asc('position') ->asc('position')
->asc('id') ->asc('id')
@ -441,37 +352,37 @@ class SwimlaneModel extends Base
* Change swimlane position * Change swimlane position
* *
* @access public * @access public
* @param integer $project_id * @param integer $projectId
* @param integer $swimlane_id * @param integer $swimlaneId
* @param integer $position * @param integer $position
* @return boolean * @return boolean
*/ */
public function changePosition($project_id, $swimlane_id, $position) public function changePosition($projectId, $swimlaneId, $position)
{ {
if ($position < 1 || $position > $this->db->table(self::TABLE)->eq('project_id', $project_id)->count()) { if ($position < 1 || $position > $this->db->table(self::TABLE)->eq('project_id', $projectId)->count()) {
return false; return false;
} }
$swimlane_ids = $this->db->table(self::TABLE) $swimlaneIds = $this->db->table(self::TABLE)
->eq('is_active', 1) ->eq('is_active', 1)
->eq('project_id', $project_id) ->eq('project_id', $projectId)
->neq('id', $swimlane_id) ->neq('id', $swimlaneId)
->asc('position') ->asc('position')
->findAllByColumn('id'); ->findAllByColumn('id');
$offset = 1; $offset = 1;
$results = array(); $results = array();
foreach ($swimlane_ids as $current_swimlane_id) { foreach ($swimlaneIds as $currentSwimlaneId) {
if ($offset == $position) { if ($offset == $position) {
$offset++; $offset++;
} }
$results[] = $this->db->table(self::TABLE)->eq('id', $current_swimlane_id)->update(array('position' => $offset)); $results[] = $this->db->table(self::TABLE)->eq('id', $currentSwimlaneId)->update(array('position' => $offset));
$offset++; $offset++;
} }
$results[] = $this->db->table(self::TABLE)->eq('id', $swimlane_id)->update(array('position' => $position)); $results[] = $this->db->table(self::TABLE)->eq('id', $swimlaneId)->update(array('position' => $position));
return !in_array(false, $results, true); return !in_array(false, $results, true);
} }
@ -480,29 +391,30 @@ class SwimlaneModel extends Base
* Duplicate Swimlane to project * Duplicate Swimlane to project
* *
* @access public * @access public
* @param integer $project_from Project Template * @param integer $projectSrcId
* @param integer $project_to Project that receives the copy * @param integer $projectDstId
* @return integer|boolean * @return boolean
*/ */
public function duplicate($projectSrcId, $projectDstId)
public function duplicate($project_from, $project_to)
{ {
$swimlanes = $this->getAll($project_from); $swimlanes = $this->getAll($projectSrcId);
foreach ($swimlanes as $swimlane) { foreach ($swimlanes as $swimlane) {
unset($swimlane['id']); if (! $this->db->table(self::TABLE)->eq('project_id', $projectDstId)->eq('name', $swimlane['name'])->exists()) {
$swimlane['project_id'] = $project_to; $values = array(
'name' => $swimlane['name'],
'description' => $swimlane['description'],
'position' => $swimlane['position'],
'is_active' => $swimlane['is_active'],
'project_id' => $projectDstId,
);
if (! $this->db->table(self::TABLE)->save($swimlane)) { if (! $this->db->table(self::TABLE)->persist($values)) {
return false; return false;
}
} }
} }
$default_swimlane = $this->getDefault($project_from);
$default_swimlane['id'] = $project_to;
$this->updateDefault($default_swimlane);
return true; return true;
} }
} }

View File

@ -62,7 +62,7 @@ class TaskCreationModel extends Base
$values = $this->dateParser->convert($values, array('date_started'), true); $values = $this->dateParser->convert($values, array('date_started'), true);
$this->helper->model->removeFields($values, array('another_task', 'duplicate_multiple_projects')); $this->helper->model->removeFields($values, array('another_task', 'duplicate_multiple_projects'));
$this->helper->model->resetFields($values, array('creator_id', 'owner_id', 'swimlane_id', 'date_due', 'date_started', 'score', 'category_id', 'time_estimated', 'time_spent')); $this->helper->model->resetFields($values, array('creator_id', 'owner_id', 'date_due', 'date_started', 'score', 'category_id', 'time_estimated', 'time_spent'));
if (empty($values['column_id'])) { if (empty($values['column_id'])) {
$values['column_id'] = $this->columnModel->getFirstColumnId($values['project_id']); $values['column_id'] = $this->columnModel->getFirstColumnId($values['project_id']);
@ -80,7 +80,7 @@ class TaskCreationModel extends Base
$values['creator_id'] = $this->userSession->getId(); $values['creator_id'] = $this->userSession->getId();
} }
$values['swimlane_id'] = empty($values['swimlane_id']) ? 0 : $values['swimlane_id']; $values['swimlane_id'] = empty($values['swimlane_id']) ? $this->swimlaneModel->getFirstActiveSwimlaneId($values['project_id']) : $values['swimlane_id'];
$values['date_creation'] = time(); $values['date_creation'] = time();
$values['date_modification'] = $values['date_creation']; $values['date_modification'] = $values['date_creation'];
$values['date_moved'] = $values['date_creation']; $values['date_moved'] = $values['date_creation'];

View File

@ -79,11 +79,13 @@ class TaskDuplicationModel extends Base
} }
// Check if the swimlane exists for the destination project // Check if the swimlane exists for the destination project
if ($values['swimlane_id'] > 0) { $values['swimlane_id'] = $this->swimlaneModel->getIdByName(
$values['swimlane_id'] = $this->swimlaneModel->getIdByName( $values['project_id'],
$values['project_id'], $this->swimlaneModel->getNameById($values['swimlane_id'])
$this->swimlaneModel->getNameById($values['swimlane_id']) );
);
if ($values['swimlane_id'] == 0) {
$values['swimlane_id'] = $this->swimlaneModel->getFirstActiveSwimlaneId($values['project_id']);
} }
// Check if the column exists for the destination project // Check if the column exists for the destination project

View File

@ -142,7 +142,6 @@ class TaskFinderModel extends Base
ColumnModel::TABLE.'.title AS column_name', ColumnModel::TABLE.'.title AS column_name',
ColumnModel::TABLE.'.position AS column_position', ColumnModel::TABLE.'.position AS column_position',
SwimlaneModel::TABLE.'.name AS swimlane_name', SwimlaneModel::TABLE.'.name AS swimlane_name',
ProjectModel::TABLE.'.default_swimlane',
ProjectModel::TABLE.'.name AS project_name' ProjectModel::TABLE.'.name AS project_name'
) )
->join(UserModel::TABLE, 'id', 'owner_id', TaskModel::TABLE) ->join(UserModel::TABLE, 'id', 'owner_id', TaskModel::TABLE)
@ -304,15 +303,13 @@ class TaskFinderModel extends Base
CategoryModel::TABLE.'.name AS category_name', CategoryModel::TABLE.'.name AS category_name',
SwimlaneModel::TABLE.'.name AS swimlane_name', SwimlaneModel::TABLE.'.name AS swimlane_name',
ProjectModel::TABLE.'.name AS project_name', ProjectModel::TABLE.'.name AS project_name',
ProjectModel::TABLE.'.default_swimlane',
ColumnModel::TABLE.'.title AS column_title', ColumnModel::TABLE.'.title AS column_title',
UserModel::TABLE.'.username AS assignee_username', UserModel::TABLE.'.username AS assignee_username',
UserModel::TABLE.'.name AS assignee_name', UserModel::TABLE.'.name AS assignee_name',
'uc.username AS creator_username', 'uc.username AS creator_username',
'uc.name AS creator_name', 'uc.name AS creator_name',
CategoryModel::TABLE.'.description AS category_description', CategoryModel::TABLE.'.description AS category_description',
ColumnModel::TABLE.'.position AS column_position', ColumnModel::TABLE.'.position AS column_position'
ProjectModel::TABLE.'.default_swimlane'
) )
->join(UserModel::TABLE, 'id', 'owner_id', TaskModel::TABLE) ->join(UserModel::TABLE, 'id', 'owner_id', TaskModel::TABLE)
->left(UserModel::TABLE, 'uc', 'id', TaskModel::TABLE, 'creator_id') ->left(UserModel::TABLE, 'uc', 'id', TaskModel::TABLE, 'creator_id')

View File

@ -33,6 +33,10 @@ class TaskPositionModel extends Base
$task = $this->taskFinderModel->getById($task_id); $task = $this->taskFinderModel->getById($task_id);
if ($swimlane_id == 0) {
$swimlane_id = $task['swimlane_id'];
}
if ($onlyOpen && $task['is_active'] == TaskModel::STATUS_CLOSED) { if ($onlyOpen && $task['is_active'] == TaskModel::STATUS_CLOSED) {
return true; return true;
} }

View File

@ -139,6 +139,6 @@ class TaskStatusModel extends Base
->table(TaskModel::TABLE) ->table(TaskModel::TABLE)
->eq('id', $task_id) ->eq('id', $task_id)
->eq('is_active', $status) ->eq('is_active', $status)
->count() === 1; ->exists();
} }
} }

63
app/Schema/Migration.php Normal file
View File

@ -0,0 +1,63 @@
<?php
namespace Schema;
use PDO;
function migrate_default_swimlane(PDO $pdo)
{
$projects = get_all_projects($pdo);
foreach ($projects as $project) {
// Create new default swimlane
$rq = $pdo->prepare('INSERT INTO swimlanes (project_id, name, is_active, position) VALUES (?, ?, ?, ?)');
$rq->execute(array(
$project['id'],
$project['default_swimlane'],
(int) $project['show_default_swimlane'],
$project['show_default_swimlane'] == 1 ? 1 : 0,
));
$swimlaneId = get_last_insert_id($pdo);
// Reorder swimlanes if the default one was active
if ($project['show_default_swimlane']) {
$rq = $pdo->prepare("UPDATE swimlanes SET position=position+1 WHERE project_id=? AND is_active='1' AND id!=?");
$rq->execute(array(
$project['id'],
$swimlaneId,
));
}
// Move all tasks to new swimlane
$rq = $pdo->prepare("UPDATE tasks SET swimlane_id=? WHERE swimlane_id='0' AND project_id=?");
$rq->execute(array(
$swimlaneId,
$project['id'],
));
// Migrate automatic actions
$rq = $pdo->prepare("UPDATE action_has_params SET value=? WHERE id IN (SELECT action_has_params.id FROM action_has_params LEFT JOIN actions ON actions.id=action_has_params.action_id WHERE project_id=? AND name='swimlane_id' AND value='0')");
$rq->execute(array($swimlaneId, $project['id']));
}
}
function get_all_projects(PDO $pdo)
{
$rq = $pdo->prepare('SELECT * FROM projects');
$rq->execute();
return $rq->fetchAll(PDO::FETCH_ASSOC);
}
function get_last_insert_id(PDO $pdo)
{
if (DB_DRIVER === 'postgres') {
$rq = $pdo->prepare('SELECT LASTVAL()');
$rq->execute();
return $rq->fetchColumn();
}
return $pdo->lastInsertId();
}

View File

@ -2,11 +2,23 @@
namespace Schema; namespace Schema;
require_once __DIR__.'/Migration.php';
use PDO; use PDO;
use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Token;
use Kanboard\Core\Security\Role; use Kanboard\Core\Security\Role;
const VERSION = 121; const VERSION = 122;
function version_122(PDO $pdo)
{
migrate_default_swimlane($pdo);
$pdo->exec('ALTER TABLE `projects` DROP COLUMN `default_swimlane`');
$pdo->exec('ALTER TABLE `projects` DROP COLUMN `show_default_swimlane`');
$pdo->exec('ALTER TABLE `tasks` MODIFY `swimlane_id` INT(11) NOT NULL;');
$pdo->exec('ALTER TABLE tasks ADD CONSTRAINT tasks_swimlane_ibfk_1 FOREIGN KEY (swimlane_id) REFERENCES swimlanes(id) ON DELETE CASCADE');
}
function version_121(PDO $pdo) function version_121(PDO $pdo)
{ {

View File

@ -2,11 +2,24 @@
namespace Schema; namespace Schema;
require_once __DIR__.'/Migration.php';
use PDO; use PDO;
use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Token;
use Kanboard\Core\Security\Role; use Kanboard\Core\Security\Role;
const VERSION = 100; const VERSION = 101;
function version_101(PDO $pdo)
{
migrate_default_swimlane($pdo);
$pdo->exec('ALTER TABLE "projects" DROP COLUMN "default_swimlane"');
$pdo->exec('ALTER TABLE "projects" DROP COLUMN "show_default_swimlane"');
$pdo->exec('ALTER TABLE "tasks" ALTER COLUMN "swimlane_id" SET NOT NULL');
$pdo->exec('ALTER TABLE "tasks" ALTER COLUMN "swimlane_id" DROP DEFAULT');
$pdo->exec('ALTER TABLE "tasks" ADD FOREIGN KEY (swimlane_id) REFERENCES swimlanes ON DELETE CASCADE');
}
function version_100(PDO $pdo) function version_100(PDO $pdo)
{ {

View File

@ -2,11 +2,18 @@
namespace Schema; namespace Schema;
require_once __DIR__.'/Migration.php';
use Kanboard\Core\Security\Token; use Kanboard\Core\Security\Token;
use Kanboard\Core\Security\Role; use Kanboard\Core\Security\Role;
use PDO; use PDO;
const VERSION = 111; const VERSION = 112;
function version_112(PDO $pdo)
{
migrate_default_swimlane($pdo);
}
function version_111(PDO $pdo) function version_111(PDO $pdo)
{ {

View File

@ -25,7 +25,6 @@
<?= $this->form->checkbox('categoryModel', t('Categories'), 1, true) ?> <?= $this->form->checkbox('categoryModel', t('Categories'), 1, true) ?>
<?= $this->form->checkbox('tagDuplicationModel', t('Tags'), 1, true) ?> <?= $this->form->checkbox('tagDuplicationModel', t('Tags'), 1, true) ?>
<?= $this->form->checkbox('actionModel', t('Actions'), 1, true) ?> <?= $this->form->checkbox('actionModel', t('Actions'), 1, true) ?>
<?= $this->form->checkbox('swimlaneModel', t('Swimlanes'), 1, true) ?>
<?= $this->form->checkbox('projectTaskDuplicationModel', t('Tasks'), 1, false) ?> <?= $this->form->checkbox('projectTaskDuplicationModel', t('Tasks'), 1, false) ?>
</div> </div>

View File

@ -17,7 +17,6 @@
<?= $this->form->checkbox('categoryModel', t('Categories'), 1, true) ?> <?= $this->form->checkbox('categoryModel', t('Categories'), 1, true) ?>
<?= $this->form->checkbox('tagDuplicationModel', t('Tags'), 1, true) ?> <?= $this->form->checkbox('tagDuplicationModel', t('Tags'), 1, true) ?>
<?= $this->form->checkbox('actionModel', t('Actions'), 1, true) ?> <?= $this->form->checkbox('actionModel', t('Actions'), 1, true) ?>
<?= $this->form->checkbox('swimlaneModel', t('Swimlanes'), 1, false) ?>
<?= $this->form->checkbox('projectMetadataModel', t('Metadata'), 1, false) ?> <?= $this->form->checkbox('projectMetadataModel', t('Metadata'), 1, false) ?>
<?= $this->form->checkbox('projectTaskDuplicationModel', t('Tasks'), 1, false) ?> <?= $this->form->checkbox('projectTaskDuplicationModel', t('Tasks'), 1, false) ?>

View File

@ -19,7 +19,7 @@
<?= $this->url->link('#'.$this->text->e($task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?> <?= $this->url->link('#'.$this->text->e($task['id']), 'TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
</td> </td>
<td> <td>
<?= $this->text->e($task['swimlane_name'] ?: $task['default_swimlane']) ?> <?= $this->text->e($task['swimlane_name']) ?>
</td> </td>
<td> <td>
<?= $this->text->e($task['column_name']) ?> <?= $this->text->e($task['column_name']) ?>

View File

@ -1,14 +0,0 @@
<div class="page-header">
<h2><?= t('Change default swimlane') ?></h2>
</div>
<form method="post" action="<?= $this->url->href('SwimlaneController', 'updateDefault', array('project_id' => $project['id'])) ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->form->hidden('id', $values) ?>
<?= $this->form->label(t('Name'), 'default_swimlane') ?>
<?= $this->form->text('default_swimlane', $values, $errors, array('autofocus', 'required', 'maxlength="50"')) ?>
<?= $this->form->checkbox('show_default_swimlane', t('Show default swimlane'), 1, $values['show_default_swimlane'] == 1) ?>
<?= $this->modal->submitButtons() ?>
</form>

View File

@ -7,21 +7,22 @@
</ul> </ul>
</div> </div>
<?php if (! empty($active_swimlanes) || $default_swimlane['show_default_swimlane'] == 1): ?>
<h3><?= t('Active swimlanes') ?></h3> <h3><?= t('Active swimlanes') ?></h3>
<?php if (empty($active_swimlanes)): ?>
<p class="alert alert-error"><?= t('Your project must have at least one active swimlane.') ?></p>
<?php else: ?>
<?= $this->render('swimlane/table', array( <?= $this->render('swimlane/table', array(
'swimlanes' => $active_swimlanes, 'swimlanes' => $active_swimlanes,
'project' => $project, 'project' => $project,
'default_swimlane' => $default_swimlane['show_default_swimlane'] == 1 ? $default_swimlane : array()
)) ?> )) ?>
<?php endif ?> <?php endif ?>
<?php if (! empty($inactive_swimlanes) || $default_swimlane['show_default_swimlane'] == 0): ?> <?php if (! empty($inactive_swimlanes)): ?>
<h3><?= t('Inactive swimlanes') ?></h3> <h3><?= t('Inactive swimlanes') ?></h3>
<?= $this->render('swimlane/table', array( <?= $this->render('swimlane/table', array(
'swimlanes' => $inactive_swimlanes, 'swimlanes' => $inactive_swimlanes,
'project' => $project, 'project' => $project,
'default_swimlane' => $default_swimlane['show_default_swimlane'] == 0 ? $default_swimlane : array(), 'disable_handler' => true,
'disable_handler' => true
)) ?> )) ?>
<?php endif ?> <?php endif ?>

View File

@ -6,33 +6,6 @@
<th><?= t('Name') ?></th> <th><?= t('Name') ?></th>
<th class="column-8"><?= t('Actions') ?></th> <th class="column-8"><?= t('Actions') ?></th>
</tr> </tr>
<?php if (! empty($default_swimlane)): ?>
<tr>
<td>
<?= $this->text->e($default_swimlane['default_swimlane']) ?>
<?php if ($default_swimlane['default_swimlane'] !== t('Default swimlane')): ?>
&nbsp;(<?= t('Default swimlane') ?>)
<?php endif ?>
</td>
<td>
<div class="dropdown">
<a href="#" class="dropdown-menu dropdown-menu-link-icon"><i class="fa fa-cog fa-fw"></i><i class="fa fa-caret-down"></i></a>
<ul>
<li>
<?= $this->modal->medium('edit', t('Edit'), 'SwimlaneController', 'editDefault', array('project_id' => $project['id'])) ?>
</li>
<li>
<?php if ($default_swimlane['show_default_swimlane'] == 1): ?>
<?= $this->url->icon('toggle-off', t('Disable'), 'SwimlaneController', 'disableDefault', array('project_id' => $project['id']), true) ?>
<?php else: ?>
<?= $this->url->icon('toggle-on', t('Enable'), 'SwimlaneController', 'enableDefault', array('project_id' => $project['id']), true) ?>
<?php endif ?>
</li>
</ul>
</td>
</tr>
<?php endif ?>
</thead> </thead>
<tbody> <tbody>
<?php foreach ($swimlanes as $swimlane): ?> <?php foreach ($swimlanes as $swimlane): ?>

View File

@ -27,7 +27,7 @@
<?= $this->form->label(t('Swimlane'), 'swimlane_id') ?> <?= $this->form->label(t('Swimlane'), 'swimlane_id') ?>
<?= $this->form->select('swimlane_id', $swimlanes_list, $values) ?> <?= $this->form->select('swimlane_id', $swimlanes_list, $values) ?>
<p class="form-help"><?= t('Current swimlane: %s', $task['swimlane_name'] ?: e($task['default_swimlane'])) ?></p> <p class="form-help"><?= t('Current swimlane: %s', $task['swimlane_name']) ?></p>
<?= $this->form->label(t('Column'), 'column_id') ?> <?= $this->form->label(t('Column'), 'column_id') ?>
<?= $this->form->select('column_id', $columns_list, $values) ?> <?= $this->form->select('column_id', $columns_list, $values) ?>

View File

@ -28,7 +28,7 @@
<?= $this->form->label(t('Swimlane'), 'swimlane_id') ?> <?= $this->form->label(t('Swimlane'), 'swimlane_id') ?>
<?= $this->form->select('swimlane_id', $swimlanes_list, $values) ?> <?= $this->form->select('swimlane_id', $swimlanes_list, $values) ?>
<p class="form-help"><?= t('Current swimlane: %s', $task['swimlane_name'] ?: e($task['default_swimlane'])) ?></p> <p class="form-help"><?= t('Current swimlane: %s', $task['swimlane_name']) ?></p>
<?= $this->form->label(t('Column'), 'column_id') ?> <?= $this->form->label(t('Column'), 'column_id') ?>
<?= $this->form->select('column_id', $columns_list, $values) ?> <?= $this->form->select('column_id', $columns_list, $values) ?>

View File

@ -26,7 +26,7 @@
<?php endif ?> <?php endif ?>
</td> </td>
<td> <td>
<?= $this->text->e($task['swimlane_name'] ?: $task['default_swimlane']) ?> <?= $this->text->e($task['swimlane_name']) ?>
</td> </td>
<td> <td>
<?= $this->text->e($task['column_name']) ?> <?= $this->text->e($task['column_name']) ?>

View File

@ -57,28 +57,6 @@ class SwimlaneValidator extends BaseValidator
); );
} }
/**
* Validate default swimlane modification
*
* @access public
* @param array $values Form values
* @return array $valid, $errors [0] = Success or not, [1] = List of errors
*/
public function validateDefaultModification(array $values)
{
$rules = array(
new Validators\Required('id', t('The id is required')),
new Validators\Required('default_swimlane', t('The name is required')),
);
$v = new Validator($values, array_merge($rules, $this->commonValidationRules()));
return array(
$v->execute(),
$v->getErrors()
);
}
/** /**
* Common validation rules * Common validation rules
* *

View File

@ -31,6 +31,7 @@ class TaskValidator extends BaseValidator
new Validators\Range('score', t('This value must be in the range %d to %d', -2147483647, 2147483647), -2147483647, 2147483647), new Validators\Range('score', t('This value must be in the range %d to %d', -2147483647, 2147483647), -2147483647, 2147483647),
new Validators\Integer('category_id', t('This value must be an integer')), new Validators\Integer('category_id', t('This value must be an integer')),
new Validators\Integer('swimlane_id', t('This value must be an integer')), new Validators\Integer('swimlane_id', t('This value must be an integer')),
new Validators\GreaterThan('swimlane_id', t('This value must be greater than %d', 0), 0),
new Validators\Integer('recurrence_child', t('This value must be an integer')), new Validators\Integer('recurrence_child', t('This value must be an integer')),
new Validators\Integer('recurrence_parent', t('This value must be an integer')), new Validators\Integer('recurrence_parent', t('This value must be an integer')),
new Validators\Integer('recurrence_factor', t('This value must be an integer')), new Validators\Integer('recurrence_factor', t('This value must be an integer')),

View File

@ -1,41 +1,6 @@
API Swimlane Procedures API Swimlane Procedures
======================= =======================
## getDefaultSwimlane
- Purpose: **Get the default swimlane for a project**
- Parameters:
- **project_id** (integer, required)
- Result on success: **true**
- Result on failure: **false**
Request example:
```json
{
"jsonrpc": "2.0",
"method": "getDefaultSwimlane",
"id": 898774713,
"params": [
1
]
}
```
Response example:
```json
{
"jsonrpc": "2.0",
"id": 898774713,
"result": {
"id": "1",
"default_swimlane": "Default swimlane",
"show_default_swimlane": "1"
}
}
```
## getActiveSwimlanes ## getActiveSwimlanes
- Purpose: **Get the list of enabled swimlanes of a project (include default swimlane if enabled)** - Purpose: **Get the list of enabled swimlanes of a project (include default swimlane if enabled)**

View File

@ -537,7 +537,7 @@ Response example:
- **task_id** (integer, required) - **task_id** (integer, required)
- **column_id** (integer, required) - **column_id** (integer, required)
- **position** (integer, required) - **position** (integer, required)
- **swimlane_id** (integer, optional, default=0) - **swimlane_id** (integer, required)
- Result on success: **true** - Result on success: **true**
- Result on failure: **false** - Result on failure: **false**

View File

@ -144,7 +144,6 @@ Attribute: **column**
Attribute: **swimlane** Attribute: **swimlane**
- Find tasks by swim-lane: `swimlane:"Version 42"` - Find tasks by swim-lane: `swimlane:"Version 42"`
- Find tasks in the default swim-lane: `swimlane:default`
- Find tasks into several swim-lanes: `swimlane:"Version 1.2" swimlane:"Version 1.3"` - Find tasks into several swim-lanes: `swimlane:"Version 1.2" swimlane:"Version 1.3"`
### Search by task link ### Search by task link

View File

@ -140,7 +140,6 @@ Görev referansı, görevinizin harici bir kimliği, örneğin başka bir yazıl
Özellik: **swimlane** Özellik: **swimlane**
- Görevleri kulvarlara(swim-lane) göre ara: `swimlane:"Version 42"` - Görevleri kulvarlara(swim-lane) göre ara: `swimlane:"Version 42"`
- Görevleri default kulvarlar (swim-lane) göre ara: `swimlane:default`
- Çeşitli kulvarlar (swim-lanes) için görev ara: `swimlane:"Version 1.2" swimlane:"Version 1.3"` - Çeşitli kulvarlar (swim-lanes) için görev ara: `swimlane:"Version 1.2" swimlane:"Version 1.3"`
### Görev bağlantısı ile arama ### Görev bağlantısı ile arama

View File

@ -10,13 +10,15 @@ class SwimlaneProcedureTest extends BaseProcedureTest
public function testAll() public function testAll()
{ {
$this->assertCreateTeamProject(); $this->assertCreateTeamProject();
} $this->assertAddSwimlane();
$this->assertGetSwimlane();
public function assertGetDefaultSwimlane() $this->assertUpdateSwimlane();
{ $this->assertDisableSwimlane();
$swimlane = $this->app->getDefaultSwimlane($this->projectId); $this->assertEnableSwimlane();
$this->assertNotEmpty($swimlane); $this->assertGetAllSwimlanes();
$this->assertEquals('Default swimlane', $swimlane['default_swimlane']); $this->assertGetActiveSwimlane();
$this->assertRemoveSwimlane();
$this->assertChangePosition();
} }
public function assertAddSwimlane() public function assertAddSwimlane()
@ -60,9 +62,10 @@ class SwimlaneProcedureTest extends BaseProcedureTest
public function assertGetAllSwimlanes() public function assertGetAllSwimlanes()
{ {
$swimlanes = $this->app->getAllSwimlanes($this->projectId); $swimlanes = $this->app->getAllSwimlanes($this->projectId);
$this->assertCount(2, $swimlanes); $this->assertCount(3, $swimlanes);
$this->assertEquals('Another swimlane', $swimlanes[0]['name']); $this->assertEquals('Default swimlane', $swimlanes[0]['name']);
$this->assertEquals('Swimlane 2', $swimlanes[1]['name']); $this->assertEquals('Swimlane 2', $swimlanes[1]['name']);
$this->assertEquals('Another swimlane', $swimlanes[2]['name']);
} }
public function assertGetActiveSwimlane() public function assertGetActiveSwimlane()
@ -86,7 +89,7 @@ class SwimlaneProcedureTest extends BaseProcedureTest
$this->assertNotFalse($this->app->addSwimlane($this->projectId, 'Swimlane B')); $this->assertNotFalse($this->app->addSwimlane($this->projectId, 'Swimlane B'));
$swimlanes = $this->app->getAllSwimlanes($this->projectId); $swimlanes = $this->app->getAllSwimlanes($this->projectId);
$this->assertCount(3, $swimlanes); $this->assertCount(4, $swimlanes);
$this->assertTrue($this->app->changeSwimlanePosition($this->projectId, $swimlaneId1, 3)); $this->assertTrue($this->app->changeSwimlanePosition($this->projectId, $swimlaneId1, 3));
} }

View File

@ -19,7 +19,7 @@ class TaskExportTest extends Base
$swimlaneModel = new SwimlaneModel($this->container); $swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'Export Project'))); $this->assertEquals(1, $projectModel->create(array('name' => 'Export Project')));
$this->assertEquals(1, $swimlaneModel->create(array('project_id' => 1, 'name' => 'S1'))); $this->assertEquals(2, $swimlaneModel->create(1, 'S1'));
$this->assertEquals(1, $categoryModel->create(array('name' => 'Category #1', 'project_id' => 1))); $this->assertEquals(1, $categoryModel->create(array('name' => 'Category #1', 'project_id' => 1)));
$this->assertEquals(1, $taskCreationModel->create(array( $this->assertEquals(1, $taskCreationModel->create(array(
@ -34,7 +34,7 @@ class TaskExportTest extends Base
$this->assertEquals(2, $taskCreationModel->create(array( $this->assertEquals(2, $taskCreationModel->create(array(
'project_id' => 1, 'project_id' => 1,
'swimlane_id' => 1, 'swimlane_id' => 2,
'title' => 'Task 2', 'title' => 'Task 2',
'date_due' => time(), 'date_due' => time(),
))); )));

View File

@ -20,24 +20,24 @@ class BoardFormatterTest extends Base
$taskFinderModel = new TaskFinderModel($this->container); $taskFinderModel = new TaskFinderModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'Test'))); $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
$this->assertEquals(1, $swimlaneModel->create(array('name' => 'Swimlane 1', 'project_id' => 1))); $this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane 1'));
$this->assertEquals(2, $swimlaneModel->create(array('name' => 'Swimlane 2', 'project_id' => 1))); $this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane 2'));
// 2 task within the same column but no score // 2 task within the same column but no score
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'Task 1', 'project_id' => 1, 'swimlane_id' => 0, 'column_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'Task 1', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 1)));
$this->assertEquals(2, $taskCreationModel->create(array('title' => 'Task 2', 'project_id' => 1, 'swimlane_id' => 0, 'column_id' => 1))); $this->assertEquals(2, $taskCreationModel->create(array('title' => 'Task 2', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 1)));
// 2 tasks in the same column with score // 2 tasks in the same column with score
$this->assertEquals(3, $taskCreationModel->create(array('title' => 'Task 3', 'project_id' => 1, 'swimlane_id' => 0, 'column_id' => 1, 'score' => 4))); $this->assertEquals(3, $taskCreationModel->create(array('title' => 'Task 3', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 1, 'score' => 4)));
$this->assertEquals(4, $taskCreationModel->create(array('title' => 'Task 4', 'project_id' => 1, 'swimlane_id' => 0, 'column_id' => 1, 'score' => 5))); $this->assertEquals(4, $taskCreationModel->create(array('title' => 'Task 4', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 1, 'score' => 5)));
// 1 task in 2nd column // 1 task in 2nd column
$this->assertEquals(5, $taskCreationModel->create(array('title' => 'Task 5', 'project_id' => 1, 'swimlane_id' => 0, 'column_id' => 2))); $this->assertEquals(5, $taskCreationModel->create(array('title' => 'Task 5', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 2)));
// tasks in same column but different swimlanes // tasks in same column but different swimlanes
$this->assertEquals(6, $taskCreationModel->create(array('title' => 'Task 6', 'project_id' => 1, 'swimlane_id' => 0, 'column_id' => 3, 'score' => 1))); $this->assertEquals(6, $taskCreationModel->create(array('title' => 'Task 6', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 3, 'score' => 1)));
$this->assertEquals(7, $taskCreationModel->create(array('title' => 'Task 7', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 3, 'score' => 2))); $this->assertEquals(7, $taskCreationModel->create(array('title' => 'Task 7', 'project_id' => 1, 'swimlane_id' => 2, 'column_id' => 3, 'score' => 2)));
$this->assertEquals(8, $taskCreationModel->create(array('title' => 'Task 8', 'project_id' => 1, 'swimlane_id' => 2, 'column_id' => 3, 'score' => 3))); $this->assertEquals(8, $taskCreationModel->create(array('title' => 'Task 8', 'project_id' => 1, 'swimlane_id' => 3, 'column_id' => 3, 'score' => 3)));
$board = BoardFormatter::getInstance($this->container) $board = BoardFormatter::getInstance($this->container)
->withQuery($taskFinderModel->getExtendedQuery()) ->withQuery($taskFinderModel->getExtendedQuery())
@ -46,7 +46,7 @@ class BoardFormatterTest extends Base
$this->assertCount(3, $board); $this->assertCount(3, $board);
$this->assertSame(0, $board[0]['id']); $this->assertSame(1, $board[0]['id']);
$this->assertEquals('Default swimlane', $board[0]['name']); $this->assertEquals('Default swimlane', $board[0]['name']);
$this->assertCount(4, $board[0]['columns']); $this->assertCount(4, $board[0]['columns']);
$this->assertEquals(3, $board[0]['nb_swimlanes']); $this->assertEquals(3, $board[0]['nb_swimlanes']);
@ -85,7 +85,7 @@ class BoardFormatterTest extends Base
$this->assertEquals('Task 5', $board[0]['columns'][1]['tasks'][0]['title']); $this->assertEquals('Task 5', $board[0]['columns'][1]['tasks'][0]['title']);
$this->assertEquals('Task 6', $board[0]['columns'][2]['tasks'][0]['title']); $this->assertEquals('Task 6', $board[0]['columns'][2]['tasks'][0]['title']);
$this->assertSame(1, $board[1]['id']); $this->assertSame(2, $board[1]['id']);
$this->assertEquals('Swimlane 1', $board[1]['name']); $this->assertEquals('Swimlane 1', $board[1]['name']);
$this->assertCount(4, $board[1]['columns']); $this->assertCount(4, $board[1]['columns']);
$this->assertEquals(3, $board[1]['nb_swimlanes']); $this->assertEquals(3, $board[1]['nb_swimlanes']);
@ -134,14 +134,14 @@ class BoardFormatterTest extends Base
$taskFinderModel = new TaskFinderModel($this->container); $taskFinderModel = new TaskFinderModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'Test'))); $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
$this->assertTrue($swimlaneModel->disableDefault(1)); $this->assertTrue($swimlaneModel->disable(1, 1));
$this->assertEquals(1, $swimlaneModel->create(array('name' => 'Swimlane 1', 'project_id' => 1))); $this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane 1'));
$this->assertEquals(2, $swimlaneModel->create(array('name' => 'Swimlane 2', 'project_id' => 1))); $this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane 2'));
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'Task 1', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'Task 1', 'project_id' => 1, 'swimlane_id' => 2, 'column_id' => 1)));
$this->assertEquals(2, $taskCreationModel->create(array('title' => 'Task 2', 'project_id' => 1, 'swimlane_id' => 2, 'column_id' => 2))); $this->assertEquals(2, $taskCreationModel->create(array('title' => 'Task 2', 'project_id' => 1, 'swimlane_id' => 3, 'column_id' => 2)));
$this->assertEquals(3, $taskCreationModel->create(array('title' => 'Task 3', 'project_id' => 1, 'swimlane_id' => 1, 'column_id' => 2, 'score' => 1))); $this->assertEquals(3, $taskCreationModel->create(array('title' => 'Task 3', 'project_id' => 1, 'swimlane_id' => 2, 'column_id' => 2, 'score' => 1)));
$this->assertEquals(4, $taskCreationModel->create(array('title' => 'Task 4', 'project_id' => 1, 'swimlane_id' => 2, 'column_id' => 1))); $this->assertEquals(4, $taskCreationModel->create(array('title' => 'Task 4', 'project_id' => 1, 'swimlane_id' => 3, 'column_id' => 1)));
$board = BoardFormatter::getInstance($this->container) $board = BoardFormatter::getInstance($this->container)
->withQuery($taskFinderModel->getExtendedQuery()) ->withQuery($taskFinderModel->getExtendedQuery())
@ -208,7 +208,7 @@ class BoardFormatterTest extends Base
$swimlaneModel = new SwimlaneModel($this->container); $swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'Test'))); $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
$this->assertTrue($swimlaneModel->disableDefault(1)); $this->assertTrue($swimlaneModel->disable(1, 1));
$board = BoardFormatter::getInstance($this->container) $board = BoardFormatter::getInstance($this->container)
->withQuery($taskFinderModel->getExtendedQuery()) ->withQuery($taskFinderModel->getExtendedQuery())
@ -245,8 +245,8 @@ class BoardFormatterTest extends Base
$taskFinderModel = new TaskFinderModel($this->container); $taskFinderModel = new TaskFinderModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'Test'))); $this->assertEquals(1, $projectModel->create(array('name' => 'Test')));
$this->assertEquals(1, $swimlaneModel->create(array('name' => 'Swimlane 1', 'project_id' => 1))); $this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane 1'));
$this->assertEquals(2, $swimlaneModel->create(array('name' => 'Swimlane 2', 'project_id' => 1))); $this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane 2'));
$board = BoardFormatter::getInstance($this->container) $board = BoardFormatter::getInstance($this->container)
->withQuery($taskFinderModel->getExtendedQuery()) ->withQuery($taskFinderModel->getExtendedQuery())

View File

@ -162,9 +162,9 @@ class TaskEventJobTest extends Base
$swimlaneModel = new SwimlaneModel($this->container); $swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(1, $swimlaneModel->create(array('name' => 'S1', 'project_id' => 1))); $this->assertEquals(2, $swimlaneModel->create(1, 'S1'));
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test 1', 'project_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'test 1', 'project_id' => 1)));
$this->assertTrue($taskPositionModel->movePosition(1, 1, 1, 1, 1)); $this->assertTrue($taskPositionModel->movePosition(1, 1, 1, 1, 2));
$called = $this->container['dispatcher']->getCalledListeners(); $called = $this->container['dispatcher']->getCalledListeners();
$this->assertArrayHasKey(TaskModel::EVENT_MOVE_SWIMLANE.'.closure', $called); $this->assertArrayHasKey(TaskModel::EVENT_MOVE_SWIMLANE.'.closure', $called);

View File

@ -24,8 +24,8 @@ class ProjectDuplicationModelTest extends Base
public function testGetSelections() public function testGetSelections()
{ {
$projectDuplicationModel = new ProjectDuplicationModel($this->container); $projectDuplicationModel = new ProjectDuplicationModel($this->container);
$this->assertCount(7, $projectDuplicationModel->getOptionalSelection()); $this->assertCount(6, $projectDuplicationModel->getOptionalSelection());
$this->assertCount(8, $projectDuplicationModel->getPossibleSelection()); $this->assertCount(9, $projectDuplicationModel->getPossibleSelection());
} }
public function testGetClonedProjectName() public function testGetClonedProjectName()
@ -405,32 +405,31 @@ class ProjectDuplicationModelTest extends Base
$taskCreationModel = new TaskCreationModel($this->container); $taskCreationModel = new TaskCreationModel($this->container);
$taskFinderModel = new TaskFinderModel($this->container); $taskFinderModel = new TaskFinderModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'P1', 'default_swimlane' => 'New Default'))); $this->assertEquals(1, $projectModel->create(array('name' => 'P1')));
// create initial swimlanes // create initial swimlanes
$this->assertEquals(1, $swimlaneModel->create(array('project_id' => 1, 'name' => 'S1'))); $this->assertEquals(2, $swimlaneModel->create(1, 'S1'));
$this->assertEquals(2, $swimlaneModel->create(array('project_id' => 1, 'name' => 'S2'))); $this->assertEquals(3, $swimlaneModel->create(1, 'S2'));
$this->assertEquals(3, $swimlaneModel->create(array('project_id' => 1, 'name' => 'S3'))); $this->assertEquals(4, $swimlaneModel->create(1, 'S3'));
// create initial tasks // create initial tasks
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'T0', 'project_id' => 1, 'swimlane_id' => 0))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'T0', 'project_id' => 1, 'swimlane_id' => 1)));
$this->assertEquals(2, $taskCreationModel->create(array('title' => 'T1', 'project_id' => 1, 'swimlane_id' => 1))); $this->assertEquals(2, $taskCreationModel->create(array('title' => 'T1', 'project_id' => 1, 'swimlane_id' => 2)));
$this->assertEquals(3, $taskCreationModel->create(array('title' => 'T2', 'project_id' => 1, 'swimlane_id' => 2))); $this->assertEquals(3, $taskCreationModel->create(array('title' => 'T2', 'project_id' => 1, 'swimlane_id' => 3)));
$this->assertEquals(4, $taskCreationModel->create(array('title' => 'T3', 'project_id' => 1, 'swimlane_id' => 3))); $this->assertEquals(4, $taskCreationModel->create(array('title' => 'T3', 'project_id' => 1, 'swimlane_id' => 4)));
$this->assertEquals(2, $projectDuplicationModel->duplicate(1, array('categoryModel', 'swimlaneModel'))); $this->assertEquals(2, $projectDuplicationModel->duplicate(1, array('categoryModel', 'swimlaneModel')));
$swimlanes = $swimlaneModel->getAll(2); $swimlanes = $swimlaneModel->getAll(2);
$this->assertCount(3, $swimlanes); $this->assertCount(4, $swimlanes);
$this->assertEquals(4, $swimlanes[0]['id']); $this->assertEquals(5, $swimlanes[0]['id']);
$this->assertEquals('S1', $swimlanes[0]['name']); $this->assertEquals('Default swimlane', $swimlanes[0]['name']);
$this->assertEquals(5, $swimlanes[1]['id']); $this->assertEquals(6, $swimlanes[1]['id']);
$this->assertEquals('S2', $swimlanes[1]['name']); $this->assertEquals('S1', $swimlanes[1]['name']);
$this->assertEquals(6, $swimlanes[2]['id']); $this->assertEquals(7, $swimlanes[2]['id']);
$this->assertEquals('S3', $swimlanes[2]['name']); $this->assertEquals('S2', $swimlanes[2]['name']);
$this->assertEquals(8, $swimlanes[3]['id']);
$swimlane = $swimlaneModel->getDefault(2); $this->assertEquals('S3', $swimlanes[3]['name']);
$this->assertEquals('New Default', $swimlane['default_swimlane']);
// Check if tasks are NOT been duplicated // Check if tasks are NOT been duplicated
$this->assertCount(0, $taskFinderModel->getAll(2)); $this->assertCount(0, $taskFinderModel->getAll(2));
@ -445,7 +444,7 @@ class ProjectDuplicationModelTest extends Base
$this->assertEquals(1, $projectModel->create(array('name' => 'P1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'P1')));
// create initial tasks // Create initial tasks
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'T1', 'project_id' => 1, 'column_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'T1', 'project_id' => 1, 'column_id' => 1)));
$this->assertEquals(2, $taskCreationModel->create(array('title' => 'T2', 'project_id' => 1, 'column_id' => 2))); $this->assertEquals(2, $taskCreationModel->create(array('title' => 'T2', 'project_id' => 1, 'column_id' => 2)));
$this->assertEquals(3, $taskCreationModel->create(array('title' => 'T3', 'project_id' => 1, 'column_id' => 3))); $this->assertEquals(3, $taskCreationModel->create(array('title' => 'T3', 'project_id' => 1, 'column_id' => 3)));
@ -468,12 +467,12 @@ class ProjectDuplicationModelTest extends Base
$taskCreationModel = new TaskCreationModel($this->container); $taskCreationModel = new TaskCreationModel($this->container);
$taskFinderModel = new TaskFinderModel($this->container); $taskFinderModel = new TaskFinderModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'P1', 'default_swimlane' => 'New Default'))); $this->assertEquals(1, $projectModel->create(array('name' => 'P1')));
// create initial swimlanes // create initial swimlanes
$this->assertEquals(1, $swimlaneModel->create(array('project_id' => 1, 'name' => 'S1'))); $this->assertEquals(2, $swimlaneModel->create(1, 'S1'));
$this->assertEquals(2, $swimlaneModel->create(array('project_id' => 1, 'name' => 'S2'))); $this->assertEquals(3, $swimlaneModel->create(1, 'S2'));
$this->assertEquals(3, $swimlaneModel->create(array('project_id' => 1, 'name' => 'S3'))); $this->assertEquals(4, $swimlaneModel->create(1, 'S3'));
// create initial tasks // create initial tasks
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'T1', 'project_id' => 1, 'column_id' => 1, 'owner_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'T1', 'project_id' => 1, 'column_id' => 1, 'owner_id' => 1)));
@ -484,16 +483,15 @@ class ProjectDuplicationModelTest extends Base
// Check if Swimlanes have been duplicated // Check if Swimlanes have been duplicated
$swimlanes = $swimlaneModel->getAll(2); $swimlanes = $swimlaneModel->getAll(2);
$this->assertCount(3, $swimlanes); $this->assertCount(4, $swimlanes);
$this->assertEquals(4, $swimlanes[0]['id']); $this->assertEquals(5, $swimlanes[0]['id']);
$this->assertEquals('S1', $swimlanes[0]['name']); $this->assertEquals('Default swimlane', $swimlanes[0]['name']);
$this->assertEquals(5, $swimlanes[1]['id']); $this->assertEquals(6, $swimlanes[1]['id']);
$this->assertEquals('S2', $swimlanes[1]['name']); $this->assertEquals('S1', $swimlanes[1]['name']);
$this->assertEquals(6, $swimlanes[2]['id']); $this->assertEquals(7, $swimlanes[2]['id']);
$this->assertEquals('S3', $swimlanes[2]['name']); $this->assertEquals('S2', $swimlanes[2]['name']);
$this->assertEquals(8, $swimlanes[3]['id']);
$swimlane = $swimlaneModel->getDefault(2); $this->assertEquals('S3', $swimlanes[3]['name']);
$this->assertEquals('New Default', $swimlane['default_swimlane']);
// Check if Tasks have been duplicated // Check if Tasks have been duplicated
$tasks = $taskFinderModel->getAll(2); $tasks = $taskFinderModel->getAll(2);

View File

@ -0,0 +1,328 @@
<?php
require_once __DIR__.'/../Base.php';
use Kanboard\Model\ProjectModel;
use Kanboard\Model\TaskCreationModel;
use Kanboard\Model\TaskFinderModel;
use Kanboard\Model\SwimlaneModel;
class SwimlaneModelTest extends Base
{
public function testCreation()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$swimlanes = $swimlaneModel->getAll(1);
$this->assertNotEmpty($swimlanes);
$this->assertEquals(2, count($swimlanes));
$this->assertEquals('Default swimlane', $swimlanes[0]['name']);
$this->assertEquals('Swimlane #1', $swimlanes[1]['name']);
$this->assertEquals(2, $swimlaneModel->getIdByName(1, 'Swimlane #1'));
$this->assertEquals(0, $swimlaneModel->getIdByName(2, 'Swimlane #2'));
$this->assertEquals('Default swimlane', $swimlaneModel->getNameById(1));
$this->assertEquals('Swimlane #1', $swimlaneModel->getNameById(2));
$this->assertEquals('', $swimlaneModel->getNameById(23));
}
public function testGetFirstActiveSwimlane()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #2'));
$this->assertTrue($swimlaneModel->disable(1, 2));
$swimlane = $swimlaneModel->getFirstActiveSwimlane(1);
$this->assertEquals(1, $swimlane['id']);
$this->assertEquals('Default swimlane', $swimlane['name']);
$this->assertSame(1, $swimlaneModel->getFirstActiveSwimlaneId(1));
$this->assertTrue($swimlaneModel->disable(1, 1));
$swimlane = $swimlaneModel->getFirstActiveSwimlane(1);
$this->assertEquals(3, $swimlane['id']);
$this->assertEquals('Swimlane #2', $swimlane['name']);
$this->assertSame(3, $swimlaneModel->getFirstActiveSwimlaneId(1));
$this->assertTrue($swimlaneModel->disable(1, 3));
$this->assertNull($swimlaneModel->getFirstActiveSwimlane(1));
$this->assertSame(0, $swimlaneModel->getFirstActiveSwimlaneId(1));
}
public function testGetList()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #2'));
$swimlanes = $swimlaneModel->getList(1);
$expected = array(
1 => 'Default swimlane',
2 => 'Swimlane #1',
3 => 'Swimlane #2',
);
$this->assertEquals($expected, $swimlanes);
}
public function testUpdate()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertTrue($swimlaneModel->update(array('id' => 2, 'name' => 'foobar')));
$swimlane = $swimlaneModel->getById(2);
$this->assertEquals('foobar', $swimlane['name']);
}
public function testDisableEnable()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$swimlane = $swimlaneModel->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
$this->assertEquals(3, $swimlaneModel->getLastPosition(1));
$this->assertTrue($swimlaneModel->disable(1, 1));
$swimlane = $swimlaneModel->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(0, $swimlane['is_active']);
$this->assertEquals(0, $swimlane['position']);
$this->assertEquals(2, $swimlaneModel->getLastPosition(1));
// Create a new swimlane
$this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #2'));
$swimlane = $swimlaneModel->getById(2);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
// Enable our disabled swimlane
$this->assertTrue($swimlaneModel->enable(1, 1));
$swimlane = $swimlaneModel->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(3, $swimlane['position']);
}
public function testRemove()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$taskCreationModel = new TaskCreationModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'swimlane_id' => 2)));
$this->assertFalse($swimlaneModel->remove(1, 2));
$this->assertTrue($swimlaneModel->remove(1, 1));
$this->assertEmpty($swimlaneModel->getById(1));
}
public function testUpdatePositions()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #2'));
$this->assertEquals(4, $swimlaneModel->create(1, 'Swimlane #3'));
$swimlane = $swimlaneModel->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
$swimlane = $swimlaneModel->getById(2);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(2, $swimlane['position']);
$swimlane = $swimlaneModel->getById(3);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(3, $swimlane['position']);
// Disable the 2nd swimlane
$this->assertTrue($swimlaneModel->disable(1, 2));
$swimlane = $swimlaneModel->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
$swimlane = $swimlaneModel->getById(2);
$this->assertNotEmpty($swimlane);
$this->assertEquals(0, $swimlane['is_active']);
$this->assertEquals(0, $swimlane['position']);
$swimlane = $swimlaneModel->getById(3);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(2, $swimlane['position']);
// Remove the first swimlane
$this->assertTrue($swimlaneModel->remove(1, 1));
$swimlane = $swimlaneModel->getById(1);
$this->assertEmpty($swimlane);
$swimlane = $swimlaneModel->getById(2);
$this->assertNotEmpty($swimlane);
$this->assertEquals(0, $swimlane['is_active']);
$this->assertEquals(0, $swimlane['position']);
$swimlane = $swimlaneModel->getById(3);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
}
public function testDuplicateSwimlane()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'P1')));
$this->assertEquals(2, $projectModel->create(array('name' => 'P2')));
$this->assertEquals(3, $swimlaneModel->create(1, 'S1'));
$this->assertEquals(4, $swimlaneModel->create(1, 'S2'));
$this->assertEquals(5, $swimlaneModel->create(1, 'S3'));
$this->assertTrue($swimlaneModel->duplicate(1, 2));
$swimlanes = $swimlaneModel->getAll(2);
$this->assertCount(4, $swimlanes);
$this->assertEquals(2, $swimlanes[0]['id']);
$this->assertEquals('Default swimlane', $swimlanes[0]['name']);
$this->assertEquals(6, $swimlanes[1]['id']);
$this->assertEquals('S1', $swimlanes[1]['name']);
$this->assertEquals(7, $swimlanes[2]['id']);
$this->assertEquals('S2', $swimlanes[2]['name']);
$this->assertEquals(8, $swimlanes[3]['id']);
$this->assertEquals('S3', $swimlanes[3]['name']);
}
public function testChangePosition()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #2'));
$this->assertEquals(4, $swimlaneModel->create(1, 'Swimlane #3'));
$this->assertEquals(5, $swimlaneModel->create(1, 'Swimlane #4'));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(1, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(2, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(3, $swimlanes[2]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 3, 2));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(1, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(3, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(2, $swimlanes[2]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 2, 1));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(2, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(1, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(3, $swimlanes[2]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 2, 2));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(1, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(2, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(3, $swimlanes[2]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 4, 1));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(4, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(1, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(2, $swimlanes[2]['id']);
$this->assertFalse($swimlaneModel->changePosition(1, 2, 0));
$this->assertFalse($swimlaneModel->changePosition(1, 2, 8));
}
public function testChangePositionWithInactiveSwimlane()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #2'));
$this->assertEquals(4, $swimlaneModel->create(1, 'Swimlane #3'));
$this->assertEquals(5, $swimlaneModel->create(1, 'Swimlane #4'));
$this->assertTrue($swimlaneModel->disable(1, 2));
$this->assertTrue($swimlaneModel->disable(1, 3));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(1, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(4, $swimlanes[1]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 4, 1));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(4, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(1, $swimlanes[1]['id']);
}
}

View File

@ -1,370 +0,0 @@
<?php
require_once __DIR__.'/../Base.php';
use Kanboard\Model\ProjectModel;
use Kanboard\Model\TaskCreationModel;
use Kanboard\Model\TaskFinderModel;
use Kanboard\Model\SwimlaneModel;
class SwimlaneTest extends Base
{
public function testCreation()
{
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
$this->assertEquals(1, $s->create(array('project_id' => 1, 'name' => 'Swimlane #1')));
$swimlanes = $s->getSwimlanes(1);
$this->assertNotEmpty($swimlanes);
$this->assertEquals(2, count($swimlanes));
$this->assertEquals('Default swimlane', $swimlanes[0]['name']);
$this->assertEquals('Swimlane #1', $swimlanes[1]['name']);
$this->assertEquals(1, $s->getIdByName(1, 'Swimlane #1'));
$this->assertEquals(0, $s->getIdByName(2, 'Swimlane #2'));
$this->assertEquals('Swimlane #1', $s->getNameById(1));
$this->assertEquals('', $s->getNameById(23));
}
public function testGetFirstActiveSwimlane()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertEquals(1, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #1', 'is_active' => 0)));
$this->assertEquals(2, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #2')));
$swimlane = $swimlaneModel->getFirstActiveSwimlane(1);
$this->assertEquals(0, $swimlane['id']);
$this->assertEquals('Default swimlane', $swimlane['name']);
$this->assertTrue($swimlaneModel->disableDefault(1));
$swimlane = $swimlaneModel->getFirstActiveSwimlane(1);
$this->assertEquals(2, $swimlane['id']);
$this->assertEquals('Swimlane #2', $swimlane['name']);
$this->assertTrue($swimlaneModel->disable(1, 2));
$this->assertNull($swimlaneModel->getFirstActiveSwimlane(1));
}
public function testGetList()
{
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
$this->assertEquals(1, $s->create(array('project_id' => 1, 'name' => 'Swimlane #1')));
$this->assertEquals(2, $s->create(array('project_id' => 1, 'name' => 'Swimlane #2')));
$swimlanes = $s->getList(1);
$expected = array('Default swimlane', 'Swimlane #1', 'Swimlane #2');
$this->assertEquals($expected, $swimlanes);
}
public function testUpdate()
{
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
$this->assertEquals(1, $s->create(array('project_id' => 1, 'name' => 'Swimlane #1')));
$swimlane = $s->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals('Swimlane #1', $swimlane['name']);
$this->assertTrue($s->update(array('id' => 1, 'name' => 'foobar')));
$swimlane = $s->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals('foobar', $swimlane['name']);
}
public function testUpdateDefaultSwimlane()
{
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
$this->assertTrue($s->updateDefault(array('id' => 1, 'default_swimlane' => 'foo', 'show_default_swimlane' => 1)));
$default = $s->getDefault(1);
$this->assertNotEmpty($default);
$this->assertEquals('foo', $default['default_swimlane']);
$this->assertEquals(1, $default['show_default_swimlane']);
$this->assertTrue($s->updateDefault(array('id' => 1, 'default_swimlane' => 'foo', 'show_default_swimlane' => 0)));
$default = $s->getDefault(1);
$this->assertNotEmpty($default);
$this->assertEquals('foo', $default['default_swimlane']);
$this->assertEquals(0, $default['show_default_swimlane']);
}
public function testDisableEnableDefaultSwimlane()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'UnitTest')));
$this->assertTrue($swimlaneModel->disableDefault(1));
$default = $swimlaneModel->getDefault(1);
$this->assertEquals(0, $default['show_default_swimlane']);
$this->assertTrue($swimlaneModel->enableDefault(1));
$default = $swimlaneModel->getDefault(1);
$this->assertEquals(1, $default['show_default_swimlane']);
}
public function testDisableEnable()
{
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
$this->assertEquals(1, $s->create(array('project_id' => 1, 'name' => 'Swimlane #1')));
$swimlane = $s->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
$this->assertEquals(2, $s->getLastPosition(1));
$this->assertTrue($s->disable(1, 1));
$swimlane = $s->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(0, $swimlane['is_active']);
$this->assertEquals(0, $swimlane['position']);
$this->assertEquals(1, $s->getLastPosition(1));
// Create a new swimlane
$this->assertEquals(2, $s->create(array('project_id' => 1, 'name' => 'Swimlane #2')));
$swimlane = $s->getById(2);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
// Enable our disabled swimlane
$this->assertTrue($s->enable(1, 1));
$swimlane = $s->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(2, $swimlane['position']);
}
public function testRemove()
{
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$tc = new TaskCreationModel($this->container);
$tf = new TaskFinderModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
$this->assertEquals(1, $s->create(array('project_id' => 1, 'name' => 'Swimlane #1')));
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1, 'swimlane_id' => 1)));
$task = $tf->getById(1);
$this->assertNotEmpty($task);
$this->assertEquals(1, $task['swimlane_id']);
$this->assertTrue($s->remove(1, 1));
$task = $tf->getById(1);
$this->assertNotEmpty($task);
$this->assertEquals(0, $task['swimlane_id']);
$this->assertEmpty($s->getById(1));
}
public function testUpdatePositions()
{
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
$this->assertEquals(1, $s->create(array('project_id' => 1, 'name' => 'Swimlane #1')));
$this->assertEquals(2, $s->create(array('project_id' => 1, 'name' => 'Swimlane #2')));
$this->assertEquals(3, $s->create(array('project_id' => 1, 'name' => 'Swimlane #3')));
$swimlane = $s->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
$swimlane = $s->getById(2);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(2, $swimlane['position']);
$swimlane = $s->getById(3);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(3, $swimlane['position']);
// Disable the 2nd swimlane
$this->assertTrue($s->disable(1, 2));
$swimlane = $s->getById(1);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
$swimlane = $s->getById(2);
$this->assertNotEmpty($swimlane);
$this->assertEquals(0, $swimlane['is_active']);
$this->assertEquals(0, $swimlane['position']);
$swimlane = $s->getById(3);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(2, $swimlane['position']);
// Remove the first swimlane
$this->assertTrue($s->remove(1, 1));
$swimlane = $s->getById(1);
$this->assertEmpty($swimlane);
$swimlane = $s->getById(2);
$this->assertNotEmpty($swimlane);
$this->assertEquals(0, $swimlane['is_active']);
$this->assertEquals(0, $swimlane['position']);
$swimlane = $s->getById(3);
$this->assertNotEmpty($swimlane);
$this->assertEquals(1, $swimlane['is_active']);
$this->assertEquals(1, $swimlane['position']);
}
public function testDuplicateSwimlane()
{
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'P1')));
$this->assertEquals(2, $p->create(array('name' => 'P2')));
$this->assertEquals(1, $s->create(array('project_id' => 1, 'name' => 'S1')));
$this->assertEquals(2, $s->create(array('project_id' => 1, 'name' => 'S2')));
$this->assertEquals(3, $s->create(array('project_id' => 1, 'name' => 'S3')));
$default_swimlane1 = $s->getDefault(1);
$default_swimlane1['default_swimlane'] = 'New Default';
$this->assertTrue($s->updateDefault($default_swimlane1));
$this->assertTrue($s->duplicate(1, 2));
$swimlanes = $s->getAll(2);
$this->assertCount(3, $swimlanes);
$this->assertEquals(4, $swimlanes[0]['id']);
$this->assertEquals('S1', $swimlanes[0]['name']);
$this->assertEquals(5, $swimlanes[1]['id']);
$this->assertEquals('S2', $swimlanes[1]['name']);
$this->assertEquals(6, $swimlanes[2]['id']);
$this->assertEquals('S3', $swimlanes[2]['name']);
$new_default = $s->getDefault(2);
$this->assertEquals('New Default', $new_default['default_swimlane']);
}
public function testChangePosition()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(1, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #1')));
$this->assertEquals(2, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #2')));
$this->assertEquals(3, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #3')));
$this->assertEquals(4, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #4')));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(1, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(2, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(3, $swimlanes[2]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 3, 2));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(1, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(3, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(2, $swimlanes[2]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 2, 1));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(2, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(1, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(3, $swimlanes[2]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 2, 2));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(1, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(2, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(3, $swimlanes[2]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 4, 1));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(4, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(1, $swimlanes[1]['id']);
$this->assertEquals(3, $swimlanes[2]['position']);
$this->assertEquals(2, $swimlanes[2]['id']);
$this->assertFalse($swimlaneModel->changePosition(1, 2, 0));
$this->assertFalse($swimlaneModel->changePosition(1, 2, 5));
}
public function testChangePositionWithInactiveSwimlane()
{
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(1, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #1')));
$this->assertEquals(2, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #2', 'is_active' => 0)));
$this->assertEquals(3, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #3', 'is_active' => 0)));
$this->assertEquals(4, $swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #4')));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(1, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(4, $swimlanes[1]['id']);
$this->assertTrue($swimlaneModel->changePosition(1, 4, 1));
$swimlanes = $swimlaneModel->getAllByStatus(1);
$this->assertEquals(1, $swimlanes[0]['position']);
$this->assertEquals(4, $swimlanes[0]['id']);
$this->assertEquals(2, $swimlanes[1]['position']);
$this->assertEquals(1, $swimlanes[1]['id']);
}
}

View File

@ -90,7 +90,7 @@ class TaskDuplicationModelTest extends Base
$this->assertEquals(1, $task['project_id']); $this->assertEquals(1, $task['project_id']);
$this->assertEquals(1, $task['owner_id']); $this->assertEquals(1, $task['owner_id']);
$this->assertEquals(2, $task['category_id']); $this->assertEquals(2, $task['category_id']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
$this->assertEquals(3, $task['column_id']); $this->assertEquals(3, $task['column_id']);
$this->assertEquals(2, $task['position']); $this->assertEquals(2, $task['position']);
$this->assertEquals('test', $task['title']); $this->assertEquals('test', $task['title']);

View File

@ -51,7 +51,7 @@ class TaskFinderModelTest extends Base
$this->assertEquals(0, $task['score']); $this->assertEquals(0, $task['score']);
$this->assertEquals(1, $task['category_id']); $this->assertEquals(1, $task['category_id']);
$this->assertEquals(0, $task['priority']); $this->assertEquals(0, $task['priority']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
$this->assertEquals(TaskModel::RECURRING_STATUS_NONE, $task['recurrence_status']); $this->assertEquals(TaskModel::RECURRING_STATUS_NONE, $task['recurrence_status']);
$this->assertEquals(TaskModel::RECURRING_TRIGGER_FIRST_COLUMN, $task['recurrence_trigger']); $this->assertEquals(TaskModel::RECURRING_TRIGGER_FIRST_COLUMN, $task['recurrence_trigger']);
$this->assertEquals(0, $task['recurrence_factor']); $this->assertEquals(0, $task['recurrence_factor']);
@ -60,8 +60,7 @@ class TaskFinderModelTest extends Base
$this->assertEquals(0, $task['recurrence_parent']); $this->assertEquals(0, $task['recurrence_parent']);
$this->assertEquals(0, $task['recurrence_child']); $this->assertEquals(0, $task['recurrence_child']);
$this->assertEquals('C1', $task['category_name']); $this->assertEquals('C1', $task['category_name']);
$this->assertNull($task['swimlane_name']); $this->assertEquals('Default swimlane', $task['swimlane_name']);
$this->assertEquals('Default swimlane', $task['default_swimlane']);
$this->assertEquals('Project #1', $task['project_name']); $this->assertEquals('Project #1', $task['project_name']);
$this->assertEquals('Backlog', $task['column_title']); $this->assertEquals('Backlog', $task['column_title']);
$this->assertEquals('admin', $task['assignee_username']); $this->assertEquals('admin', $task['assignee_username']);

View File

@ -422,7 +422,7 @@ class TaskPositionModelTest extends Base
$swimlaneModel = new SwimlaneModel($this->container); $swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'Project #1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'Project #1')));
$this->assertEquals(1, $swimlaneModel->create(array('project_id' => 1, 'name' => 'test 1'))); $this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'Task #1', 'project_id' => 1, 'column_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'Task #1', 'project_id' => 1, 'column_id' => 1)));
$this->assertEquals(2, $taskCreationModel->create(array('title' => 'Task #2', 'project_id' => 1, 'column_id' => 1))); $this->assertEquals(2, $taskCreationModel->create(array('title' => 'Task #2', 'project_id' => 1, 'column_id' => 1)));
$this->assertEquals(3, $taskCreationModel->create(array('title' => 'Task #3', 'project_id' => 1, 'column_id' => 1))); $this->assertEquals(3, $taskCreationModel->create(array('title' => 'Task #3', 'project_id' => 1, 'column_id' => 1)));
@ -430,60 +430,60 @@ class TaskPositionModelTest extends Base
$this->assertEquals(5, $taskCreationModel->create(array('title' => 'Task #5', 'project_id' => 1, 'column_id' => 1))); $this->assertEquals(5, $taskCreationModel->create(array('title' => 'Task #5', 'project_id' => 1, 'column_id' => 1)));
// Move the task to the swimlane // Move the task to the swimlane
$this->assertTrue($taskPositionModel->movePosition(1, 1, 2, 1, 1)); $this->assertTrue($taskPositionModel->movePosition(1, 1, 2, 1, 2));
// Check tasks position // Check tasks position
$task = $taskFinderModel->getById(1); $task = $taskFinderModel->getById(1);
$this->assertEquals(1, $task['id']); $this->assertEquals(1, $task['id']);
$this->assertEquals(2, $task['column_id']); $this->assertEquals(2, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(1, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$task = $taskFinderModel->getById(2); $task = $taskFinderModel->getById(2);
$this->assertEquals(2, $task['id']); $this->assertEquals(2, $task['id']);
$this->assertEquals(1, $task['column_id']); $this->assertEquals(1, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
$task = $taskFinderModel->getById(3); $task = $taskFinderModel->getById(3);
$this->assertEquals(3, $task['id']); $this->assertEquals(3, $task['id']);
$this->assertEquals(1, $task['column_id']); $this->assertEquals(1, $task['column_id']);
$this->assertEquals(2, $task['position']); $this->assertEquals(2, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
$task = $taskFinderModel->getById(4); $task = $taskFinderModel->getById(4);
$this->assertEquals(4, $task['id']); $this->assertEquals(4, $task['id']);
$this->assertEquals(1, $task['column_id']); $this->assertEquals(1, $task['column_id']);
$this->assertEquals(3, $task['position']); $this->assertEquals(3, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
// Move the task to the swimlane // Move the task to the swimlane
$this->assertTrue($taskPositionModel->movePosition(1, 2, 2, 1, 1)); $this->assertTrue($taskPositionModel->movePosition(1, 2, 2, 1, 2));
// Check tasks position // Check tasks position
$task = $taskFinderModel->getById(1); $task = $taskFinderModel->getById(1);
$this->assertEquals(1, $task['id']); $this->assertEquals(1, $task['id']);
$this->assertEquals(2, $task['column_id']); $this->assertEquals(2, $task['column_id']);
$this->assertEquals(2, $task['position']); $this->assertEquals(2, $task['position']);
$this->assertEquals(1, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$task = $taskFinderModel->getById(2); $task = $taskFinderModel->getById(2);
$this->assertEquals(2, $task['id']); $this->assertEquals(2, $task['id']);
$this->assertEquals(2, $task['column_id']); $this->assertEquals(2, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(1, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$task = $taskFinderModel->getById(3); $task = $taskFinderModel->getById(3);
$this->assertEquals(3, $task['id']); $this->assertEquals(3, $task['id']);
$this->assertEquals(1, $task['column_id']); $this->assertEquals(1, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
$task = $taskFinderModel->getById(4); $task = $taskFinderModel->getById(4);
$this->assertEquals(4, $task['id']); $this->assertEquals(4, $task['id']);
$this->assertEquals(1, $task['column_id']); $this->assertEquals(1, $task['column_id']);
$this->assertEquals(2, $task['position']); $this->assertEquals(2, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
// Move the task 5 to the last column // Move the task 5 to the last column
$this->assertTrue($taskPositionModel->movePosition(1, 5, 4, 1, 0)); $this->assertTrue($taskPositionModel->movePosition(1, 5, 4, 1, 0));
@ -493,31 +493,31 @@ class TaskPositionModelTest extends Base
$this->assertEquals(1, $task['id']); $this->assertEquals(1, $task['id']);
$this->assertEquals(2, $task['column_id']); $this->assertEquals(2, $task['column_id']);
$this->assertEquals(2, $task['position']); $this->assertEquals(2, $task['position']);
$this->assertEquals(1, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$task = $taskFinderModel->getById(2); $task = $taskFinderModel->getById(2);
$this->assertEquals(2, $task['id']); $this->assertEquals(2, $task['id']);
$this->assertEquals(2, $task['column_id']); $this->assertEquals(2, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(1, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$task = $taskFinderModel->getById(3); $task = $taskFinderModel->getById(3);
$this->assertEquals(3, $task['id']); $this->assertEquals(3, $task['id']);
$this->assertEquals(1, $task['column_id']); $this->assertEquals(1, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
$task = $taskFinderModel->getById(4); $task = $taskFinderModel->getById(4);
$this->assertEquals(4, $task['id']); $this->assertEquals(4, $task['id']);
$this->assertEquals(1, $task['column_id']); $this->assertEquals(1, $task['column_id']);
$this->assertEquals(2, $task['position']); $this->assertEquals(2, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
$task = $taskFinderModel->getById(5); $task = $taskFinderModel->getById(5);
$this->assertEquals(5, $task['id']); $this->assertEquals(5, $task['id']);
$this->assertEquals(4, $task['column_id']); $this->assertEquals(4, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
} }
public function testEvents() public function testEvents()
@ -529,7 +529,7 @@ class TaskPositionModelTest extends Base
$swimlaneModel = new SwimlaneModel($this->container); $swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'Project #1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'Project #1')));
$this->assertEquals(1, $swimlaneModel->create(array('project_id' => 1, 'name' => 'test 1'))); $this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'Task #1', 'project_id' => 1, 'column_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'Task #1', 'project_id' => 1, 'column_id' => 1)));
$this->assertEquals(2, $taskCreationModel->create(array('title' => 'Task #2', 'project_id' => 1, 'column_id' => 2))); $this->assertEquals(2, $taskCreationModel->create(array('title' => 'Task #2', 'project_id' => 1, 'column_id' => 2)));
@ -573,19 +573,19 @@ class TaskPositionModelTest extends Base
$this->assertEquals(2, count($called)); $this->assertEquals(2, count($called));
// Move to another swimlane // Move to another swimlane
$this->assertTrue($taskPositionModel->movePosition(1, 1, 3, 1, 1)); $this->assertTrue($taskPositionModel->movePosition(1, 1, 3, 1, 2));
$task = $taskFinderModel->getById(1); $task = $taskFinderModel->getById(1);
$this->assertEquals(1, $task['id']); $this->assertEquals(1, $task['id']);
$this->assertEquals(3, $task['column_id']); $this->assertEquals(3, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(1, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$task = $taskFinderModel->getById(2); $task = $taskFinderModel->getById(2);
$this->assertEquals(2, $task['id']); $this->assertEquals(2, $task['id']);
$this->assertEquals(2, $task['column_id']); $this->assertEquals(2, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(1, $task['swimlane_id']);
$called = $this->container['dispatcher']->getCalledListeners(); $called = $this->container['dispatcher']->getCalledListeners();
$this->assertArrayHasKey(TaskModel::EVENT_MOVE_SWIMLANE.'.TaskPositionModelTest::onMoveSwimlane', $called); $this->assertArrayHasKey(TaskModel::EVENT_MOVE_SWIMLANE.'.TaskPositionModelTest::onMoveSwimlane', $called);
@ -626,6 +626,6 @@ class TaskPositionModelTest extends Base
$this->assertEquals(1, $event_data['position']); $this->assertEquals(1, $event_data['position']);
$this->assertEquals(3, $event_data['column_id']); $this->assertEquals(3, $event_data['column_id']);
$this->assertEquals(1, $event_data['project_id']); $this->assertEquals(1, $event_data['project_id']);
$this->assertEquals(1, $event_data['swimlane_id']); $this->assertEquals(2, $event_data['swimlane_id']);
} }
} }

View File

@ -55,7 +55,7 @@ class TaskProjectDuplicationModelTest extends Base
$this->assertNotEmpty($task); $this->assertNotEmpty($task);
$this->assertEquals(0, $task['owner_id']); $this->assertEquals(0, $task['owner_id']);
$this->assertEquals(0, $task['category_id']); $this->assertEquals(0, $task['category_id']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$this->assertEquals(6, $task['column_id']); $this->assertEquals(6, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(2, $task['project_id']); $this->assertEquals(2, $task['project_id']);
@ -91,7 +91,7 @@ class TaskProjectDuplicationModelTest extends Base
$this->assertNotEmpty($task); $this->assertNotEmpty($task);
$this->assertEquals(0, $task['owner_id']); $this->assertEquals(0, $task['owner_id']);
$this->assertEquals(2, $task['category_id']); $this->assertEquals(2, $task['category_id']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$this->assertEquals(6, $task['column_id']); $this->assertEquals(6, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(2, $task['project_id']); $this->assertEquals(2, $task['project_id']);
@ -149,8 +149,8 @@ class TaskProjectDuplicationModelTest extends Base
$this->assertEquals(1, $projectModel->create(array('name' => 'test1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(2, $projectModel->create(array('name' => 'test2'))); $this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #1'))); $this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 2, 'name' => 'Swimlane #1'))); $this->assertEquals(4, $swimlaneModel->create(2, 'Swimlane #2'));
// We create a task // We create a task
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 1)));
@ -182,11 +182,11 @@ class TaskProjectDuplicationModelTest extends Base
$this->assertEquals(1, $projectModel->create(array('name' => 'test1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(2, $projectModel->create(array('name' => 'test2'))); $this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #1'))); $this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 2, 'name' => 'Swimlane #2'))); $this->assertEquals(4, $swimlaneModel->create(1, 'Swimlane #2'));
// We create a task // We create a task
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 2)));
// We duplicate our task to the 2nd project // We duplicate our task to the 2nd project
$this->assertEquals(2, $taskProjectDuplicationModel->duplicateToProject(1, 2)); $this->assertEquals(2, $taskProjectDuplicationModel->duplicateToProject(1, 2));
@ -196,7 +196,7 @@ class TaskProjectDuplicationModelTest extends Base
$this->assertNotEmpty($task); $this->assertNotEmpty($task);
$this->assertEquals(0, $task['owner_id']); $this->assertEquals(0, $task['owner_id']);
$this->assertEquals(0, $task['category_id']); $this->assertEquals(0, $task['category_id']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$this->assertEquals(6, $task['column_id']); $this->assertEquals(6, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(2, $task['project_id']); $this->assertEquals(2, $task['project_id']);
@ -215,12 +215,12 @@ class TaskProjectDuplicationModelTest extends Base
$this->assertEquals(1, $projectModel->create(array('name' => 'test1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(2, $projectModel->create(array('name' => 'test2'))); $this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #1'))); $this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 2, 'name' => 'Swimlane #1'))); $this->assertEquals(4, $swimlaneModel->create(2, 'Swimlane #1'));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 2, 'name' => 'Swimlane #2'))); $this->assertEquals(5, $swimlaneModel->create(2, 'Swimlane #2'));
// We create a task // We create a task
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 2)));
// We duplicate our task to the 2nd project // We duplicate our task to the 2nd project
$this->assertEquals(2, $taskProjectDuplicationModel->duplicateToProject(1, 2, 3)); $this->assertEquals(2, $taskProjectDuplicationModel->duplicateToProject(1, 2, 3));
@ -228,7 +228,7 @@ class TaskProjectDuplicationModelTest extends Base
// Check the values of the duplicated task // Check the values of the duplicated task
$task = $taskFinderModel->getById(2); $task = $taskFinderModel->getById(2);
$this->assertNotEmpty($task); $this->assertNotEmpty($task);
$this->assertEquals(3, $task['swimlane_id']); $this->assertEquals(4, $task['swimlane_id']);
} }
public function testDuplicateAnotherProjectWithPredefinedColumn() public function testDuplicateAnotherProjectWithPredefinedColumn()

View File

@ -61,7 +61,7 @@ class TaskProjectMoveModelTest extends Base
$this->assertNotEmpty($task); $this->assertNotEmpty($task);
$this->assertEquals(0, $task['owner_id']); $this->assertEquals(0, $task['owner_id']);
$this->assertEquals(0, $task['category_id']); $this->assertEquals(0, $task['category_id']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$this->assertEquals(2, $task['project_id']); $this->assertEquals(2, $task['project_id']);
$this->assertEquals(5, $task['column_id']); $this->assertEquals(5, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
@ -97,7 +97,7 @@ class TaskProjectMoveModelTest extends Base
$this->assertNotEmpty($task); $this->assertNotEmpty($task);
$this->assertEquals(0, $task['owner_id']); $this->assertEquals(0, $task['owner_id']);
$this->assertEquals(2, $task['category_id']); $this->assertEquals(2, $task['category_id']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$this->assertEquals(6, $task['column_id']); $this->assertEquals(6, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(2, $task['project_id']); $this->assertEquals(2, $task['project_id']);
@ -182,11 +182,11 @@ class TaskProjectMoveModelTest extends Base
$this->assertEquals(1, $projectModel->create(array('name' => 'test1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(2, $projectModel->create(array('name' => 'test2'))); $this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #1'))); $this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 2, 'name' => 'Swimlane #1'))); $this->assertEquals(4, $swimlaneModel->create(2, 'Swimlane #1'));
// We create a task // We create a task
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 3)));
// We move our task to the 2nd project // We move our task to the 2nd project
$this->assertTrue($taskProjectMoveModel->moveToProject(1, 2)); $this->assertTrue($taskProjectMoveModel->moveToProject(1, 2));
@ -196,7 +196,7 @@ class TaskProjectMoveModelTest extends Base
$this->assertNotEmpty($task); $this->assertNotEmpty($task);
$this->assertEquals(0, $task['owner_id']); $this->assertEquals(0, $task['owner_id']);
$this->assertEquals(0, $task['category_id']); $this->assertEquals(0, $task['category_id']);
$this->assertEquals(2, $task['swimlane_id']); $this->assertEquals(4, $task['swimlane_id']);
$this->assertEquals(6, $task['column_id']); $this->assertEquals(6, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(2, $task['project_id']); $this->assertEquals(2, $task['project_id']);
@ -215,11 +215,11 @@ class TaskProjectMoveModelTest extends Base
$this->assertEquals(1, $projectModel->create(array('name' => 'test1'))); $this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(2, $projectModel->create(array('name' => 'test2'))); $this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 1, 'name' => 'Swimlane #1'))); $this->assertEquals(3, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertNotFalse($swimlaneModel->create(array('project_id' => 2, 'name' => 'Swimlane #2'))); $this->assertEquals(4, $swimlaneModel->create(2, 'Swimlane #2'));
// We create a task // We create a task
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 1))); $this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'swimlane_id' => 3)));
// We move our task to the 2nd project // We move our task to the 2nd project
$this->assertTrue($taskProjectMoveModel->moveToProject(1, 2)); $this->assertTrue($taskProjectMoveModel->moveToProject(1, 2));
@ -229,7 +229,7 @@ class TaskProjectMoveModelTest extends Base
$this->assertNotEmpty($task); $this->assertNotEmpty($task);
$this->assertEquals(0, $task['owner_id']); $this->assertEquals(0, $task['owner_id']);
$this->assertEquals(0, $task['category_id']); $this->assertEquals(0, $task['category_id']);
$this->assertEquals(0, $task['swimlane_id']); $this->assertEquals(2, $task['swimlane_id']);
$this->assertEquals(6, $task['column_id']); $this->assertEquals(6, $task['column_id']);
$this->assertEquals(1, $task['position']); $this->assertEquals(1, $task['position']);
$this->assertEquals(2, $task['project_id']); $this->assertEquals(2, $task['project_id']);

View File

@ -0,0 +1,143 @@
<?php
require_once __DIR__.'/../Base.php';
use Kanboard\Model\SwimlaneModel;
use Kanboard\Model\SubtaskModel;
use Kanboard\Model\TaskModel;
use Kanboard\Model\TaskCreationModel;
use Kanboard\Model\TaskFinderModel;
use Kanboard\Model\TaskStatusModel;
use Kanboard\Model\ProjectModel;
class TaskStatusModelTest extends Base
{
public function testCloseBySwimlaneAndColumn()
{
$taskCreationModel = new TaskCreationModel($this->container);
$taskFinderModel = new TaskFinderModel($this->container);
$taskStatusModel = new TaskStatusModel($this->container);
$projectModel = new ProjectModel($this->container);
$swimlaneModel = new SwimlaneModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test')));
$this->assertEquals(2, $swimlaneModel->create(1, 'Swimlane #1'));
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1)));
$this->assertEquals(2, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1)));
$this->assertEquals(3, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2)));
$this->assertEquals(4, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'swimlane_id' => 2)));
$this->assertEquals(5, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1, 'is_active' => 0, 'date_completed' => strtotime('2015-01-01'))));
$taskBefore = $taskFinderModel->getById(5);
$this->assertEquals(2, $taskFinderModel->countByColumnAndSwimlaneId(1, 1, 1));
$this->assertEquals(1, $taskFinderModel->countByColumnAndSwimlaneId(1, 1, 2));
$this->assertEquals(1, $taskFinderModel->countByColumnAndSwimlaneId(1, 2, 1));
$taskStatusModel->closeTasksBySwimlaneAndColumn(1, 1);
$this->assertEquals(0, $taskFinderModel->countByColumnAndSwimlaneId(1, 1, 1));
$this->assertEquals(1, $taskFinderModel->countByColumnAndSwimlaneId(1, 1, 2));
$this->assertEquals(1, $taskFinderModel->countByColumnAndSwimlaneId(1, 2, 1));
$taskStatusModel->closeTasksBySwimlaneAndColumn(2, 1);
$this->assertEquals(0, $taskFinderModel->countByColumnAndSwimlaneId(1, 1, 1));
$this->assertEquals(0, $taskFinderModel->countByColumnAndSwimlaneId(1, 1, 2));
$this->assertEquals(1, $taskFinderModel->countByColumnAndSwimlaneId(1, 2, 1));
$taskStatusModel->closeTasksBySwimlaneAndColumn(1, 2);
$this->assertEquals(0, $taskFinderModel->countByColumnAndSwimlaneId(1, 1, 1));
$this->assertEquals(0, $taskFinderModel->countByColumnAndSwimlaneId(1, 1, 2));
$this->assertEquals(0, $taskFinderModel->countByColumnAndSwimlaneId(1, 2, 1));
$taskAfter = $taskFinderModel->getById(5);
$this->assertEquals(strtotime('2015-01-01'), $taskAfter['date_completed']);
$this->assertEquals($taskBefore['date_modification'], $taskAfter['date_modification']);
}
public function testStatus()
{
$taskCreationModel = new TaskCreationModel($this->container);
$taskFinderModel = new TaskFinderModel($this->container);
$taskStatusModel = new TaskStatusModel($this->container);
$projectModel = new ProjectModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test')));
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test', 'project_id' => 1)));
// The task must be open
$this->assertTrue($taskStatusModel->isOpen(1));
$task = $taskFinderModel->getById(1);
$this->assertNotEmpty($task);
$this->assertEquals(TaskModel::STATUS_OPEN, $task['is_active']);
$this->assertEquals(0, $task['date_completed']);
$this->assertEquals(time(), $task['date_modification'], '', 1);
// We close the task
$this->container['dispatcher']->addListener(TaskModel::EVENT_CLOSE, array($this, 'onTaskClose'));
$this->container['dispatcher']->addListener(TaskModel::EVENT_OPEN, array($this, 'onTaskOpen'));
$this->assertTrue($taskStatusModel->close(1));
$this->assertTrue($taskStatusModel->isClosed(1));
$task = $taskFinderModel->getById(1);
$this->assertNotEmpty($task);
$this->assertEquals(TaskModel::STATUS_CLOSED, $task['is_active']);
$this->assertEquals(time(), $task['date_completed'], 'Bad completion timestamp', 1);
$this->assertEquals(time(), $task['date_modification'], 'Bad modification timestamp', 1);
// We open the task again
$this->assertTrue($taskStatusModel->open(1));
$this->assertTrue($taskStatusModel->isOpen(1));
$task = $taskFinderModel->getById(1);
$this->assertNotEmpty($task);
$this->assertEquals(TaskModel::STATUS_OPEN, $task['is_active']);
$this->assertEquals(0, $task['date_completed']);
$this->assertEquals(time(), $task['date_modification'], '', 1);
$called = $this->container['dispatcher']->getCalledListeners();
$this->assertArrayHasKey('task.close.TaskStatusModelTest::onTaskClose', $called);
$this->assertArrayHasKey('task.open.TaskStatusModelTest::onTaskOpen', $called);
}
public function onTaskOpen($event)
{
$this->assertInstanceOf('Kanboard\Event\TaskEvent', $event);
$this->assertArrayHasKey('task_id', $event);
$this->assertNotEmpty($event['task_id']);
}
public function onTaskClose($event)
{
$this->assertInstanceOf('Kanboard\Event\TaskEvent', $event);
$this->assertArrayHasKey('task_id', $event);
$this->assertNotEmpty($event['task_id']);
}
public function testThatAllSubtasksAreClosed()
{
$taskStatusModel = new TaskStatusModel($this->container);
$taskCreationModel = new TaskCreationModel($this->container);
$subtaskModel = new SubtaskModel($this->container);
$projectModel = new ProjectModel($this->container);
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
$this->assertEquals(1, $taskCreationModel->create(array('title' => 'test 1', 'project_id' => 1)));
$this->assertEquals(1, $subtaskModel->create(array('title' => 'subtask #1', 'task_id' => 1)));
$this->assertEquals(2, $subtaskModel->create(array('title' => 'subtask #2', 'task_id' => 1)));
$this->assertTrue($taskStatusModel->close(1));
$subtasks = $subtaskModel->getAll(1);
$this->assertNotEmpty($subtasks);
foreach ($subtasks as $subtask) {
$this->assertEquals(SubtaskModel::STATUS_DONE, $subtask['status']);
}
}
}

View File

@ -1,143 +0,0 @@
<?php
require_once __DIR__.'/../Base.php';
use Kanboard\Model\SwimlaneModel;
use Kanboard\Model\SubtaskModel;
use Kanboard\Model\TaskModel;
use Kanboard\Model\TaskCreationModel;
use Kanboard\Model\TaskFinderModel;
use Kanboard\Model\TaskStatusModel;
use Kanboard\Model\ProjectModel;
class TaskStatusTest extends Base
{
public function testCloseBySwimlaneAndColumn()
{
$tc = new TaskCreationModel($this->container);
$tf = new TaskFinderModel($this->container);
$ts = new TaskStatusModel($this->container);
$p = new ProjectModel($this->container);
$s = new SwimlaneModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'test')));
$this->assertEquals(1, $s->create(array('name' => 'test', 'project_id' => 1)));
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1)));
$this->assertEquals(2, $tc->create(array('title' => 'test', 'project_id' => 1)));
$this->assertEquals(3, $tc->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2)));
$this->assertEquals(4, $tc->create(array('title' => 'test', 'project_id' => 1, 'swimlane_id' => 1)));
$this->assertEquals(5, $tc->create(array('title' => 'test', 'project_id' => 1, 'is_active' => 0, 'date_completed' => strtotime('2015-01-01'))));
$taskBefore = $tf->getById(5);
$this->assertEquals(2, $tf->countByColumnAndSwimlaneId(1, 1, 0));
$this->assertEquals(1, $tf->countByColumnAndSwimlaneId(1, 1, 1));
$this->assertEquals(1, $tf->countByColumnAndSwimlaneId(1, 2, 0));
$ts->closeTasksBySwimlaneAndColumn(0, 1);
$this->assertEquals(0, $tf->countByColumnAndSwimlaneId(1, 1, 0));
$this->assertEquals(1, $tf->countByColumnAndSwimlaneId(1, 1, 1));
$this->assertEquals(1, $tf->countByColumnAndSwimlaneId(1, 2, 0));
$ts->closeTasksBySwimlaneAndColumn(1, 1);
$this->assertEquals(0, $tf->countByColumnAndSwimlaneId(1, 1, 0));
$this->assertEquals(0, $tf->countByColumnAndSwimlaneId(1, 1, 1));
$this->assertEquals(1, $tf->countByColumnAndSwimlaneId(1, 2, 0));
$ts->closeTasksBySwimlaneAndColumn(0, 2);
$this->assertEquals(0, $tf->countByColumnAndSwimlaneId(1, 1, 0));
$this->assertEquals(0, $tf->countByColumnAndSwimlaneId(1, 1, 1));
$this->assertEquals(0, $tf->countByColumnAndSwimlaneId(1, 2, 0));
$taskAfter = $tf->getById(5);
$this->assertEquals(strtotime('2015-01-01'), $taskAfter['date_completed']);
$this->assertEquals($taskBefore['date_modification'], $taskAfter['date_modification']);
}
public function testStatus()
{
$tc = new TaskCreationModel($this->container);
$tf = new TaskFinderModel($this->container);
$ts = new TaskStatusModel($this->container);
$p = new ProjectModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'test')));
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1)));
// The task must be open
$this->assertTrue($ts->isOpen(1));
$task = $tf->getById(1);
$this->assertNotEmpty($task);
$this->assertEquals(TaskModel::STATUS_OPEN, $task['is_active']);
$this->assertEquals(0, $task['date_completed']);
$this->assertEquals(time(), $task['date_modification'], '', 1);
// We close the task
$this->container['dispatcher']->addListener(TaskModel::EVENT_CLOSE, array($this, 'onTaskClose'));
$this->container['dispatcher']->addListener(TaskModel::EVENT_OPEN, array($this, 'onTaskOpen'));
$this->assertTrue($ts->close(1));
$this->assertTrue($ts->isClosed(1));
$task = $tf->getById(1);
$this->assertNotEmpty($task);
$this->assertEquals(TaskModel::STATUS_CLOSED, $task['is_active']);
$this->assertEquals(time(), $task['date_completed'], 'Bad completion timestamp', 1);
$this->assertEquals(time(), $task['date_modification'], 'Bad modification timestamp', 1);
// We open the task again
$this->assertTrue($ts->open(1));
$this->assertTrue($ts->isOpen(1));
$task = $tf->getById(1);
$this->assertNotEmpty($task);
$this->assertEquals(TaskModel::STATUS_OPEN, $task['is_active']);
$this->assertEquals(0, $task['date_completed']);
$this->assertEquals(time(), $task['date_modification'], '', 1);
$called = $this->container['dispatcher']->getCalledListeners();
$this->assertArrayHasKey('task.close.TaskStatusTest::onTaskClose', $called);
$this->assertArrayHasKey('task.open.TaskStatusTest::onTaskOpen', $called);
}
public function onTaskOpen($event)
{
$this->assertInstanceOf('Kanboard\Event\TaskEvent', $event);
$this->assertArrayHasKey('task_id', $event);
$this->assertNotEmpty($event['task_id']);
}
public function onTaskClose($event)
{
$this->assertInstanceOf('Kanboard\Event\TaskEvent', $event);
$this->assertArrayHasKey('task_id', $event);
$this->assertNotEmpty($event['task_id']);
}
public function testThatAllSubtasksAreClosed()
{
$ts = new TaskStatusModel($this->container);
$tc = new TaskCreationModel($this->container);
$s = new SubtaskModel($this->container);
$p = new ProjectModel($this->container);
$this->assertEquals(1, $p->create(array('name' => 'test1')));
$this->assertEquals(1, $tc->create(array('title' => 'test 1', 'project_id' => 1)));
$this->assertEquals(1, $s->create(array('title' => 'subtask #1', 'task_id' => 1)));
$this->assertEquals(2, $s->create(array('title' => 'subtask #2', 'task_id' => 1)));
$this->assertTrue($ts->close(1));
$subtasks = $s->getAll(1);
$this->assertNotEmpty($subtasks);
foreach ($subtasks as $subtask) {
$this->assertEquals(SubtaskModel::STATUS_DONE, $subtask['status']);
}
}
}

View File

@ -39,4 +39,15 @@ class TaskValidatorTest extends Base
$result = $taskValidator->validateCreation(array('project_id' => 1, 'title' => 'test', 'score' => -2147483648)); $result = $taskValidator->validateCreation(array('project_id' => 1, 'title' => 'test', 'score' => -2147483648));
$this->assertFalse($result[0]); $this->assertFalse($result[0]);
} }
public function testSwimlaneIdField()
{
$taskValidator = new TaskValidator($this->container);
$result = $taskValidator->validateCreation(array('project_id' => 1, 'title' => 'test', 'swimlane_id' => 1));
$this->assertTrue($result[0]);
$result = $taskValidator->validateCreation(array('project_id' => 1, 'title' => 'test', 'swimlane_id' => 0));
$this->assertFalse($result[0]);
}
} }