Add categories for projects and tasks

This commit is contained in:
Frédéric Guillot
2014-05-21 22:33:57 -04:00
parent 57e40671af
commit a750b8ab2a
39 changed files with 815 additions and 44 deletions

View File

@@ -44,6 +44,7 @@ class Action extends Base
'TaskAssignCurrentUser' => t('Assign the task to the person who does the action'),
'TaskDuplicateAnotherProject' => t('Duplicate the task to another project'),
'TaskAssignColorUser' => t('Assign a color to a specific user'),
'TaskAssignColorCategory' => t('Assign a color to a specific category'),
);
}
@@ -62,6 +63,7 @@ class Action extends Base
Task::EVENT_CREATE => t('Task creation'),
Task::EVENT_OPEN => t('Open a closed task'),
Task::EVENT_CLOSE => t('Closing a task'),
Task::EVENT_CREATE_UPDATE => t('Task creation or modification'),
);
}
@@ -239,6 +241,10 @@ class Action extends Base
require_once __DIR__.'/../actions/task_assign_color_user.php';
$className = '\Action\TaskAssignColorUser';
return new $className($project_id, new Task($this->db, $this->event));
case 'TaskAssignColorCategory':
require_once __DIR__.'/../actions/task_assign_color_category.php';
$className = '\Action\TaskAssignColorCategory';
return new $className($project_id, new Task($this->db, $this->event));
default:
throw new \LogicException('Action not found: '.$name);
}

152
models/category.php Normal file
View File

@@ -0,0 +1,152 @@
<?php
namespace Model;
require_once __DIR__.'/base.php';
use SimpleValidator\Validator;
use SimpleValidator\Validators;
/**
* Category model
*
* @package model
* @author Frederic Guillot
*/
class Category extends Base
{
/**
* SQL table name
*
* @var string
*/
const TABLE = 'project_has_categories';
/**
* Get a category by the id
*
* @access public
* @param integer $category_id Category id
* @return array
*/
public function getById($category_id)
{
return $this->db->table(self::TABLE)->eq('id', $category_id)->findOne();
}
/**
* Return the list of all categories
*
* @access public
* @param integer $project_id Project id
* @param bool $prepend_none If true, prepend to the list the value 'None'
* @param bool $prepend_all If true, prepend to the list the value 'All'
* @return array
*/
public function getList($project_id, $prepend_none = true, $prepend_all = false)
{
$listing = $this->db->table(self::TABLE)
->eq('project_id', $project_id)
->asc('name')
->listing('id', 'name');
$prepend = array();
if ($prepend_all) {
$prepend[-1] = t('All categories');
}
if ($prepend_none) {
$prepend[0] = t('No category');
}
return $prepend + $listing;
}
/**
* Create a category
*
* @access public
* @param array $values Form values
* @return bool
*/
public function create(array $values)
{
return $this->db->table(self::TABLE)->save($values);
}
/**
* Update a category
*
* @access public
* @param array $values Form values
* @return bool
*/
public function update(array $values)
{
return $this->db->table(self::TABLE)->eq('id', $values['id'])->save($values);
}
/**
* Remove a category
*
* @access public
* @param integer $category_id Category id
* @return bool
*/
public function remove($category_id)
{
$this->db->startTransaction();
$r1 = $this->db->table(Task::TABLE)->eq('category_id', $category_id)->update(array('category_id' => 0));
$r2 = $this->db->table(self::TABLE)->eq('id', $category_id)->remove();
$this->db->closeTransaction();
return $r1 && $r2;
}
/**
* Validate category creation
*
* @access public
* @param array $array Form values
* @return array $valid, $errors [0] = Success or not, [1] = List of errors
*/
public function validateCreation(array $values)
{
$v = new Validator($values, array(
new Validators\Required('project_id', t('The project id is required')),
new Validators\Integer('project_id', t('The project id must be an integer')),
new Validators\Required('name', t('The name is required')),
new Validators\MaxLength('name', t('The maximum length is %d characters', 50), 50)
));
return array(
$v->execute(),
$v->getErrors()
);
}
/**
* Validate category modification
*
* @access public
* @param array $array Form values
* @return array $valid, $errors [0] = Success or not, [1] = List of errors
*/
public function validateModification(array $values)
{
$v = new Validator($values, array(
new Validators\Required('id', t('The id is required')),
new Validators\Integer('id', t('The id must be an integer')),
new Validators\Required('project_id', t('The project id is required')),
new Validators\Integer('project_id', t('The project id must be an integer')),
new Validators\Required('name', t('The name is required')),
new Validators\MaxLength('name', t('The maximum length is %d characters', 50), 50)
));
return array(
$v->execute(),
$v->getErrors()
);
}
}

View File

@@ -8,9 +8,9 @@ require_once __DIR__.'/board.php';
require_once __DIR__.'/task.php';
require_once __DIR__.'/../events/task_modification.php';
use \SimpleValidator\Validator;
use \SimpleValidator\Validators;
use \Event\TaskModification;
use SimpleValidator\Validator;
use SimpleValidator\Validators;
use Event\TaskModification;
/**
* Project model

View File

@@ -4,8 +4,8 @@ namespace Model;
require_once __DIR__.'/base.php';
use \SimpleValidator\Validator;
use \SimpleValidator\Validators;
use SimpleValidator\Validator;
use SimpleValidator\Validators;
use DateTime;
/**
@@ -42,6 +42,7 @@ class Task extends Base
const EVENT_CREATE = 'task.create';
const EVENT_CLOSE = 'task.close';
const EVENT_OPEN = 'task.open';
const EVENT_CREATE_UPDATE = 'task.create_update';
/**
* Get available colors
@@ -90,10 +91,13 @@ class Task extends Base
self::TABLE.'.position',
self::TABLE.'.is_active',
self::TABLE.'.score',
self::TABLE.'.category_id',
Category::TABLE.'.name AS category_name',
Project::TABLE.'.name AS project_name',
Board::TABLE.'.title AS column_title',
User::TABLE.'.username'
)
->join(Category::TABLE, 'id', 'category_id')
->join(Project::TABLE, 'id', 'project_id')
->join(Board::TABLE, 'id', 'column_id')
->join(User::TABLE, 'id', 'owner_id')
@@ -150,6 +154,7 @@ class Task extends Base
'tasks.position',
'tasks.is_active',
'tasks.score',
'tasks.category_id',
'users.username'
)
->join('users', 'id', 'owner_id');
@@ -236,6 +241,7 @@ class Task extends Base
$this->db->closeTransaction();
// Trigger events
$this->event->trigger(self::EVENT_CREATE_UPDATE, array('task_id' => $task_id) + $task);
$this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id) + $task);
return $task_id;
@@ -265,6 +271,7 @@ class Task extends Base
// Assign new values
$task['date_creation'] = time();
$task['owner_id'] = 0;
$task['category_id'] = 0;
$task['is_active'] = 1;
$task['column_id'] = $boardModel->getFirstColumn($project_id);
$task['project_id'] = $project_id;
@@ -281,6 +288,7 @@ class Task extends Base
$this->db->closeTransaction();
// Trigger events
$this->event->trigger(self::EVENT_CREATE_UPDATE, array('task_id' => $task_id) + $task);
$this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id) + $task);
return $task_id;
@@ -320,6 +328,7 @@ class Task extends Base
$this->db->closeTransaction();
// Trigger events
$this->event->trigger(self::EVENT_CREATE_UPDATE, array('task_id' => $task_id) + $values);
$this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id) + $values);
return $task_id;
@@ -355,7 +364,8 @@ class Task extends Base
$events = array();
if ($this->event->getLastTriggeredEvent() !== self::EVENT_UPDATE) {
if (! in_array($this->event->getLastTriggeredEvent(), array(self::EVENT_CREATE_UPDATE))) {
$events[] = self::EVENT_CREATE_UPDATE;
$events[] = self::EVENT_UPDATE;
}