diff options
author | Frédéric Guillot <fred@kanboard.net> | 2014-09-28 14:26:40 -0400 |
---|---|---|
committer | Frédéric Guillot <fred@kanboard.net> | 2014-09-28 14:26:40 -0400 |
commit | 03fa01ac7b036820ee232d893ec63241918c6012 (patch) | |
tree | 295e82e6552ffb044554a11afa95318a4e180f87 /app | |
parent | 0c8de6a3f58cde2696ac276b3456f3577d312e2b (diff) |
Improve automatic actions (check for compatible events/actions/parameters)
Diffstat (limited to 'app')
25 files changed, 425 insertions, 252 deletions
diff --git a/app/Action/Base.php b/app/Action/Base.php index 5b7b3502..339aeecc 100644 --- a/app/Action/Base.php +++ b/app/Action/Base.php @@ -3,12 +3,17 @@ namespace Action; use Core\Listener; +use Core\Registry; +use Core\Tool; /** * Base class for automatic actions * * @package action * @author Frederic Guillot + * + * @property \Model\Acl $acl + * @property \Model\Task $task */ abstract class Base implements Listener { @@ -29,6 +34,22 @@ abstract class Base implements Listener private $params = array(); /** + * Attached event name + * + * @access protected + * @var string + */ + protected $event_name = ''; + + /** + * Registry instance + * + * @access protected + * @var \Core\Registry + */ + protected $registry; + + /** * Execute the action * * @abstract @@ -57,14 +78,59 @@ abstract class Base implements Listener abstract public function getEventRequiredParameters(); /** + * Get the compatible events + * + * @abstract + * @access public + * @return array + */ + abstract public function getCompatibleEvents(); + + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + abstract public function hasRequiredCondition(array $data); + + /** * Constructor * * @access public - * @param integer $project_id Project id + * @param \Core\Registry $registry Regsitry instance + * @param integer $project_id Project id + * @param string $event_name Attached event name */ - public function __construct($project_id) + public function __construct(Registry $registry, $project_id, $event_name) { + $this->registry = $registry; $this->project_id = $project_id; + $this->event_name = $event_name; + } + + /** + * Return class information + * + * @access public + * @return string + */ + public function __toString() + { + return get_called_class(); + } + + /** + * Load automatically models + * + * @access public + * @param string $name Model name + * @return mixed + */ + public function __get($name) + { + return Tool::loadModel($this->registry, $name); } /** @@ -101,11 +167,34 @@ abstract class Base implements Listener */ public function isExecutable(array $data) { - if (isset($data['project_id']) && $data['project_id'] == $this->project_id && $this->hasRequiredParameters($data)) { - return true; - } + return $this->hasCompatibleEvent() && + $this->hasRequiredProject($data) && + $this->hasRequiredParameters($data) && + $this->hasRequiredCondition($data); + } - return false; + /** + * Check if the event is compatible with the action + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasCompatibleEvent() + { + return in_array($this->event_name, $this->getCompatibleEvents()); + } + + /** + * Check if the event data has the required project + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredProject(array $data) + { + return isset($data['project_id']) && $data['project_id'] == $this->project_id; } /** @@ -118,7 +207,9 @@ abstract class Base implements Listener public function hasRequiredParameters(array $data) { foreach ($this->getEventRequiredParameters() as $parameter) { - if (! isset($data[$parameter])) return false; + if (! isset($data[$parameter])) { + return false; + } } return true; @@ -139,15 +230,4 @@ abstract class Base implements Listener return false; } - - /** - * Return class information - * - * @access public - * @return string - */ - public function __toString() - { - return get_called_class(); - } } diff --git a/app/Action/TaskAssignCategoryColor.php b/app/Action/TaskAssignCategoryColor.php index 3e5b9304..be15f659 100644 --- a/app/Action/TaskAssignCategoryColor.php +++ b/app/Action/TaskAssignCategoryColor.php @@ -13,24 +13,16 @@ use Model\Task; class TaskAssignCategoryColor extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_CREATE_UPDATE, + ); } /** @@ -62,7 +54,7 @@ class TaskAssignCategoryColor extends Base } /** - * Execute the action + * Execute the action (change the category) * * @access public * @param array $data Event data dictionary @@ -70,16 +62,23 @@ class TaskAssignCategoryColor extends Base */ public function doAction(array $data) { - if ($data['color_id'] == $this->getParam('color_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'category_id' => $this->getParam('category_id'), - ), false); + $values = array( + 'id' => $data['task_id'], + 'category_id' => $this->getParam('category_id'), + ); - return true; - } + return $this->task->update($values, false); + } - return 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['color_id'] == $this->getParam('color_id'); } } diff --git a/app/Action/TaskAssignColorCategory.php b/app/Action/TaskAssignColorCategory.php index e7aad01f..f5a9ac5a 100644 --- a/app/Action/TaskAssignColorCategory.php +++ b/app/Action/TaskAssignColorCategory.php @@ -13,24 +13,16 @@ use Model\Task; class TaskAssignColorCategory extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_CREATE_UPDATE, + ); } /** @@ -62,7 +54,7 @@ class TaskAssignColorCategory extends Base } /** - * Execute the action + * Execute the action (change the task color) * * @access public * @param array $data Event data dictionary @@ -70,16 +62,23 @@ class TaskAssignColorCategory extends Base */ public function doAction(array $data) { - if ($data['category_id'] == $this->getParam('category_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'color_id' => $this->getParam('color_id'), - ), false); + $values = array( + 'id' => $data['task_id'], + 'color_id' => $this->getParam('color_id'), + ); - return true; - } + return $this->task->update($values, false); + } - return 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['category_id'] == $this->getParam('category_id'); } } diff --git a/app/Action/TaskAssignColorUser.php b/app/Action/TaskAssignColorUser.php index dad46bf9..00680186 100644 --- a/app/Action/TaskAssignColorUser.php +++ b/app/Action/TaskAssignColorUser.php @@ -13,24 +13,17 @@ use Model\Task; class TaskAssignColorUser extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_CREATE, + Task::EVENT_ASSIGNEE_CHANGE, + ); } /** @@ -62,7 +55,7 @@ class TaskAssignColorUser extends Base } /** - * Execute the action + * Execute the action (change the task color) * * @access public * @param array $data Event data dictionary @@ -70,16 +63,23 @@ class TaskAssignColorUser extends Base */ public function doAction(array $data) { - if ($data['owner_id'] == $this->getParam('user_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'color_id' => $this->getParam('color_id'), - ), false); + $values = array( + 'id' => $data['task_id'], + 'color_id' => $this->getParam('color_id'), + ); - return true; - } + return $this->task->update($values, false); + } - return 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['owner_id'] == $this->getParam('user_id'); } } diff --git a/app/Action/TaskAssignCurrentUser.php b/app/Action/TaskAssignCurrentUser.php index 8ae87ff9..7a9cf70b 100644 --- a/app/Action/TaskAssignCurrentUser.php +++ b/app/Action/TaskAssignCurrentUser.php @@ -3,7 +3,6 @@ namespace Action; use Model\Task; -use Model\Acl; /** * Assign a task to the logged user @@ -14,34 +13,17 @@ use Model\Acl; class TaskAssignCurrentUser extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Acl model - * - * @accesss private - * @var \Model\Acl - */ - private $acl; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance - * @param \Model\Acl $acl Acl model instance + * @return array */ - public function __construct($project_id, Task $task, Acl $acl) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; - $this->acl = $acl; + return array( + Task::EVENT_CREATE, + Task::EVENT_MOVE_COLUMN, + ); } /** @@ -80,16 +62,23 @@ class TaskAssignCurrentUser extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'owner_id' => $this->acl->getUserId(), - ), false); + $values = array( + 'id' => $data['task_id'], + 'owner_id' => $this->acl->getUserId(), + ); - return true; - } + return $this->task->update($values, false); + } - return 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['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskAssignSpecificUser.php b/app/Action/TaskAssignSpecificUser.php index a903327b..f70459be 100644 --- a/app/Action/TaskAssignSpecificUser.php +++ b/app/Action/TaskAssignSpecificUser.php @@ -13,24 +13,17 @@ use Model\Task; class TaskAssignSpecificUser extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_CREATE_UPDATE, + Task::EVENT_MOVE_COLUMN, + ); } /** @@ -62,7 +55,7 @@ class TaskAssignSpecificUser extends Base } /** - * Execute the action + * Execute the action (assign the given user) * * @access public * @param array $data Event data dictionary @@ -70,16 +63,23 @@ class TaskAssignSpecificUser extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'owner_id' => $this->getParam('user_id'), - ), false); + $values = array( + 'id' => $data['task_id'], + 'owner_id' => $this->getParam('user_id'), + ); - return true; - } + return $this->task->update($values, false); + } - return 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['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskClose.php b/app/Action/TaskClose.php index 32887d3c..da0744d0 100644 --- a/app/Action/TaskClose.php +++ b/app/Action/TaskClose.php @@ -2,6 +2,7 @@ namespace Action; +use Model\GithubWebhook; use Model\Task; /** @@ -13,24 +14,17 @@ use Model\Task; class TaskClose extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_MOVE_COLUMN, + GithubWebhook::EVENT_COMMIT, + ); } /** @@ -41,9 +35,12 @@ class TaskClose extends Base */ public function getActionRequiredParameters() { - return array( - 'column_id' => t('Column'), - ); + switch ($this->event_name) { + case GithubWebhook::EVENT_COMMIT: + return array(); + default: + return array('column_id' => t('Column')); + } } /** @@ -54,14 +51,16 @@ class TaskClose extends Base */ public function getEventRequiredParameters() { - return array( - 'task_id', - 'column_id', - ); + switch ($this->event_name) { + case GithubWebhook::EVENT_COMMIT: + return array('task_id'); + default: + return array('task_id', 'column_id'); + } } /** - * Execute the action + * Execute the action (close the task) * * @access public * @param array $data Event data dictionary @@ -69,11 +68,23 @@ class TaskClose extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id')) { - $this->task->close($data['task_id']); - return true; - } + return $this->task->close($data['task_id']); + } - return 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) + { + switch ($this->event_name) { + case GithubWebhook::EVENT_COMMIT: + return true; + default: + return $data['column_id'] == $this->getParam('column_id'); + } } } diff --git a/app/Action/TaskDuplicateAnotherProject.php b/app/Action/TaskDuplicateAnotherProject.php index 0f14cbed..b76b3884 100644 --- a/app/Action/TaskDuplicateAnotherProject.php +++ b/app/Action/TaskDuplicateAnotherProject.php @@ -13,24 +13,17 @@ use Model\Task; class TaskDuplicateAnotherProject extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_MOVE_COLUMN, + Task::EVENT_CLOSE, + ); } /** @@ -63,7 +56,7 @@ class TaskDuplicateAnotherProject extends Base } /** - * Execute the action + * Execute the action (duplicate the task to another project) * * @access public * @param array $data Event data dictionary @@ -71,14 +64,20 @@ class TaskDuplicateAnotherProject extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id')) { - - $task = $this->task->getById($data['task_id']); - $this->task->duplicateToAnotherProject($this->getParam('project_id'), $task); - - return true; - } + $task = $this->task->getById($data['task_id']); + $this->task->duplicateToAnotherProject($this->getParam('project_id'), $task); + return true; + } - return 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['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id'); } } diff --git a/app/Action/TaskMoveAnotherProject.php b/app/Action/TaskMoveAnotherProject.php index 8091053e..9922a981 100644 --- a/app/Action/TaskMoveAnotherProject.php +++ b/app/Action/TaskMoveAnotherProject.php @@ -13,24 +13,17 @@ use Model\Task; class TaskMoveAnotherProject extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_MOVE_COLUMN, + Task::EVENT_CLOSE, + ); } /** @@ -63,7 +56,7 @@ class TaskMoveAnotherProject extends Base } /** - * Execute the action + * Execute the action (move the task to another project) * * @access public * @param array $data Event data dictionary @@ -71,14 +64,20 @@ class TaskMoveAnotherProject extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id')) { - - $task = $this->task->getById($data['task_id']); - $this->task->moveToAnotherProject($this->getParam('project_id'), $task); - - return true; - } + $task = $this->task->getById($data['task_id']); + $this->task->moveToAnotherProject($this->getParam('project_id'), $task); + return true; + } - return 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['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id'); } } diff --git a/app/Controller/Action.php b/app/Controller/Action.php index 64d77aab..44ab6430 100644 --- a/app/Controller/Action.php +++ b/app/Controller/Action.php @@ -37,7 +37,30 @@ class Action extends Base } /** - * Define action parameters (step 2) + * Choose the event according to the action (step 2) + * + * @access public + */ + public function event() + { + $project = $this->getProject(); + $values = $this->request->getValues(); + + if (empty($values['action_name']) || empty($values['project_id'])) { + $this->response->redirect('?controller=action&action=index&project_id='.$project['id']); + } + + $this->response->html($this->projectLayout('action_event', array( + 'values' => $values, + 'project' => $project, + 'events' => $this->action->getCompatibleEvents($values['action_name']), + 'menu' => 'projects', + 'title' => t('Automatic actions') + ))); + } + + /** + * Define action parameters (step 3) * * @access public */ @@ -45,14 +68,27 @@ class Action extends Base { $project = $this->getProject(); $values = $this->request->getValues(); - $action = $this->action->load($values['action_name'], $values['project_id']); + + if (empty($values['action_name']) || empty($values['project_id']) || empty($values['event_name'])) { + $this->response->redirect('?controller=action&action=index&project_id='.$project['id']); + } + + $action = $this->action->load($values['action_name'], $values['project_id'], $values['event_name']); + $action_params = $action->getActionRequiredParameters(); + + if (empty($action_params)) { + $this->doCreation($project, $values + array('params' => array())); + } + + $projects_list = $this->project->getList(false); + unset($projects_list[$project['id']]); $this->response->html($this->projectLayout('action_params', array( 'values' => $values, - 'action_params' => $action->getActionRequiredParameters(), + 'action_params' => $action_params, 'columns_list' => $this->board->getColumnsList($project['id']), 'users_list' => $this->projectPermission->getUsersList($project['id']), - 'projects_list' => $this->project->getList(false), + 'projects_list' => $projects_list, 'colors_list' => $this->color->getList(), 'categories_list' => $this->category->getList($project['id']), 'project' => $project, @@ -68,9 +104,18 @@ class Action extends Base */ public function create() { - $project = $this->getProject(); - $values = $this->request->getValues(); + $this->doCreation($this->getProject(), $this->request->getValues()); + } + /** + * Save the action + * + * @access private + * @param array $project Project properties + * @param array $values Form values + */ + private function doCreation(array $project, array $values) + { list($valid,) = $this->action->validateCreation($values); if ($valid) { diff --git a/app/Locales/de_DE/translations.php b/app/Locales/de_DE/translations.php index b32b9778..cfb1a7e2 100644 --- a/app/Locales/de_DE/translations.php +++ b/app/Locales/de_DE/translations.php @@ -503,4 +503,6 @@ return array( // '[%s][Position Change] %s (#%d)' => '', // '[%s][Assignee Change] %s (#%d)' => '', // 'New password for the user "%s"' => '', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Locales/es_ES/translations.php b/app/Locales/es_ES/translations.php index 262e0e3a..d99b1a3e 100644 --- a/app/Locales/es_ES/translations.php +++ b/app/Locales/es_ES/translations.php @@ -503,4 +503,6 @@ return array( '[%s][Position Change] %s (#%d)' => '[%s][Cambia Posición] %s (#%d)', '[%s][Assignee Change] %s (#%d)' => '[%s][Cambia Persona Asignada] %s (#%d)', 'New password for the user "%s"' => 'Nueva contraseña para el usuario "%s"', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Locales/fi_FI/translations.php b/app/Locales/fi_FI/translations.php index e146be7c..b2372eb9 100644 --- a/app/Locales/fi_FI/translations.php +++ b/app/Locales/fi_FI/translations.php @@ -503,4 +503,6 @@ return array( // '[%s][Position Change] %s (#%d)' => '', // '[%s][Assignee Change] %s (#%d)' => '', // 'New password for the user "%s"' => '', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Locales/fr_FR/translations.php b/app/Locales/fr_FR/translations.php index 5f5a5c20..92fa35cf 100644 --- a/app/Locales/fr_FR/translations.php +++ b/app/Locales/fr_FR/translations.php @@ -503,4 +503,6 @@ return array( '[%s][Position Change] %s (#%d)' => '[%s][Changement de position] %s (#%d)', '[%s][Assignee Change] %s (#%d)' => '[%s][Changement d\'assigné] %s (#%d)', 'New password for the user "%s"' => 'Nouveau mot de passe pour l\'utilisateur « %s »', + 'Choose an event' => 'Choisir un événement', + 'Github commit received' => '« Commit » reçu via Github', ); diff --git a/app/Locales/it_IT/translations.php b/app/Locales/it_IT/translations.php index 1e16640b..5db07c99 100644 --- a/app/Locales/it_IT/translations.php +++ b/app/Locales/it_IT/translations.php @@ -503,4 +503,6 @@ return array( // '[%s][Position Change] %s (#%d)' => '', // '[%s][Assignee Change] %s (#%d)' => '', // 'New password for the user "%s"' => '', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Locales/pl_PL/translations.php b/app/Locales/pl_PL/translations.php index 06410535..e065a4d2 100644 --- a/app/Locales/pl_PL/translations.php +++ b/app/Locales/pl_PL/translations.php @@ -503,4 +503,6 @@ return array( // '[%s][Position Change] %s (#%d)' => '', // '[%s][Assignee Change] %s (#%d)' => '', // 'New password for the user "%s"' => '', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Locales/pt_BR/translations.php b/app/Locales/pt_BR/translations.php index 1856b086..0473b592 100644 --- a/app/Locales/pt_BR/translations.php +++ b/app/Locales/pt_BR/translations.php @@ -503,4 +503,6 @@ return array( // '[%s][Position Change] %s (#%d)' => '', // '[%s][Assignee Change] %s (#%d)' => '', // 'New password for the user "%s"' => '', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Locales/ru_RU/translations.php b/app/Locales/ru_RU/translations.php index 682b8bd5..c8e12abd 100644 --- a/app/Locales/ru_RU/translations.php +++ b/app/Locales/ru_RU/translations.php @@ -503,4 +503,6 @@ return array( // '[%s][Position Change] %s (#%d)' => '', // '[%s][Assignee Change] %s (#%d)' => '', // 'New password for the user "%s"' => '', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Locales/sv_SE/translations.php b/app/Locales/sv_SE/translations.php index 9b2ca188..496a0959 100644 --- a/app/Locales/sv_SE/translations.php +++ b/app/Locales/sv_SE/translations.php @@ -503,4 +503,6 @@ return array( // '[%s][Position Change] %s (#%d)' => '', // '[%s][Assignee Change] %s (#%d)' => '', // 'New password for the user "%s"' => '', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Locales/zh_CN/translations.php b/app/Locales/zh_CN/translations.php index cb669296..b8b67a38 100644 --- a/app/Locales/zh_CN/translations.php +++ b/app/Locales/zh_CN/translations.php @@ -503,4 +503,6 @@ return array( // '[%s][Position Change] %s (#%d)' => '', // '[%s][Assignee Change] %s (#%d)' => '', // 'New password for the user "%s"' => '', + // 'Choose an event' => '', + // 'Github commit received' => '', ); diff --git a/app/Model/Action.php b/app/Model/Action.php index a0c992aa..6b1ebdad 100644 --- a/app/Model/Action.php +++ b/app/Model/Action.php @@ -37,7 +37,7 @@ class Action extends Base public function getAvailableActions() { return array( - 'TaskClose' => t('Close the task'), + 'TaskClose' => t('Close a task'), 'TaskAssignSpecificUser' => t('Assign the task to a specific user'), 'TaskAssignCurrentUser' => t('Assign the task to the person who does the action'), 'TaskDuplicateAnotherProject' => t('Duplicate the task to another project'), @@ -58,7 +58,6 @@ class Action extends Base { return array( Task::EVENT_MOVE_COLUMN => t('Move a task to another column'), - Task::EVENT_MOVE_POSITION => t('Move a task to another position in the same column'), Task::EVENT_UPDATE => t('Task modification'), Task::EVENT_CREATE => t('Task creation'), Task::EVENT_OPEN => t('Open a closed task'), @@ -70,6 +69,28 @@ class Action extends Base } /** + * Return the name and description of compatible actions + * + * @access public + * @param string $action_name Action name + * @return array + */ + public function getCompatibleEvents($action_name) + { + $action = $this->load($action_name, 0, ''); + $compatible_events = $action->getCompatibleEvents(); + $events = array(); + + foreach ($this->getAvailableEvents() as $event_name => $event_description) { + if (in_array($event_name, $compatible_events)) { + $events[$event_name] = $event_description; + } + } + + return $events; + } + + /** * Return actions and parameters for a given project * * @access public @@ -116,7 +137,7 @@ class Action extends Base foreach ($this->getAll() as $action) { - $action = $this->load($action['action_name'], $action['project_id']); + $action = $this->load($action['action_name'], $action['project_id'], $action['event_name']); $params += $action->getActionRequiredParameters(); } @@ -202,7 +223,7 @@ class Action extends Base { foreach ($this->getAll() as $action) { - $listener = $this->load($action['action_name'], $action['project_id']); + $listener = $this->load($action['action_name'], $action['project_id'], $action['event_name']); foreach ($action['params'] as $param) { $listener->setParam($param['name'], $param['value']); @@ -216,21 +237,15 @@ class Action extends Base * Load an action * * @access public - * @param string $name Action class name - * @param integer $project_id Project id - * @throws \LogicException - * @return \Core\Listener Action Instance + * @param string $name Action class name + * @param integer $project_id Project id + * @param string $event Event name + * @return \Core\Listener Action instance */ - public function load($name, $project_id) + public function load($name, $project_id, $event) { $className = '\Action\\'.$name; - - if ($name === 'TaskAssignCurrentUser') { - return new $className($project_id, new Task($this->registry), new Acl($this->registry)); - } - else { - return new $className($project_id, new Task($this->registry)); - } + return new $className($this->registry, $project_id, $event); } /** diff --git a/app/Model/Task.php b/app/Model/Task.php index 8708f128..3e19555f 100644 --- a/app/Model/Task.php +++ b/app/Model/Task.php @@ -690,6 +690,9 @@ class Task extends Base $values['position'] = $this->countByColumnId($project_id, $values['column_id']) + 1; $values['project_id'] = $project_id; + // The task will be open (close event binding) + $values['is_active'] = 1; + if ($this->db->table(self::TABLE)->eq('id', $task['id'])->update($values)) { return $task['id']; } diff --git a/app/Templates/action_event.php b/app/Templates/action_event.php new file mode 100644 index 00000000..eee41780 --- /dev/null +++ b/app/Templates/action_event.php @@ -0,0 +1,22 @@ +<div class="page-header"> + <h2><?= t('Automatic actions for the project "%s"', $project['name']) ?></h2> +</div> + +<h3><?= t('Choose an event') ?></h3> +<form method="post" action="?controller=action&action=params&project_id=<?= $project['id'] ?>" autocomplete="off"> + <?= Helper\form_csrf() ?> + <?= Helper\form_hidden('project_id', $values) ?> + <?= Helper\form_hidden('action_name', $values) ?> + + <?= Helper\form_label(t('Event'), 'event_name') ?> + <?= Helper\form_select('event_name', $events, $values) ?><br/> + + <div class="form-help"> + <?= t('When the selected event occurs execute the corresponding action.') ?> + </div> + + <div class="form-actions"> + <input type="submit" value="<?= t('Next step') ?>" class="btn btn-blue"/> + <?= t('or') ?> <a href="?controller=action&action=index&project_id=<?= $project['id'] ?>"><?= t('cancel') ?></a> + </div> +</form>
\ No newline at end of file diff --git a/app/Templates/action_index.php b/app/Templates/action_index.php index c21395fd..2647e4a7 100644 --- a/app/Templates/action_index.php +++ b/app/Templates/action_index.php @@ -50,20 +50,13 @@ <?php endif ?> <h3><?= t('Add an action') ?></h3> -<form method="post" action="?controller=action&action=params&project_id=<?= $project['id'] ?>" autocomplete="off"> +<form method="post" action="?controller=action&action=event&project_id=<?= $project['id'] ?>" autocomplete="off"> <?= Helper\form_csrf() ?> <?= Helper\form_hidden('project_id', $values) ?> - <?= Helper\form_label(t('Event'), 'event_name') ?> - <?= Helper\form_select('event_name', $available_events, $values) ?><br/> - <?= Helper\form_label(t('Action'), 'action_name') ?> <?= Helper\form_select('action_name', $available_actions, $values) ?><br/> - <div class="form-help"> - <?= t('When the selected event occurs execute the corresponding action.') ?> - </div> - <div class="form-actions"> <input type="submit" value="<?= t('Next step') ?>" class="btn btn-blue"/> </div> diff --git a/app/Templates/action_params.php b/app/Templates/action_params.php index 92d16288..e3417f32 100644 --- a/app/Templates/action_params.php +++ b/app/Templates/action_params.php @@ -1,7 +1,6 @@ <div class="page-header"> <h2><?= t('Automatic actions for the project "%s"', $project['name']) ?></h2> </div> -<section> <h3><?= t('Define action parameters') ?></h3> <form method="post" action="?controller=action&action=create&project_id=<?= $project['id'] ?>" autocomplete="off"> |