Added automated action to change task color based on the priority
This commit is contained in:
@@ -3,6 +3,7 @@ Version 1.0.28 (unreleased)
|
||||
|
||||
New features:
|
||||
|
||||
* Added automated action to change task color based on the priority
|
||||
* Added support for LDAP Posix Groups (OpenLDAP with memberUid)
|
||||
* Search in activity stream
|
||||
* Search in comments
|
||||
|
||||
95
app/Action/TaskAssignColorPriority.php
Normal file
95
app/Action/TaskAssignColorPriority.php
Normal file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace Kanboard\Action;
|
||||
|
||||
use Kanboard\Model\Task;
|
||||
|
||||
/**
|
||||
* Assign a color to a priority
|
||||
*
|
||||
* @package action
|
||||
* @author Frederic Guillot
|
||||
*/
|
||||
class TaskAssignColorPriority extends Base
|
||||
{
|
||||
/**
|
||||
* Get automatic action description
|
||||
*
|
||||
* @access public
|
||||
* @return string
|
||||
*/
|
||||
public function getDescription()
|
||||
{
|
||||
return t('Assign automatically a color based on a priority');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of compatible events
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getCompatibleEvents()
|
||||
{
|
||||
return array(
|
||||
Task::EVENT_CREATE_UPDATE,
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the required parameter for the action (defined by the user)
|
||||
*
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function getActionRequiredParameters()
|
||||
{
|
||||
return array(
|
||||
'color_id' => t('Color'),
|
||||
'priority' => t('Priority'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the required parameter for the event
|
||||
*
|
||||
* @access public
|
||||
* @return string[]
|
||||
*/
|
||||
public function getEventRequiredParameters()
|
||||
{
|
||||
return array(
|
||||
'task_id',
|
||||
'priority',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the action (change the task color)
|
||||
*
|
||||
* @access public
|
||||
* @param array $data Event data dictionary
|
||||
* @return bool True if the action was executed or false when not executed
|
||||
*/
|
||||
public function doAction(array $data)
|
||||
{
|
||||
$values = array(
|
||||
'id' => $data['task_id'],
|
||||
'color_id' => $this->getParam('color_id'),
|
||||
);
|
||||
|
||||
return $this->taskModification->update($values, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the event data meet the action condition
|
||||
*
|
||||
* @access public
|
||||
* @param array $data Event data dictionary
|
||||
* @return bool
|
||||
*/
|
||||
public function hasRequiredCondition(array $data)
|
||||
{
|
||||
return $data['priority'] == $this->getParam('priority');
|
||||
}
|
||||
}
|
||||
@@ -81,6 +81,7 @@ class ActionCreation extends Base
|
||||
'colors_list' => $this->color->getList(),
|
||||
'categories_list' => $this->category->getList($project['id']),
|
||||
'links_list' => $this->link->getList(0, false),
|
||||
'priorities_list' => $this->project->getPriorities($project),
|
||||
'project' => $project,
|
||||
'available_actions' => $this->actionManager->getAvailableActions(),
|
||||
'events' => $this->actionManager->getCompatibleEvents($values['action_name']),
|
||||
|
||||
@@ -201,7 +201,7 @@ class Project extends Base
|
||||
* Get all projects with all its data for a given status
|
||||
*
|
||||
* @access public
|
||||
* @param integer $status Proejct status: self::ACTIVE or self:INACTIVE
|
||||
* @param integer $status Project status: self::ACTIVE or self:INACTIVE
|
||||
* @return array
|
||||
*/
|
||||
public function getAllByStatus($status)
|
||||
@@ -244,6 +244,19 @@ class Project extends Base
|
||||
->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Priority range from a project
|
||||
*
|
||||
* @access public
|
||||
* @param array $project
|
||||
* @return array
|
||||
*/
|
||||
public function getPriorities(array $project)
|
||||
{
|
||||
$range = range($project['priority_start'], $project['priority_end']);
|
||||
return array_combine($range, $range);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gather some task metrics for a given project
|
||||
*
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Kanboard\ServiceProvider;
|
||||
|
||||
use Kanboard\Action\TaskAssignColorPriority;
|
||||
use Pimple\Container;
|
||||
use Pimple\ServiceProviderInterface;
|
||||
use Kanboard\Core\Action\ActionManager;
|
||||
@@ -59,6 +60,7 @@ class ActionProvider implements ServiceProviderInterface
|
||||
$container['actionManager']->register(new TaskAssignColorColumn($container));
|
||||
$container['actionManager']->register(new TaskAssignColorLink($container));
|
||||
$container['actionManager']->register(new TaskAssignColorUser($container));
|
||||
$container['actionManager']->register(new TaskAssignColorPriority($container));
|
||||
$container['actionManager']->register(new TaskAssignCurrentUser($container));
|
||||
$container['actionManager']->register(new TaskAssignCurrentUserColumn($container));
|
||||
$container['actionManager']->register(new TaskAssignSpecificUser($container));
|
||||
|
||||
@@ -35,6 +35,9 @@
|
||||
<?php elseif ($this->text->contains($param_name, 'link_id')): ?>
|
||||
<?= $this->form->label($param_desc, $param_name) ?>
|
||||
<?= $this->form->select('params['.$param_name.']', $links_list, $values) ?>
|
||||
<?php elseif ($param_name === 'priority'): ?>
|
||||
<?= $this->form->label($param_desc, $param_name) ?>
|
||||
<?= $this->form->select('params['.$param_name.']', $priorities_list, $values) ?>
|
||||
<?php elseif ($this->text->contains($param_name, 'duration')): ?>
|
||||
<?= $this->form->label($param_desc, $param_name) ?>
|
||||
<?= $this->form->number('params['.$param_name.']', $values) ?>
|
||||
@@ -49,4 +52,4 @@
|
||||
<?= t('or') ?>
|
||||
<?= $this->url->link(t('cancel'), 'action', 'index', array('project_id' => $project['id']), false, 'close-popover') ?>
|
||||
</div>
|
||||
</form>
|
||||
</form>
|
||||
|
||||
@@ -40,7 +40,6 @@ class CommentCreationMoveTaskColumnTest extends Base
|
||||
public function testWithUserNotLogged()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$commentModel = new Comment($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
|
||||
@@ -46,7 +46,6 @@ class CommentCreationTest extends Base
|
||||
{
|
||||
$userModel = new User($this->container);
|
||||
$projectModel = new Project($this->container);
|
||||
$projectUserRoleModel = new ProjectUserRole($this->container);
|
||||
$commentModel = new Comment($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
@@ -74,8 +73,6 @@ class CommentCreationTest extends Base
|
||||
{
|
||||
$userModel = new User($this->container);
|
||||
$projectModel = new Project($this->container);
|
||||
$projectUserRoleModel = new ProjectUserRole($this->container);
|
||||
$commentModel = new Comment($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
|
||||
@@ -42,7 +42,6 @@ class TaskAssignCategoryColorTest extends Base
|
||||
$categoryModel = new Category($this->container);
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -42,7 +42,6 @@ class TaskAssignCategoryLabelTest extends Base
|
||||
$categoryModel = new Category($this->container);
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
@@ -64,7 +63,6 @@ class TaskAssignCategoryLabelTest extends Base
|
||||
$categoryModel = new Category($this->container);
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $categoryModel->create(array('name' => 'c1', 'project_id' => 1)));
|
||||
|
||||
@@ -70,7 +70,6 @@ class TaskAssignCategoryLinkTest extends Base
|
||||
public function testThatExistingCategoryWillNotChange()
|
||||
{
|
||||
$tc = new TaskCreation($this->container);
|
||||
$tf = new TaskFinder($this->container);
|
||||
$p = new Project($this->container);
|
||||
$c = new Category($this->container);
|
||||
|
||||
|
||||
@@ -39,10 +39,8 @@ class TaskAssignColorCategoryTest extends Base
|
||||
|
||||
public function testWithWrongCategory()
|
||||
{
|
||||
$categoryModel = new Category($this->container);
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -38,7 +38,6 @@ class TaskAssignColorColumnTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -38,7 +38,6 @@ class TaskAssignColorLinkTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
57
tests/units/Action/TaskAssignColorPriorityTest.php
Normal file
57
tests/units/Action/TaskAssignColorPriorityTest.php
Normal file
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__.'/../Base.php';
|
||||
|
||||
use Kanboard\Event\GenericEvent;
|
||||
use Kanboard\Model\Category;
|
||||
use Kanboard\Model\TaskCreation;
|
||||
use Kanboard\Model\TaskFinder;
|
||||
use Kanboard\Model\Project;
|
||||
use Kanboard\Model\Task;
|
||||
use Kanboard\Action\TaskAssignColorPriority;
|
||||
|
||||
class TaskAssignColorPriorityTest extends Base
|
||||
{
|
||||
public function testChangeColor()
|
||||
{
|
||||
$categoryModel = new Category($this->container);
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
$this->assertEquals(1, $categoryModel->create(array('name' => 'c1', 'project_id' => 1)));
|
||||
|
||||
$event = new GenericEvent(array('project_id' => 1, 'task_id' => 1, 'priority' => 1));
|
||||
|
||||
$action = new TaskAssignColorPriority($this->container);
|
||||
$action->setProjectId(1);
|
||||
$action->setParam('color_id', 'red');
|
||||
$action->setParam('priority', 1);
|
||||
|
||||
$this->assertTrue($action->execute($event, Task::EVENT_CREATE_UPDATE));
|
||||
|
||||
$task = $taskFinderModel->getById(1);
|
||||
$this->assertNotEmpty($task);
|
||||
$this->assertEquals('red', $task['color_id']);
|
||||
}
|
||||
|
||||
public function testWithWrongPriority()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
$event = new GenericEvent(array('project_id' => 1, 'task_id' => 1, 'priority' => 2));
|
||||
|
||||
$action = new TaskAssignColorPriority($this->container);
|
||||
$action->setProjectId(1);
|
||||
$action->setParam('color_id', 'red');
|
||||
$action->setParam('priority', 1);
|
||||
|
||||
$this->assertFalse($action->execute($event, Task::EVENT_CREATE_UPDATE));
|
||||
}
|
||||
}
|
||||
@@ -38,7 +38,6 @@ class TaskAssignColorUserTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -41,7 +41,6 @@ class TaskAssignCurrentUserColumnTest extends Base
|
||||
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
@@ -59,7 +58,6 @@ class TaskAssignCurrentUserColumnTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -38,7 +38,6 @@ class TaskAssignCurrentUserTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -38,7 +38,6 @@ class TaskAssignSpecificUserTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -41,11 +41,8 @@ class TaskAssignUserTest extends Base
|
||||
|
||||
public function testWithNotAssignableUser()
|
||||
{
|
||||
$userModel = new User($this->container);
|
||||
$projectModel = new Project($this->container);
|
||||
$projectUserRoleModel = new ProjectUserRole($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -37,7 +37,6 @@ class TaskCloseColumnTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(1, $taskCreationModel->create(array('project_id' => 1, 'title' => 'test')));
|
||||
|
||||
@@ -34,7 +34,6 @@ class TaskCreationActionTest extends Base
|
||||
public function testWithNoTitle()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
|
||||
|
||||
@@ -39,7 +39,6 @@ class TaskDuplicateAnotherProjectTest extends Base
|
||||
public function testWithWrongColumn()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
|
||||
|
||||
@@ -44,7 +44,6 @@ class TaskEmailTest extends Base
|
||||
public function testWithWrongColumn()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
|
||||
|
||||
@@ -40,7 +40,6 @@ class TaskMoveAnotherProjectTest extends Base
|
||||
public function testWithWrongColumn()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
|
||||
|
||||
@@ -39,7 +39,6 @@ class TaskMoveColumnAssignedTest extends Base
|
||||
public function testWithWrongColumn()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
|
||||
|
||||
@@ -43,7 +43,6 @@ class TaskMoveColumnCategoryChangeTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
$categoryModel = new Category($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
@@ -65,7 +64,6 @@ class TaskMoveColumnCategoryChangeTest extends Base
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
$taskFinderModel = new TaskFinder($this->container);
|
||||
$categoryModel = new Category($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
|
||||
@@ -39,7 +39,6 @@ class TaskMoveColumnUnAssignedTest extends Base
|
||||
public function testWithWrongColumn()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
|
||||
@@ -57,7 +56,6 @@ class TaskMoveColumnUnAssignedTest extends Base
|
||||
public function testWithWrongUser()
|
||||
{
|
||||
$projectModel = new Project($this->container);
|
||||
$taskCreationModel = new TaskCreation($this->container);
|
||||
|
||||
$this->assertEquals(1, $projectModel->create(array('name' => 'test1')));
|
||||
$this->assertEquals(2, $projectModel->create(array('name' => 'test2')));
|
||||
|
||||
@@ -315,6 +315,11 @@ class ProjectTest extends Base
|
||||
$this->assertEquals(0, $project['priority_start']);
|
||||
$this->assertEquals(3, $project['priority_end']);
|
||||
|
||||
$this->assertEquals(
|
||||
array(0 => 0, 1 => 1, 2 => 2, 3 => 3),
|
||||
$projectModel->getPriorities($project)
|
||||
);
|
||||
|
||||
$this->assertTrue($projectModel->update(array('id' => 1, 'priority_start' => 2, 'priority_end' => 5, 'priority_default' => 4)));
|
||||
|
||||
$project = $projectModel->getById(1);
|
||||
@@ -322,5 +327,10 @@ class ProjectTest extends Base
|
||||
$this->assertEquals(4, $project['priority_default']);
|
||||
$this->assertEquals(2, $project['priority_start']);
|
||||
$this->assertEquals(5, $project['priority_end']);
|
||||
|
||||
$this->assertEquals(
|
||||
array(2 => 2, 3 => 3, 4 => 4, 5 => 5),
|
||||
$projectModel->getPriorities($project)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user