Add pagination and sorting to the dashboard

This commit is contained in:
Frédéric Guillot 2014-11-15 21:49:06 -05:00
parent af93754ec9
commit aa6fffb05a
21 changed files with 582 additions and 300 deletions

View File

@ -20,17 +20,137 @@ class App extends Base
*/
public function index()
{
$paginate = $this->request->getStringParam('paginate', 'userTasks');
$offset = $this->request->getIntegerParam('offset', 0);
$direction = $this->request->getStringParam('direction');
$order = $this->request->getStringParam('order');
$user_id = $this->acl->getUserId();
$projects = $this->projectPermission->getMemberProjects($user_id);
$project_ids = array_keys($projects);
$this->response->html($this->template->layout('app/index', array(
$params = array(
'title' => t('Dashboard'),
'board_selector' => $this->projectPermission->getAllowedProjects($user_id),
'events' => $this->projectActivity->getProjects($project_ids, 10),
'tasks' => $this->taskFinder->getAllTasksByUser($user_id),
'subtasks' => $this->subTask->getAllByUser($user_id, array(SubTask::STATUS_TODO, SubTask::STATUS_INPROGRESS)),
'projects' => $this->project->getSummary($project_ids),
'title' => t('Dashboard'),
)));
);
$params += $this->getTaskPagination($user_id, $paginate, $offset, $order, $direction);
$params += $this->getSubtaskPagination($user_id, $paginate, $offset, $order, $direction);
$params += $this->getProjectPagination($project_ids, $paginate, $offset, $order, $direction);
$this->response->html($this->template->layout('app/dashboard', $params));
}
/**
* Get tasks pagination
*
* @access public
*/
private function getTaskPagination($user_id, $paginate, $offset, $order, $direction)
{
$limit = 10;
if (! in_array($order, array('tasks.id', 'project_name', 'title'))) {
$order = 'tasks.id';
$direction = 'ASC';
}
if ($paginate === 'userTasks') {
$tasks = $this->taskPaginator->userTasks($user_id, $offset, $limit, $order, $direction);
}
else {
$offset = 0;
$tasks = $this->taskPaginator->userTasks($user_id, $offset, $limit);
}
return array(
'tasks' => $tasks,
'task_pagination' => array(
'controller' => 'app',
'action' => 'index',
'params' => array('paginate' => 'userTasks'),
'direction' => $direction,
'order' => $order,
'total' => $this->taskPaginator->countUserTasks($user_id),
'offset' => $offset,
'limit' => $limit,
)
);
}
/**
* Get subtasks pagination
*
* @access public
*/
private function getSubtaskPagination($user_id, $paginate, $offset, $order, $direction)
{
$status = array(SubTask::STATUS_TODO, SubTask::STATUS_INPROGRESS);
$limit = 10;
if (! in_array($order, array('tasks.id', 'project_name', 'status', 'title'))) {
$order = 'tasks.id';
$direction = 'ASC';
}
if ($paginate === 'userSubtasks') {
$subtasks = $this->subtaskPaginator->userSubtasks($user_id, $status, $offset, $limit, $order, $direction);
}
else {
$offset = 0;
$subtasks = $this->subtaskPaginator->userSubtasks($user_id, $status, $offset, $limit);
}
return array(
'subtasks' => $subtasks,
'subtask_pagination' => array(
'controller' => 'app',
'action' => 'index',
'params' => array('paginate' => 'userSubtasks'),
'direction' => $direction,
'order' => $order,
'total' => $this->subtaskPaginator->countUserSubtasks($user_id, $status),
'offset' => $offset,
'limit' => $limit,
)
);
}
/**
* Get projects pagination
*
* @access public
*/
private function getProjectPagination($project_ids, $paginate, $offset, $order, $direction)
{
$limit = 5;
if (! in_array($order, array('id', 'name'))) {
$order = 'name';
$direction = 'ASC';
}
if ($paginate === 'projectSummaries') {
$projects = $this->projectPaginator->projectSummaries($project_ids, $offset, $limit, $order, $direction);
}
else {
$offset = 0;
$projects = $this->projectPaginator->projectSummaries($project_ids, $offset, $limit);
}
return array(
'projects' => $projects,
'project_pagination' => array(
'controller' => 'app',
'action' => 'index',
'params' => array('paginate' => 'projectSummaries'),
'direction' => $direction,
'order' => $order,
'total' => count($project_ids),
'offset' => $offset,
'limit' => $limit,
)
);
}
}

View File

@ -428,8 +428,8 @@ class Project extends Base
$limit = 25;
if ($search !== '') {
$tasks = $this->taskFinder->search($project['id'], $search, $offset, $limit, $order, $direction);
$nb_tasks = $this->taskFinder->countSearch($project['id'], $search);
$tasks = $this->taskPaginator->searchTasks($project['id'], $search, $offset, $limit, $order, $direction);
$nb_tasks = $this->taskPaginator->countSearchTasks($project['id'], $search);
}
$this->response->html($this->template->layout('project_search', array(
@ -472,8 +472,8 @@ class Project extends Base
$offset = $this->request->getIntegerParam('offset', 0);
$limit = 25;
$tasks = $this->taskFinder->getClosedTasks($project['id'], $offset, $limit, $order, $direction);
$nb_tasks = $this->taskFinder->countByProjectId($project['id'], array(TaskModel::STATUS_CLOSED));
$tasks = $this->taskPaginator->closedTasks($project['id'], $offset, $limit, $order, $direction);
$nb_tasks = $this->taskPaginator->countClosedTasks($project['id']);
$this->response->html($this->template->layout('project_tasks', array(
'board_selector' => $this->projectPermission->getAllowedProjects($this->acl->getUserId()),

View File

@ -95,40 +95,6 @@ class Project extends Base
return (bool) $this->db->table(self::TABLE)->eq('id', $project_id)->eq('is_private', 1)->count();
}
/**
* Get project summary for a list of project (number of tasks for each column)
*
* @access public
* @param array $project_ids List of project id
* @param integer $status Project status
* @param string $order Sort on this column
* @param string $direction Sorting direction
* @return array Project properties
*/
public function getSummary(array $project_ids, $status = self::ACTIVE, $order = 'name', $direction = 'asc')
{
if (empty($project_ids)) {
return array();
}
$projects = $this->db->table(self::TABLE)
->in('id', $project_ids)
->eq('is_active', $status)
->orderby($order, $direction)
->findAll();
foreach ($projects as &$project) {
$project['columns'] = $this->board->getColumns($project['id']);
foreach ($project['columns'] as &$column) {
$column['nb_tasks'] = $this->taskFinder->countByColumnId($project['id'], $column['id']);
}
}
return $projects;
}
/**
* Get all projects, optionaly fetch stats for each project and can check users permissions
*

View File

@ -57,7 +57,7 @@ class ProjectAnalytic extends Base
foreach ($tasks as $task) {
$user = $users[$task['owner_id']];
$user = isset($users[$task['owner_id']]) ? $users[$task['owner_id']] : $users[0];
$total++;
if (! isset($metrics[$user])) {

View File

@ -0,0 +1,49 @@
<?php
namespace Model;
/**
* Project Paginator
*
* @package model
* @author Frederic Guillot
*/
class ProjectPaginator extends Base
{
/**
* Get project summary for a list of project (number of tasks for each column)
*
* @access public
* @param array $project_ids List of project id
* @param integer $offset Offset
* @param integer $limit Limit
* @param string $column Sorting column
* @param string $direction Sorting direction
* @return array
*/
public function projectSummaries(array $project_ids, $offset = 0, $limit = 25, $column = 'name', $direction = 'asc')
{
if (empty($project_ids)) {
return array();
}
$projects = $this->db
->table(Project::TABLE)
->in('id', $project_ids)
->offset($offset)
->limit($limit)
->orderBy($column, $direction)
->findAll();
foreach ($projects as &$project) {
$project['columns'] = $this->board->getColumns($project['id']);
foreach ($project['columns'] as &$column) {
$column['nb_tasks'] = $this->taskFinder->countByColumnId($project['id'], $column['id']);
}
}
return $projects;
}
}

View File

@ -92,38 +92,6 @@ class SubTask extends Base
return $subtasks;
}
/**
* Get all subtasks assigned to a user
*
* @access public
* @param integer $user_id User id
* @param array $status List of status
* @return array
*/
public function getAllByUser($user_id, array $status)
{
$status_list = $this->getStatusList();
$subtasks = $this->db->table(self::TABLE)
->columns(
self::TABLE.'.*',
Task::TABLE.'.project_id',
Task::TABLE.'.color_id',
Project::TABLE.'.name AS project_name'
)
->eq('user_id', $user_id)
->in(self::TABLE.'.status', $status)
->join(Task::TABLE, 'id', 'task_id')
->join(Project::TABLE, 'id', 'project_id', Task::TABLE)
->asc(Task::TABLE.'.id')
->findAll();
foreach ($subtasks as &$subtask) {
$subtask['status_name'] = $status_list[$subtask['status']];
}
return $subtasks;
}
/**
* Get a subtask by the id
*

View File

@ -0,0 +1,68 @@
<?php
namespace Model;
/**
* Subtask Paginator
*
* @package model
* @author Frederic Guillot
*/
class SubtaskPaginator extends Base
{
/**
* Get all subtasks assigned to a user
*
* @access public
* @param integer $user_id User id
* @param array $status List of status
* @param integer $offset Offset
* @param integer $limit Limit
* @param string $column Sorting column
* @param string $direction Sorting direction
* @return array
*/
public function userSubtasks($user_id, array $status, $offset = 0, $limit = 25, $column = 'tasks.id', $direction = 'asc')
{
$status_list = $this->subTask->getStatusList();
$subtasks = $this->db->table(SubTask::TABLE)
->columns(
SubTask::TABLE.'.*',
Task::TABLE.'.project_id',
Task::TABLE.'.color_id',
Project::TABLE.'.name AS project_name'
)
->eq('user_id', $user_id)
->in(SubTask::TABLE.'.status', $status)
->join(Task::TABLE, 'id', 'task_id')
->join(Project::TABLE, 'id', 'project_id', Task::TABLE)
->offset($offset)
->limit($limit)
->orderBy($column, $direction)
->findAll();
foreach ($subtasks as &$subtask) {
$subtask['status_name'] = $status_list[$subtask['status']];
}
return $subtasks;
}
/**
* Count all subtasks assigned to the user
*
* @access public
* @param integer $user_id User id
* @param array $status List of status
* @return integer
*/
public function countUserSubtasks($user_id, array $status)
{
return $this->db
->table(SubTask::TABLE)
->eq('user_id', $user_id)
->in('status', $status)
->count();
}
}

View File

@ -15,10 +15,10 @@ class TaskFinder extends Base
/**
* Common request to fetch a list of tasks
*
* @access private
* @access public
* @return \PicoDb\Table
*/
private function prepareRequestList()
public function getQuery()
{
return $this->db
->table(Task::TABLE)
@ -50,51 +50,6 @@ class TaskFinder extends Base
->join(User::TABLE, 'id', 'owner_id');
}
/**
* Task search with pagination
*
* @access public
* @param integer $project_id Project id
* @param string $search Search terms
* @param integer $offset Offset
* @param integer $limit Limit
* @param string $column Sorting column
* @param string $direction Sorting direction
* @return array
*/
public function search($project_id, $search, $offset = 0, $limit = 25, $column = 'tasks.id', $direction = 'DESC')
{
return $this->prepareRequestList()
->eq('project_id', $project_id)
->like('title', '%'.$search.'%')
->offset($offset)
->limit($limit)
->orderBy($column, $direction)
->findAll();
}
/**
* Get all completed tasks with pagination
*
* @access public
* @param integer $project_id Project id
* @param integer $offset Offset
* @param integer $limit Limit
* @param string $column Sorting column
* @param string $direction Sorting direction
* @return array
*/
public function getClosedTasks($project_id, $offset = 0, $limit = 25, $column = 'tasks.date_completed', $direction = 'DESC')
{
return $this->prepareRequestList()
->eq('project_id', $project_id)
->eq('is_active', Task::STATUS_CLOSED)
->offset($offset)
->limit($limit)
->orderBy($column, $direction)
->findAll();
}
/**
* Get all tasks shown on the board (sorted by position)
*
@ -104,40 +59,13 @@ class TaskFinder extends Base
*/
public function getTasksOnBoard($project_id)
{
return $this->prepareRequestList()
return $this->getQuery()
->eq('project_id', $project_id)
->eq('is_active', Task::STATUS_OPEN)
->asc('tasks.position')
->findAll();
}
/**
* Get all open tasks for a given user
*
* @access public
* @param integer $user_id User id
* @return array
*/
public function getAllTasksByUser($user_id)
{
return $this->db
->table(Task::TABLE)
->columns(
'tasks.id',
'tasks.title',
'tasks.date_due',
'tasks.date_creation',
'tasks.project_id',
'tasks.color_id',
'projects.name AS project_name'
)
->join(Project::TABLE, 'id', 'project_id')
->eq('tasks.owner_id', $user_id)
->eq('tasks.is_active', Task::STATUS_OPEN)
->asc('tasks.id')
->findAll();
}
/**
* Get all tasks for a given project and status
*
@ -295,22 +223,6 @@ class TaskFinder extends Base
->count();
}
/**
* Count the number of tasks for a custom search
*
* @access public
* @param integer $project_id Project id
* @param string $search Search terms
* @return integer
*/
public function countSearch($project_id, $search)
{
return $this->db->table(Task::TABLE)
->eq('project_id', $project_id)
->like('title', '%'.$search.'%')
->count();
}
/**
* Return true if the task exists
*

139
app/Model/TaskPaginator.php Normal file
View File

@ -0,0 +1,139 @@
<?php
namespace Model;
/**
* Task Paginator model
*
* @package model
* @author Frederic Guillot
*/
class TaskPaginator extends Base
{
/**
* Task search with pagination
*
* @access public
* @param integer $project_id Project id
* @param string $search Search terms
* @param integer $offset Offset
* @param integer $limit Limit
* @param string $column Sorting column
* @param string $direction Sorting direction
* @return array
*/
public function searchTasks($project_id, $search, $offset = 0, $limit = 25, $column = 'tasks.id', $direction = 'DESC')
{
return $this->taskFinder->getQuery()
->eq('project_id', $project_id)
->like('title', '%'.$search.'%')
->offset($offset)
->limit($limit)
->orderBy($column, $direction)
->findAll();
}
/**
* Count the number of tasks for a custom search
*
* @access public
* @param integer $project_id Project id
* @param string $search Search terms
* @return integer
*/
public function countSearchTasks($project_id, $search)
{
return $this->db->table(Task::TABLE)
->eq('project_id', $project_id)
->like('title', '%'.$search.'%')
->count();
}
/**
* Get all completed tasks with pagination
*
* @access public
* @param integer $project_id Project id
* @param integer $offset Offset
* @param integer $limit Limit
* @param string $column Sorting column
* @param string $direction Sorting direction
* @return array
*/
public function closedTasks($project_id, $offset = 0, $limit = 25, $column = 'tasks.date_completed', $direction = 'DESC')
{
return $this->taskFinder->getQuery()
->eq('project_id', $project_id)
->eq('is_active', Task::STATUS_CLOSED)
->offset($offset)
->limit($limit)
->orderBy($column, $direction)
->findAll();
}
/**
* Count all closed tasks
*
* @access public
* @param integer $project_id Project id
* @param array $status List of status id
* @return integer
*/
public function countClosedTasks($project_id)
{
return $this->db
->table(Task::TABLE)
->eq('project_id', $project_id)
->eq('is_active', Task::STATUS_CLOSED)
->count();
}
/**
* Get all open tasks for a given user
*
* @access public
* @param integer $user_id User id
* @param integer $offset Offset
* @param integer $limit Limit
* @param string $column Sorting column
* @param string $direction Sorting direction
* @return array
*/
public function userTasks($user_id, $offset = 0, $limit = 25, $column = 'tasks.id', $direction = 'ASC')
{
return $this->db
->table(Task::TABLE)
->columns(
'tasks.id',
'tasks.title',
'tasks.date_due',
'tasks.date_creation',
'tasks.project_id',
'tasks.color_id',
'projects.name AS project_name'
)
->join(Project::TABLE, 'id', 'project_id')
->eq('tasks.owner_id', $user_id)
->eq('tasks.is_active', Task::STATUS_OPEN)
->offset($offset)
->limit($limit)
->orderBy($column, $direction)
->findAll();
}
/**
* Count all tasks assigned to the user
*
* @access public
* @param integer $user_id User id
* @return integer
*/
public function countUserTasks($user_id)
{
return $this->db
->table(Task::TABLE)
->eq('owner_id', $user_id)
->eq('is_active', Task::STATUS_OPEN)
->count();
}
}

View File

@ -0,0 +1,26 @@
<section id="main">
<div class="page-header">
<ul>
<?php if (Helper\is_admin()): ?>
<li><i class="fa fa-plus fa-fw"></i><?= Helper\a(t('New project'), 'project', 'create') ?></li>
<?php endif ?>
<li><i class="fa fa-lock fa-fw"></i><?= Helper\a(t('New private project'), 'project', 'create', array('private' => 1)) ?></li>
<li><i class="fa fa-folder fa-fw"></i><?= Helper\a(t('Project management'), 'project', 'index') ?></li>
<?php if (Helper\is_admin()): ?>
<li><i class="fa fa-user fa-fw"></i><?= Helper\a(t('User management'), 'user', 'index') ?></li>
<li><i class="fa fa-cog fa-fw"></i><?= Helper\a(t('Settings'), 'config', 'index') ?></li>
<?php endif ?>
</ul>
</div>
<section id="dashboard">
<div class="dashboard-left-column">
<?= Helper\Template('app/projects', array('projects' => $projects, 'pagination' => $project_pagination)) ?>
<?= Helper\Template('app/tasks', array('tasks' => $tasks, 'pagination' => $task_pagination)) ?>
<?= Helper\Template('app/subtasks', array('subtasks' => $subtasks, 'pagination' => $subtask_pagination)) ?>
</div>
<div class="dashboard-right-column">
<h2><?= t('Activity stream') ?></h2>
<?= Helper\template('project_events', array('events' => $events)) ?>
</div>
</section>
</section>

View File

@ -1,114 +0,0 @@
<section id="main">
<div class="page-header">
<ul>
<?php if (Helper\is_admin()): ?>
<li><i class="fa fa-plus fa-fw"></i><?= Helper\a(t('New project'), 'project', 'create') ?></li>
<?php endif ?>
<li><i class="fa fa-lock fa-fw"></i><?= Helper\a(t('New private project'), 'project', 'create', array('private' => 1)) ?></li>
<li><i class="fa fa-folder fa-fw"></i><?= Helper\a(t('Project management'), 'project', 'index') ?></li>
<?php if (Helper\is_admin()): ?>
<li><i class="fa fa-user fa-fw"></i><?= Helper\a(t('User management'), 'user', 'index') ?></li>
<li><i class="fa fa-cog fa-fw"></i><?= Helper\a(t('Settings'), 'config', 'index') ?></li>
<?php endif ?>
</ul>
</div>
<section id="dashboard">
<div class="dashboard-left-column">
<h2><?= t('My projects') ?></h2>
<?php if (empty($projects)): ?>
<p class="alert"><?= t('Your are not member of any project.') ?></p>
<?php else: ?>
<table class="table-fixed">
<tr>
<th class="column-8">&nbsp;</th>
<th class="column-20"><?= t('Project') ?></th>
<th><?= t('Columns') ?></th>
</tr>
<?php foreach ($projects as $project): ?>
<tr>
<td>
<?= Helper\a('#'.$project['id'], 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link') ?>
</td>
<td>
<?php if (Helper\is_project_admin($project)): ?>
<?= Helper\a('<i class="fa fa-cog"></i>', 'project', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Settings')) ?>&nbsp;
<?php endif ?>
<?= Helper\a(Helper\escape($project['name']), 'board', 'show', array('project_id' => $project['id'])) ?>
</td>
<td class="dashboard-project-stats">
<?php foreach ($project['columns'] as $column): ?>
<strong title="<?= t('Task count') ?>"><?= $column['nb_tasks'] ?></strong>
<span><?= Helper\escape($column['title']) ?></span>
<?php endforeach ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
<h2><?= t('My tasks') ?></h2>
<?php if (empty($tasks)): ?>
<p class="alert"><?= t('There is nothing assigned to you.') ?></p>
<?php else: ?>
<table class="table-fixed">
<tr>
<th class="column-8">&nbsp;</th>
<th class="column-20"><?= t('Project') ?></th>
<th><?= t('Task') ?></th>
<th class="column-20"><?= t('Due date') ?></th>
</tr>
<?php foreach ($tasks as $task): ?>
<tr>
<td class="task-table task-<?= $task['color_id'] ?>">
<?= Helper\a('#'.$task['id'], 'task', 'show', array('task_id' => $task['id'])) ?>
</td>
<td>
<?= Helper\a(Helper\escape($task['project_name']), 'board', 'show', array('project_id' => $task['project_id'])) ?>
</td>
<td>
<?= Helper\a(Helper\escape($task['title']), 'task', 'show', array('task_id' => $task['id'])) ?>
</td>
<td>
<?= dt('%B %e, %Y', $task['date_due']) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
<h2><?= t('My subtasks') ?></h2>
<?php if (empty($subtasks)): ?>
<p class="alert"><?= t('There is nothing assigned to you.') ?></p>
<?php else: ?>
<table class="table-fixed">
<tr>
<th class="column-8">&nbsp;</th>
<th class="column-20"><?= t('Project') ?></th>
<th class="column-15"><?= t('Status') ?></th>
<th><?= t('Subtask') ?></th>
</tr>
<?php foreach ($subtasks as $subtask): ?>
<tr>
<td class="task-table task-<?= $subtask['color_id'] ?>">
<?= Helper\a('#'.$subtask['task_id'], 'task', 'show', array('task_id' => $subtask['task_id'])) ?>
</td>
<td>
<?= Helper\a(Helper\escape($subtask['project_name']), 'board', 'show', array('project_id' => $subtask['project_id'])) ?>
</td>
<td>
<?= Helper\escape($subtask['status_name']) ?>
</td>
<td>
<?= Helper\a(Helper\escape($subtask['title']), 'task', 'show', array('task_id' => $subtask['task_id'])) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
</div>
<div class="dashboard-right-column">
<h2><?= t('Activity stream') ?></h2>
<?= Helper\template('project_events', array('events' => $events)) ?>
</section>
</section>

View File

@ -0,0 +1,33 @@
<h2><?= t('My projects') ?></h2>
<?php if (empty($projects)): ?>
<p class="alert"><?= t('Your are not member of any project.') ?></p>
<?php else: ?>
<table class="table-fixed">
<tr>
<th class="column-8"><?= Helper\order('Id', 'id', $pagination) ?></th>
<th class="column-20"><?= Helper\order(t('Project'), 'name', $pagination) ?></th>
<th><?= t('Columns') ?></th>
</tr>
<?php foreach ($projects as $project): ?>
<tr>
<td>
<?= Helper\a('#'.$project['id'], 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link') ?>
</td>
<td>
<?php if (Helper\is_project_admin($project)): ?>
<?= Helper\a('<i class="fa fa-cog"></i>', 'project', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Settings')) ?>&nbsp;
<?php endif ?>
<?= Helper\a(Helper\escape($project['name']), 'board', 'show', array('project_id' => $project['id'])) ?>
</td>
<td class="dashboard-project-stats">
<?php foreach ($project['columns'] as $column): ?>
<strong title="<?= t('Task count') ?>"><?= $column['nb_tasks'] ?></strong>
<span><?= Helper\escape($column['title']) ?></span>
<?php endforeach ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?= Helper\paginate($pagination) ?>
<?php endif ?>

View File

@ -0,0 +1,31 @@
<h2><?= t('My subtasks') ?></h2>
<?php if (empty($subtasks)): ?>
<p class="alert"><?= t('There is nothing assigned to you.') ?></p>
<?php else: ?>
<table class="table-fixed">
<tr>
<th class="column-10"><?= Helper\order(t('Task Id'), 'tasks.id', $pagination) ?></th>
<th class="column-20"><?= Helper\order(t('Project'), 'project_name', $pagination) ?></th>
<th class="column-15"><?= Helper\order(t('Status'), 'status', $pagination) ?></th>
<th><?= Helper\order(t('Subtask'), 'title', $pagination) ?></th>
</tr>
<?php foreach ($subtasks as $subtask): ?>
<tr>
<td class="task-table task-<?= $subtask['color_id'] ?>">
<?= Helper\a('#'.$subtask['task_id'], 'task', 'show', array('task_id' => $subtask['task_id'])) ?>
</td>
<td>
<?= Helper\a(Helper\escape($subtask['project_name']), 'board', 'show', array('project_id' => $subtask['project_id'])) ?>
</td>
<td>
<?= Helper\escape($subtask['status_name']) ?>
</td>
<td>
<?= Helper\a(Helper\escape($subtask['title']), 'task', 'show', array('task_id' => $subtask['task_id'])) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?= Helper\paginate($pagination) ?>
<?php endif ?>

View File

@ -0,0 +1,31 @@
<h2><?= t('My tasks') ?></h2>
<?php if (empty($tasks)): ?>
<p class="alert"><?= t('There is nothing assigned to you.') ?></p>
<?php else: ?>
<table class="table-fixed">
<tr>
<th class="column-8"><?= Helper\order('Id', 'tasks.id', $pagination) ?></th>
<th class="column-20"><?= Helper\order(t('Project'), 'project_name', $pagination) ?></th>
<th><?= Helper\order(t('Task'), 'title', $pagination) ?></th>
<th class="column-20"><?= Helper\order(t('Due date'), 'date_due', $pagination) ?></th>
</tr>
<?php foreach ($tasks as $task): ?>
<tr>
<td class="task-table task-<?= $task['color_id'] ?>">
<?= Helper\a('#'.$task['id'], 'task', 'show', array('task_id' => $task['id'])) ?>
</td>
<td>
<?= Helper\a(Helper\escape($task['project_name']), 'board', 'show', array('project_id' => $task['project_id'])) ?>
</td>
<td>
<?= Helper\a(Helper\escape($task['title']), 'task', 'show', array('task_id' => $task['id'])) ?>
</td>
<td>
<?= dt('%B %e, %Y', $task['date_due']) ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?= Helper\paginate($pagination) ?>
<?php endif ?>

View File

@ -618,8 +618,8 @@ function paginate(array $pagination)
{
extract($pagination);
$html = '<div id="pagination">';
$html .= '<span id="pagination-previous">';
$html = '<div class="pagination">';
$html .= '<span class="pagination-previous">';
if ($pagination['offset'] > 0) {
$offset = $pagination['offset'] - $limit;
@ -630,7 +630,7 @@ function paginate(array $pagination)
}
$html .= '</span>';
$html .= '<span id="pagination-next">';
$html .= '<span class="pagination-next">';
if (($total - $pagination['offset']) > $limit) {
$offset = $pagination['offset'] + $limit;

View File

@ -18,6 +18,7 @@ body {
body {
margin-left: 10px;
margin-right: 10px;
padding-bottom: 20px;
color: #333;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
@ -1082,15 +1083,15 @@ tr td.task-orange,
}
/* pagination */
#pagination {
.pagination {
text-align: center;
}
#pagination-next {
.pagination-next {
margin-left: 5px;
}
#pagination-previous {
.pagination-previous {
margin-right: 5px;
}/* popover */
#popover-container {

View File

@ -17,6 +17,7 @@ body {
body {
margin-left: 10px;
margin-right: 10px;
padding-bottom: 20px;
color: #333;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;

View File

@ -4,14 +4,14 @@
}
/* pagination */
#pagination {
.pagination {
text-align: center;
}
#pagination-next {
.pagination-next {
margin-left: 5px;
}
#pagination-previous {
.pagination-previous {
margin-right: 5px;
}

View File

@ -0,0 +1,18 @@
#!/usr/bin/env php
<?php
require __DIR__.'/../app/common.php';
use Model\Project;
use Model\ProjectPermission;
$projectModel = new Project($container);
$permissionModel = new ProjectPermission($container);
for ($i = 0; $i < 100; $i++) {
$id = $projectModel->create(array(
'name' => 'Project #'.$i
));
$permissionModel->allowUser($id, 1);
}

View File

@ -4,9 +4,35 @@
require __DIR__.'/../app/common.php';
use Model\Task;
use Model\SubTask;
use Model\Project;
use Model\ProjectPermission;
use Model\User;
$task_per_column = 250;
$taskModel = new Task($registry);
$task_per_column = 50;
$userModel = new User($container);
$projectModel = new Project($container);
$permissionModel = new ProjectPermission($container);
$taskModel = new Task($container);
$subtaskModel = new SubTask($container);
for ($i = 0; $i <= 100; $i++) {
$id = $projectModel->create(array(
'name' => 'Project #'.$i
));
$permissionModel->allowUser($id, 1);
}
for ($i = 0; $i <= 500; $i++) {
$userModel->create(array(
'username' => 'user'.$i,
'password' => 'password'.$i,
'name' => 'User #'.$i,
'email' => 'user'.$i.'@localhost',
));
}
foreach (array(1, 2, 3, 4) as $column_id) {
@ -14,14 +40,21 @@ foreach (array(1, 2, 3, 4) as $column_id) {
$task = array(
'title' => 'Task #'.$i.'-'.$column_id,
'project_id' => 1,
'project_id' => mt_rand(1, 100),
'column_id' => $column_id,
'owner_id' => rand(0, 1),
'color_id' => rand(0, 1) === 0 ? 'green' : 'purple',
'score' => rand(0, 21),
'is_active' => rand(0, 1),
'owner_id' => 1,
'color_id' => mt_rand(0, 1) === 0 ? 'green' : 'purple',
'score' => mt_rand(0, 21),
'is_active' => mt_rand(0, 1),
);
$taskModel->create($task);
$id = $taskModel->create($task);
$subtaskModel->create(array(
'title' => 'Subtask of task #'.$id,
'user_id' => 1,
'status' => mt_rand(0, 2),
'task_id' => $id,
));
}
}

View File

@ -5,7 +5,7 @@ require __DIR__.'/../app/common.php';
use Model\User;
$userModel = new User($registry);
$userModel = new User($container);
for ($i = 0; $i < 500; $i++) {
$userModel->create(array(