Move dashboard pagination into separate classes

This commit is contained in:
Frederic Guillot
2016-07-24 12:09:41 -04:00
parent 506ebf3bac
commit 51b2193fc4
19 changed files with 337 additions and 126 deletions

View File

@@ -2,9 +2,6 @@
namespace Kanboard\Controller;
use Kanboard\Model\ProjectModel;
use Kanboard\Model\SubtaskModel;
/**
* Dashboard Controller
*
@@ -13,63 +10,6 @@ use Kanboard\Model\SubtaskModel;
*/
class DashboardController extends BaseController
{
/**
* Get project pagination
*
* @access private
* @param integer $user_id
* @param string $action
* @param integer $max
* @return \Kanboard\Core\Paginator
*/
private function getProjectPaginator($user_id, $action, $max)
{
return $this->paginator
->setUrl('DashboardController', $action, array('pagination' => 'projects', 'user_id' => $user_id))
->setMax($max)
->setOrder(ProjectModel::TABLE.'.name')
->setQuery($this->projectModel->getQueryColumnStats($this->projectPermissionModel->getActiveProjectIds($user_id)))
->calculateOnlyIf($this->request->getStringParam('pagination') === 'projects');
}
/**
* Get task pagination
*
* @access private
* @param integer $user_id
* @param string $action
* @param integer $max
* @return \Kanboard\Core\Paginator
*/
private function getTaskPaginator($user_id, $action, $max)
{
return $this->paginator
->setUrl('DashboardController', $action, array('pagination' => 'tasks', 'user_id' => $user_id))
->setMax($max)
->setOrder('tasks.id')
->setQuery($this->taskFinderModel->getUserQuery($user_id))
->calculateOnlyIf($this->request->getStringParam('pagination') === 'tasks');
}
/**
* Get subtask pagination
*
* @access private
* @param integer $user_id
* @param string $action
* @param integer $max
* @return \Kanboard\Core\Paginator
*/
private function getSubtaskPaginator($user_id, $action, $max)
{
return $this->paginator
->setUrl('DashboardController', $action, array('pagination' => 'subtasks', 'user_id' => $user_id))
->setMax($max)
->setOrder('tasks.id')
->setQuery($this->subtaskModel->getUserQuery($user_id, array(SubTaskModel::STATUS_TODO, SubtaskModel::STATUS_INPROGRESS)))
->calculateOnlyIf($this->request->getStringParam('pagination') === 'subtasks');
}
/**
* Dashboard overview
*
@@ -81,9 +21,9 @@ class DashboardController extends BaseController
$this->response->html($this->helper->layout->dashboard('dashboard/show', array(
'title' => t('Dashboard'),
'project_paginator' => $this->getProjectPaginator($user['id'], 'show', 10),
'task_paginator' => $this->getTaskPaginator($user['id'], 'show', 10),
'subtask_paginator' => $this->getSubtaskPaginator($user['id'], 'show', 10),
'project_paginator' => $this->projectPagination->getDashboardPaginator($user['id'], 'show', 10),
'task_paginator' => $this->taskPagination->getDashboardPaginator($user['id'], 'show', 10),
'subtask_paginator' => $this->subtaskPagination->getDashboardPaginator($user['id'], 'show', 10),
'user' => $user,
)));
}
@@ -99,7 +39,7 @@ class DashboardController extends BaseController
$this->response->html($this->helper->layout->dashboard('dashboard/tasks', array(
'title' => t('My tasks'),
'paginator' => $this->getTaskPaginator($user['id'], 'tasks', 50),
'paginator' => $this->taskPagination->getDashboardPaginator($user['id'], 'tasks', 50),
'user' => $user,
)));
}
@@ -115,7 +55,7 @@ class DashboardController extends BaseController
$this->response->html($this->helper->layout->dashboard('dashboard/subtasks', array(
'title' => t('My subtasks'),
'paginator' => $this->getSubtaskPaginator($user['id'], 'subtasks', 50),
'paginator' => $this->subtaskPagination->getDashboardPaginator($user['id'], 'subtasks', 50),
'user' => $user,
)));
}
@@ -131,7 +71,7 @@ class DashboardController extends BaseController
$this->response->html($this->helper->layout->dashboard('dashboard/projects', array(
'title' => t('My projects'),
'paginator' => $this->getProjectPaginator($user['id'], 'projects', 25),
'paginator' => $this->projectPagination->getDashboardPaginator($user['id'], 'projects', 25),
'user' => $user,
)));
}

View File

@@ -17,12 +17,7 @@ class UserListController extends BaseController
*/
public function show()
{
$paginator = $this->paginator
->setUrl('UserListController', 'show')
->setMax(30)
->setOrder('username')
->setQuery($this->userModel->getQuery())
->calculate();
$paginator = $this->userPagination->getListingPaginator();
$this->response->html($this->helper->layout->app('user_list/show', array(
'title' => t('Users').' ('.$paginator->getTotal().')',

View File

@@ -122,6 +122,10 @@ use Pimple\Container;
* @property \Kanboard\Model\UserNotificationFilterModel $userNotificationFilterModel
* @property \Kanboard\Model\UserUnreadNotificationModel $userUnreadNotificationModel
* @property \Kanboard\Model\UserMetadataModel $userMetadataModel
* @property \Kanboard\Pagination\TaskPagination $taskPagination
* @property \Kanboard\Pagination\SubtaskPagination $subtaskPagination
* @property \Kanboard\Pagination\ProjectPagination $projectPagination
* @property \Kanboard\Pagination\UserPagination $userPagination
* @property \Kanboard\Validator\ActionValidator $actionValidator
* @property \Kanboard\Validator\AuthValidator $authValidator
* @property \Kanboard\Validator\ColumnValidator $columnValidator

View File

@@ -159,7 +159,7 @@ class ProjectDuplicationModel extends Base
}
/**
* Make sure that the creator of the duplicated project is alsp owner
* Make sure that the creator of the duplicated project is also owner
*
* @access private
* @param integer $dst_project_id

View File

@@ -318,7 +318,7 @@ class ProjectModel extends Base
public function getQueryColumnStats(array $project_ids)
{
if (empty($project_ids)) {
return $this->db->table(ProjectModel::TABLE)->limit(0);
return $this->db->table(ProjectModel::TABLE)->eq(ProjectModel::TABLE.'.id', 0);
}
return $this->db

View File

@@ -63,19 +63,19 @@ class TaskFinderModel extends Base
return $this->db
->table(TaskModel::TABLE)
->columns(
'tasks.id',
'tasks.title',
'tasks.date_due',
'tasks.date_creation',
'tasks.project_id',
'tasks.color_id',
'tasks.priority',
'tasks.time_spent',
'tasks.time_estimated',
'tasks.is_active',
'tasks.creator_id',
'projects.name AS project_name',
'columns.title AS column_title'
TaskModel::TABLE.'.id',
TaskModel::TABLE.'.title',
TaskModel::TABLE.'.date_due',
TaskModel::TABLE.'.date_creation',
TaskModel::TABLE.'.project_id',
TaskModel::TABLE.'.color_id',
TaskModel::TABLE.'.priority',
TaskModel::TABLE.'.time_spent',
TaskModel::TABLE.'.time_estimated',
TaskModel::TABLE.'.is_active',
TaskModel::TABLE.'.creator_id',
ProjectModel::TABLE.'.name AS project_name',
ColumnModel::TABLE.'.title AS column_title'
)
->join(ProjectModel::TABLE, 'id', 'project_id')
->join(ColumnModel::TABLE, 'id', 'column_id')
@@ -103,36 +103,36 @@ class TaskFinderModel extends Base
'(SELECT COUNT(*) FROM '.TaskLinkModel::TABLE.' WHERE '.TaskLinkModel::TABLE.'.task_id = tasks.id) AS nb_links',
'(SELECT COUNT(*) FROM '.TaskExternalLinkModel::TABLE.' WHERE '.TaskExternalLinkModel::TABLE.'.task_id = tasks.id) AS nb_external_links',
'(SELECT DISTINCT 1 FROM '.TaskLinkModel::TABLE.' WHERE '.TaskLinkModel::TABLE.'.task_id = tasks.id AND '.TaskLinkModel::TABLE.'.link_id = 9) AS is_milestone',
'tasks.id',
'tasks.reference',
'tasks.title',
'tasks.description',
'tasks.date_creation',
'tasks.date_modification',
'tasks.date_completed',
'tasks.date_started',
'tasks.date_due',
'tasks.color_id',
'tasks.project_id',
'tasks.column_id',
'tasks.swimlane_id',
'tasks.owner_id',
'tasks.creator_id',
'tasks.position',
'tasks.is_active',
'tasks.score',
'tasks.category_id',
'tasks.priority',
'tasks.date_moved',
'tasks.recurrence_status',
'tasks.recurrence_trigger',
'tasks.recurrence_factor',
'tasks.recurrence_timeframe',
'tasks.recurrence_basedate',
'tasks.recurrence_parent',
'tasks.recurrence_child',
'tasks.time_estimated',
'tasks.time_spent',
TaskModel::TABLE.'.id',
TaskModel::TABLE.'.reference',
TaskModel::TABLE.'.title',
TaskModel::TABLE.'.description',
TaskModel::TABLE.'.date_creation',
TaskModel::TABLE.'.date_modification',
TaskModel::TABLE.'.date_completed',
TaskModel::TABLE.'.date_started',
TaskModel::TABLE.'.date_due',
TaskModel::TABLE.'.color_id',
TaskModel::TABLE.'.project_id',
TaskModel::TABLE.'.column_id',
TaskModel::TABLE.'.swimlane_id',
TaskModel::TABLE.'.owner_id',
TaskModel::TABLE.'.creator_id',
TaskModel::TABLE.'.position',
TaskModel::TABLE.'.is_active',
TaskModel::TABLE.'.score',
TaskModel::TABLE.'.category_id',
TaskModel::TABLE.'.priority',
TaskModel::TABLE.'.date_moved',
TaskModel::TABLE.'.recurrence_status',
TaskModel::TABLE.'.recurrence_trigger',
TaskModel::TABLE.'.recurrence_factor',
TaskModel::TABLE.'.recurrence_timeframe',
TaskModel::TABLE.'.recurrence_basedate',
TaskModel::TABLE.'.recurrence_parent',
TaskModel::TABLE.'.recurrence_child',
TaskModel::TABLE.'.time_estimated',
TaskModel::TABLE.'.time_spent',
UserModel::TABLE.'.username AS assignee_username',
UserModel::TABLE.'.name AS assignee_name',
UserModel::TABLE.'.email AS assignee_email',

View File

@@ -0,0 +1,35 @@
<?php
namespace Kanboard\Pagination;
use Kanboard\Core\Base;
use Kanboard\Core\Paginator;
use Kanboard\Model\ProjectModel;
/**
* Class ProjectPagination
*
* @package Kanboard\Pagination
* @author Frederic Guillot
*/
class ProjectPagination extends Base
{
/**
* Get dashboard pagination
*
* @access public
* @param integer $user_id
* @param string $method
* @param integer $max
* @return Paginator
*/
public function getDashboardPaginator($user_id, $method, $max)
{
return $this->paginator
->setUrl('DashboardController', $method, array('pagination' => 'projects', 'user_id' => $user_id))
->setMax($max)
->setOrder(ProjectModel::TABLE.'.name')
->setQuery($this->projectModel->getQueryColumnStats($this->projectPermissionModel->getActiveProjectIds($user_id)))
->calculateOnlyIf($this->request->getStringParam('pagination') === 'projects');
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace Kanboard\Pagination;
use Kanboard\Core\Base;
use Kanboard\Core\Paginator;
use Kanboard\Model\SubtaskModel;
use Kanboard\Model\TaskModel;
/**
* Class SubtaskPagination
*
* @package Kanboard\Pagination
* @author Frederic Guillot
*/
class SubtaskPagination extends Base
{
/**
* Get dashboard pagination
*
* @access public
* @param integer $user_id
* @param string $method
* @param integer $max
* @return Paginator
*/
public function getDashboardPaginator($user_id, $method, $max)
{
return $this->paginator
->setUrl('DashboardController', $method, array('pagination' => 'subtasks', 'user_id' => $user_id))
->setMax($max)
->setOrder(TaskModel::TABLE.'.id')
->setQuery($this->subtaskModel->getUserQuery($user_id, array(SubtaskModel::STATUS_TODO, SubtaskModel::STATUS_INPROGRESS)))
->calculateOnlyIf($this->request->getStringParam('pagination') === 'subtasks');
}
}

View File

@@ -0,0 +1,35 @@
<?php
namespace Kanboard\Pagination;
use Kanboard\Core\Base;
use Kanboard\Core\Paginator;
use Kanboard\Model\TaskModel;
/**
* Class TaskPagination
*
* @package Kanboard\Pagination
* @author Frederic Guillot
*/
class TaskPagination extends Base
{
/**
* Get dashboard pagination
*
* @access public
* @param integer $user_id
* @param string $method
* @param integer $max
* @return Paginator
*/
public function getDashboardPaginator($user_id, $method, $max)
{
return $this->paginator
->setUrl('DashboardController', $method, array('pagination' => 'tasks', 'user_id' => $user_id))
->setMax($max)
->setOrder(TaskModel::TABLE.'.id')
->setQuery($this->taskFinderModel->getUserQuery($user_id))
->calculateOnlyIf($this->request->getStringParam('pagination') === 'tasks');
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace Kanboard\Pagination;
use Kanboard\Core\Base;
use Kanboard\Core\Paginator;
use Kanboard\Model\UserModel;
/**
* Class UserPagination
*
* @package Kanboard\Pagination
* @author Frederic Guillot
*/
class UserPagination extends Base
{
/**
* Get user listing paginator
*
* @access public
* @return Paginator
*/
public function getListingPaginator()
{
return $this->paginator
->setUrl('UserListController', 'show')
->setMax(30)
->setOrder(UserModel::TABLE.'.username')
->setQuery($this->userModel->getQuery())
->calculate();
}
}

View File

@@ -122,6 +122,12 @@ class ClassProvider implements ServiceProviderInterface
'TaskExport',
'TransitionExport',
),
'Pagination' => array(
'TaskPagination',
'SubtaskPagination',
'ProjectPagination',
'UserPagination',
),
'Core' => array(
'DateParser',
'Lexer',

View File

@@ -6,8 +6,8 @@
<?php else: ?>
<table class="table-fixed table-small">
<tr>
<th class="column-5"><?= $paginator->order('Id', 'id') ?></th>
<th class="column-3"><?= $paginator->order('<i class="fa fa-lock fa-fw" title="'.t('Private project').'"></i>', 'is_private') ?></th>
<th class="column-5"><?= $paginator->order('Id', \Kanboard\Model\ProjectModel::TABLE.'.id') ?></th>
<th class="column-3"><?= $paginator->order('<i class="fa fa-lock fa-fw" title="'.t('Private project').'"></i>', \Kanboard\Model\ProjectModel::TABLE.'.is_private') ?></th>
<th class="column-25"><?= $paginator->order(t('Project'), \Kanboard\Model\ProjectModel::TABLE.'.name') ?></th>
<th class="column-10"><?= t('Tasks') ?></th>
<th><?= t('Columns') ?></th>

View File

@@ -6,10 +6,10 @@
<?php else: ?>
<table class="table-fixed table-small">
<tr>
<th class="column-5"><?= $paginator->order('Id', 'tasks.id') ?></th>
<th class="column-5"><?= $paginator->order('Id', \Kanboard\Model\TaskModel::TABLE.'.id') ?></th>
<th class="column-20"><?= $paginator->order(t('Project'), 'project_name') ?></th>
<th><?= $paginator->order(t('Task'), 'task_name') ?></th>
<th><?= $paginator->order(t('Subtask'), 'title') ?></th>
<th><?= $paginator->order(t('Subtask'), \Kanboard\Model\SubtaskModel::TABLE.'.title') ?></th>
<th class="column-20"><?= t('Time tracking') ?></th>
</tr>
<?php foreach ($paginator->getCollection() as $subtask): ?>

View File

@@ -6,12 +6,12 @@
<?php else: ?>
<table class="table-fixed table-small">
<tr>
<th class="column-5"><?= $paginator->order('Id', 'tasks.id') ?></th>
<th class="column-5"><?= $paginator->order('Id', \Kanboard\Model\TaskModel::TABLE.'.id') ?></th>
<th class="column-20"><?= $paginator->order(t('Project'), 'project_name') ?></th>
<th><?= $paginator->order(t('Task'), 'title') ?></th>
<th class="column-5"><?= $paginator->order(t('Priority'), 'tasks.priority') ?></th>
<th><?= $paginator->order(t('Task'), \Kanboard\Model\TaskModel::TABLE.'.title') ?></th>
<th class="column-5"><?= $paginator->order(t('Priority'), \Kanboard\Model\TaskModel::TABLE.'.priority') ?></th>
<th class="column-20"><?= t('Time tracking') ?></th>
<th class="column-10"><?= $paginator->order(t('Due date'), 'date_due') ?></th>
<th class="column-10"><?= $paginator->order(t('Due date'), \Kanboard\Model\TaskModel::TABLE.'.date_due') ?></th>
<th class="column-10"><?= $paginator->order(t('Column'), 'column_title') ?></th>
</tr>
<?php foreach ($paginator->getCollection() as $task): ?>