diff options
Diffstat (limited to 'app/Controller')
77 files changed, 972 insertions, 874 deletions
diff --git a/app/Controller/Action.php b/app/Controller/ActionController.php index 40497a62..097640f6 100644 --- a/app/Controller/Action.php +++ b/app/Controller/ActionController.php @@ -3,12 +3,12 @@  namespace Kanboard\Controller;  /** - * Automatic Actions + * Automatic Actions Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Frederic Guillot   */ -class Action extends BaseController +class ActionController extends BaseController  {      /**       * List of automatic actions for a given project @@ -18,7 +18,7 @@ class Action extends BaseController      public function index()      {          $project = $this->getProject(); -        $actions = $this->action->getAllByProject($project['id']); +        $actions = $this->actionModel->getAllByProject($project['id']);          $this->response->html($this->helper->layout->project('action/index', array(              'values' => array('project_id' => $project['id']), @@ -27,12 +27,12 @@ class Action extends BaseController              'available_actions' => $this->actionManager->getAvailableActions(),              'available_events' => $this->eventManager->getAll(),              'available_params' => $this->actionManager->getAvailableParameters($actions), -            'columns_list' => $this->column->getList($project['id']), -            'users_list' => $this->projectUserRole->getAssignableUsersList($project['id']), -            'projects_list' => $this->projectUserRole->getProjectsByUser($this->userSession->getId()), -            'colors_list' => $this->color->getList(), -            'categories_list' => $this->category->getList($project['id']), -            'links_list' => $this->link->getList(0, false), +            'columns_list' => $this->columnModel->getList($project['id']), +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($project['id']), +            'projects_list' => $this->projectUserRoleModel->getProjectsByUser($this->userSession->getId()), +            'colors_list' => $this->colorModel->getList(), +            'categories_list' => $this->categoryModel->getList($project['id']), +            'links_list' => $this->linkModel->getList(0, false),              'title' => t('Automatic actions')          )));      } @@ -47,7 +47,7 @@ class Action extends BaseController          $project = $this->getProject();          $this->response->html($this->helper->layout->project('action/remove', array( -            'action' => $this->action->getById($this->request->getIntegerParam('action_id')), +            'action' => $this->actionModel->getById($this->request->getIntegerParam('action_id')),              'available_events' => $this->eventManager->getAll(),              'available_actions' => $this->actionManager->getAvailableActions(),              'project' => $project, @@ -64,14 +64,14 @@ class Action extends BaseController      {          $this->checkCSRFParam();          $project = $this->getProject(); -        $action = $this->action->getById($this->request->getIntegerParam('action_id')); +        $action = $this->actionModel->getById($this->request->getIntegerParam('action_id')); -        if (! empty($action) && $this->action->remove($action['id'])) { +        if (! empty($action) && $this->actionModel->remove($action['id'])) {              $this->flash->success(t('Action removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this action.'));          } -        $this->response->redirect($this->helper->url->to('action', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('ActionController', 'index', array('project_id' => $project['id'])));      }  } diff --git a/app/Controller/ActionCreation.php b/app/Controller/ActionCreationController.php index 388b30e2..e984f8d4 100644 --- a/app/Controller/ActionCreation.php +++ b/app/Controller/ActionCreationController.php @@ -3,12 +3,12 @@  namespace Kanboard\Controller;  /** - * Action Creation + * Action Creation Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Frederic Guillot   */ -class ActionCreation extends BaseController +class ActionCreationController extends BaseController  {      /**       * Show the form (step 1) @@ -69,19 +69,19 @@ class ActionCreation extends BaseController              $this->doCreation($project, $values + array('params' => array()));          } -        $projects_list = $this->projectUserRole->getActiveProjectsByUser($this->userSession->getId()); +        $projects_list = $this->projectUserRoleModel->getActiveProjectsByUser($this->userSession->getId());          unset($projects_list[$project['id']]);          $this->response->html($this->template->render('action_creation/params', array(              'values' => $values,              'action_params' => $action_params, -            'columns_list' => $this->column->getList($project['id']), -            'users_list' => $this->projectUserRole->getAssignableUsersList($project['id']), +            'columns_list' => $this->columnModel->getList($project['id']), +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($project['id']),              'projects_list' => $projects_list, -            '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), +            'colors_list' => $this->colorModel->getList(), +            'categories_list' => $this->categoryModel->getList($project['id']), +            'links_list' => $this->linkModel->getList(0, false), +            'priorities_list' => $this->projectModel->getPriorities($project),              'project' => $project,              'available_actions' => $this->actionManager->getAvailableActions(),              'events' => $this->actionManager->getCompatibleEvents($values['action_name']), @@ -110,13 +110,13 @@ class ActionCreation extends BaseController          list($valid, ) = $this->actionValidator->validateCreation($values);          if ($valid) { -            if ($this->action->create($values) !== false) { +            if ($this->actionModel->create($values) !== false) {                  $this->flash->success(t('Your automatic action have been created successfully.'));              } else {                  $this->flash->failure(t('Unable to create your automatic action.'));              }          } -        $this->response->redirect($this->helper->url->to('action', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('ActionController', 'index', array('project_id' => $project['id'])));      }  } diff --git a/app/Controller/Activity.php b/app/Controller/ActivityController.php index 0c6aa3f3..9f9841af 100644 --- a/app/Controller/Activity.php +++ b/app/Controller/ActivityController.php @@ -3,12 +3,12 @@  namespace Kanboard\Controller;  /** - * Activity stream + * Activity Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Frederic Guillot   */ -class Activity extends BaseController +class ActivityController extends BaseController  {      /**       * Activity page for a project @@ -38,7 +38,7 @@ class Activity extends BaseController          $this->response->html($this->helper->layout->task('activity/task', array(              'title' => $task['title'],              'task' => $task, -            'project' => $this->project->getById($task['project_id']), +            'project' => $this->projectModel->getById($task['project_id']),              'events' => $this->helper->projectActivity->getTaskEvents($task['id']),          )));      } diff --git a/app/Controller/Analytic.php b/app/Controller/AnalyticController.php index ba73c15c..cf3ba034 100644 --- a/app/Controller/Analytic.php +++ b/app/Controller/AnalyticController.php @@ -3,15 +3,15 @@  namespace Kanboard\Controller;  use Kanboard\Filter\TaskProjectFilter; -use Kanboard\Model\Task as TaskModel; +use Kanboard\Model\TaskModel;  /** - * Project Analytic controller + * Project Analytic Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Analytic extends BaseController +class AnalyticController extends BaseController  {      /**       * Show average Lead and Cycle time @@ -30,8 +30,8 @@ class Analytic extends BaseController              ),              'project' => $project,              'average' => $this->averageLeadCycleTimeAnalytic->build($project['id']), -            'metrics' => $this->projectDailyStats->getRawMetrics($project['id'], $from, $to), -            'date_format' => $this->config->get('application_date_format'), +            'metrics' => $this->projectDailyStatsModel->getRawMetrics($project['id'], $from, $to), +            'date_format' => $this->configModel->get('application_date_format'),              'date_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateFormats()),              'title' => t('Lead and Cycle time for "%s"', $project['name']),          ))); @@ -47,7 +47,7 @@ class Analytic extends BaseController          $project = $this->getProject();          $paginator = $this->paginator -            ->setUrl('analytic', 'compareHours', array('project_id' => $project['id'])) +            ->setUrl('AnalyticController', 'compareHours', array('project_id' => $project['id']))              ->setMax(30)              ->setOrder(TaskModel::TABLE.'.id')              ->setQuery($this->taskQuery @@ -145,7 +145,7 @@ class Analytic extends BaseController          $project = $this->getProject();          list($from, $to) = $this->getDates(); -        $display_graph = $this->projectDailyColumnStats->countDays($project['id'], $from, $to) >= 2; +        $display_graph = $this->projectDailyColumnStatsModel->countDays($project['id'], $from, $to) >= 2;          $this->response->html($this->helper->layout->analytic($template, array(              'values' => array( @@ -153,9 +153,9 @@ class Analytic extends BaseController                  'to' => $to,              ),              'display_graph' => $display_graph, -            'metrics' => $display_graph ? $this->projectDailyColumnStats->getAggregatedMetrics($project['id'], $from, $to, $column) : array(), +            'metrics' => $display_graph ? $this->projectDailyColumnStatsModel->getAggregatedMetrics($project['id'], $from, $to, $column) : array(),              'project' => $project, -            'date_format' => $this->config->get('application_date_format'), +            'date_format' => $this->configModel->get('application_date_format'),              'date_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateFormats()),              'title' => t($title, $project['name']),          ))); diff --git a/app/Controller/AppController.php b/app/Controller/AppController.php index 60bc154a..45cf39a5 100644 --- a/app/Controller/AppController.php +++ b/app/Controller/AppController.php @@ -8,6 +8,7 @@ use Kanboard\Core\Base;   * Class AppController   *   * @package Kanboard\Controller + * @author  Frederic Guillot   */  class AppController extends Base  { diff --git a/app/Controller/Auth.php b/app/Controller/AuthController.php index cad44a34..dc46070c 100644 --- a/app/Controller/Auth.php +++ b/app/Controller/AuthController.php @@ -3,12 +3,12 @@  namespace Kanboard\Controller;  /** - * Authentication controller + * Authentication Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Auth extends BaseController +class AuthController extends BaseController  {      /**       * Display the form login @@ -23,7 +23,7 @@ class Auth extends BaseController              $this->response->redirect($this->helper->url->to('DashboardController', 'show'));          } else {              $this->response->html($this->helper->layout->app('auth/index', array( -                'captcha' => ! empty($values['username']) && $this->userLocking->hasCaptcha($values['username']), +                'captcha' => ! empty($values['username']) && $this->userLockingModel->hasCaptcha($values['username']),                  'errors' => $errors,                  'values' => $values,                  'no_layout' => true, @@ -59,9 +59,9 @@ class Auth extends BaseController      {          if (! DISABLE_LOGOUT) {              $this->sessionManager->close(); -            $this->response->redirect($this->helper->url->to('auth', 'login')); +            $this->response->redirect($this->helper->url->to('AuthController', 'login'));          } else { -            $this->response->redirect($this->helper->url->to('auth', 'index')); +            $this->response->redirect($this->helper->url->to('AuthController', 'index'));          }      } diff --git a/app/Controller/AvatarFile.php b/app/Controller/AvatarFileController.php index 1891a2fc..6879c577 100644 --- a/app/Controller/AvatarFile.php +++ b/app/Controller/AvatarFileController.php @@ -8,10 +8,10 @@ use Kanboard\Core\Thumbnail;  /**   * Avatar File Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class AvatarFile extends BaseController +class AvatarFileController extends BaseController  {      /**       * Display avatar page @@ -32,11 +32,11 @@ class AvatarFile extends BaseController      {          $user = $this->getUser(); -        if (! $this->avatarFile->uploadImageFile($user['id'], $this->request->getFileInfo('avatar'))) { +        if (! $this->avatarFileModel->uploadImageFile($user['id'], $this->request->getFileInfo('avatar'))) {              $this->flash->failure(t('Unable to upload the file.'));          } -        $this->response->redirect($this->helper->url->to('AvatarFile', 'show', array('user_id' => $user['id']))); +        $this->response->redirect($this->helper->url->to('AvatarFileController', 'show', array('user_id' => $user['id'])));      }      /** @@ -46,9 +46,9 @@ class AvatarFile extends BaseController      {          $this->checkCSRFParam();          $user = $this->getUser(); -        $this->avatarFile->remove($user['id']); +        $this->avatarFileModel->remove($user['id']);          $this->userSession->refresh($user['id']); -        $this->response->redirect($this->helper->url->to('AvatarFile', 'show', array('user_id' => $user['id']))); +        $this->response->redirect($this->helper->url->to('AvatarFileController', 'show', array('user_id' => $user['id'])));      }      /** @@ -58,7 +58,7 @@ class AvatarFile extends BaseController      {          $user_id = $this->request->getIntegerParam('user_id');          $size = $this->request->getStringParam('size', 48); -        $filename = $this->avatarFile->getFilename($user_id); +        $filename = $this->avatarFileModel->getFilename($user_id);          $etag = md5($filename.$size);          $this->response->withCache(365 * 86400, $etag); diff --git a/app/Controller/BaseController.php b/app/Controller/BaseController.php index ad02f708..36871bb4 100644 --- a/app/Controller/BaseController.php +++ b/app/Controller/BaseController.php @@ -33,7 +33,7 @@ abstract class BaseController extends Base       */      protected function checkWebhookToken()      { -        if ($this->config->get('webhook_token') !== $this->request->getStringParam('token')) { +        if ($this->configModel->get('webhook_token') !== $this->request->getStringParam('token')) {              $this->response->text('Not Authorized', 401);          }      } @@ -49,7 +49,7 @@ abstract class BaseController extends Base      protected function getTask()      {          $project_id = $this->request->getIntegerParam('project_id'); -        $task = $this->taskFinder->getDetails($this->request->getIntegerParam('task_id')); +        $task = $this->taskFinderModel->getDetails($this->request->getIntegerParam('task_id'));          if (empty($task)) {              throw new PageNotFoundException(); @@ -78,7 +78,7 @@ abstract class BaseController extends Base          if ($task_id > 0) {              $model = 'taskFile'; -            $project_id = $this->taskFinder->getProjectId($task_id); +            $project_id = $this->taskFinderModel->getProjectId($task_id);              if ($project_id !== $this->request->getIntegerParam('project_id')) {                  throw new AccessForbiddenException(); @@ -106,7 +106,7 @@ abstract class BaseController extends Base      protected function getProject($project_id = 0)      {          $project_id = $this->request->getIntegerParam('project_id', $project_id); -        $project = $this->project->getByIdWithOwner($project_id); +        $project = $this->projectModel->getByIdWithOwner($project_id);          if (empty($project)) {              throw new PageNotFoundException(); @@ -125,7 +125,7 @@ abstract class BaseController extends Base       */      protected function getUser()      { -        $user = $this->user->getById($this->request->getIntegerParam('user_id', $this->userSession->getId())); +        $user = $this->userModel->getById($this->request->getIntegerParam('user_id', $this->userSession->getId()));          if (empty($user)) {              throw new PageNotFoundException(); @@ -147,7 +147,7 @@ abstract class BaseController extends Base       */      protected function getSubtask()      { -        $subtask = $this->subtask->getById($this->request->getIntegerParam('subtask_id')); +        $subtask = $this->subtaskModel->getById($this->request->getIntegerParam('subtask_id'));          if (empty($subtask)) {              throw new PageNotFoundException(); diff --git a/app/Controller/Board.php b/app/Controller/BoardAjaxController.php index 0f6b3b14..24914671 100644 --- a/app/Controller/Board.php +++ b/app/Controller/BoardAjaxController.php @@ -6,67 +6,15 @@ use Kanboard\Core\Controller\AccessForbiddenException;  use Kanboard\Formatter\BoardFormatter;  /** - * Board controller + * Class BoardAjaxController   * - * @package  controller - * @author   Frederic Guillot + * @package Kanboard\Controller + * @author  Fredric Guillot   */ -class Board extends BaseController +class BoardAjaxController extends BaseController  {      /** -     * Display the public version of a board -     * Access checked by a simple token, no user login, read only, auto-refresh -     * -     * @access public -     */ -    public function readonly() -    { -        $token = $this->request->getStringParam('token'); -        $project = $this->project->getByToken($token); - -        // Token verification -        if (empty($project)) { -            throw AccessForbiddenException::getInstance()->withoutLayout(); -        } - -        // Display the board with a specific layout -        $this->response->html($this->helper->layout->app('board/view_public', array( -            'project' => $project, -            'swimlanes' => $this->board->getBoard($project['id']), -            'title' => $project['name'], -            'description' => $project['description'], -            'no_layout' => true, -            'not_editable' => true, -            'board_public_refresh_interval' => $this->config->get('board_public_refresh_interval'), -            'board_private_refresh_interval' => $this->config->get('board_private_refresh_interval'), -            'board_highlight_period' => $this->config->get('board_highlight_period'), -        ))); -    } - -    /** -     * Show a board for a given project -     * -     * @access public -     */ -    public function show() -    { -        $project = $this->getProject(); -        $search = $this->helper->projectHeader->getSearchQuery($project); - -        $this->response->html($this->helper->layout->app('board/view_private', array( -            'project' => $project, -            'title' => $project['name'], -            'description' => $this->helper->projectHeader->getDescription($project), -            'board_private_refresh_interval' => $this->config->get('board_private_refresh_interval'), -            'board_highlight_period' => $this->config->get('board_highlight_period'), -            'swimlanes' => $this->taskLexer -                ->build($search) -                ->format(BoardFormatter::getInstance($this->container)->setProjectId($project['id'])) -        ))); -    } - -    /** -     * Save the board (Ajax request made by the drag and drop) +     * Save new task positions (Ajax request made by the drag and drop)       *       * @access public       */ @@ -80,7 +28,7 @@ class Board extends BaseController          $values = $this->request->getJson(); -        $result =$this->taskPosition->movePosition( +        $result =$this->taskPositionModel->movePosition(              $project_id,              $values['task_id'],              $values['column_id'], @@ -106,8 +54,8 @@ class Board extends BaseController          $timestamp = $this->request->getIntegerParam('timestamp');          if (! $project_id || ! $this->request->isAjax()) { -            $this->response->status(403); -        } elseif (! $this->project->isModifiedSince($project_id, $timestamp)) { +            throw new AccessForbiddenException(); +        } elseif (! $this->projectModel->isModifiedSince($project_id, $timestamp)) {              $this->response->status(304);          } else {              $this->response->html($this->renderBoard($project_id)); @@ -167,23 +115,23 @@ class Board extends BaseController          if ($this->request->isAjax()) {              $this->response->html($this->renderBoard($project_id));          } else { -            $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $project_id))); +            $this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project_id)));          }      }      /**       * Render board       * -     * @access private +     * @access protected       * @param  integer $project_id       * @return string       */ -    private function renderBoard($project_id) +    protected function renderBoard($project_id)      {          return $this->template->render('board/table_container', array( -            'project' => $this->project->getById($project_id), -            'board_private_refresh_interval' => $this->config->get('board_private_refresh_interval'), -            'board_highlight_period' => $this->config->get('board_highlight_period'), +            'project' => $this->projectModel->getById($project_id), +            'board_private_refresh_interval' => $this->configModel->get('board_private_refresh_interval'), +            'board_highlight_period' => $this->configModel->get('board_highlight_period'),              'swimlanes' => $this->taskLexer                  ->build($this->userSession->getFilters($project_id))                  ->format(BoardFormatter::getInstance($this->container)->setProjectId($project_id)) diff --git a/app/Controller/BoardPopover.php b/app/Controller/BoardPopoverController.php index d3117f78..a0f5ae12 100644 --- a/app/Controller/BoardPopover.php +++ b/app/Controller/BoardPopoverController.php @@ -3,12 +3,12 @@  namespace Kanboard\Controller;  /** - * Board Popover + * Board Popover Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class BoardPopover extends BaseController +class BoardPopoverController extends BaseController  {      /**       * Confirmation before to close all column tasks @@ -23,9 +23,9 @@ class BoardPopover extends BaseController          $this->response->html($this->template->render('board_popover/close_all_tasks_column', array(              'project' => $project, -            'nb_tasks' => $this->taskFinder->countByColumnAndSwimlaneId($project['id'], $column_id, $swimlane_id), -            'column' => $this->column->getColumnTitleById($column_id), -            'swimlane' => $this->swimlane->getNameById($swimlane_id) ?: t($project['default_swimlane']), +            'nb_tasks' => $this->taskFinderModel->countByColumnAndSwimlaneId($project['id'], $column_id, $swimlane_id), +            'column' => $this->columnModel->getColumnTitleById($column_id), +            'swimlane' => $this->swimlaneModel->getNameById($swimlane_id) ?: t($project['default_swimlane']),              'values' => array('column_id' => $column_id, 'swimlane_id' => $swimlane_id),          )));      } @@ -40,8 +40,8 @@ class BoardPopover extends BaseController          $project = $this->getProject();          $values = $this->request->getValues(); -        $this->taskStatus->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->column->getColumnTitleById($values['column_id']), $this->swimlane->getNameById($values['swimlane_id']) ?: t($project['default_swimlane']))); -        $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $project['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->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id'])));      }  } diff --git a/app/Controller/BoardTooltip.php b/app/Controller/BoardTooltipController.php index 49d02ced..2a947027 100644 --- a/app/Controller/BoardTooltip.php +++ b/app/Controller/BoardTooltipController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Board Tooltip   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class BoardTooltip extends BaseController +class BoardTooltipController extends BaseController  {      /**       * Get links on mouseover @@ -19,7 +19,7 @@ class BoardTooltip extends BaseController      {          $task = $this->getTask();          $this->response->html($this->template->render('board/tooltip_tasklinks', array( -            'links' => $this->taskLink->getAllGroupedByLabel($task['id']), +            'links' => $this->taskLinkModel->getAllGroupedByLabel($task['id']),              'task' => $task,          )));      } @@ -33,7 +33,7 @@ class BoardTooltip extends BaseController      {          $task = $this->getTask();          $this->response->html($this->template->render('board/tooltip_external_links', array( -            'links' => $this->taskExternalLink->getAll($task['id']), +            'links' => $this->taskExternalLinkModel->getAll($task['id']),              'task' => $task,          )));      } @@ -47,7 +47,7 @@ class BoardTooltip extends BaseController      {          $task = $this->getTask();          $this->response->html($this->template->render('board/tooltip_subtasks', array( -            'subtasks' => $this->subtask->getAll($task['id']), +            'subtasks' => $this->subtaskModel->getAll($task['id']),              'task' => $task,          )));      } @@ -62,7 +62,7 @@ class BoardTooltip extends BaseController          $task = $this->getTask();          $this->response->html($this->template->render('board/tooltip_files', array( -            'files' => $this->taskFile->getAll($task['id']), +            'files' => $this->taskFileModel->getAll($task['id']),              'task' => $task,          )));      } @@ -78,7 +78,7 @@ class BoardTooltip extends BaseController          $this->response->html($this->template->render('board/tooltip_comments', array(              'task' => $task, -            'comments' => $this->comment->getAll($task['id'], $this->userSession->getCommentSorting()) +            'comments' => $this->commentModel->getAll($task['id'], $this->userSession->getCommentSorting())          )));      } @@ -107,9 +107,9 @@ class BoardTooltip extends BaseController          $this->response->html($this->template->render('task_recurrence/info', array(              'task' => $task, -            'recurrence_trigger_list' => $this->task->getRecurrenceTriggerList(), -            'recurrence_timeframe_list' => $this->task->getRecurrenceTimeframeList(), -            'recurrence_basedate_list' => $this->task->getRecurrenceBasedateList(), +            'recurrence_trigger_list' => $this->taskModel->getRecurrenceTriggerList(), +            'recurrence_timeframe_list' => $this->taskModel->getRecurrenceTimeframeList(), +            'recurrence_basedate_list' => $this->taskModel->getRecurrenceBasedateList(),          )));      } @@ -121,7 +121,7 @@ class BoardTooltip extends BaseController      public function swimlane()      {          $this->getProject(); -        $swimlane = $this->swimlane->getById($this->request->getIntegerParam('swimlane_id')); +        $swimlane = $this->swimlaneModel->getById($this->request->getIntegerParam('swimlane_id'));          $this->response->html($this->template->render('board/tooltip_description', array('task' => $swimlane)));      }  } diff --git a/app/Controller/BoardViewController.php b/app/Controller/BoardViewController.php new file mode 100644 index 00000000..496fa995 --- /dev/null +++ b/app/Controller/BoardViewController.php @@ -0,0 +1,65 @@ +<?php + +namespace Kanboard\Controller; + +use Kanboard\Core\Controller\AccessForbiddenException; +use Kanboard\Formatter\BoardFormatter; + +/** + * Board controller + * + * @package  Kanboard\Controller + * @author   Frederic Guillot + */ +class BoardViewController extends BaseController +{ +    /** +     * Display the public version of a board +     * Access checked by a simple token, no user login, read only, auto-refresh +     * +     * @access public +     */ +    public function readonly() +    { +        $token = $this->request->getStringParam('token'); +        $project = $this->projectModel->getByToken($token); + +        if (empty($project)) { +            throw AccessForbiddenException::getInstance()->withoutLayout(); +        } + +        $this->response->html($this->helper->layout->app('board/view_public', array( +            'project' => $project, +            'swimlanes' => $this->boardModel->getBoard($project['id']), +            'title' => $project['name'], +            'description' => $project['description'], +            'no_layout' => true, +            'not_editable' => true, +            'board_public_refresh_interval' => $this->configModel->get('board_public_refresh_interval'), +            'board_private_refresh_interval' => $this->configModel->get('board_private_refresh_interval'), +            'board_highlight_period' => $this->configModel->get('board_highlight_period'), +        ))); +    } + +    /** +     * Show a board for a given project +     * +     * @access public +     */ +    public function show() +    { +        $project = $this->getProject(); +        $search = $this->helper->projectHeader->getSearchQuery($project); + +        $this->response->html($this->helper->layout->app('board/view_private', array( +            'project' => $project, +            'title' => $project['name'], +            'description' => $this->helper->projectHeader->getDescription($project), +            'board_private_refresh_interval' => $this->configModel->get('board_private_refresh_interval'), +            'board_highlight_period' => $this->configModel->get('board_highlight_period'), +            'swimlanes' => $this->taskLexer +                ->build($search) +                ->format(BoardFormatter::getInstance($this->container)->setProjectId($project['id'])) +        ))); +    } +} diff --git a/app/Controller/Calendar.php b/app/Controller/CalendarController.php index 706c1d3b..e5114f02 100644 --- a/app/Controller/Calendar.php +++ b/app/Controller/CalendarController.php @@ -5,16 +5,16 @@ namespace Kanboard\Controller;  use Kanboard\Filter\TaskAssigneeFilter;  use Kanboard\Filter\TaskProjectFilter;  use Kanboard\Filter\TaskStatusFilter; -use Kanboard\Model\Task as TaskModel; +use Kanboard\Model\TaskModel;  /** - * Project Calendar controller + * Calendar Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   * @author   Timo Litzbarski   */ -class Calendar extends BaseController +class CalendarController extends BaseController  {      /**       * Show calendar view for projects @@ -29,7 +29,7 @@ class Calendar extends BaseController              'project' => $project,              'title' => $project['name'],              'description' => $this->helper->projectHeader->getDescription($project), -            'check_interval' => $this->config->get('board_private_refresh_interval'), +            'check_interval' => $this->configModel->get('board_private_refresh_interval'),          )));      } @@ -75,7 +75,7 @@ class Calendar extends BaseController          $events = $this->helper->calendar->getTaskDateDueEvents(clone($queryBuilder), $start, $end);          $events = array_merge($events, $this->helper->calendar->getTaskEvents(clone($queryBuilder), $start, $end)); -        if ($this->config->get('calendar_user_subtasks_time_tracking') == 1) { +        if ($this->configModel->get('calendar_user_subtasks_time_tracking') == 1) {              $events = array_merge($events, $this->helper->calendar->getSubtaskTimeTrackingEvents($user_id, $start, $end));          } @@ -98,7 +98,7 @@ class Calendar extends BaseController          if ($this->request->isAjax() && $this->request->isPost()) {              $values = $this->request->getJson(); -            $this->taskModification->update(array( +            $this->taskModificationModel->update(array(                  'id' => $values['task_id'],                  'date_due' => substr($values['date_due'], 0, 10),              )); diff --git a/app/Controller/Captcha.php b/app/Controller/CaptchaController.php index f6c717b3..43b2f823 100644 --- a/app/Controller/Captcha.php +++ b/app/Controller/CaptchaController.php @@ -7,10 +7,10 @@ use Gregwar\Captcha\CaptchaBuilder;  /**   * Captcha Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Frederic Guillot   */ -class Captcha extends BaseController +class CaptchaController extends BaseController  {      /**       * Display captcha image diff --git a/app/Controller/Category.php b/app/Controller/CategoryController.php index 954d92cc..dd6e1c35 100644 --- a/app/Controller/Category.php +++ b/app/Controller/CategoryController.php @@ -5,12 +5,12 @@ namespace Kanboard\Controller;  use Kanboard\Core\Controller\PageNotFoundException;  /** - * Category management + * Category Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Frederic Guillot   */ -class Category extends BaseController +class CategoryController extends BaseController  {      /**       * Get the category (common method between actions) @@ -21,7 +21,7 @@ class Category extends BaseController       */      private function getCategory()      { -        $category = $this->category->getById($this->request->getIntegerParam('category_id')); +        $category = $this->categoryModel->getById($this->request->getIntegerParam('category_id'));          if (empty($category)) {              throw new PageNotFoundException(); @@ -43,7 +43,7 @@ class Category extends BaseController          $project = $this->getProject();          $this->response->html($this->helper->layout->project('category/index', array( -            'categories' => $this->category->getList($project['id'], false), +            'categories' => $this->categoryModel->getList($project['id'], false),              'values' => $values + array('project_id' => $project['id']),              'errors' => $errors,              'project' => $project, @@ -64,9 +64,9 @@ class Category extends BaseController          list($valid, $errors) = $this->categoryValidator->validateCreation($values);          if ($valid) { -            if ($this->category->create($values)) { +            if ($this->categoryModel->create($values) !== false) {                  $this->flash->success(t('Your category have been created successfully.')); -                return $this->response->redirect($this->helper->url->to('category', 'index', array('project_id' => $project['id']))); +                return $this->response->redirect($this->helper->url->to('CategoryController', 'index', array('project_id' => $project['id'])));              } else {                  $this->flash->failure(t('Unable to create your category.'));              } @@ -109,9 +109,9 @@ class Category extends BaseController          list($valid, $errors) = $this->categoryValidator->validateModification($values);          if ($valid) { -            if ($this->category->update($values)) { +            if ($this->categoryModel->update($values)) {                  $this->flash->success(t('Your category have been updated successfully.')); -                return $this->response->redirect($this->helper->url->to('category', 'index', array('project_id' => $project['id']))); +                return $this->response->redirect($this->helper->url->to('CategoryController', 'index', array('project_id' => $project['id'])));              } else {                  $this->flash->failure(t('Unable to update your category.'));              } @@ -148,12 +148,12 @@ class Category extends BaseController          $project = $this->getProject();          $category = $this->getCategory(); -        if ($this->category->remove($category['id'])) { +        if ($this->categoryModel->remove($category['id'])) {              $this->flash->success(t('Category removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this category.'));          } -        $this->response->redirect($this->helper->url->to('category', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('CategoryController', 'index', array('project_id' => $project['id'])));      }  } diff --git a/app/Controller/Column.php b/app/Controller/ColumnController.php index 294c31d8..95fbcaaa 100644 --- a/app/Controller/Column.php +++ b/app/Controller/ColumnController.php @@ -5,12 +5,12 @@ namespace Kanboard\Controller;  use Kanboard\Core\Controller\AccessForbiddenException;  /** - * Column controller + * Column Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Column extends BaseController +class ColumnController extends BaseController  {      /**       * Display columns list @@ -20,7 +20,7 @@ class Column extends BaseController      public function index()      {          $project = $this->getProject(); -        $columns = $this->column->getAll($project['id']); +        $columns = $this->columnModel->getAll($project['id']);          $this->response->html($this->helper->layout->project('column/index', array(              'columns' => $columns, @@ -66,9 +66,9 @@ class Column extends BaseController          list($valid, $errors) = $this->columnValidator->validateCreation($values);          if ($valid) { -            if ($this->column->create($project['id'], $values['title'], $values['task_limit'], $values['description'])) { +            if ($this->columnModel->create($project['id'], $values['title'], $values['task_limit'], $values['description']) !== false) {                  $this->flash->success(t('Column created successfully.')); -                return $this->response->redirect($this->helper->url->to('column', 'index', array('project_id' => $project['id'])), true); +                return $this->response->redirect($this->helper->url->to('ColumnController', 'index', array('project_id' => $project['id'])), true);              } else {                  $errors['title'] = array(t('Another column with the same name exists in the project'));              } @@ -87,7 +87,7 @@ class Column extends BaseController      public function edit(array $values = array(), array $errors = array())      {          $project = $this->getProject(); -        $column = $this->column->getById($this->request->getIntegerParam('column_id')); +        $column = $this->columnModel->getById($this->request->getIntegerParam('column_id'));          $this->response->html($this->helper->layout->project('column/edit', array(              'errors' => $errors, @@ -111,9 +111,9 @@ class Column extends BaseController          list($valid, $errors) = $this->columnValidator->validateModification($values);          if ($valid) { -            if ($this->column->update($values['id'], $values['title'], $values['task_limit'], $values['description'])) { +            if ($this->columnModel->update($values['id'], $values['title'], $values['task_limit'], $values['description'])) {                  $this->flash->success(t('Board updated successfully.')); -                return $this->response->redirect($this->helper->url->to('column', 'index', array('project_id' => $project['id']))); +                return $this->response->redirect($this->helper->url->to('ColumnController', 'index', array('project_id' => $project['id'])));              } else {                  $this->flash->failure(t('Unable to update this board.'));              } @@ -133,7 +133,7 @@ class Column extends BaseController          $values = $this->request->getJson();          if (! empty($values) && isset($values['column_id']) && isset($values['position'])) { -            $result = $this->column->changePosition($project['id'], $values['column_id'], $values['position']); +            $result = $this->columnModel->changePosition($project['id'], $values['column_id'], $values['position']);              $this->response->json(array('result' => $result));          } else {              throw new AccessForbiddenException(); @@ -150,7 +150,7 @@ class Column extends BaseController          $project = $this->getProject();          $this->response->html($this->helper->layout->project('column/remove', array( -            'column' => $this->column->getById($this->request->getIntegerParam('column_id')), +            'column' => $this->columnModel->getById($this->request->getIntegerParam('column_id')),              'project' => $project,              'title' => t('Remove a column from a board')          ))); @@ -167,12 +167,12 @@ class Column extends BaseController          $this->checkCSRFParam();          $column_id = $this->request->getIntegerParam('column_id'); -        if ($this->column->remove($column_id)) { +        if ($this->columnModel->remove($column_id)) {              $this->flash->success(t('Column removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this column.'));          } -        $this->response->redirect($this->helper->url->to('column', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('ColumnController', 'index', array('project_id' => $project['id'])));      }  } diff --git a/app/Controller/Comment.php b/app/Controller/CommentController.php index 83a67b41..2a8c258a 100644 --- a/app/Controller/Comment.php +++ b/app/Controller/CommentController.php @@ -6,12 +6,12 @@ use Kanboard\Core\Controller\AccessForbiddenException;  use Kanboard\Core\Controller\PageNotFoundException;  /** - * Comment controller + * Comment Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Comment extends BaseController +class CommentController extends BaseController  {      /**       * Get the current comment @@ -23,7 +23,7 @@ class Comment extends BaseController       */      private function getComment()      { -        $comment = $this->comment->getById($this->request->getIntegerParam('comment_id')); +        $comment = $this->commentModel->getById($this->request->getIntegerParam('comment_id'));          if (empty($comment)) {              throw new PageNotFoundException(); @@ -76,13 +76,13 @@ class Comment extends BaseController          list($valid, $errors) = $this->commentValidator->validateCreation($values);          if ($valid) { -            if ($this->comment->create($values)) { +            if ($this->commentModel->create($values) !== false) {                  $this->flash->success(t('Comment added successfully.'));              } else {                  $this->flash->failure(t('Unable to create your comment.'));              } -            return $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), 'comments'), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), 'comments'), true);          }          return $this->create($values, $errors); @@ -125,13 +125,13 @@ class Comment extends BaseController          list($valid, $errors) = $this->commentValidator->validateModification($values);          if ($valid) { -            if ($this->comment->update($values)) { +            if ($this->commentModel->update($values)) {                  $this->flash->success(t('Comment updated successfully.'));              } else {                  $this->flash->failure(t('Unable to update your comment.'));              } -            return $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), false); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), false);          }          return $this->edit($values, $errors); @@ -165,13 +165,13 @@ class Comment extends BaseController          $task = $this->getTask();          $comment = $this->getComment(); -        if ($this->comment->remove($comment['id'])) { +        if ($this->commentModel->remove($comment['id'])) {              $this->flash->success(t('Comment removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this comment.'));          } -        $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), 'comments')); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), 'comments'));      }      /** @@ -186,6 +186,6 @@ class Comment extends BaseController          $order = $this->userSession->getCommentSorting() === 'ASC' ? 'DESC' : 'ASC';          $this->userSession->setCommentSorting($order); -        $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), 'comments')); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), 'comments'));      }  } diff --git a/app/Controller/Config.php b/app/Controller/ConfigController.php index abf6565c..8bcf4c35 100644 --- a/app/Controller/Config.php +++ b/app/Controller/ConfigController.php @@ -3,12 +3,12 @@  namespace Kanboard\Controller;  /** - * Config controller + * Config Controller   * - * @package  controller + * @package  Kanboard/Controller   * @author   Frederic Guillot   */ -class Config extends BaseController +class ConfigController extends BaseController  {      /**       * Display the about page @@ -18,7 +18,7 @@ class Config extends BaseController      public function index()      {          $this->response->html($this->helper->layout->config('config/about', array( -            'db_size' => $this->config->getDatabaseSize(), +            'db_size' => $this->configModel->getDatabaseSize(),              'db_version' => $this->db->getDriver()->getDatabaseVersion(),              'user_agent' => $this->request->getServerVariable('HTTP_USER_AGENT'),              'title' => t('Settings').' > '.t('About'), @@ -54,14 +54,14 @@ class Config extends BaseController                  break;          } -        if ($this->config->save($values)) { -            $this->language->loadCurrentLanguage(); +        if ($this->configModel->save($values)) { +            $this->languageModel->loadCurrentLanguage();              $this->flash->success(t('Settings saved successfully.'));          } else {              $this->flash->failure(t('Unable to save your settings.'));          } -        $this->response->redirect($this->helper->url->to('config', $redirect)); +        $this->response->redirect($this->helper->url->to('ConfigController', $redirect));      }      /** @@ -72,8 +72,8 @@ class Config extends BaseController      public function application()      {          $this->response->html($this->helper->layout->config('config/application', array( -            'languages' => $this->language->getLanguages(), -            'timezones' => $this->timezone->getTimezones(), +            'languages' => $this->languageModel->getLanguages(), +            'timezones' => $this->timezoneModel->getTimezones(),              'date_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateFormats()),              'datetime_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateTimeFormats()),              'time_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getTimeFormats()), @@ -89,8 +89,8 @@ class Config extends BaseController      public function project()      {          $this->response->html($this->helper->layout->config('config/project', array( -            'colors' => $this->color->getList(), -            'default_columns' => implode(', ', $this->board->getDefaultColumns()), +            'colors' => $this->colorModel->getList(), +            'default_columns' => implode(', ', $this->boardModel->getDefaultColumns()),              'title' => t('Settings').' > '.t('Project settings'),          )));      } @@ -164,7 +164,7 @@ class Config extends BaseController      {          $this->checkCSRFParam();          $this->response->withFileDownload('db.sqlite.gz'); -        $this->response->binary($this->config->downloadDatabase()); +        $this->response->binary($this->configModel->downloadDatabase());      }      /** @@ -175,9 +175,9 @@ class Config extends BaseController      public function optimizeDb()      {          $this->checkCSRFParam(); -        $this->config->optimizeDatabase(); +        $this->configModel->optimizeDatabase();          $this->flash->success(t('Database optimization done.')); -        $this->response->redirect($this->helper->url->to('config', 'index')); +        $this->response->redirect($this->helper->url->to('ConfigController', 'index'));      }      /** @@ -190,9 +190,9 @@ class Config extends BaseController          $type = $this->request->getStringParam('type');          $this->checkCSRFParam(); -        $this->config->regenerateToken($type.'_token'); +        $this->configModel->regenerateToken($type.'_token');          $this->flash->success(t('Token regenerated.')); -        $this->response->redirect($this->helper->url->to('config', $type)); +        $this->response->redirect($this->helper->url->to('ConfigController', $type));      }  } diff --git a/app/Controller/Currency.php b/app/Controller/CurrencyController.php index 872d6929..ad590035 100644 --- a/app/Controller/Currency.php +++ b/app/Controller/CurrencyController.php @@ -3,12 +3,12 @@  namespace Kanboard\Controller;  /** - * Currency controller + * Currency Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Currency extends BaseController +class CurrencyController extends BaseController  {      /**       * Display all currency rates and form @@ -20,11 +20,11 @@ class Currency extends BaseController      public function index(array $values = array(), array $errors = array())      {          $this->response->html($this->helper->layout->config('currency/index', array( -            'config_values' => array('application_currency' => $this->config->get('application_currency')), +            'config_values' => array('application_currency' => $this->configModel->get('application_currency')),              'values' => $values,              'errors' => $errors, -            'rates' => $this->currency->getAll(), -            'currencies' => $this->currency->getCurrencies(), +            'rates' => $this->currencyModel->getAll(), +            'currencies' => $this->currencyModel->getCurrencies(),              'title' => t('Settings').' > '.t('Currency rates'),          )));      } @@ -40,9 +40,9 @@ class Currency extends BaseController          list($valid, $errors) = $this->currencyValidator->validateCreation($values);          if ($valid) { -            if ($this->currency->create($values['currency'], $values['rate'])) { +            if ($this->currencyModel->create($values['currency'], $values['rate'])) {                  $this->flash->success(t('The currency rate have been added successfully.')); -                return $this->response->redirect($this->helper->url->to('currency', 'index')); +                return $this->response->redirect($this->helper->url->to('CurrencyController', 'index'));              } else {                  $this->flash->failure(t('Unable to add this currency rate.'));              } @@ -60,12 +60,12 @@ class Currency extends BaseController      {          $values = $this->request->getValues(); -        if ($this->config->save($values)) { +        if ($this->configModel->save($values)) {              $this->flash->success(t('Settings saved successfully.'));          } else {              $this->flash->failure(t('Unable to save your settings.'));          } -        $this->response->redirect($this->helper->url->to('currency', 'index')); +        $this->response->redirect($this->helper->url->to('CurrencyController', 'index'));      }  } diff --git a/app/Controller/Customfilter.php b/app/Controller/CustomFilterController.php index d0794366..e5f674cd 100644 --- a/app/Controller/Customfilter.php +++ b/app/Controller/CustomFilterController.php @@ -6,17 +6,21 @@ use Kanboard\Core\Controller\AccessForbiddenException;  use Kanboard\Core\Security\Role;  /** - * Custom Filter management + * Custom Filter Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Timo Litzbarski + * @author  Frederic Guillot   */ -class Customfilter extends BaseController +class CustomFilterController extends BaseController  {      /**       * Display list of filters       *       * @access public +     * @param  array $values +     * @param  array $errors +     * @throws \Kanboard\Core\Controller\PageNotFoundException       */      public function index(array $values = array(), array $errors = array())      { @@ -26,7 +30,7 @@ class Customfilter extends BaseController              'values' => $values + array('project_id' => $project['id']),              'errors' => $errors,              'project' => $project, -            'custom_filters' => $this->customFilter->getAll($project['id'], $this->userSession->getId()), +            'custom_filters' => $this->customFilterModel->getAll($project['id'], $this->userSession->getId()),              'title' => t('Custom filters'),          )));      } @@ -46,9 +50,9 @@ class Customfilter extends BaseController          list($valid, $errors) = $this->customFilterValidator->validateCreation($values);          if ($valid) { -            if ($this->customFilter->create($values)) { +            if ($this->customFilterModel->create($values) !== false) {                  $this->flash->success(t('Your custom filter have been created successfully.')); -                return $this->response->redirect($this->helper->url->to('customfilter', 'index', array('project_id' => $project['id']))); +                return $this->response->redirect($this->helper->url->to('CustomFilterController', 'index', array('project_id' => $project['id'])));              } else {                  $this->flash->failure(t('Unable to create your custom filter.'));              } @@ -65,7 +69,7 @@ class Customfilter extends BaseController      public function confirm()      {          $project = $this->getProject(); -        $filter = $this->customFilter->getById($this->request->getIntegerParam('filter_id')); +        $filter = $this->customFilterModel->getById($this->request->getIntegerParam('filter_id'));          $this->response->html($this->helper->layout->project('custom_filter/remove', array(              'project' => $project, @@ -83,28 +87,32 @@ class Customfilter extends BaseController      {          $this->checkCSRFParam();          $project = $this->getProject(); -        $filter = $this->customFilter->getById($this->request->getIntegerParam('filter_id')); +        $filter = $this->customFilterModel->getById($this->request->getIntegerParam('filter_id'));          $this->checkPermission($project, $filter); -        if ($this->customFilter->remove($filter['id'])) { +        if ($this->customFilterModel->remove($filter['id'])) {              $this->flash->success(t('Custom filter removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this custom filter.'));          } -        $this->response->redirect($this->helper->url->to('customfilter', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('CustomFilterController', 'index', array('project_id' => $project['id'])));      }      /**       * Edit a custom filter (display the form)       *       * @access public +     * @param  array $values +     * @param  array $errors +     * @throws AccessForbiddenException +     * @throws \Kanboard\Core\Controller\PageNotFoundException       */      public function edit(array $values = array(), array $errors = array())      {          $project = $this->getProject(); -        $filter = $this->customFilter->getById($this->request->getIntegerParam('filter_id')); +        $filter = $this->customFilterModel->getById($this->request->getIntegerParam('filter_id'));          $this->checkPermission($project, $filter); @@ -125,7 +133,7 @@ class Customfilter extends BaseController      public function update()      {          $project = $this->getProject(); -        $filter = $this->customFilter->getById($this->request->getIntegerParam('filter_id')); +        $filter = $this->customFilterModel->getById($this->request->getIntegerParam('filter_id'));          $this->checkPermission($project, $filter); @@ -142,9 +150,9 @@ class Customfilter extends BaseController          list($valid, $errors) = $this->customFilterValidator->validateModification($values);          if ($valid) { -            if ($this->customFilter->update($values)) { +            if ($this->customFilterModel->update($values)) {                  $this->flash->success(t('Your custom filter have been updated successfully.')); -                return $this->response->redirect($this->helper->url->to('customfilter', 'index', array('project_id' => $project['id']))); +                return $this->response->redirect($this->helper->url->to('CustomFilterController', 'index', array('project_id' => $project['id'])));              } else {                  $this->flash->failure(t('Unable to update custom filter.'));              } @@ -157,7 +165,7 @@ class Customfilter extends BaseController      {          $user_id = $this->userSession->getId(); -        if ($filter['user_id'] != $user_id && ($this->projectUserRole->getUserRole($project['id'], $user_id) === Role::PROJECT_MANAGER || ! $this->userSession->isAdmin())) { +        if ($filter['user_id'] != $user_id && ($this->projectUserRoleModel->getUserRole($project['id'], $user_id) === Role::PROJECT_MANAGER || ! $this->userSession->isAdmin())) {              throw new AccessForbiddenException();          }      } diff --git a/app/Controller/DashboardController.php b/app/Controller/DashboardController.php index 145e0bff..44874546 100644 --- a/app/Controller/DashboardController.php +++ b/app/Controller/DashboardController.php @@ -2,8 +2,8 @@  namespace Kanboard\Controller; -use Kanboard\Model\Project as ProjectModel; -use Kanboard\Model\Subtask as SubtaskModel; +use Kanboard\Model\ProjectModel; +use Kanboard\Model\SubtaskModel;  /**   * Dashboard Controller @@ -28,7 +28,7 @@ class DashboardController extends BaseController              ->setUrl('DashboardController', $action, array('pagination' => 'projects', 'user_id' => $user_id))              ->setMax($max)              ->setOrder(ProjectModel::TABLE.'.name') -            ->setQuery($this->project->getQueryColumnStats($this->projectPermission->getActiveProjectIds($user_id))) +            ->setQuery($this->projectModel->getQueryColumnStats($this->projectPermissionModel->getActiveProjectIds($user_id)))              ->calculateOnlyIf($this->request->getStringParam('pagination') === 'projects');      } @@ -47,7 +47,7 @@ class DashboardController extends BaseController              ->setUrl('DashboardController', $action, array('pagination' => 'tasks', 'user_id' => $user_id))              ->setMax($max)              ->setOrder('tasks.id') -            ->setQuery($this->taskFinder->getUserQuery($user_id)) +            ->setQuery($this->taskFinderModel->getUserQuery($user_id))              ->calculateOnlyIf($this->request->getStringParam('pagination') === 'tasks');      } @@ -66,7 +66,7 @@ class DashboardController extends BaseController              ->setUrl('DashboardController', $action, array('pagination' => 'subtasks', 'user_id' => $user_id))              ->setMax($max)              ->setOrder('tasks.id') -            ->setQuery($this->subtask->getUserQuery($user_id, array(SubTaskModel::STATUS_TODO, SubtaskModel::STATUS_INPROGRESS))) +            ->setQuery($this->subtaskModel->getUserQuery($user_id, array(SubTaskModel::STATUS_TODO, SubtaskModel::STATUS_INPROGRESS)))              ->calculateOnlyIf($this->request->getStringParam('pagination') === 'subtasks');      } @@ -147,7 +147,7 @@ class DashboardController extends BaseController          $this->response->html($this->helper->layout->dashboard('dashboard/activity', array(              'title' => t('My activity stream'), -            'events' => $this->helper->projectActivity->getProjectsEvents($this->projectPermission->getActiveProjectIds($user['id']), 100), +            'events' => $this->helper->projectActivity->getProjectsEvents($this->projectPermissionModel->getActiveProjectIds($user['id']), 100),              'user' => $user,          )));      } @@ -176,7 +176,7 @@ class DashboardController extends BaseController          $this->response->html($this->helper->layout->dashboard('dashboard/notifications', array(              'title' => t('My notifications'), -            'notifications' => $this->userUnreadNotification->getAll($user['id']), +            'notifications' => $this->userUnreadNotificationModel->getAll($user['id']),              'user' => $user,          )));      } diff --git a/app/Controller/Doc.php b/app/Controller/DocumentationController.php index 5caf5f5f..d86fb3c8 100644 --- a/app/Controller/Doc.php +++ b/app/Controller/DocumentationController.php @@ -7,10 +7,10 @@ use Parsedown;  /**   * Documentation Viewer   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Doc extends BaseController +class DocumentationController extends BaseController  {      public function show()      { @@ -20,7 +20,7 @@ class Doc extends BaseController              $page = 'index';          } -        if ($this->language->getCurrentLanguage() === 'fr_FR') { +        if ($this->languageModel->getCurrentLanguage() === 'fr_FR') {              $filename = __DIR__.'/../../doc/fr/' . $page . '.markdown';          } else {              $filename = __DIR__ . '/../../doc/' . $page . '.markdown'; @@ -71,7 +71,7 @@ class Doc extends BaseController       */      public function replaceMarkdownUrl(array $matches)      { -        return '('.$this->helper->url->to('doc', 'show', array('file' => str_replace('.markdown', '', $matches[1]))).')'; +        return '('.$this->helper->url->to('DocumentationController', 'show', array('file' => str_replace('.markdown', '', $matches[1]))).')';      }      /** @@ -83,7 +83,7 @@ class Doc extends BaseController       */      public function replaceImageUrl(array $matches)      { -        if ($this->language->getCurrentLanguage() === 'fr_FR') { +        if ($this->languageModel->getCurrentLanguage() === 'fr_FR') {              return '('.$this->helper->url->base().'doc/fr/'.$matches[1].')';          } diff --git a/app/Controller/Export.php b/app/Controller/ExportController.php index 7e1d2fdc..b2fe0ebd 100644 --- a/app/Controller/Export.php +++ b/app/Controller/ExportController.php @@ -3,12 +3,12 @@  namespace Kanboard\Controller;  /** - * Export controller + * Export Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Export extends BaseController +class ExportController extends BaseController  {      /**       * Common export method @@ -35,14 +35,14 @@ class Export extends BaseController          $this->response->html($this->helper->layout->project('export/'.$action, array(              'values' => array( -                'controller' => 'export', +                'controller' => 'ExportController',                  'action' => $action,                  'project_id' => $project['id'],                  'from' => $from,                  'to' => $to,              ),              'errors' => array(), -            'date_format' => $this->config->get('application_date_format'), +            'date_format' => $this->configModel->get('application_date_format'),              'date_formats' => $this->dateParser->getAvailableFormats($this->dateParser->getDateFormats()),              'project' => $project,              'title' => $page_title, diff --git a/app/Controller/Feed.php b/app/Controller/FeedController.php index 7554a499..cf2b1088 100644 --- a/app/Controller/Feed.php +++ b/app/Controller/FeedController.php @@ -7,10 +7,10 @@ use Kanboard\Core\Controller\AccessForbiddenException;  /**   * Atom/RSS Feed controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Feed extends BaseController +class FeedController extends BaseController  {      /**       * RSS feed for a user @@ -20,7 +20,7 @@ class Feed extends BaseController      public function user()      {          $token = $this->request->getStringParam('token'); -        $user = $this->user->getByToken($token); +        $user = $this->userModel->getByToken($token);          // Token verification          if (empty($user)) { @@ -28,7 +28,7 @@ class Feed extends BaseController          }          $this->response->xml($this->template->render('feed/user', array( -            'events' => $this->helper->projectActivity->getProjectsEvents($this->projectPermission->getActiveProjectIds($user['id'])), +            'events' => $this->helper->projectActivity->getProjectsEvents($this->projectPermissionModel->getActiveProjectIds($user['id'])),              'user' => $user,          )));      } @@ -41,7 +41,7 @@ class Feed extends BaseController      public function project()      {          $token = $this->request->getStringParam('token'); -        $project = $this->project->getByToken($token); +        $project = $this->projectModel->getByToken($token);          if (empty($project)) {              throw AccessForbiddenException::getInstance()->withoutLayout(); diff --git a/app/Controller/FileViewer.php b/app/Controller/FileViewerController.php index a49b0fb2..245845c7 100644 --- a/app/Controller/FileViewer.php +++ b/app/Controller/FileViewerController.php @@ -7,10 +7,10 @@ use Kanboard\Core\ObjectStorage\ObjectStorageException;  /**   * File Viewer Controller   * - * @package  controller + * @package  Kanbaord\Controller   * @author   Frederic Guillot   */ -class FileViewer extends BaseController +class FileViewerController extends BaseController  {      /**       * Get file content from object storage diff --git a/app/Controller/Gantt.php b/app/Controller/Gantt.php deleted file mode 100644 index d062b2fe..00000000 --- a/app/Controller/Gantt.php +++ /dev/null @@ -1,165 +0,0 @@ -<?php - -namespace Kanboard\Controller; - -use Kanboard\Filter\ProjectIdsFilter; -use Kanboard\Filter\ProjectStatusFilter; -use Kanboard\Filter\ProjectTypeFilter; -use Kanboard\Filter\TaskProjectFilter; -use Kanboard\Formatter\ProjectGanttFormatter; -use Kanboard\Formatter\TaskGanttFormatter; -use Kanboard\Model\Task as TaskModel; -use Kanboard\Model\Project as ProjectModel; - -/** - * Gantt controller - * - * @package  controller - * @author   Frederic Guillot - */ -class Gantt extends BaseController -{ -    /** -     * Show Gantt chart for all projects -     */ -    public function projects() -    { -        $project_ids = $this->projectPermission->getActiveProjectIds($this->userSession->getId()); -        $filter = $this->projectQuery -            ->withFilter(new ProjectTypeFilter(ProjectModel::TYPE_TEAM)) -            ->withFilter(new ProjectStatusFilter(ProjectModel::ACTIVE)) -            ->withFilter(new ProjectIdsFilter($project_ids)); - -        $filter->getQuery()->asc(ProjectModel::TABLE.'.start_date'); - -        $this->response->html($this->helper->layout->app('gantt/projects', array( -            'projects' => $filter->format(new ProjectGanttFormatter($this->container)), -            'title' => t('Gantt chart for all projects'), -        ))); -    } - -    /** -     * Save new project start date and end date -     */ -    public function saveProjectDate() -    { -        $values = $this->request->getJson(); - -        $result = $this->project->update(array( -            'id' => $values['id'], -            'start_date' => $this->dateParser->getIsoDate(strtotime($values['start'])), -            'end_date' => $this->dateParser->getIsoDate(strtotime($values['end'])), -        )); - -        if (! $result) { -            $this->response->json(array('message' => 'Unable to save project'), 400); -        } else { -            $this->response->json(array('message' => 'OK'), 201); -        } -    } - -    /** -     * Show Gantt chart for one project -     */ -    public function project() -    { -        $project = $this->getProject(); -        $search = $this->helper->projectHeader->getSearchQuery($project); -        $sorting = $this->request->getStringParam('sorting', 'board'); -        $filter = $this->taskLexer->build($search)->withFilter(new TaskProjectFilter($project['id'])); - -        if ($sorting === 'date') { -            $filter->getQuery()->asc(TaskModel::TABLE.'.date_started')->asc(TaskModel::TABLE.'.date_creation'); -        } else { -            $filter->getQuery()->asc('column_position')->asc(TaskModel::TABLE.'.position'); -        } - -        $this->response->html($this->helper->layout->app('gantt/project', array( -            'project' => $project, -            'title' => $project['name'], -            'description' => $this->helper->projectHeader->getDescription($project), -            'sorting' => $sorting, -            'tasks' => $filter->format(new TaskGanttFormatter($this->container)), -        ))); -    } - -    /** -     * Save new task start date and due date -     */ -    public function saveTaskDate() -    { -        $this->getProject(); -        $values = $this->request->getJson(); - -        $result = $this->taskModification->update(array( -            'id' => $values['id'], -            'date_started' => strtotime($values['start']), -            'date_due' => strtotime($values['end']), -        )); - -        if (! $result) { -            $this->response->json(array('message' => 'Unable to save task'), 400); -        } else { -            $this->response->json(array('message' => 'OK'), 201); -        } -    } - -    /** -     * Simplified form to create a new task -     * -     * @access public -     * @param array $values -     * @param array $errors -     * @throws \Kanboard\Core\Controller\PageNotFoundException -     */ -    public function task(array $values = array(), array $errors = array()) -    { -        $project = $this->getProject(); - -        $values = $values + array( -            'project_id' => $project['id'], -            'column_id' => $this->column->getFirstColumnId($project['id']), -            'position' => 1 -        ); - -        $values = $this->hook->merge('controller:task:form:default', $values, array('default_values' => $values)); -        $values = $this->hook->merge('controller:gantt:task:form:default', $values, array('default_values' => $values)); - -        $this->response->html($this->template->render('gantt/task_creation', array( -            'project' => $project, -            'errors' => $errors, -            'values' => $values, -            'users_list' => $this->projectUserRole->getAssignableUsersList($project['id'], true, false, true), -            'colors_list' => $this->color->getList(), -            'categories_list' => $this->category->getList($project['id']), -            'swimlanes_list' => $this->swimlane->getList($project['id'], false, true), -            'title' => $project['name'].' > '.t('New task') -        ))); -    } - -    /** -     * Validate and save a new task -     * -     * @access public -     */ -    public function saveTask() -    { -        $project = $this->getProject(); -        $values = $this->request->getValues(); - -        list($valid, $errors) = $this->taskValidator->validateCreation($values); - -        if ($valid) { -            $task_id = $this->taskCreation->create($values); - -            if ($task_id !== false) { -                $this->flash->success(t('Task created successfully.')); -                return $this->response->redirect($this->helper->url->to('gantt', 'project', array('project_id' => $project['id']))); -            } else { -                $this->flash->failure(t('Unable to create your task.')); -            } -        } - -        return $this->task($values, $errors); -    } -} diff --git a/app/Controller/GroupCreationController.php b/app/Controller/GroupCreationController.php index 7d0bb93c..b297b19f 100644 --- a/app/Controller/GroupCreationController.php +++ b/app/Controller/GroupCreationController.php @@ -36,7 +36,7 @@ class GroupCreationController extends BaseController          list($valid, $errors) = $this->groupValidator->validateCreation($values);          if ($valid) { -            if ($this->group->create($values['name']) !== false) { +            if ($this->groupModel->create($values['name']) !== false) {                  $this->flash->success(t('Group created successfully.'));                  return $this->response->redirect($this->helper->url->to('GroupListController', 'index'), true);              } else { diff --git a/app/Controller/GroupListController.php b/app/Controller/GroupListController.php index 17f3b2a9..4486bbff 100644 --- a/app/Controller/GroupListController.php +++ b/app/Controller/GroupListController.php @@ -21,7 +21,7 @@ class GroupListController extends BaseController              ->setUrl('GroupListController', 'index')              ->setMax(30)              ->setOrder('name') -            ->setQuery($this->group->getQuery()) +            ->setQuery($this->groupModel->getQuery())              ->calculate();          $this->response->html($this->helper->layout->app('group/index', array( @@ -38,13 +38,13 @@ class GroupListController extends BaseController      public function users()      {          $group_id = $this->request->getIntegerParam('group_id'); -        $group = $this->group->getById($group_id); +        $group = $this->groupModel->getById($group_id);          $paginator = $this->paginator              ->setUrl('GroupListController', 'users', array('group_id' => $group_id))              ->setMax(30)              ->setOrder('username') -            ->setQuery($this->groupMember->getQuery($group_id)) +            ->setQuery($this->groupMemberModel->getQuery($group_id))              ->calculate();          $this->response->html($this->helper->layout->app('group/users', array( @@ -64,14 +64,14 @@ class GroupListController extends BaseController      public function associate(array $values = array(), array $errors = array())      {          $group_id = $this->request->getIntegerParam('group_id'); -        $group = $this->group->getById($group_id); +        $group = $this->groupModel->getById($group_id);          if (empty($values)) {              $values['group_id'] = $group_id;          }          $this->response->html($this->template->render('group/associate', array( -            'users' => $this->user->prepareList($this->groupMember->getNotMembers($group_id)), +            'users' => $this->userModel->prepareList($this->groupMemberModel->getNotMembers($group_id)),              'group' => $group,              'errors' => $errors,              'values' => $values, @@ -88,7 +88,7 @@ class GroupListController extends BaseController          $values = $this->request->getValues();          if (isset($values['group_id']) && isset($values['user_id'])) { -            if ($this->groupMember->addUser($values['group_id'], $values['user_id'])) { +            if ($this->groupMemberModel->addUser($values['group_id'], $values['user_id'])) {                  $this->flash->success(t('Group member added successfully.'));                  return $this->response->redirect($this->helper->url->to('GroupListController', 'users', array('group_id' => $values['group_id'])), true);              } else { @@ -108,8 +108,8 @@ class GroupListController extends BaseController      {          $group_id = $this->request->getIntegerParam('group_id');          $user_id = $this->request->getIntegerParam('user_id'); -        $group = $this->group->getById($group_id); -        $user = $this->user->getById($user_id); +        $group = $this->groupModel->getById($group_id); +        $user = $this->userModel->getById($user_id);          $this->response->html($this->template->render('group/dissociate', array(              'group' => $group, @@ -128,7 +128,7 @@ class GroupListController extends BaseController          $group_id = $this->request->getIntegerParam('group_id');          $user_id = $this->request->getIntegerParam('user_id'); -        if ($this->groupMember->removeUser($group_id, $user_id)) { +        if ($this->groupMemberModel->removeUser($group_id, $user_id)) {              $this->flash->success(t('User removed successfully from this group.'));          } else {              $this->flash->failure(t('Unable to remove this user from the group.')); @@ -145,7 +145,7 @@ class GroupListController extends BaseController      public function confirm()      {          $group_id = $this->request->getIntegerParam('group_id'); -        $group = $this->group->getById($group_id); +        $group = $this->groupModel->getById($group_id);          $this->response->html($this->template->render('group/remove', array(              'group' => $group, @@ -162,7 +162,7 @@ class GroupListController extends BaseController          $this->checkCSRFParam();          $group_id = $this->request->getIntegerParam('group_id'); -        if ($this->group->remove($group_id)) { +        if ($this->groupModel->remove($group_id)) {              $this->flash->success(t('Group removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this group.')); diff --git a/app/Controller/GroupModificationController.php b/app/Controller/GroupModificationController.php index 1f225a14..bd181b74 100644 --- a/app/Controller/GroupModificationController.php +++ b/app/Controller/GroupModificationController.php @@ -20,7 +20,7 @@ class GroupModificationController extends BaseController      public function show(array $values = array(), array $errors = array())      {          if (empty($values)) { -            $values = $this->group->getById($this->request->getIntegerParam('group_id')); +            $values = $this->groupModel->getById($this->request->getIntegerParam('group_id'));          }          $this->response->html($this->template->render('group_modification/show', array( @@ -40,7 +40,7 @@ class GroupModificationController extends BaseController          list($valid, $errors) = $this->groupValidator->validateModification($values);          if ($valid) { -            if ($this->group->update($values) !== false) { +            if ($this->groupModel->update($values) !== false) {                  $this->flash->success(t('Group updated successfully.'));                  return $this->response->redirect($this->helper->url->to('GroupListController', 'index'), true);              } else { diff --git a/app/Controller/Ical.php b/app/Controller/ICalendarController.php index 091ea5f4..e354c6f1 100644 --- a/app/Controller/Ical.php +++ b/app/Controller/ICalendarController.php @@ -8,16 +8,16 @@ use Kanboard\Filter\TaskAssigneeFilter;  use Kanboard\Filter\TaskProjectFilter;  use Kanboard\Filter\TaskStatusFilter;  use Kanboard\Formatter\TaskICalFormatter; -use Kanboard\Model\Task as TaskModel; +use Kanboard\Model\TaskModel;  use Eluceo\iCal\Component\Calendar as iCalendar;  /** - * iCalendar controller + * iCalendar Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Ical extends BaseController +class ICalendarController extends BaseController  {      /**       * Get user iCalendar @@ -27,7 +27,7 @@ class Ical extends BaseController      public function user()      {          $token = $this->request->getStringParam('token'); -        $user = $this->user->getByToken($token); +        $user = $this->userModel->getByToken($token);          // Token verification          if (empty($user)) { @@ -37,7 +37,7 @@ class Ical extends BaseController          // Common filter          $queryBuilder = new QueryBuilder();          $queryBuilder -            ->withQuery($this->taskFinder->getICalQuery()) +            ->withQuery($this->taskFinderModel->getICalQuery())              ->withFilter(new TaskStatusFilter(TaskModel::STATUS_OPEN))              ->withFilter(new TaskAssigneeFilter($user['id'])); @@ -58,7 +58,7 @@ class Ical extends BaseController      public function project()      {          $token = $this->request->getStringParam('token'); -        $project = $this->project->getByToken($token); +        $project = $this->projectModel->getByToken($token);          // Token verification          if (empty($project)) { @@ -68,7 +68,7 @@ class Ical extends BaseController          // Common filter          $queryBuilder = new QueryBuilder();          $queryBuilder -            ->withQuery($this->taskFinder->getICalQuery()) +            ->withQuery($this->taskFinderModel->getICalQuery())              ->withFilter(new TaskStatusFilter(TaskModel::STATUS_OPEN))              ->withFilter(new TaskProjectFilter($project['id'])); diff --git a/app/Controller/Link.php b/app/Controller/LinkController.php index d28f5e4e..477b25a4 100644 --- a/app/Controller/Link.php +++ b/app/Controller/LinkController.php @@ -5,13 +5,13 @@ namespace Kanboard\Controller;  use Kanboard\Core\Controller\PageNotFoundException;  /** - * Link controller + * Link Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Olivier Maridat   * @author  Frederic Guillot   */ -class Link extends BaseController +class LinkController extends BaseController  {      /**       * Get the current link @@ -22,7 +22,7 @@ class Link extends BaseController       */      private function getLink()      { -        $link = $this->link->getById($this->request->getIntegerParam('link_id')); +        $link = $this->linkModel->getById($this->request->getIntegerParam('link_id'));          if (empty($link)) {              throw new PageNotFoundException(); @@ -41,7 +41,7 @@ class Link extends BaseController      public function index(array $values = array(), array $errors = array())      {          $this->response->html($this->helper->layout->config('link/index', array( -            'links' => $this->link->getMergedList(), +            'links' => $this->linkModel->getMergedList(),              'values' => $values,              'errors' => $errors,              'title' => t('Settings').' > '.t('Task\'s links'), @@ -59,9 +59,9 @@ class Link extends BaseController          list($valid, $errors) = $this->linkValidator->validateCreation($values);          if ($valid) { -            if ($this->link->create($values['label'], $values['opposite_label']) !== false) { +            if ($this->linkModel->create($values['label'], $values['opposite_label']) !== false) {                  $this->flash->success(t('Link added successfully.')); -                return $this->response->redirect($this->helper->url->to('link', 'index')); +                return $this->response->redirect($this->helper->url->to('LinkController', 'index'));              } else {                  $this->flash->failure(t('Unable to create your link.'));              } @@ -86,7 +86,7 @@ class Link extends BaseController          $this->response->html($this->helper->layout->config('link/edit', array(              'values' => $values ?: $link,              'errors' => $errors, -            'labels' => $this->link->getList($link['id']), +            'labels' => $this->linkModel->getList($link['id']),              'link' => $link,              'title' => t('Link modification')          ))); @@ -103,9 +103,9 @@ class Link extends BaseController          list($valid, $errors) = $this->linkValidator->validateModification($values);          if ($valid) { -            if ($this->link->update($values)) { +            if ($this->linkModel->update($values)) {                  $this->flash->success(t('Link updated successfully.')); -                return $this->response->redirect($this->helper->url->to('link', 'index')); +                return $this->response->redirect($this->helper->url->to('LinkController', 'index'));              } else {                  $this->flash->failure(t('Unable to update your link.'));              } @@ -139,12 +139,12 @@ class Link extends BaseController          $this->checkCSRFParam();          $link = $this->getLink(); -        if ($this->link->remove($link['id'])) { +        if ($this->linkModel->remove($link['id'])) {              $this->flash->success(t('Link removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this link.'));          } -        $this->response->redirect($this->helper->url->to('link', 'index')); +        $this->response->redirect($this->helper->url->to('LinkController', 'index'));      }  } diff --git a/app/Controller/Oauth.php b/app/Controller/OAuthController.php index 04adf154..7663ddcc 100644 --- a/app/Controller/Oauth.php +++ b/app/Controller/OAuthController.php @@ -5,12 +5,12 @@ namespace Kanboard\Controller;  use Kanboard\Core\Security\OAuthAuthenticationProviderInterface;  /** - * OAuth controller + * OAuth Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Oauth extends BaseController +class OAuthController extends BaseController  {      /**       * Redirect to the provider if no code received diff --git a/app/Controller/PasswordReset.php b/app/Controller/PasswordResetController.php index 7050d6d2..18b4be80 100644 --- a/app/Controller/PasswordReset.php +++ b/app/Controller/PasswordResetController.php @@ -7,10 +7,10 @@ use Kanboard\Core\Controller\AccessForbiddenException;  /**   * Password Reset Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Frederic Guillot   */ -class PasswordReset extends BaseController +class PasswordResetController extends BaseController  {      /**       * Show the form to reset the password @@ -38,7 +38,7 @@ class PasswordReset extends BaseController          if ($valid) {              $this->sendEmail($values['username']); -            $this->response->redirect($this->helper->url->to('auth', 'login')); +            $this->response->redirect($this->helper->url->to('AuthController', 'login'));          } else {              $this->create($values, $errors);          } @@ -52,7 +52,7 @@ class PasswordReset extends BaseController          $this->checkActivation();          $token = $this->request->getStringParam('token'); -        $user_id = $this->passwordReset->getUserIdByToken($token); +        $user_id = $this->passwordResetModel->getUserIdByToken($token);          if ($user_id !== false) {              $this->response->html($this->helper->layout->app('password_reset/change', array( @@ -62,7 +62,7 @@ class PasswordReset extends BaseController                  'no_layout' => true,              )));          } else { -            $this->response->redirect($this->helper->url->to('auth', 'login')); +            $this->response->redirect($this->helper->url->to('AuthController', 'login'));          }      } @@ -78,14 +78,14 @@ class PasswordReset extends BaseController          list($valid, $errors) = $this->passwordResetValidator->validateModification($values);          if ($valid) { -            $user_id = $this->passwordReset->getUserIdByToken($token); +            $user_id = $this->passwordResetModel->getUserIdByToken($token);              if ($user_id !== false) { -                $this->user->update(array('id' => $user_id, 'password' => $values['password'])); -                $this->passwordReset->disable($user_id); +                $this->userModel->update(array('id' => $user_id, 'password' => $values['password'])); +                $this->passwordResetModel->disable($user_id);              } -            return $this->response->redirect($this->helper->url->to('auth', 'login')); +            return $this->response->redirect($this->helper->url->to('AuthController', 'login'));          }          return $this->change($values, $errors); @@ -96,10 +96,10 @@ class PasswordReset extends BaseController       */      private function sendEmail($username)      { -        $token = $this->passwordReset->create($username); +        $token = $this->passwordResetModel->create($username);          if ($token !== false) { -            $user = $this->user->getByUsername($username); +            $user = $this->userModel->getByUsername($username);              $this->emailClient->send(                  $user['email'], @@ -115,7 +115,7 @@ class PasswordReset extends BaseController       */      private function checkActivation()      { -        if ($this->config->get('password_reset', 0) == 0) { +        if ($this->configModel->get('password_reset', 0) == 0) {              throw AccessForbiddenException::getInstance()->withoutLayout();          }      } diff --git a/app/Controller/ActionProject.php b/app/Controller/ProjectActionDuplicationController.php index 10b3c9d4..a4993cca 100644 --- a/app/Controller/ActionProject.php +++ b/app/Controller/ProjectActionDuplicationController.php @@ -5,18 +5,18 @@ namespace Kanboard\Controller;  /**   * Duplicate automatic action from another project   * - * @package controller + * @package Kanboard\Controller   * @author  Frederic Guillot   */ -class ActionProject extends BaseController +class ProjectActionDuplicationController extends BaseController  { -    public function project() +    public function show()      {          $project = $this->getProject(); -        $projects = $this->projectUserRole->getProjectsByUser($this->userSession->getId()); +        $projects = $this->projectUserRoleModel->getProjectsByUser($this->userSession->getId());          unset($projects[$project['id']]); -        $this->response->html($this->template->render('action_project/project', array( +        $this->response->html($this->template->render('project_action_duplication/show', array(              'project' => $project,              'projects_list' => $projects,          ))); @@ -27,12 +27,12 @@ class ActionProject extends BaseController          $project = $this->getProject();          $src_project_id = $this->request->getValue('src_project_id'); -        if ($this->action->duplicate($src_project_id, $project['id'])) { +        if ($this->actionModel->duplicate($src_project_id, $project['id'])) {              $this->flash->success(t('Actions duplicated successfully.'));          } else {              $this->flash->failure(t('Unable to duplicate actions.'));          } -        $this->response->redirect($this->helper->url->to('action', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('ActionController', 'index', array('project_id' => $project['id'])));      }  } diff --git a/app/Controller/ProjectCreation.php b/app/Controller/ProjectCreationController.php index 0ffa2174..c471cfdd 100644 --- a/app/Controller/ProjectCreation.php +++ b/app/Controller/ProjectCreationController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Project Creation Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class ProjectCreation extends BaseController +class ProjectCreationController extends BaseController  {      /**       * Display a form to create a new project @@ -20,7 +20,7 @@ class ProjectCreation extends BaseController      public function create(array $values = array(), array $errors = array())      {          $is_private = isset($values['is_private']) && $values['is_private'] == 1; -        $projects_list = array(0 => t('Do not duplicate anything')) + $this->projectUserRole->getActiveProjectsByUser($this->userSession->getId()); +        $projects_list = array(0 => t('Do not duplicate anything')) + $this->projectUserRoleModel->getActiveProjectsByUser($this->userSession->getId());          $this->response->html($this->helper->layout->app('project_creation/create', array(              'values' => $values, @@ -98,7 +98,7 @@ class ProjectCreation extends BaseController              'is_private' => $values['is_private'],          ); -        return $this->project->create($project, $this->userSession->getId(), true); +        return $this->projectModel->create($project, $this->userSession->getId(), true);      }      /** @@ -112,13 +112,13 @@ class ProjectCreation extends BaseController      {          $selection = array(); -        foreach ($this->projectDuplication->getOptionalSelection() as $item) { +        foreach ($this->projectDuplicationModel->getOptionalSelection() as $item) {              if (isset($values[$item]) && $values[$item] == 1) {                  $selection[] = $item;              }          } -        return $this->projectDuplication->duplicate( +        return $this->projectDuplicationModel->duplicate(              $values['src_project_id'],              $selection,              $this->userSession->getId(), diff --git a/app/Controller/ProjectEditController.php b/app/Controller/ProjectEditController.php index 774c6909..228d681c 100644 --- a/app/Controller/ProjectEditController.php +++ b/app/Controller/ProjectEditController.php @@ -73,7 +73,7 @@ class ProjectEditController extends BaseController          list($valid, $errors) = $this->projectValidator->validateModification($values);          if ($valid) { -            if ($this->project->update($values)) { +            if ($this->projectModel->update($values)) {                  $this->flash->success(t('Project updated successfully.'));                  return $this->response->redirect($this->helper->url->to('ProjectEditController', $redirect, array('project_id' => $project['id'])), true);              } else { @@ -97,11 +97,11 @@ class ProjectEditController extends BaseController      {          if ($redirect === 'edit') {              if (isset($values['is_private'])) { -                if (! $this->helper->user->hasProjectAccess('ProjectCreation', 'create', $project['id'])) { +                if (! $this->helper->user->hasProjectAccess('ProjectCreationController', 'create', $project['id'])) {                      unset($values['is_private']);                  }              } elseif ($project['is_private'] == 1 && ! isset($values['is_private'])) { -                if ($this->helper->user->hasProjectAccess('ProjectCreation', 'create', $project['id'])) { +                if ($this->helper->user->hasProjectAccess('ProjectCreationController', 'create', $project['id'])) {                      $values += array('is_private' => 0);                  }              } @@ -123,7 +123,7 @@ class ProjectEditController extends BaseController          $project = $this->getProject();          $this->response->html($this->helper->layout->project($template, array( -            'owners' => $this->projectUserRole->getAssignableUsersList($project['id'], true), +            'owners' => $this->projectUserRoleModel->getAssignableUsersList($project['id'], true),              'values' => empty($values) ? $project : $values,              'errors' => $errors,              'project' => $project, diff --git a/app/Controller/ProjectFile.php b/app/Controller/ProjectFileController.php index 6ec5ff27..cbe48679 100644 --- a/app/Controller/ProjectFile.php +++ b/app/Controller/ProjectFileController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Project File Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class ProjectFile extends BaseController +class ProjectFileController extends BaseController  {      /**       * File upload form @@ -34,11 +34,11 @@ class ProjectFile extends BaseController      {          $project = $this->getProject(); -        if (! $this->projectFile->uploadFiles($project['id'], $this->request->getFileInfo('files'))) { +        if (! $this->projectFileModel->uploadFiles($project['id'], $this->request->getFileInfo('files'))) {              $this->flash->failure(t('Unable to upload the file.'));          } -        $this->response->redirect($this->helper->url->to('ProjectOverview', 'show', array('project_id' => $project['id'])), true); +        $this->response->redirect($this->helper->url->to('ProjectOverviewController', 'show', array('project_id' => $project['id'])), true);      }      /** @@ -50,15 +50,15 @@ class ProjectFile extends BaseController      {          $this->checkCSRFParam();          $project = $this->getProject(); -        $file = $this->projectFile->getById($this->request->getIntegerParam('file_id')); +        $file = $this->projectFileModel->getById($this->request->getIntegerParam('file_id')); -        if ($this->projectFile->remove($file['id'])) { +        if ($this->projectFileModel->remove($file['id'])) {              $this->flash->success(t('File removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this file.'));          } -        $this->response->redirect($this->helper->url->to('ProjectOverview', 'show', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('ProjectOverviewController', 'show', array('project_id' => $project['id'])));      }      /** @@ -69,7 +69,7 @@ class ProjectFile extends BaseController      public function confirm()      {          $project = $this->getProject(); -        $file = $this->projectFile->getById($this->request->getIntegerParam('file_id')); +        $file = $this->projectFileModel->getById($this->request->getIntegerParam('file_id'));          $this->response->html($this->template->render('project_file/remove', array(              'project' => $project, diff --git a/app/Controller/ProjectGanttController.php b/app/Controller/ProjectGanttController.php new file mode 100644 index 00000000..a70d9eee --- /dev/null +++ b/app/Controller/ProjectGanttController.php @@ -0,0 +1,57 @@ +<?php + +namespace Kanboard\Controller; + +use Kanboard\Filter\ProjectIdsFilter; +use Kanboard\Filter\ProjectStatusFilter; +use Kanboard\Filter\ProjectTypeFilter; +use Kanboard\Formatter\ProjectGanttFormatter; +use Kanboard\Model\ProjectModel; + +/** + * Projects Gantt Controller + * + * @package Kanboard\Controller + * @author  Frederic Guillot + */ +class ProjectGanttController extends BaseController +{ +    /** +     * Show Gantt chart for all projects +     */ +    public function show() +    { +        $project_ids = $this->projectPermissionModel->getActiveProjectIds($this->userSession->getId()); +        $filter = $this->projectQuery +            ->withFilter(new ProjectTypeFilter(ProjectModel::TYPE_TEAM)) +            ->withFilter(new ProjectStatusFilter(ProjectModel::ACTIVE)) +            ->withFilter(new ProjectIdsFilter($project_ids)); + +        $filter->getQuery()->asc(ProjectModel::TABLE.'.start_date'); + +        $this->response->html($this->helper->layout->app('project_gantt/show', array( +            'projects' => $filter->format(new ProjectGanttFormatter($this->container)), +            'title' => t('Gantt chart for all projects'), +        ))); +    } + +    /** +     * Save new project start date and end date +     */ +    public function save() +    { +        $values = $this->request->getJson(); + +        $result = $this->projectModel->update(array( +            'id' => $values['id'], +            'start_date' => $this->dateParser->getIsoDate(strtotime($values['start'])), +            'end_date' => $this->dateParser->getIsoDate(strtotime($values['end'])), +        )); + +        if (! $result) { +            $this->response->json(array('message' => 'Unable to save project'), 400); +        } else { +            $this->response->json(array('message' => 'OK'), 201); +        } +    } +} diff --git a/app/Controller/ProjectListController.php b/app/Controller/ProjectListController.php index 5571b3c9..e1172400 100644 --- a/app/Controller/ProjectListController.php +++ b/app/Controller/ProjectListController.php @@ -18,9 +18,9 @@ class ProjectListController extends BaseController      public function show()      {          if ($this->userSession->isAdmin()) { -            $project_ids = $this->project->getAllIds(); +            $project_ids = $this->projectModel->getAllIds();          } else { -            $project_ids = $this->projectPermission->getActiveProjectIds($this->userSession->getId()); +            $project_ids = $this->projectPermissionModel->getActiveProjectIds($this->userSession->getId());          }          $nb_projects = count($project_ids); @@ -29,7 +29,7 @@ class ProjectListController extends BaseController              ->setUrl('ProjectListController', 'show')              ->setMax(20)              ->setOrder('name') -            ->setQuery($this->project->getQueryColumnStats($project_ids)) +            ->setQuery($this->projectModel->getQueryColumnStats($project_ids))              ->calculate();          $this->response->html($this->helper->layout->app('project_list/show', array( diff --git a/app/Controller/ProjectOverview.php b/app/Controller/ProjectOverviewController.php index f8837f95..abdff657 100644 --- a/app/Controller/ProjectOverview.php +++ b/app/Controller/ProjectOverviewController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Project Overview Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class ProjectOverview extends BaseController +class ProjectOverviewController extends BaseController  {      /**       * Show project overview @@ -16,17 +16,17 @@ class ProjectOverview extends BaseController      public function show()      {          $project = $this->getProject(); -        $this->project->getColumnStats($project); +        $this->projectModel->getColumnStats($project);          $this->response->html($this->helper->layout->app('project_overview/show', array(              'project' => $project,              'title' => $project['name'],              'description' => $this->helper->projectHeader->getDescription($project), -            'users' => $this->projectUserRole->getAllUsersGroupedByRole($project['id']), +            'users' => $this->projectUserRoleModel->getAllUsersGroupedByRole($project['id']),              'roles' => $this->role->getProjectRoles(),              'events' => $this->helper->projectActivity->getProjectEvents($project['id'], 10), -            'images' => $this->projectFile->getAllImages($project['id']), -            'files' => $this->projectFile->getAllDocuments($project['id']), +            'images' => $this->projectFileModel->getAllImages($project['id']), +            'files' => $this->projectFileModel->getAllDocuments($project['id']),          )));      }  } diff --git a/app/Controller/ProjectPermissionController.php b/app/Controller/ProjectPermissionController.php index d27681b1..f3ca6ed9 100644 --- a/app/Controller/ProjectPermissionController.php +++ b/app/Controller/ProjectPermissionController.php @@ -50,8 +50,8 @@ class ProjectPermissionController extends BaseController          $this->response->html($this->helper->layout->project('project_permission/index', array(              'project' => $project, -            'users' => $this->projectUserRole->getUsers($project['id']), -            'groups' => $this->projectGroupRole->getGroups($project['id']), +            'users' => $this->projectUserRoleModel->getUsers($project['id']), +            'groups' => $this->projectGroupRoleModel->getGroups($project['id']),              'roles' => $this->role->getProjectRoles(),              'values' => $values,              'errors' => $errors, @@ -69,7 +69,7 @@ class ProjectPermissionController extends BaseController          $project = $this->getProject();          $values = $this->request->getValues() + array('is_everybody_allowed' => 0); -        if ($this->project->update($values)) { +        if ($this->projectModel->update($values)) {              $this->flash->success(t('Project updated successfully.'));          } else {              $this->flash->failure(t('Unable to update this project.')); @@ -90,7 +90,7 @@ class ProjectPermissionController extends BaseController          if (empty($values['user_id'])) {              $this->flash->failure(t('User not found.')); -        } elseif ($this->projectUserRole->addUser($values['project_id'], $values['user_id'], $values['role'])) { +        } elseif ($this->projectUserRoleModel->addUser($values['project_id'], $values['user_id'], $values['role'])) {              $this->flash->success(t('Project updated successfully.'));          } else {              $this->flash->failure(t('Unable to update this project.')); @@ -110,7 +110,7 @@ class ProjectPermissionController extends BaseController          $project = $this->getProject();          $user_id = $this->request->getIntegerParam('user_id'); -        if ($this->projectUserRole->removeUser($project['id'], $user_id)) { +        if ($this->projectUserRoleModel->removeUser($project['id'], $user_id)) {              $this->flash->success(t('Project updated successfully.'));          } else {              $this->flash->failure(t('Unable to update this project.')); @@ -129,7 +129,7 @@ class ProjectPermissionController extends BaseController          $project = $this->getProject();          $values = $this->request->getJson(); -        if (! empty($project) && ! empty($values) && $this->projectUserRole->changeUserRole($project['id'], $values['id'], $values['role'])) { +        if (! empty($project) && ! empty($values) && $this->projectUserRoleModel->changeUserRole($project['id'], $values['id'], $values['role'])) {              $this->response->json(array('status' => 'ok'));          } else {              $this->response->json(array('status' => 'error')); @@ -147,10 +147,10 @@ class ProjectPermissionController extends BaseController          $values = $this->request->getValues();          if (empty($values['group_id']) && ! empty($values['external_id'])) { -            $values['group_id'] = $this->group->create($values['name'], $values['external_id']); +            $values['group_id'] = $this->groupModel->create($values['name'], $values['external_id']);          } -        if ($this->projectGroupRole->addGroup($project['id'], $values['group_id'], $values['role'])) { +        if ($this->projectGroupRoleModel->addGroup($project['id'], $values['group_id'], $values['role'])) {              $this->flash->success(t('Project updated successfully.'));          } else {              $this->flash->failure(t('Unable to update this project.')); @@ -170,7 +170,7 @@ class ProjectPermissionController extends BaseController          $project = $this->getProject();          $group_id = $this->request->getIntegerParam('group_id'); -        if ($this->projectGroupRole->removeGroup($project['id'], $group_id)) { +        if ($this->projectGroupRoleModel->removeGroup($project['id'], $group_id)) {              $this->flash->success(t('Project updated successfully.'));          } else {              $this->flash->failure(t('Unable to update this project.')); @@ -189,7 +189,7 @@ class ProjectPermissionController extends BaseController          $project = $this->getProject();          $values = $this->request->getJson(); -        if (! empty($project) && ! empty($values) && $this->projectGroupRole->changeGroupRole($project['id'], $values['id'], $values['role'])) { +        if (! empty($project) && ! empty($values) && $this->projectGroupRoleModel->changeGroupRole($project['id'], $values['id'], $values['role'])) {              $this->response->json(array('status' => 'ok'));          } else {              $this->response->json(array('status' => 'error')); diff --git a/app/Controller/ProjectStatusController.php b/app/Controller/ProjectStatusController.php index 16ac32b8..78e77870 100644 --- a/app/Controller/ProjectStatusController.php +++ b/app/Controller/ProjectStatusController.php @@ -31,7 +31,7 @@ class ProjectStatusController extends BaseController          $project = $this->getProject();          $this->checkCSRFParam(); -        if ($this->project->enable($project['id'])) { +        if ($this->projectModel->enable($project['id'])) {              $this->flash->success(t('Project activated successfully.'));          } else {              $this->flash->failure(t('Unable to activate this project.')); @@ -61,7 +61,7 @@ class ProjectStatusController extends BaseController          $project = $this->getProject();          $this->checkCSRFParam(); -        if ($this->project->disable($project['id'])) { +        if ($this->projectModel->disable($project['id'])) {              $this->flash->success(t('Project disabled successfully.'));          } else {              $this->flash->failure(t('Unable to disable this project.')); @@ -91,7 +91,7 @@ class ProjectStatusController extends BaseController          $project = $this->getProject();          $this->checkCSRFParam(); -        if ($this->project->remove($project['id'])) { +        if ($this->projectModel->remove($project['id'])) {              $this->flash->success(t('Project removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this project.')); diff --git a/app/Controller/Projectuser.php b/app/Controller/ProjectUserOverviewController.php index fe1fe0f1..686de830 100644 --- a/app/Controller/Projectuser.php +++ b/app/Controller/ProjectUserOverviewController.php @@ -2,36 +2,36 @@  namespace Kanboard\Controller; -use Kanboard\Model\User as UserModel; -use Kanboard\Model\Task as TaskModel; +use Kanboard\Model\UserModel; +use Kanboard\Model\TaskModel;  use Kanboard\Core\Security\Role;  /**   * Project User overview   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Projectuser extends BaseController +class ProjectUserOverviewController extends BaseController  {      private function common()      {          $user_id = $this->request->getIntegerParam('user_id', UserModel::EVERYBODY_ID);          if ($this->userSession->isAdmin()) { -            $project_ids = $this->project->getAllIds(); +            $project_ids = $this->projectModel->getAllIds();          } else { -            $project_ids = $this->projectPermission->getActiveProjectIds($this->userSession->getId()); +            $project_ids = $this->projectPermissionModel->getActiveProjectIds($this->userSession->getId());          } -        return array($user_id, $project_ids, $this->user->getActiveUsersList(true)); +        return array($user_id, $project_ids, $this->userModel->getActiveUsersList(true));      }      private function role($role, $action, $title, $title_user)      {          list($user_id, $project_ids, $users) = $this->common(); -        $query = $this->projectPermission->getQueryByRole($project_ids, $role)->callback(array($this->project, 'applyColumnStats')); +        $query = $this->projectPermissionModel->getQueryByRole($project_ids, $role)->callback(array($this->projectModel, 'applyColumnStats'));          if ($user_id !== UserModel::EVERYBODY_ID && isset($users[$user_id])) {              $query->eq(UserModel::TABLE.'.id', $user_id); @@ -39,13 +39,13 @@ class Projectuser extends BaseController          }          $paginator = $this->paginator -            ->setUrl('projectuser', $action, array('user_id' => $user_id)) +            ->setUrl('ProjectUserOverviewController', $action, array('user_id' => $user_id))              ->setMax(30)              ->setOrder('projects.name')              ->setQuery($query)              ->calculate(); -        $this->response->html($this->helper->layout->projectUser('project_user/roles', array( +        $this->response->html($this->helper->layout->projectUser('project_user_overview/roles', array(              'paginator' => $paginator,              'title' => $title,              'user_id' => $user_id, @@ -57,7 +57,7 @@ class Projectuser extends BaseController      {          list($user_id, $project_ids, $users) = $this->common(); -        $query = $this->taskFinder->getProjectUserOverviewQuery($project_ids, $is_active); +        $query = $this->taskFinderModel->getProjectUserOverviewQuery($project_ids, $is_active);          if ($user_id !== UserModel::EVERYBODY_ID && isset($users[$user_id])) {              $query->eq(TaskModel::TABLE.'.owner_id', $user_id); @@ -65,13 +65,13 @@ class Projectuser extends BaseController          }          $paginator = $this->paginator -            ->setUrl('projectuser', $action, array('user_id' => $user_id)) +            ->setUrl('ProjectUserOverviewController', $action, array('user_id' => $user_id))              ->setMax(50)              ->setOrder(TaskModel::TABLE.'.id')              ->setQuery($query)              ->calculate(); -        $this->response->html($this->helper->layout->projectUser('project_user/tasks', array( +        $this->response->html($this->helper->layout->projectUser('project_user_overview/tasks', array(              'paginator' => $paginator,              'title' => $title,              'user_id' => $user_id, @@ -122,8 +122,8 @@ class Projectuser extends BaseController      {          $project = $this->getProject(); -        return $this->response->html($this->template->render('project_user/tooltip_users', array( -            'users' => $this->projectUserRole->getAllUsersGroupedByRole($project['id']), +        return $this->response->html($this->template->render('project_user_overview/tooltip_users', array( +            'users' => $this->projectUserRoleModel->getAllUsersGroupedByRole($project['id']),              'roles' => $this->role->getProjectRoles(),          )));      } diff --git a/app/Controller/ProjectViewController.php b/app/Controller/ProjectViewController.php index ca112a41..92b93804 100644 --- a/app/Controller/ProjectViewController.php +++ b/app/Controller/ProjectViewController.php @@ -21,7 +21,7 @@ class ProjectViewController extends BaseController          $this->response->html($this->helper->layout->project('project_view/show', array(              'project' => $project, -            'stats' => $this->project->getTaskStats($project['id']), +            'stats' => $this->projectModel->getTaskStats($project['id']),              'title' => $project['name'],          )));      } @@ -53,7 +53,7 @@ class ProjectViewController extends BaseController          $this->checkCSRFParam();          $switch = $this->request->getStringParam('switch'); -        if ($this->project->{$switch.'PublicAccess'}($project['id'])) { +        if ($this->projectModel->{$switch.'PublicAccess'}($project['id'])) {              $this->flash->success(t('Project updated successfully.'));          } else {              $this->flash->failure(t('Unable to update this project.')); @@ -74,8 +74,8 @@ class ProjectViewController extends BaseController          $this->response->html($this->helper->layout->project('project_view/integrations', array(              'project' => $project,              'title' => t('Integrations'), -            'webhook_token' => $this->config->get('webhook_token'), -            'values' => $this->projectMetadata->getAll($project['id']), +            'webhook_token' => $this->configModel->get('webhook_token'), +            'values' => $this->projectMetadataModel->getAll($project['id']),              'errors' => array(),          )));      } @@ -89,7 +89,7 @@ class ProjectViewController extends BaseController      {          $project = $this->getProject(); -        $this->projectMetadata->save($project['id'], $this->request->getValues()); +        $this->projectMetadataModel->save($project['id'], $this->request->getValues());          $this->flash->success(t('Project updated successfully.'));          $this->response->redirect($this->helper->url->to('ProjectViewController', 'integrations', array('project_id' => $project['id'])));      } @@ -104,8 +104,8 @@ class ProjectViewController extends BaseController          $project = $this->getProject();          $this->response->html($this->helper->layout->project('project_view/notifications', array( -            'notifications' => $this->projectNotification->readSettings($project['id']), -            'types' => $this->projectNotificationType->getTypes(), +            'notifications' => $this->projectNotificationModel->readSettings($project['id']), +            'types' => $this->projectNotificationTypeModel->getTypes(),              'project' => $project,              'title' => t('Notifications'),          ))); @@ -121,7 +121,7 @@ class ProjectViewController extends BaseController          $project = $this->getProject();          $values = $this->request->getValues(); -        $this->projectNotification->saveSettings($project['id'], $values); +        $this->projectNotificationModel->saveSettings($project['id'], $values);          $this->flash->success(t('Project updated successfully.'));          $this->response->redirect($this->helper->url->to('ProjectViewController', 'notifications', array('project_id' => $project['id'])));      } @@ -149,7 +149,7 @@ class ProjectViewController extends BaseController      public function doDuplication()      {          $project = $this->getProject(); -        $project_id = $this->projectDuplication->duplicate($project['id'], array_keys($this->request->getValues()), $this->userSession->getId()); +        $project_id = $this->projectDuplicationModel->duplicate($project['id'], array_keys($this->request->getValues()), $this->userSession->getId());          if ($project_id !== false) {              $this->flash->success(t('Project cloned successfully.')); diff --git a/app/Controller/Search.php b/app/Controller/SearchController.php index a092cba6..8557b182 100644 --- a/app/Controller/Search.php +++ b/app/Controller/SearchController.php @@ -5,21 +5,21 @@ namespace Kanboard\Controller;  use Kanboard\Filter\TaskProjectsFilter;  /** - * Search controller + * Search Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Search extends BaseController +class SearchController extends BaseController  {      public function index()      { -        $projects = $this->projectUserRole->getProjectsByUser($this->userSession->getId()); +        $projects = $this->projectUserRoleModel->getProjectsByUser($this->userSession->getId());          $search = urldecode($this->request->getStringParam('search'));          $nb_tasks = 0;          $paginator = $this->paginator -                ->setUrl('search', 'index', array('search' => $search)) +                ->setUrl('SearchController', 'index', array('search' => $search))                  ->setMax(30)                  ->setOrder('tasks.id')                  ->setDirection('DESC'); @@ -39,7 +39,7 @@ class Search extends BaseController          $this->response->html($this->helper->layout->app('search/index', array(              'values' => array(                  'search' => $search, -                'controller' => 'search', +                'controller' => 'SearchController',                  'action' => 'index',              ),              'paginator' => $paginator, @@ -56,7 +56,7 @@ class Search extends BaseController          $this->response->html($this->helper->layout->app('search/activity', array(              'values' => array(                  'search' => $search, -                'controller' => 'search', +                'controller' => 'SearchController',                  'action' => 'activity',              ),              'title' => t('Search in activity stream').($nb_events > 0 ? ' ('.$nb_events.')' : ''), diff --git a/app/Controller/SubtaskController.php b/app/Controller/SubtaskController.php index 830548da..93dab5cd 100644 --- a/app/Controller/SubtaskController.php +++ b/app/Controller/SubtaskController.php @@ -36,7 +36,7 @@ class SubtaskController extends BaseController          $this->response->html($this->template->render('subtask/create', array(              'values' => $values,              'errors' => $errors, -            'users_list' => $this->projectUserRole->getAssignableUsersList($task['project_id']), +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($task['project_id']),              'task' => $task,          )));      } @@ -54,7 +54,7 @@ class SubtaskController extends BaseController          list($valid, $errors) = $this->subtaskValidator->validateCreation($values);          if ($valid) { -            if ($this->subtask->create($values)) { +            if ($this->subtaskModel->create($values) !== false) {                  $this->flash->success(t('Sub-task added successfully.'));              } else {                  $this->flash->failure(t('Unable to create your sub-task.')); @@ -64,7 +64,7 @@ class SubtaskController extends BaseController                  return $this->create(array('project_id' => $task['project_id'], 'task_id' => $task['id'], 'another_subtask' => 1));              } -            return $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id']), 'subtasks'), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id']), 'subtasks'), true);          }          return $this->create($values, $errors); @@ -87,8 +87,8 @@ class SubtaskController extends BaseController          $this->response->html($this->template->render('subtask/edit', array(              'values' => empty($values) ? $subtask : $values,              'errors' => $errors, -            'users_list' => $this->projectUserRole->getAssignableUsersList($task['project_id']), -            'status_list' => $this->subtask->getStatusList(), +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($task['project_id']), +            'status_list' => $this->subtaskModel->getStatusList(),              'subtask' => $subtask,              'task' => $task,          ))); @@ -108,13 +108,13 @@ class SubtaskController extends BaseController          list($valid, $errors) = $this->subtaskValidator->validateModification($values);          if ($valid) { -            if ($this->subtask->update($values)) { +            if ($this->subtaskModel->update($values)) {                  $this->flash->success(t('Sub-task updated successfully.'));              } else {                  $this->flash->failure(t('Unable to update your sub-task.'));              } -            return $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true);          }          return $this->edit($values, $errors); @@ -147,13 +147,13 @@ class SubtaskController extends BaseController          $task = $this->getTask();          $subtask = $this->getSubtask(); -        if ($this->subtask->remove($subtask['id'])) { +        if ($this->subtaskModel->remove($subtask['id'])) {              $this->flash->success(t('Sub-task removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this sub-task.'));          } -        $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true);      }      /** @@ -168,7 +168,7 @@ class SubtaskController extends BaseController          $values = $this->request->getJson();          if (! empty($values) && $this->helper->user->hasProjectAccess('SubtaskController', 'movePosition', $project_id)) { -            $result = $this->subtask->changePosition($task_id, $values['subtask_id'], $values['position']); +            $result = $this->subtaskModel->changePosition($task_id, $values['subtask_id'], $values['position']);              $this->response->json(array('result' => $result));          } else {              throw new AccessForbiddenException(); diff --git a/app/Controller/SubtaskConverterController.php b/app/Controller/SubtaskConverterController.php index 829b937a..65bcd2da 100644 --- a/app/Controller/SubtaskConverterController.php +++ b/app/Controller/SubtaskConverterController.php @@ -26,7 +26,7 @@ class SubtaskConverterController extends BaseController          $project = $this->getProject();          $subtask = $this->getSubtask(); -        $task_id = $this->subtask->convertToTask($project['id'], $subtask['id']); +        $task_id = $this->subtaskModel->convertToTask($project['id'], $subtask['id']);          if ($task_id !== false) {              $this->flash->success(t('Subtask converted to task successfully.')); @@ -34,6 +34,6 @@ class SubtaskConverterController extends BaseController              $this->flash->failure(t('Unable to convert the subtask.'));          } -        $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $project['id'], 'task_id' => $task_id)), true); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $project['id'], 'task_id' => $task_id)), true);      }  } diff --git a/app/Controller/SubtaskRestrictionController.php b/app/Controller/SubtaskRestrictionController.php index 185371e7..084fc0d9 100644 --- a/app/Controller/SubtaskRestrictionController.php +++ b/app/Controller/SubtaskRestrictionController.php @@ -2,7 +2,7 @@  namespace Kanboard\Controller; -use Kanboard\Model\Subtask as SubtaskModel; +use Kanboard\Model\SubtaskModel;  /**   * Subtask Restriction @@ -27,7 +27,7 @@ class SubtaskRestrictionController extends BaseController                  SubtaskModel::STATUS_TODO => t('Todo'),                  SubtaskModel::STATUS_DONE => t('Done'),              ), -            'subtask_inprogress' => $this->subtask->getSubtaskInProgress($this->userSession->getId()), +            'subtask_inprogress' => $this->subtaskModel->getSubtaskInProgress($this->userSession->getId()),              'subtask' => $subtask,              'task' => $task,          ))); @@ -45,17 +45,17 @@ class SubtaskRestrictionController extends BaseController          $values = $this->request->getValues();          // Change status of the previous "in progress" subtask -        $this->subtask->update(array( +        $this->subtaskModel->update(array(              'id' => $values['id'],              'status' => $values['status'],          ));          // Set the current subtask to "in progress" -        $this->subtask->update(array( +        $this->subtaskModel->update(array(              'id' => $subtask['id'],              'status' => SubtaskModel::STATUS_INPROGRESS,          )); -        $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true);      }  } diff --git a/app/Controller/SubtaskStatusController.php b/app/Controller/SubtaskStatusController.php index e24002dc..699951fe 100644 --- a/app/Controller/SubtaskStatusController.php +++ b/app/Controller/SubtaskStatusController.php @@ -20,7 +20,7 @@ class SubtaskStatusController extends BaseController          $task = $this->getTask();          $subtask = $this->getSubtask(); -        $status = $this->subtask->toggleStatus($subtask['id']); +        $status = $this->subtaskModel->toggleStatus($subtask['id']);          if ($this->request->getIntegerParam('refresh-table') === 0) {              $subtask['status'] = $status; @@ -44,10 +44,10 @@ class SubtaskStatusController extends BaseController          $timer = $this->request->getStringParam('timer');          if ($timer === 'start') { -            $this->subtaskTimeTracking->logStartTime($subtask_id, $this->userSession->getId()); +            $this->subtaskTimeTrackingModel->logStartTime($subtask_id, $this->userSession->getId());          } elseif ($timer === 'stop') { -            $this->subtaskTimeTracking->logEndTime($subtask_id, $this->userSession->getId()); -            $this->subtaskTimeTracking->updateTaskTimeTracking($task['id']); +            $this->subtaskTimeTrackingModel->logEndTime($subtask_id, $this->userSession->getId()); +            $this->subtaskTimeTrackingModel->updateTaskTimeTracking($task['id']);          }          $this->response->html($this->renderTable($task)); @@ -64,9 +64,8 @@ class SubtaskStatusController extends BaseController      {          return $this->template->render('subtask/table', array(              'task' => $task, -            'subtasks' => $this->subtask->getAll($task['id']), +            'subtasks' => $this->subtaskModel->getAll($task['id']),              'editable' => true, -            'redirect' => 'task',          ));      }  } diff --git a/app/Controller/Swimlane.php b/app/Controller/SwimlaneController.php index 4575e909..c7c20ce8 100644 --- a/app/Controller/Swimlane.php +++ b/app/Controller/SwimlaneController.php @@ -4,15 +4,15 @@ namespace Kanboard\Controller;  use Kanboard\Core\Controller\AccessForbiddenException;  use Kanboard\Core\Controller\PageNotFoundException; -use Kanboard\Model\Swimlane as SwimlaneModel; +use Kanboard\Model\SwimlaneModel;  /** - * Swimlanes + * Swimlanes Controller   * - * @package controller + * @package Kanboard\Controller   * @author  Frederic Guillot   */ -class Swimlane extends BaseController +class SwimlaneController extends BaseController  {      /**       * Get the swimlane (common method between actions) @@ -23,7 +23,7 @@ class Swimlane extends BaseController       */      private function getSwimlane()      { -        $swimlane = $this->swimlane->getById($this->request->getIntegerParam('swimlane_id')); +        $swimlane = $this->swimlaneModel->getById($this->request->getIntegerParam('swimlane_id'));          if (empty($swimlane)) {              throw new PageNotFoundException(); @@ -42,9 +42,9 @@ class Swimlane extends BaseController          $project = $this->getProject();          $this->response->html($this->helper->layout->project('swimlane/index', array( -            'default_swimlane' => $this->swimlane->getDefault($project['id']), -            'active_swimlanes' => $this->swimlane->getAllByStatus($project['id'], SwimlaneModel::ACTIVE), -            'inactive_swimlanes' => $this->swimlane->getAllByStatus($project['id'], SwimlaneModel::INACTIVE), +            'default_swimlane' => $this->swimlaneModel->getDefault($project['id']), +            'active_swimlanes' => $this->swimlaneModel->getAllByStatus($project['id'], SwimlaneModel::ACTIVE), +            'inactive_swimlanes' => $this->swimlaneModel->getAllByStatus($project['id'], SwimlaneModel::INACTIVE),              'project' => $project,              'title' => t('Swimlanes')          ))); @@ -81,9 +81,9 @@ class Swimlane extends BaseController          list($valid, $errors) = $this->swimlaneValidator->validateCreation($values);          if ($valid) { -            if ($this->swimlane->create($values)) { +            if ($this->swimlaneModel->create($values) !== false) {                  $this->flash->success(t('Your swimlane have been created successfully.')); -                return $this->response->redirect($this->helper->url->to('swimlane', 'index', array('project_id' => $project['id']))); +                return $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));              } else {                  $errors = array('name' => array(t('Another swimlane with the same name exists in the project')));              } @@ -103,7 +103,7 @@ class Swimlane extends BaseController      public function editDefault(array $values = array(), array $errors = array())      {          $project = $this->getProject(); -        $swimlane = $this->swimlane->getDefault($project['id']); +        $swimlane = $this->swimlaneModel->getDefault($project['id']);          $this->response->html($this->helper->layout->project('swimlane/edit_default', array(              'values' => empty($values) ? $swimlane : $values, @@ -125,9 +125,9 @@ class Swimlane extends BaseController          list($valid, $errors) = $this->swimlaneValidator->validateDefaultModification($values);          if ($valid) { -            if ($this->swimlane->updateDefault($values)) { +            if ($this->swimlaneModel->updateDefault($values)) {                  $this->flash->success(t('The default swimlane have been updated successfully.')); -                return $this->response->redirect($this->helper->url->to('swimlane', 'index', array('project_id' => $project['id'])), true); +                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.'));              } @@ -169,9 +169,9 @@ class Swimlane extends BaseController          list($valid, $errors) = $this->swimlaneValidator->validateModification($values);          if ($valid) { -            if ($this->swimlane->update($values)) { +            if ($this->swimlaneModel->update($values)) {                  $this->flash->success(t('Swimlane updated successfully.')); -                return $this->response->redirect($this->helper->url->to('swimlane', 'index', array('project_id' => $project['id']))); +                return $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));              } else {                  $errors = array('name' => array(t('Another swimlane with the same name exists in the project')));              } @@ -207,13 +207,13 @@ class Swimlane extends BaseController          $project = $this->getProject();          $swimlane_id = $this->request->getIntegerParam('swimlane_id'); -        if ($this->swimlane->remove($project['id'], $swimlane_id)) { +        if ($this->swimlaneModel->remove($project['id'], $swimlane_id)) {              $this->flash->success(t('Swimlane removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this swimlane.'));          } -        $this->response->redirect($this->helper->url->to('swimlane', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));      }      /** @@ -227,13 +227,13 @@ class Swimlane extends BaseController          $project = $this->getProject();          $swimlane_id = $this->request->getIntegerParam('swimlane_id'); -        if ($this->swimlane->disable($project['id'], $swimlane_id)) { +        if ($this->swimlaneModel->disable($project['id'], $swimlane_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('swimlane', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));      }      /** @@ -246,13 +246,13 @@ class Swimlane extends BaseController          $this->checkCSRFParam();          $project = $this->getProject(); -        if ($this->swimlane->disableDefault($project['id'])) { +        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('swimlane', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));      }      /** @@ -266,13 +266,13 @@ class Swimlane extends BaseController          $project = $this->getProject();          $swimlane_id = $this->request->getIntegerParam('swimlane_id'); -        if ($this->swimlane->enable($project['id'], $swimlane_id)) { +        if ($this->swimlaneModel->enable($project['id'], $swimlane_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('swimlane', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));      }      /** @@ -285,13 +285,13 @@ class Swimlane extends BaseController          $this->checkCSRFParam();          $project = $this->getProject(); -        if ($this->swimlane->enableDefault($project['id'])) { +        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('swimlane', 'index', array('project_id' => $project['id']))); +        $this->response->redirect($this->helper->url->to('SwimlaneController', 'index', array('project_id' => $project['id'])));      }      /** @@ -305,7 +305,7 @@ class Swimlane extends BaseController          $values = $this->request->getJson();          if (! empty($values) && isset($values['swimlane_id']) && isset($values['position'])) { -            $result = $this->swimlane->changePosition($project['id'], $values['swimlane_id'], $values['position']); +            $result = $this->swimlaneModel->changePosition($project['id'], $values['swimlane_id'], $values['position']);              $this->response->json(array('result' => $result));          } else {              throw new AccessForbiddenException(); diff --git a/app/Controller/TaskHelper.php b/app/Controller/TaskAjaxController.php index 2f14c0eb..f9feff15 100644 --- a/app/Controller/TaskHelper.php +++ b/app/Controller/TaskAjaxController.php @@ -9,12 +9,12 @@ use Kanboard\Filter\TaskTitleFilter;  use Kanboard\Formatter\TaskAutoCompleteFormatter;  /** - * Task Ajax Helper + * Task Ajax Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class TaskHelper extends BaseController +class TaskAjaxController extends BaseController  {      /**       * Task auto-completion (Ajax) @@ -24,7 +24,7 @@ class TaskHelper extends BaseController      public function autocomplete()      {          $search = $this->request->getStringParam('term'); -        $project_ids = $this->projectPermission->getActiveProjectIds($this->userSession->getId()); +        $project_ids = $this->projectPermissionModel->getActiveProjectIds($this->userSession->getId());          $exclude_task_id = $this->request->getIntegerParam('exclude_task_id');          if (empty($project_ids)) { diff --git a/app/Controller/TaskBulkController.php b/app/Controller/TaskBulkController.php index 4b4a2594..df7f589b 100644 --- a/app/Controller/TaskBulkController.php +++ b/app/Controller/TaskBulkController.php @@ -6,6 +6,7 @@ namespace Kanboard\Controller;   * Class TaskBulkController   *   * @package Kanboard\Controller + * @author  Frederic Guillot   */  class TaskBulkController extends BaseController  { @@ -31,9 +32,9 @@ class TaskBulkController extends BaseController              'project' => $project,              'values' => $values,              'errors' => $errors, -            'users_list' => $this->projectUserRole->getAssignableUsersList($project['id'], true, false, true), -            'colors_list' => $this->color->getList(), -            'categories_list' => $this->category->getList($project['id']), +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($project['id'], true, false, true), +            'colors_list' => $this->colorModel->getList(), +            'categories_list' => $this->categoryModel->getList($project['id']),          )));      } @@ -49,7 +50,7 @@ class TaskBulkController extends BaseController          if ($valid) {              $this->createTasks($project, $values);              $this->response->redirect($this->helper->url->to( -                'Board', +                'BoardViewController',                  'show',                  array('project_id' => $project['id']),                  'swimlane-'. $values['swimlane_id'] @@ -73,7 +74,7 @@ class TaskBulkController extends BaseController              $title = trim($title);              if (! empty($title)) { -                $this->taskCreation->create(array( +                $this->taskCreationModel->create(array(                      'title' => $title,                      'column_id' => $values['column_id'],                      'swimlane_id' => $values['swimlane_id'], diff --git a/app/Controller/TaskCreationController.php b/app/Controller/TaskCreationController.php index 2a63ddcc..819de96e 100644 --- a/app/Controller/TaskCreationController.php +++ b/app/Controller/TaskCreationController.php @@ -21,13 +21,13 @@ class TaskCreationController extends BaseController      public function show(array $values = array(), array $errors = array())      {          $project = $this->getProject(); -        $swimlanes_list = $this->swimlane->getList($project['id'], false, true); +        $swimlanes_list = $this->swimlaneModel->getList($project['id'], false, true);          if (empty($values)) {              $values = array(                  'swimlane_id' => $this->request->getIntegerParam('swimlane_id', key($swimlanes_list)),                  'column_id' => $this->request->getIntegerParam('column_id'), -                'color_id' => $this->color->getDefaultColor(), +                'color_id' => $this->colorModel->getDefaultColor(),                  'owner_id' => $this->userSession->getId(),              ); @@ -39,10 +39,10 @@ class TaskCreationController extends BaseController              'project' => $project,              'errors' => $errors,              'values' => $values + array('project_id' => $project['id']), -            'columns_list' => $this->column->getList($project['id']), -            'users_list' => $this->projectUserRole->getAssignableUsersList($project['id'], true, false, true), -            'colors_list' => $this->color->getList(), -            'categories_list' => $this->category->getList($project['id']), +            'columns_list' => $this->columnModel->getList($project['id']), +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($project['id'], true, false, true), +            'colors_list' => $this->colorModel->getList(), +            'categories_list' => $this->categoryModel->getList($project['id']),              'swimlanes_list' => $swimlanes_list,              'title' => $project['name'].' > '.t('New task')          ))); @@ -60,7 +60,7 @@ class TaskCreationController extends BaseController          list($valid, $errors) = $this->taskValidator->validateCreation($values); -        if ($valid && $this->taskCreation->create($values)) { +        if ($valid && $this->taskCreationModel->create($values)) {              $this->flash->success(t('Task created successfully.'));              return $this->afterSave($project, $values);          } @@ -82,6 +82,6 @@ class TaskCreationController extends BaseController              ));          } -        return $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $project['id'])), true); +        return $this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id'])), true);      }  } diff --git a/app/Controller/Taskduplication.php b/app/Controller/TaskDuplicationController.php index ff60228e..6a475374 100644 --- a/app/Controller/Taskduplication.php +++ b/app/Controller/TaskDuplicationController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Task Duplication controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Taskduplication extends BaseController +class TaskDuplicationController extends BaseController  {      /**       * Duplicate a task @@ -21,14 +21,14 @@ class Taskduplication extends BaseController          if ($this->request->getStringParam('confirmation') === 'yes') {              $this->checkCSRFParam(); -            $task_id = $this->taskDuplication->duplicate($task['id']); +            $task_id = $this->taskDuplicationModel->duplicate($task['id']);              if ($task_id > 0) {                  $this->flash->success(t('Task created successfully.')); -                return $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task_id))); +                return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task_id)));              } else {                  $this->flash->failure(t('Unable to create this task.')); -                return $this->response->redirect($this->helper->url->to('taskduplication', 'duplicate', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true); +                return $this->response->redirect($this->helper->url->to('TaskDuplicationController', 'duplicate', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true);              }          } @@ -50,14 +50,14 @@ class Taskduplication extends BaseController              $values = $this->request->getValues();              list($valid, ) = $this->taskValidator->validateProjectModification($values); -            if ($valid && $this->taskDuplication->moveToProject($task['id'], +            if ($valid && $this->taskDuplicationModel->moveToProject($task['id'],                                                                  $values['project_id'],                                                                  $values['swimlane_id'],                                                                  $values['column_id'],                                                                  $values['category_id'],                                                                  $values['owner_id'])) {                  $this->flash->success(t('Task updated successfully.')); -                return $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $values['project_id'], 'task_id' => $task['id']))); +                return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $values['project_id'], 'task_id' => $task['id'])));              }              $this->flash->failure(t('Unable to update your task.')); @@ -80,14 +80,14 @@ class Taskduplication extends BaseController              list($valid, ) = $this->taskValidator->validateProjectModification($values);              if ($valid) { -                $task_id = $this->taskDuplication->duplicateToProject( +                $task_id = $this->taskDuplicationModel->duplicateToProject(                      $task['id'], $values['project_id'], $values['swimlane_id'],                      $values['column_id'], $values['category_id'], $values['owner_id']                  );                  if ($task_id > 0) {                      $this->flash->success(t('Task created successfully.')); -                    return $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $values['project_id'], 'task_id' => $task_id))); +                    return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $values['project_id'], 'task_id' => $task_id)));                  }              } @@ -107,19 +107,19 @@ class Taskduplication extends BaseController      private function chooseDestination(array $task, $template)      {          $values = array(); -        $projects_list = $this->projectUserRole->getActiveProjectsByUser($this->userSession->getId()); +        $projects_list = $this->projectUserRoleModel->getActiveProjectsByUser($this->userSession->getId());          unset($projects_list[$task['project_id']]);          if (! empty($projects_list)) {              $dst_project_id = $this->request->getIntegerParam('dst_project_id', key($projects_list)); -            $swimlanes_list = $this->swimlane->getList($dst_project_id, false, true); -            $columns_list = $this->column->getList($dst_project_id); -            $categories_list = $this->category->getList($dst_project_id); -            $users_list = $this->projectUserRole->getAssignableUsersList($dst_project_id); +            $swimlanes_list = $this->swimlaneModel->getList($dst_project_id, false, true); +            $columns_list = $this->columnModel->getList($dst_project_id); +            $categories_list = $this->categoryModel->getList($dst_project_id); +            $users_list = $this->projectUserRoleModel->getAssignableUsersList($dst_project_id); -            $values = $this->taskDuplication->checkDestinationProjectValues($task); +            $values = $this->taskDuplicationModel->checkDestinationProjectValues($task);              $values['project_id'] = $dst_project_id;          } else {              $swimlanes_list = array(); diff --git a/app/Controller/TaskExternalLink.php b/app/Controller/TaskExternalLinkController.php index 9f040957..9c04eb00 100644 --- a/app/Controller/TaskExternalLink.php +++ b/app/Controller/TaskExternalLinkController.php @@ -8,10 +8,10 @@ use Kanboard\Core\ExternalLink\ExternalLinkProviderNotFound;  /**   * Task External Link Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class TaskExternalLink extends BaseController +class TaskExternalLinkController extends BaseController  {      /**       * First creation form @@ -76,9 +76,9 @@ class TaskExternalLink extends BaseController          $values = $this->request->getValues();          list($valid, $errors) = $this->externalLinkValidator->validateCreation($values); -        if ($valid && $this->taskExternalLink->create($values)) { +        if ($valid && $this->taskExternalLinkModel->create($values) !== false) {              $this->flash->success(t('Link added successfully.')); -            return $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true);          }          return $this->edit($values, $errors); @@ -100,7 +100,7 @@ class TaskExternalLink extends BaseController          $link_id = $this->request->getIntegerParam('link_id');          if ($link_id > 0) { -            $values = $this->taskExternalLink->getById($link_id); +            $values = $this->taskExternalLinkModel->getById($link_id);          }          if (empty($values)) { @@ -128,9 +128,9 @@ class TaskExternalLink extends BaseController          $values = $this->request->getValues();          list($valid, $errors) = $this->externalLinkValidator->validateModification($values); -        if ($valid && $this->taskExternalLink->update($values)) { +        if ($valid && $this->taskExternalLinkModel->update($values)) {              $this->flash->success(t('Link updated successfully.')); -            return $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true);          }          return $this->edit($values, $errors); @@ -145,7 +145,7 @@ class TaskExternalLink extends BaseController      {          $task = $this->getTask();          $link_id = $this->request->getIntegerParam('link_id'); -        $link = $this->taskExternalLink->getById($link_id); +        $link = $this->taskExternalLinkModel->getById($link_id);          if (empty($link)) {              throw new PageNotFoundException(); @@ -167,12 +167,12 @@ class TaskExternalLink extends BaseController          $this->checkCSRFParam();          $task = $this->getTask(); -        if ($this->taskExternalLink->remove($this->request->getIntegerParam('link_id'))) { +        if ($this->taskExternalLinkModel->remove($this->request->getIntegerParam('link_id'))) {              $this->flash->success(t('Link removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this link.'));          } -        $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])));      }  } diff --git a/app/Controller/TaskFile.php b/app/Controller/TaskFileController.php index 0fcd2d69..77c0c026 100644 --- a/app/Controller/TaskFile.php +++ b/app/Controller/TaskFileController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Task File Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class TaskFile extends BaseController +class TaskFileController extends BaseController  {      /**       * Screenshot @@ -19,9 +19,9 @@ class TaskFile extends BaseController      {          $task = $this->getTask(); -        if ($this->request->isPost() && $this->taskFile->uploadScreenshot($task['id'], $this->request->getValue('screenshot')) !== false) { +        if ($this->request->isPost() && $this->taskFileModel->uploadScreenshot($task['id'], $this->request->getValue('screenshot')) !== false) {              $this->flash->success(t('Screenshot uploaded successfully.')); -            return $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true);          }          return $this->response->html($this->template->render('task_file/screenshot', array( @@ -53,11 +53,11 @@ class TaskFile extends BaseController      {          $task = $this->getTask(); -        if (! $this->taskFile->uploadFiles($task['id'], $this->request->getFileInfo('files'))) { +        if (! $this->taskFileModel->uploadFiles($task['id'], $this->request->getFileInfo('files'))) {              $this->flash->failure(t('Unable to upload the file.'));          } -        $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true);      }      /** @@ -69,15 +69,15 @@ class TaskFile extends BaseController      {          $this->checkCSRFParam();          $task = $this->getTask(); -        $file = $this->taskFile->getById($this->request->getIntegerParam('file_id')); +        $file = $this->taskFileModel->getById($this->request->getIntegerParam('file_id')); -        if ($file['task_id'] == $task['id'] && $this->taskFile->remove($file['id'])) { +        if ($file['task_id'] == $task['id'] && $this->taskFileModel->remove($file['id'])) {              $this->flash->success(t('File removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this file.'));          } -        $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])));      }      /** @@ -88,7 +88,7 @@ class TaskFile extends BaseController      public function confirm()      {          $task = $this->getTask(); -        $file = $this->taskFile->getById($this->request->getIntegerParam('file_id')); +        $file = $this->taskFileModel->getById($this->request->getIntegerParam('file_id'));          $this->response->html($this->template->render('task_file/remove', array(              'task' => $task, diff --git a/app/Controller/TaskGanttController.php b/app/Controller/TaskGanttController.php new file mode 100644 index 00000000..868368e1 --- /dev/null +++ b/app/Controller/TaskGanttController.php @@ -0,0 +1,62 @@ +<?php + +namespace Kanboard\Controller; + +use Kanboard\Filter\TaskProjectFilter; +use Kanboard\Formatter\TaskGanttFormatter; +use Kanboard\Model\TaskModel; + +/** + * Tasks Gantt Controller + * + * @package  Kanboard\Controller + * @author   Frederic Guillot + */ +class TaskGanttController extends BaseController +{ +    /** +     * Show Gantt chart for one project +     */ +    public function show() +    { +        $project = $this->getProject(); +        $search = $this->helper->projectHeader->getSearchQuery($project); +        $sorting = $this->request->getStringParam('sorting', 'board'); +        $filter = $this->taskLexer->build($search)->withFilter(new TaskProjectFilter($project['id'])); + +        if ($sorting === 'date') { +            $filter->getQuery()->asc(TaskModel::TABLE.'.date_started')->asc(TaskModel::TABLE.'.date_creation'); +        } else { +            $filter->getQuery()->asc('column_position')->asc(TaskModel::TABLE.'.position'); +        } + +        $this->response->html($this->helper->layout->app('task_gantt/show', array( +            'project' => $project, +            'title' => $project['name'], +            'description' => $this->helper->projectHeader->getDescription($project), +            'sorting' => $sorting, +            'tasks' => $filter->format(new TaskGanttFormatter($this->container)), +        ))); +    } + +    /** +     * Save new task start date and due date +     */ +    public function save() +    { +        $this->getProject(); +        $values = $this->request->getJson(); + +        $result = $this->taskModificationModel->update(array( +            'id' => $values['id'], +            'date_started' => strtotime($values['start']), +            'date_due' => strtotime($values['end']), +        )); + +        if (! $result) { +            $this->response->json(array('message' => 'Unable to save task'), 400); +        } else { +            $this->response->json(array('message' => 'OK'), 201); +        } +    } +} diff --git a/app/Controller/TaskGanttCreationController.php b/app/Controller/TaskGanttCreationController.php new file mode 100644 index 00000000..c2998a3e --- /dev/null +++ b/app/Controller/TaskGanttCreationController.php @@ -0,0 +1,71 @@ +<?php + +namespace Kanboard\Controller; + +/** + * Class TaskGanttCreationController + * + * @package Kanboard\Controller + * @author  Frederic Guillot + */ +class TaskGanttCreationController extends BaseController +{ +    /** +     * Simplified form to create a new task +     * +     * @access public +     * @param  array $values +     * @param  array $errors +     * @throws \Kanboard\Core\Controller\PageNotFoundException +     */ +    public function show(array $values = array(), array $errors = array()) +    { +        $project = $this->getProject(); + +        $values = $values + array( +                'project_id' => $project['id'], +                'column_id' => $this->columnModel->getFirstColumnId($project['id']), +                'position' => 1 +            ); + +        $values = $this->hook->merge('controller:task:form:default', $values, array('default_values' => $values)); +        $values = $this->hook->merge('controller:gantt:task:form:default', $values, array('default_values' => $values)); + +        $this->response->html($this->template->render('task_gantt_creation/show', array( +            'project' => $project, +            'errors' => $errors, +            'values' => $values, +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($project['id'], true, false, true), +            'colors_list' => $this->colorModel->getList(), +            'categories_list' => $this->categoryModel->getList($project['id']), +            'swimlanes_list' => $this->swimlaneModel->getList($project['id'], false, true), +            'title' => $project['name'].' > '.t('New task') +        ))); +    } + +    /** +     * Validate and save a new task +     * +     * @access public +     */ +    public function save() +    { +        $project = $this->getProject(); +        $values = $this->request->getValues(); + +        list($valid, $errors) = $this->taskValidator->validateCreation($values); + +        if ($valid) { +            $task_id = $this->taskCreationModel->create($values); + +            if ($task_id !== false) { +                $this->flash->success(t('Task created successfully.')); +                return $this->response->redirect($this->helper->url->to('TaskGanttController', 'show', array('project_id' => $project['id']))); +            } else { +                $this->flash->failure(t('Unable to create your task.')); +            } +        } + +        return $this->show($values, $errors); +    } +} diff --git a/app/Controller/TaskImport.php b/app/Controller/TaskImportController.php index 5e37fb2f..aff2d390 100644 --- a/app/Controller/TaskImport.php +++ b/app/Controller/TaskImportController.php @@ -7,10 +7,10 @@ use Kanboard\Core\Csv;  /**   * Task Import controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class TaskImport extends BaseController +class TaskImportController extends BaseController  {      /**       * Upload the file and ask settings @@ -19,11 +19,11 @@ class TaskImport extends BaseController       * @param array $errors       * @throws \Kanboard\Core\Controller\PageNotFoundException       */ -    public function step1(array $values = array(), array $errors = array()) +    public function show(array $values = array(), array $errors = array())      {          $project = $this->getProject(); -        $this->response->html($this->helper->layout->project('task_import/step1', array( +        $this->response->html($this->helper->layout->project('task_import/show', array(              'project' => $project,              'values' => $values,              'errors' => $errors, @@ -31,36 +31,35 @@ class TaskImport extends BaseController              'delimiters' => Csv::getDelimiters(),              'enclosures' => Csv::getEnclosures(),              'title' => t('Import tasks from CSV file'), -        ))); +        ), 'task_import/sidebar'));      }      /**       * Process CSV file -     *       */ -    public function step2() +    public function save()      {          $project = $this->getProject();          $values = $this->request->getValues();          $filename = $this->request->getFilePath('file');          if (! file_exists($filename)) { -            $this->step1($values, array('file' => array(t('Unable to read your file')))); -        } +            $this->show($values, array('file' => array(t('Unable to read your file')))); +        } else { +            $this->taskImport->projectId = $project['id']; -        $this->taskImport->projectId = $project['id']; +            $csv = new Csv($values['delimiter'], $values['enclosure']); +            $csv->setColumnMapping($this->taskImport->getColumnMapping()); +            $csv->read($filename, array($this->taskImport, 'import')); -        $csv = new Csv($values['delimiter'], $values['enclosure']); -        $csv->setColumnMapping($this->taskImport->getColumnMapping()); -        $csv->read($filename, array($this->taskImport, 'import')); +            if ($this->taskImport->counter > 0) { +                $this->flash->success(t('%d task(s) have been imported successfully.', $this->taskImport->counter)); +            } else { +                $this->flash->failure(t('Nothing have been imported!')); +            } -        if ($this->taskImport->counter > 0) { -            $this->flash->success(t('%d task(s) have been imported successfully.', $this->taskImport->counter)); -        } else { -            $this->flash->failure(t('Nothing have been imported!')); +            $this->response->redirect($this->helper->url->to('TaskImportController', 'show', array('project_id' => $project['id'])));          } - -        $this->response->redirect($this->helper->url->to('taskImport', 'step1', array('project_id' => $project['id'])));      }      /** diff --git a/app/Controller/TaskInternalLink.php b/app/Controller/TaskInternalLinkController.php index 6ff20252..a140f1ff 100644 --- a/app/Controller/TaskInternalLink.php +++ b/app/Controller/TaskInternalLinkController.php @@ -7,11 +7,11 @@ use Kanboard\Core\Controller\PageNotFoundException;  /**   * TaskInternalLink Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Olivier Maridat   * @author   Frederic Guillot   */ -class TaskInternalLink extends BaseController +class TaskInternalLinkController extends BaseController  {      /**       * Get the current link @@ -22,7 +22,7 @@ class TaskInternalLink extends BaseController       */      private function getTaskLink()      { -        $link = $this->taskLink->getById($this->request->getIntegerParam('link_id')); +        $link = $this->taskLinkModel->getById($this->request->getIntegerParam('link_id'));          if (empty($link)) {              throw new PageNotFoundException(); @@ -48,7 +48,7 @@ class TaskInternalLink extends BaseController              'values' => $values,              'errors' => $errors,              'task' => $task, -            'labels' => $this->link->getList(0, false), +            'labels' => $this->linkModel->getList(0, false),          )));      } @@ -65,9 +65,9 @@ class TaskInternalLink extends BaseController          list($valid, $errors) = $this->taskLinkValidator->validateCreation($values);          if ($valid) { -            if ($this->taskLink->create($values['task_id'], $values['opposite_task_id'], $values['link_id'])) { +            if ($this->taskLinkModel->create($values['task_id'], $values['opposite_task_id'], $values['link_id'])) {                  $this->flash->success(t('Link added successfully.')); -                return $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); +                return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true);              }              $errors = array('title' => array(t('The exact same link already exists'))); @@ -92,7 +92,7 @@ class TaskInternalLink extends BaseController          $task_link = $this->getTaskLink();          if (empty($values)) { -            $opposite_task = $this->taskFinder->getById($task_link['opposite_task_id']); +            $opposite_task = $this->taskFinderModel->getById($task_link['opposite_task_id']);              $values = $task_link;              $values['title'] = '#'.$opposite_task['id'].' - '.$opposite_task['title'];          } @@ -102,7 +102,7 @@ class TaskInternalLink extends BaseController              'errors' => $errors,              'task_link' => $task_link,              'task' => $task, -            'labels' => $this->link->getList(0, false) +            'labels' => $this->linkModel->getList(0, false)          )));      } @@ -119,9 +119,9 @@ class TaskInternalLink extends BaseController          list($valid, $errors) = $this->taskLinkValidator->validateModification($values);          if ($valid) { -            if ($this->taskLink->update($values['id'], $values['task_id'], $values['opposite_task_id'], $values['link_id'])) { +            if ($this->taskLinkModel->update($values['id'], $values['task_id'], $values['opposite_task_id'], $values['link_id'])) {                  $this->flash->success(t('Link updated successfully.')); -                return $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])).'#links'); +                return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])).'#links');              }              $this->flash->failure(t('Unable to update your link.')); @@ -156,12 +156,12 @@ class TaskInternalLink extends BaseController          $this->checkCSRFParam();          $task = $this->getTask(); -        if ($this->taskLink->remove($this->request->getIntegerParam('link_id'))) { +        if ($this->taskLinkModel->remove($this->request->getIntegerParam('link_id'))) {              $this->flash->success(t('Link removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this link.'));          } -        $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']))); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])));      }  } diff --git a/app/Controller/Listing.php b/app/Controller/TaskListController.php index 93a7b836..c6d1fa92 100644 --- a/app/Controller/Listing.php +++ b/app/Controller/TaskListController.php @@ -3,15 +3,15 @@  namespace Kanboard\Controller;  use Kanboard\Filter\TaskProjectFilter; -use Kanboard\Model\Task as TaskModel; +use Kanboard\Model\TaskModel;  /** - * List view controller + * Task List Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Listing extends BaseController +class TaskListController extends BaseController  {      /**       * Show list view for projects @@ -24,7 +24,7 @@ class Listing extends BaseController          $search = $this->helper->projectHeader->getSearchQuery($project);          $paginator = $this->paginator -            ->setUrl('listing', 'show', array('project_id' => $project['id'])) +            ->setUrl('TaskListController', 'show', array('project_id' => $project['id']))              ->setMax(30)              ->setOrder(TaskModel::TABLE.'.id')              ->setDirection('DESC') @@ -35,7 +35,7 @@ class Listing extends BaseController              )              ->calculate(); -        $this->response->html($this->helper->layout->app('listing/show', array( +        $this->response->html($this->helper->layout->app('task_list/show', array(              'project' => $project,              'title' => $project['name'],              'description' => $this->helper->projectHeader->getDescription($project), diff --git a/app/Controller/Taskmodification.php b/app/Controller/TaskModificationController.php index e8eafe20..fc9113dd 100644 --- a/app/Controller/Taskmodification.php +++ b/app/Controller/TaskModificationController.php @@ -7,10 +7,10 @@ use Kanboard\Core\DateParser;  /**   * Task Modification controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Taskmodification extends BaseController +class TaskModificationController extends BaseController  {      /**       * Set automatically the start date @@ -20,8 +20,8 @@ class Taskmodification extends BaseController      public function start()      {          $task = $this->getTask(); -        $this->taskModification->update(array('id' => $task['id'], 'date_started' => time())); -        $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id']))); +        $this->taskModificationModel->update(array('id' => $task['id'], 'date_started' => time())); +        $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])));      }      /** @@ -61,13 +61,13 @@ class Taskmodification extends BaseController          list($valid, $errors) = $this->taskValidator->validateDescriptionCreation($values);          if ($valid) { -            if ($this->taskModification->update($values)) { +            if ($this->taskModificationModel->update($values)) {                  $this->flash->success(t('Task updated successfully.'));              } else {                  $this->flash->failure(t('Unable to update your task.'));              } -            return $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true);          }          return $this->description($values, $errors); @@ -85,7 +85,7 @@ class Taskmodification extends BaseController      public function edit(array $values = array(), array $errors = array())      {          $task = $this->getTask(); -        $project = $this->project->getById($task['project_id']); +        $project = $this->projectModel->getById($task['project_id']);          if (empty($values)) {              $values = $task; @@ -93,17 +93,17 @@ class Taskmodification extends BaseController              $values = $this->hook->merge('controller:task-modification:form:default', $values, array('default_values' => $values));          } -        $values = $this->dateParser->format($values, array('date_due'), $this->config->get('application_date_format', DateParser::DATE_FORMAT)); -        $values = $this->dateParser->format($values, array('date_started'), $this->config->get('application_datetime_format', DateParser::DATE_TIME_FORMAT)); +        $values = $this->dateParser->format($values, array('date_due'), $this->configModel->get('application_date_format', DateParser::DATE_FORMAT)); +        $values = $this->dateParser->format($values, array('date_started'), $this->configModel->get('application_datetime_format', DateParser::DATE_TIME_FORMAT));          $this->response->html($this->template->render('task_modification/edit_task', array(              'project' => $project,              'values' => $values,              'errors' => $errors,              'task' => $task, -            'users_list' => $this->projectUserRole->getAssignableUsersList($task['project_id']), -            'colors_list' => $this->color->getList(), -            'categories_list' => $this->category->getList($task['project_id']), +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($task['project_id']), +            'colors_list' => $this->colorModel->getList(), +            'categories_list' => $this->categoryModel->getList($task['project_id']),          )));      } @@ -119,9 +119,9 @@ class Taskmodification extends BaseController          list($valid, $errors) = $this->taskValidator->validateModification($values); -        if ($valid && $this->taskModification->update($values)) { +        if ($valid && $this->taskModificationModel->update($values)) {              $this->flash->success(t('Task updated successfully.')); -            $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true); +            $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true);          } else {              $this->flash->failure(t('Unable to update your task.'));              $this->edit($values, $errors); diff --git a/app/Controller/TaskPopover.php b/app/Controller/TaskPopoverController.php index 0e47cffe..bf4e23d5 100644 --- a/app/Controller/TaskPopover.php +++ b/app/Controller/TaskPopoverController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Task Popover   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class TaskPopover extends BaseController +class TaskPopoverController extends BaseController  {      /**       * Change a task assignee directly from the board @@ -18,11 +18,11 @@ class TaskPopover extends BaseController      public function changeAssignee()      {          $task = $this->getTask(); -        $project = $this->project->getById($task['project_id']); +        $project = $this->projectModel->getById($task['project_id']);          $this->response->html($this->template->render('task_popover/change_assignee', array(              'values'     => $task, -            'users_list' => $this->projectUserRole->getAssignableUsersList($project['id']), +            'users_list' => $this->projectUserRoleModel->getAssignableUsersList($project['id']),              'project'    => $project,          )));      } @@ -38,13 +38,13 @@ class TaskPopover extends BaseController          list($valid,) = $this->taskValidator->validateAssigneeModification($values); -        if ($valid && $this->taskModification->update($values)) { +        if ($valid && $this->taskModificationModel->update($values)) {              $this->flash->success(t('Task updated successfully.'));          } else {              $this->flash->failure(t('Unable to update your task.'));          } -        $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $values['project_id'])), true); +        $this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $values['project_id'])), true);      }      /** @@ -55,11 +55,11 @@ class TaskPopover extends BaseController      public function changeCategory()      {          $task = $this->getTask(); -        $project = $this->project->getById($task['project_id']); +        $project = $this->projectModel->getById($task['project_id']);          $this->response->html($this->template->render('task_popover/change_category', array(              'values'          => $task, -            'categories_list' => $this->category->getList($project['id']), +            'categories_list' => $this->categoryModel->getList($project['id']),              'project'         => $project,          )));      } @@ -75,13 +75,13 @@ class TaskPopover extends BaseController          list($valid,) = $this->taskValidator->validateCategoryModification($values); -        if ($valid && $this->taskModification->update($values)) { +        if ($valid && $this->taskModificationModel->update($values)) {              $this->flash->success(t('Task updated successfully.'));          } else {              $this->flash->failure(t('Unable to update your task.'));          } -        $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $values['project_id'])), true); +        $this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $values['project_id'])), true);      }      /** diff --git a/app/Controller/TaskRecurrence.php b/app/Controller/TaskRecurrenceController.php index 72dce3a5..dc7a0e1b 100644 --- a/app/Controller/TaskRecurrence.php +++ b/app/Controller/TaskRecurrenceController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Task Recurrence controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class TaskRecurrence extends BaseController +class TaskRecurrenceController extends BaseController  {      /**       * Edit recurrence form @@ -31,10 +31,10 @@ class TaskRecurrence extends BaseController              'values' => $values,              'errors' => $errors,              'task' => $task, -            'recurrence_status_list' => $this->task->getRecurrenceStatusList(), -            'recurrence_trigger_list' => $this->task->getRecurrenceTriggerList(), -            'recurrence_timeframe_list' => $this->task->getRecurrenceTimeframeList(), -            'recurrence_basedate_list' => $this->task->getRecurrenceBasedateList(), +            'recurrence_status_list' => $this->taskModel->getRecurrenceStatusList(), +            'recurrence_trigger_list' => $this->taskModel->getRecurrenceTriggerList(), +            'recurrence_timeframe_list' => $this->taskModel->getRecurrenceTimeframeList(), +            'recurrence_basedate_list' => $this->taskModel->getRecurrenceBasedateList(),          )));      } @@ -51,13 +51,13 @@ class TaskRecurrence extends BaseController          list($valid, $errors) = $this->taskValidator->validateEditRecurrence($values);          if ($valid) { -            if ($this->taskModification->update($values)) { +            if ($this->taskModificationModel->update($values)) {                  $this->flash->success(t('Task updated successfully.'));              } else {                  $this->flash->failure(t('Unable to update your task.'));              } -            return $this->response->redirect($this->helper->url->to('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), true);          }          return $this->edit($values, $errors); diff --git a/app/Controller/Taskstatus.php b/app/Controller/TaskStatusController.php index eeaf8513..82b4f9c4 100644 --- a/app/Controller/Taskstatus.php +++ b/app/Controller/TaskStatusController.php @@ -5,10 +5,10 @@ namespace Kanboard\Controller;  /**   * Task Status controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Taskstatus extends BaseController +class TaskStatusController extends BaseController  {      /**       * Close a task @@ -46,13 +46,13 @@ class Taskstatus extends BaseController          if ($this->request->getStringParam('confirmation') === 'yes') {              $this->checkCSRFParam(); -            if ($this->taskStatus->$method($task['id'])) { +            if ($this->taskStatusModel->$method($task['id'])) {                  $this->flash->success($success_message);              } else {                  $this->flash->failure($failure_message);              } -            return $this->response->redirect($this->helper->url->to('task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true); +            return $this->response->redirect($this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id'])), true);          }          return $this->response->html($this->template->render($template, array( diff --git a/app/Controller/TaskSuppressionController.php b/app/Controller/TaskSuppressionController.php new file mode 100644 index 00000000..600107c9 --- /dev/null +++ b/app/Controller/TaskSuppressionController.php @@ -0,0 +1,53 @@ +<?php + +namespace Kanboard\Controller; + +use Kanboard\Core\Controller\AccessForbiddenException; + +/** + * Class TaskSuppressionController + * + * @package Kanboard\Controller + * @author  Frederic Guillot + */ +class TaskSuppressionController extends BaseController +{ +    /** +     * Confirmation dialog box before to remove the task +     */ +    public function confirm() +    { +        $task = $this->getTask(); + +        if (! $this->helper->user->canRemoveTask($task)) { +            throw new AccessForbiddenException(); +        } + +        $this->response->html($this->template->render('task_suppression/remove', array( +            'task' => $task, +            'redirect' => $this->request->getStringParam('redirect'), +        ))); +    } + +    /** +     * Remove a task +     */ +    public function remove() +    { +        $task = $this->getTask(); +        $this->checkCSRFParam(); + +        if (! $this->helper->user->canRemoveTask($task)) { +            throw new AccessForbiddenException(); +        } + +        if ($this->taskModel->remove($task['id'])) { +            $this->flash->success(t('Task removed successfully.')); +        } else { +            $this->flash->failure(t('Unable to remove this task.')); +        } + +        $redirect = $this->request->getStringParam('redirect') === ''; +        $this->response->redirect($this->helper->url->to('BoardViewController', 'show', array('project_id' => $task['project_id'])), $redirect); +    } +} diff --git a/app/Controller/Task.php b/app/Controller/TaskViewController.php index 1ce13f69..2a79ee45 100644 --- a/app/Controller/Task.php +++ b/app/Controller/TaskViewController.php @@ -7,12 +7,12 @@ use Kanboard\Core\Controller\PageNotFoundException;  use Kanboard\Core\DateParser;  /** - * Task controller + * Task Controller   * - * @package  controller + * @package  Kanboard\Controller   * @author   Frederic Guillot   */ -class Task extends BaseController +class TaskViewController extends BaseController  {      /**       * Public access (display a task) @@ -21,14 +21,14 @@ class Task extends BaseController       */      public function readonly()      { -        $project = $this->project->getByToken($this->request->getStringParam('token')); +        $project = $this->projectModel->getByToken($this->request->getStringParam('token'));          // Token verification          if (empty($project)) {              throw AccessForbiddenException::getInstance()->withoutLayout();          } -        $task = $this->taskFinder->getDetails($this->request->getIntegerParam('task_id')); +        $task = $this->taskFinderModel->getDetails($this->request->getIntegerParam('task_id'));          if (empty($task)) {              throw PageNotFoundException::getInstance()->withoutLayout(); @@ -40,12 +40,12 @@ class Task extends BaseController          $this->response->html($this->helper->layout->app('task/public', array(              'project' => $project, -            'comments' => $this->comment->getAll($task['id']), -            'subtasks' => $this->subtask->getAll($task['id']), -            'links' => $this->taskLink->getAllGroupedByLabel($task['id']), +            'comments' => $this->commentModel->getAll($task['id']), +            'subtasks' => $this->subtaskModel->getAll($task['id']), +            'links' => $this->taskLinkModel->getAllGroupedByLabel($task['id']),              'task' => $task, -            'columns_list' => $this->column->getList($task['project_id']), -            'colors_list' => $this->color->getList(), +            'columns_list' => $this->columnModel->getList($task['project_id']), +            'colors_list' => $this->colorModel->getList(),              'title' => $task['title'],              'no_layout' => true,              'auto_refresh' => true, @@ -61,7 +61,7 @@ class Task extends BaseController      public function show()      {          $task = $this->getTask(); -        $subtasks = $this->subtask->getAll($task['id']); +        $subtasks = $this->subtaskModel->getAll($task['id']);          $values = array(              'id' => $task['id'], @@ -70,19 +70,19 @@ class Task extends BaseController              'time_spent' => $task['time_spent'] ?: '',          ); -        $values = $this->dateParser->format($values, array('date_started'), $this->config->get('application_datetime_format', DateParser::DATE_TIME_FORMAT)); +        $values = $this->dateParser->format($values, array('date_started'), $this->configModel->get('application_datetime_format', DateParser::DATE_TIME_FORMAT));          $this->response->html($this->helper->layout->task('task/show', array(              'task' => $task, -            'project' => $this->project->getById($task['project_id']), +            'project' => $this->projectModel->getById($task['project_id']),              'values' => $values, -            'files' => $this->taskFile->getAllDocuments($task['id']), -            'images' => $this->taskFile->getAllImages($task['id']), -            'comments' => $this->comment->getAll($task['id'], $this->userSession->getCommentSorting()), +            'files' => $this->taskFileModel->getAllDocuments($task['id']), +            'images' => $this->taskFileModel->getAllImages($task['id']), +            'comments' => $this->commentModel->getAll($task['id'], $this->userSession->getCommentSorting()),              'subtasks' => $subtasks, -            'internal_links' => $this->taskLink->getAllGroupedByLabel($task['id']), -            'external_links' => $this->taskExternalLink->getAll($task['id']), -            'link_label_list' => $this->link->getList(0, false), +            'internal_links' => $this->taskLinkModel->getAllGroupedByLabel($task['id']), +            'external_links' => $this->taskExternalLinkModel->getAll($task['id']), +            'link_label_list' => $this->linkModel->getList(0, false),          )));      } @@ -97,10 +97,10 @@ class Task extends BaseController          $this->response->html($this->helper->layout->task('task/analytics', array(              'task' => $task, -            'project' => $this->project->getById($task['project_id']), -            'lead_time' => $this->taskAnalytic->getLeadTime($task), -            'cycle_time' => $this->taskAnalytic->getCycleTime($task), -            'time_spent_columns' => $this->taskAnalytic->getTimeSpentByColumn($task), +            'project' => $this->projectModel->getById($task['project_id']), +            'lead_time' => $this->taskAnalyticModel->getLeadTime($task), +            'cycle_time' => $this->taskAnalyticModel->getCycleTime($task), +            'time_spent_columns' => $this->taskAnalyticModel->getTimeSpentByColumn($task),          )));      } @@ -114,16 +114,16 @@ class Task extends BaseController          $task = $this->getTask();          $subtask_paginator = $this->paginator -            ->setUrl('task', 'timetracking', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'pagination' => 'subtasks')) +            ->setUrl('TaskViewController', 'timetracking', array('task_id' => $task['id'], 'project_id' => $task['project_id'], 'pagination' => 'subtasks'))              ->setMax(15)              ->setOrder('start')              ->setDirection('DESC') -            ->setQuery($this->subtaskTimeTracking->getTaskQuery($task['id'])) +            ->setQuery($this->subtaskTimeTrackingModel->getTaskQuery($task['id']))              ->calculateOnlyIf($this->request->getStringParam('pagination') === 'subtasks');          $this->response->html($this->helper->layout->task('task/time_tracking_details', array(              'task' => $task, -            'project' => $this->project->getById($task['project_id']), +            'project' => $this->projectModel->getById($task['project_id']),              'subtask_paginator' => $subtask_paginator,          )));      } @@ -139,38 +139,8 @@ class Task extends BaseController          $this->response->html($this->helper->layout->task('task/transitions', array(              'task' => $task, -            'project' => $this->project->getById($task['project_id']), -            'transitions' => $this->transition->getAllByTask($task['id']), -        ))); -    } - -    /** -     * Remove a task -     * -     * @access public -     */ -    public function remove() -    { -        $task = $this->getTask(); - -        if (! $this->helper->user->canRemoveTask($task)) { -            throw new AccessForbiddenException(); -        } - -        if ($this->request->getStringParam('confirmation') === 'yes') { -            $this->checkCSRFParam(); - -            if ($this->task->remove($task['id'])) { -                $this->flash->success(t('Task removed successfully.')); -            } else { -                $this->flash->failure(t('Unable to remove this task.')); -            } - -            return $this->response->redirect($this->helper->url->to('board', 'show', array('project_id' => $task['project_id'])), true); -        } - -        return $this->response->html($this->template->render('task/remove', array( -            'task' => $task, +            'project' => $this->projectModel->getById($task['project_id']), +            'transitions' => $this->transitionModel->getAllByTask($task['id']),          )));      }  } diff --git a/app/Controller/Twofactor.php b/app/Controller/TwoFactorController.php index 118613b2..d02c8950 100644 --- a/app/Controller/Twofactor.php +++ b/app/Controller/TwoFactorController.php @@ -7,10 +7,10 @@ use Kanboard\Core\Controller\AccessForbiddenException;  /**   * Two Factor Auth controller   * - * @package  controller + * @package  Kanboard/Controller   * @author   Frederic Guillot   */ -class Twofactor extends UserViewController +class TwoFactorController extends UserViewController  {      /**       * Only the current user can access to 2FA settings @@ -91,7 +91,7 @@ class Twofactor extends UserViewController          if ($provider->authenticate()) {              $this->flash->success(t('The two factor authentication code is valid.')); -            $this->user->update(array( +            $this->userModel->update(array(                  'id' => $user['id'],                  'twofactor_activated' => 1,                  'twofactor_secret' => $this->authenticationManager->getPostAuthenticationProvider()->getSecret(), @@ -100,10 +100,10 @@ class Twofactor extends UserViewController              unset($this->sessionStorage->twoFactorSecret);              $this->userSession->disablePostAuthentication(); -            $this->response->redirect($this->helper->url->to('twofactor', 'index', array('user_id' => $user['id']))); +            $this->response->redirect($this->helper->url->to('TwoFactorController', 'index', array('user_id' => $user['id'])));          } else {              $this->flash->failure(t('The two factor authentication code is not valid.')); -            $this->response->redirect($this->helper->url->to('twofactor', 'show', array('user_id' => $user['id']))); +            $this->response->redirect($this->helper->url->to('TwoFactorController', 'show', array('user_id' => $user['id'])));          }      } @@ -117,7 +117,7 @@ class Twofactor extends UserViewController          $user = $this->getUser();          $this->checkCurrentUser($user); -        $this->user->update(array( +        $this->userModel->update(array(              'id' => $user['id'],              'twofactor_activated' => 0,              'twofactor_secret' => '', @@ -127,7 +127,7 @@ class Twofactor extends UserViewController          $this->userSession->disablePostAuthentication();          $this->flash->success(t('User updated successfully.')); -        $this->response->redirect($this->helper->url->to('twofactor', 'index', array('user_id' => $user['id']))); +        $this->response->redirect($this->helper->url->to('TwoFactorController', 'index', array('user_id' => $user['id'])));      }      /** @@ -152,7 +152,7 @@ class Twofactor extends UserViewController              $this->response->redirect($this->helper->url->to('DashboardController', 'show'));          } else {              $this->flash->failure(t('The two factor authentication code is not valid.')); -            $this->response->redirect($this->helper->url->to('twofactor', 'code')); +            $this->response->redirect($this->helper->url->to('TwoFactorController', 'code'));          }      } @@ -186,7 +186,7 @@ class Twofactor extends UserViewController          if ($this->request->getStringParam('disable') === 'yes') {              $this->checkCSRFParam(); -            $this->user->update(array( +            $this->userModel->update(array(                  'id' => $user['id'],                  'twofactor_activated' => 0,                  'twofactor_secret' => '', diff --git a/app/Controller/UserAjaxController.php b/app/Controller/UserAjaxController.php index 7b365667..ed180471 100644 --- a/app/Controller/UserAjaxController.php +++ b/app/Controller/UserAjaxController.php @@ -4,7 +4,7 @@ namespace Kanboard\Controller;  use Kanboard\Filter\UserNameFilter;  use Kanboard\Formatter\UserAutoCompleteFormatter; -use Kanboard\Model\User as UserModel; +use Kanboard\Model\UserModel;  /**   * User Ajax Controller @@ -36,7 +36,7 @@ class UserAjaxController extends BaseController      {          $project_id = $this->request->getStringParam('project_id');          $query = $this->request->getStringParam('q'); -        $users = $this->projectPermission->findUsernames($project_id, $query); +        $users = $this->projectPermissionModel->findUsernames($project_id, $query);          $this->response->json($users);      } diff --git a/app/Controller/UserCreationController.php b/app/Controller/UserCreationController.php index 49f9db54..9c873f85 100644 --- a/app/Controller/UserCreationController.php +++ b/app/Controller/UserCreationController.php @@ -3,7 +3,7 @@  namespace Kanboard\Controller;  use Kanboard\Core\Security\Role; -use Kanboard\Notification\Mail as MailNotification; +use Kanboard\Notification\MailNotification;  /**   * Class UserCreationController @@ -26,10 +26,10 @@ class UserCreationController extends BaseController          $template = $isRemote ? 'user_creation/remote' : 'user_creation/local';          $this->response->html($this->template->render($template, array( -            'timezones' => $this->timezone->getTimezones(true), -            'languages' => $this->language->getLanguages(true), +            'timezones' => $this->timezoneModel->getTimezones(true), +            'languages' => $this->languageModel->getLanguages(true),              'roles' => $this->role->getApplicationRoles(), -            'projects' => $this->project->getList(), +            'projects' => $this->projectModel->getList(),              'errors' => $errors,              'values' => $values + array('role' => Role::APP_USER),          ))); @@ -62,15 +62,15 @@ class UserCreationController extends BaseController          $project_id = empty($values['project_id']) ? 0 : $values['project_id'];          unset($values['project_id']); -        $user_id = $this->user->create($values); +        $user_id = $this->userModel->create($values);          if ($user_id !== false) {              if ($project_id !== 0) { -                $this->projectUserRole->addUser($project_id, $user_id, Role::PROJECT_MEMBER); +                $this->projectUserRoleModel->addUser($project_id, $user_id, Role::PROJECT_MEMBER);              }              if (! empty($values['notifications_enabled'])) { -                $this->userNotificationType->saveSelectedTypes($user_id, array(MailNotification::TYPE)); +                $this->userNotificationTypeModel->saveSelectedTypes($user_id, array(MailNotification::TYPE));              }              $this->flash->success(t('User created successfully.')); diff --git a/app/Controller/UserCredentialController.php b/app/Controller/UserCredentialController.php index 3310aaa8..4021dc37 100644 --- a/app/Controller/UserCredentialController.php +++ b/app/Controller/UserCredentialController.php @@ -44,9 +44,9 @@ class UserCredentialController extends BaseController          list($valid, $errors) = $this->userValidator->validatePasswordModification($values);          if ($valid) { -            if ($this->user->update($values)) { +            if ($this->userModel->update($values)) {                  $this->flash->success(t('Password modified successfully.')); -                $this->userLocking->resetFailedLogin($user['username']); +                $this->userLockingModel->resetFailedLogin($user['username']);              } else {                  $this->flash->failure(t('Unable to change the password.'));              } @@ -95,7 +95,7 @@ class UserCredentialController extends BaseController          list($valid, $errors) = $this->userValidator->validateModification($values);          if ($valid) { -            if ($this->user->update($values)) { +            if ($this->userModel->update($values)) {                  $this->flash->success(t('User updated successfully.'));              } else {                  $this->flash->failure(t('Unable to update your user.')); diff --git a/app/Controller/UserListController.php b/app/Controller/UserListController.php index 685746fb..31fcdd44 100644 --- a/app/Controller/UserListController.php +++ b/app/Controller/UserListController.php @@ -21,7 +21,7 @@ class UserListController extends BaseController              ->setUrl('UserListController', 'show')              ->setMax(30)              ->setOrder('username') -            ->setQuery($this->user->getQuery()) +            ->setQuery($this->userModel->getQuery())              ->calculate();          $this->response->html($this->helper->layout->app('user_list/show', array( diff --git a/app/Controller/UserModificationController.php b/app/Controller/UserModificationController.php index 0a50eb5b..d339fd9a 100644 --- a/app/Controller/UserModificationController.php +++ b/app/Controller/UserModificationController.php @@ -32,8 +32,8 @@ class UserModificationController extends BaseController              'values' => $values,              'errors' => $errors,              'user' => $user, -            'timezones' => $this->timezone->getTimezones(true), -            'languages' => $this->language->getLanguages(true), +            'timezones' => $this->timezoneModel->getTimezones(true), +            'languages' => $this->languageModel->getLanguages(true),              'roles' => $this->role->getApplicationRoles(),          )));      } @@ -55,7 +55,7 @@ class UserModificationController extends BaseController          list($valid, $errors) = $this->userValidator->validateModification($values);          if ($valid) { -            if ($this->user->update($values)) { +            if ($this->userModel->update($values)) {                  $this->flash->success(t('User updated successfully.'));              } else {                  $this->flash->failure(t('Unable to update your user.')); diff --git a/app/Controller/UserStatusController.php b/app/Controller/UserStatusController.php index bc40a7dd..070fb6fc 100644 --- a/app/Controller/UserStatusController.php +++ b/app/Controller/UserStatusController.php @@ -34,7 +34,7 @@ class UserStatusController extends BaseController          $user = $this->getUser();          $this->checkCSRFParam(); -        if ($this->user->remove($user['id'])) { +        if ($this->userModel->remove($user['id'])) {              $this->flash->success(t('User removed successfully.'));          } else {              $this->flash->failure(t('Unable to remove this user.')); @@ -67,7 +67,7 @@ class UserStatusController extends BaseController          $user = $this->getUser();          $this->checkCSRFParam(); -        if ($this->user->enable($user['id'])) { +        if ($this->userModel->enable($user['id'])) {              $this->flash->success(t('User activated successfully.'));          } else {              $this->flash->failure(t('Unable to enable this user.')); @@ -100,7 +100,7 @@ class UserStatusController extends BaseController          $user = $this->getUser();          $this->checkCSRFParam(); -        if ($this->user->disable($user['id'])) { +        if ($this->userModel->disable($user['id'])) {              $this->flash->success(t('User disabled successfully.'));          } else {              $this->flash->failure(t('Unable to disable this user.')); diff --git a/app/Controller/UserViewController.php b/app/Controller/UserViewController.php index b299e35b..a73c5c51 100644 --- a/app/Controller/UserViewController.php +++ b/app/Controller/UserViewController.php @@ -3,7 +3,7 @@  namespace Kanboard\Controller;  use Kanboard\Core\Controller\PageNotFoundException; -use Kanboard\Model\Project as ProjectModel; +use Kanboard\Model\ProjectModel;  /**   * Class UserViewController @@ -21,7 +21,7 @@ class UserViewController extends BaseController       */      public function profile()      { -        $user = $this->user->getById($this->request->getIntegerParam('user_id')); +        $user = $this->userModel->getById($this->request->getIntegerParam('user_id'));          if (empty($user)) {              throw new PageNotFoundException(); @@ -43,8 +43,8 @@ class UserViewController extends BaseController          $user = $this->getUser();          $this->response->html($this->helper->layout->user('user_view/show', array(              'user'      => $user, -            'timezones' => $this->timezone->getTimezones(true), -            'languages' => $this->language->getLanguages(true), +            'timezones' => $this->timezoneModel->getTimezones(true), +            'languages' => $this->languageModel->getLanguages(true),          )));      } @@ -62,7 +62,7 @@ class UserViewController extends BaseController              ->setMax(20)              ->setOrder('start')              ->setDirection('DESC') -            ->setQuery($this->subtaskTimeTracking->getUserQuery($user['id'])) +            ->setQuery($this->subtaskTimeTrackingModel->getUserQuery($user['id']))              ->calculateOnlyIf($this->request->getStringParam('pagination') === 'subtasks');          $this->response->html($this->helper->layout->user('user_view/timesheet', array( @@ -80,7 +80,7 @@ class UserViewController extends BaseController      {          $user = $this->getUser();          $this->response->html($this->helper->layout->user('user_view/password_reset', array( -            'tokens' => $this->passwordReset->getAll($user['id']), +            'tokens' => $this->passwordResetModel->getAll($user['id']),              'user'   => $user,          )));      } @@ -94,7 +94,7 @@ class UserViewController extends BaseController      {          $user = $this->getUser();          $this->response->html($this->helper->layout->user('user_view/last', array( -            'last_logins' => $this->lastLogin->getAll($user['id']), +            'last_logins' => $this->lastLoginModel->getAll($user['id']),              'user'        => $user,          )));      } @@ -108,7 +108,7 @@ class UserViewController extends BaseController      {          $user = $this->getUser();          $this->response->html($this->helper->layout->user('user_view/sessions', array( -            'sessions' => $this->rememberMeSession->getAll($user['id']), +            'sessions' => $this->rememberMeSessionModel->getAll($user['id']),              'user'     => $user,          )));      } @@ -122,7 +122,7 @@ class UserViewController extends BaseController      {          $this->checkCSRFParam();          $user = $this->getUser(); -        $this->rememberMeSession->remove($this->request->getIntegerParam('id')); +        $this->rememberMeSessionModel->remove($this->request->getIntegerParam('id'));          $this->response->redirect($this->helper->url->to('UserViewController', 'sessions', array('user_id' => $user['id'])));      } @@ -137,16 +137,16 @@ class UserViewController extends BaseController          if ($this->request->isPost()) {              $values = $this->request->getValues(); -            $this->userNotification->saveSettings($user['id'], $values); +            $this->userNotificationModel->saveSettings($user['id'], $values);              $this->flash->success(t('User updated successfully.'));              return $this->response->redirect($this->helper->url->to('UserViewController', 'notifications', array('user_id' => $user['id'])));          }          return $this->response->html($this->helper->layout->user('user_view/notifications', array( -            'projects'      => $this->projectUserRole->getProjectsByUser($user['id'], array(ProjectModel::ACTIVE)), -            'notifications' => $this->userNotification->readSettings($user['id']), -            'types'         => $this->userNotificationType->getTypes(), -            'filters'       => $this->userNotificationFilter->getFilters(), +            'projects'      => $this->projectUserRoleModel->getProjectsByUser($user['id'], array(ProjectModel::ACTIVE)), +            'notifications' => $this->userNotificationModel->readSettings($user['id']), +            'types'         => $this->userNotificationTypeModel->getTypes(), +            'filters'       => $this->userNotificationFilterModel->getFilters(),              'user'          => $user,          )));      } @@ -162,14 +162,14 @@ class UserViewController extends BaseController          if ($this->request->isPost()) {              $values = $this->request->getValues(); -            $this->userMetadata->save($user['id'], $values); +            $this->userMetadataModel->save($user['id'], $values);              $this->flash->success(t('User updated successfully.'));              $this->response->redirect($this->helper->url->to('UserViewController', 'integrations', array('user_id' => $user['id'])));          }          $this->response->html($this->helper->layout->user('user_view/integrations', array(              'user'   => $user, -            'values' => $this->userMetadata->getAll($user['id']), +            'values' => $this->userMetadataModel->getAll($user['id']),          )));      } @@ -182,7 +182,7 @@ class UserViewController extends BaseController      {          $user = $this->getUser();          $this->response->html($this->helper->layout->user('user_view/external', array( -            'last_logins' => $this->lastLogin->getAll($user['id']), +            'last_logins' => $this->lastLoginModel->getAll($user['id']),              'user'        => $user,          )));      } @@ -200,7 +200,7 @@ class UserViewController extends BaseController          if ($switch === 'enable' || $switch === 'disable') {              $this->checkCSRFParam(); -            if ($this->user->{$switch . 'PublicAccess'}($user['id'])) { +            if ($this->userModel->{$switch . 'PublicAccess'}($user['id'])) {                  $this->flash->success(t('User updated successfully.'));              } else {                  $this->flash->failure(t('Unable to update this user.')); diff --git a/app/Controller/WebNotification.php b/app/Controller/WebNotification.php deleted file mode 100644 index a62da0e3..00000000 --- a/app/Controller/WebNotification.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php - -namespace Kanboard\Controller; - -/** - * Web notification controller - * - * @package  controller - * @author   Frederic Guillot - */ -class WebNotification extends BaseController -{ -    /** -     * Mark all notifications as read -     * -     * @access public -     */ -    public function flush() -    { -        $user_id = $this->getUserId(); - -        $this->userUnreadNotification->markAllAsRead($user_id); -        $this->response->redirect($this->helper->url->to('DashboardController', 'notifications', array('user_id' => $user_id))); -    } - -    /** -     * Mark a notification as read -     * -     * @access public -     */ -    public function remove() -    { -        $user_id = $this->getUserId(); -        $notification_id = $this->request->getIntegerParam('notification_id'); - -        $this->userUnreadNotification->markAsRead($user_id, $notification_id); -        $this->response->redirect($this->helper->url->to('DashboardController', 'notifications', array('user_id' => $user_id))); -    } - -    private function getUserId() -    { -        $user_id = $this->request->getIntegerParam('user_id'); - -        if (! $this->userSession->isAdmin() && $user_id != $this->userSession->getId()) { -            $user_id = $this->userSession->getId(); -        } - -        return $user_id; -    } -} diff --git a/app/Controller/WebNotificationController.php b/app/Controller/WebNotificationController.php new file mode 100644 index 00000000..46a42063 --- /dev/null +++ b/app/Controller/WebNotificationController.php @@ -0,0 +1,79 @@ +<?php + +namespace Kanboard\Controller; + +/** + * Web notification controller + * + * @package  Kanboard\Controller + * @author   Frederic Guillot + */ +class WebNotificationController extends BaseController +{ +    /** +     * Mark all notifications as read +     * +     * @access public +     */ +    public function flush() +    { +        $user_id = $this->getUserId(); + +        $this->userUnreadNotificationModel->markAllAsRead($user_id); +        $this->response->redirect($this->helper->url->to('DashboardController', 'notifications', array('user_id' => $user_id))); +    } + +    /** +     * Mark a notification as read +     * +     * @access public +     */ +    public function remove() +    { +        $user_id = $this->getUserId(); +        $notification_id = $this->request->getIntegerParam('notification_id'); + +        $this->userUnreadNotificationModel->markAsRead($user_id, $notification_id); +        $this->response->redirect($this->helper->url->to('DashboardController', 'notifications', array('user_id' => $user_id))); +    } + +    /** +     * Redirect to the task and mark notification as read +     */ +    public function redirect() +    { +        $user_id = $this->getUserId(); +        $notification_id = $this->request->getIntegerParam('notification_id'); + +        $notification = $this->userUnreadNotificationModel->getById($notification_id); +        $this->userUnreadNotificationModel->markAsRead($user_id, $notification_id); + +        if (empty($notification)) { +            $this->response->redirect($this->helper->url->to('DashboardController', 'notifications', array('user_id' => $user_id))); +        } elseif ($this->helper->text->contains($notification['event_name'], 'comment')) { +            $this->response->redirect($this->helper->url->to( +                'TaskViewController', +                'show', +                array('task_id' => $notification['event_data']['task']['id'], 'project_id' => $notification['event_data']['task']['project_id']), +                'comment-'.$notification['event_data']['comment']['id'] +            )); +        } else { +            $this->response->redirect($this->helper->url->to( +                'TaskViewController', +                'show', +                array('task_id' => $notification['event_data']['task']['id'], 'project_id' => $notification['event_data']['task']['project_id']) +            )); +        } +    } + +    private function getUserId() +    { +        $user_id = $this->request->getIntegerParam('user_id'); + +        if (! $this->userSession->isAdmin() && $user_id != $this->userSession->getId()) { +            $user_id = $this->userSession->getId(); +        } + +        return $user_id; +    } +}  | 
