Add a basic task search

This commit is contained in:
Frédéric Guillot 2014-04-27 15:14:13 -04:00
parent 6551609d1b
commit 096b282a47
12 changed files with 231 additions and 8 deletions

View File

@ -25,6 +25,57 @@ class Project extends Base
)));
}
/**
* Task search for a given project
*
* @access public
*/
public function search()
{
$project_id = $this->request->getIntegerParam('project_id');
$search = $this->request->getStringParam('search');
$project = $this->project->getById($project_id);
$tasks = array();
$nb_tasks = 0;
if (! $project) {
$this->session->flashError(t('Project not found.'));
$this->response->redirect('?controller=project');
}
$this->checkProjectPermissions($project['id']);
if ($search !== '') {
$filters = array(
array('column' => 'project_id', 'operator' => 'eq', 'value' => $project_id),
'or' => array(
array('column' => 'title', 'operator' => 'like', 'value' => '%'.$search.'%'),
array('column' => 'description', 'operator' => 'like', 'value' => '%'.$search.'%'),
)
);
$tasks = $this->task->find($filters);
$nb_tasks = count($tasks);
}
$this->response->html($this->template->layout('project_search', array(
'tasks' => $tasks,
'nb_tasks' => $nb_tasks,
'values' => array(
'search' => $search,
'controller' => 'project',
'action' => 'search',
'project_id' => $project['id'],
),
'menu' => 'projects',
'project' => $project,
'columns' => $this->board->getColumnsList($project_id),
'title' => $project['name'].($nb_tasks > 0 ? ' ('.$nb_tasks.')' : '')
)));
}
/**
* List of completed tasks for a given project
*

View File

@ -43,4 +43,9 @@ class Request
return '';
}
public function isPost()
{
return isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST';
}
}

View File

@ -52,6 +52,10 @@ namespace Translator {
function datetime($format, $timestamp)
{
if (! $timestamp) {
return '';
}
return strftime(get($format, $format), (int) $timestamp);
}

View File

@ -283,4 +283,10 @@ return array(
// 'Filter by user' => '',
// 'Filter by due date' => ',
// 'Everybody' => '',
// 'Open' => '',
// 'Closed' => '',
// 'Search' => '',
// 'Nothing found.' => '',
// 'Search in the project "%s"' => '',
// 'Due date' => '',
);

View File

@ -283,4 +283,10 @@ return array(
'Filter by user' => 'Filtrer par utilisateur',
'Filter by due date' => 'Filtrer par date d\'échéance',
'Everybody' => 'Tout le monde',
'Open' => 'Ouvert',
'Closed' => 'Fermé',
'Search' => 'Rechercher',
'Nothing found.' => 'Rien trouvé.',
'Search in the project "%s"' => 'Rechercher dans le projet « %s »',
'Due date' => 'Date d\'échéance',
);

View File

@ -288,4 +288,10 @@ return array(
// 'Filter by user' => '',
// 'Filter by due date' => ',
// 'Everybody' => '',
// 'Open' => '',
// 'Closed' => '',
// 'Search' => '',
// 'Nothing found.' => '',
// 'Search in the project "%s"' => '',
// 'Due date' => '',
);

View File

@ -284,4 +284,10 @@ return array(
// 'Filter by user' => '',
// 'Filter by due date' => ',
// 'Everybody' => '',
// 'Open' => '',
// 'Closed' => '',
// 'Search' => '',
// 'Nothing found.' => '',
// 'Search in the project "%s"' => '',
// 'Due date' => '',
);

View File

@ -152,8 +152,21 @@ class Task extends Base
)
->join('users', 'id', 'owner_id');
foreach ($filters as $filter) {
$table->$filter['operator']($filter['column'], $filter['value']);
foreach ($filters as $key => $filter) {
if ($key === 'or') {
$table->beginOr();
foreach ($filter as $subfilter) {
$table->$subfilter['operator']($subfilter['column'], $subfilter['value']);
}
$table->closeOr();
}
else if (isset($filter['operator']) && isset($filter['column']) && isset($filter['value'])) {
$table->$filter['operator']($filter['column'], $filter['value']);
}
}
if (empty($sorting)) {

View File

@ -22,6 +22,7 @@
<?= Helper\form_select('user_id', $users, $filters) ?>
</li>
<li><a href="#" id="filter-due-date"><?= t('Filter by due date') ?></a></li>
<li><a href="?controller=project&amp;action=search&amp;project_id=<?= $current_project_id ?>"><?= t('Search') ?></a></li>
<li><a href="?controller=project&amp;action=tasks&amp;project_id=<?= $current_project_id ?>"><?= t('Completed tasks') ?></a></li>
</ul>
</div>

View File

@ -0,0 +1,80 @@
<section id="main">
<div class="page-header">
<h2>
<?= t('Search in the project "%s"', $project['name']) ?>
<?php if (! empty($nb_tasks)): ?>
<span id="page-counter"> (<?= $nb_tasks ?>)</span>
<?php endif ?>
</h2>
<ul>
<li><a href="?controller=board&amp;action=show&amp;project_id=<?= $project['id'] ?>"><?= t('Back to the board') ?></a></li>
<li><a href="?controller=project&amp;action=tasks&amp;project_id=<?= $project['id'] ?>"><?= t('Completed tasks') ?></a></li>
<li><a href="?controller=project&amp;action=index"><?= t('List of projects') ?></a></li>
</ul>
</div>
<section>
<form method="get" action="?" autocomplete="off">
<?= Helper\form_hidden('controller', $values) ?>
<?= Helper\form_hidden('action', $values) ?>
<?= Helper\form_hidden('project_id', $values) ?>
<?= Helper\form_text('search', $values, array(), array('autofocus', 'required', 'placeholder="'.t('Search').'"')) ?>
<input type="submit" value="<?= t('Search') ?>" class="btn btn-blue"/>
</form>
<?php if (empty($tasks) && ! empty($values['search'])): ?>
<p class="alert"><?= t('Nothing found.') ?></p>
<?php elseif (! empty($tasks)): ?>
<table>
<tr>
<th><?= t('Id') ?></th>
<th><?= t('Column') ?></th>
<th><?= t('Title') ?></th>
<th><?= t('Assignee') ?></th>
<th><?= t('Due date') ?></th>
<th><?= t('Date created') ?></th>
<th><?= t('Date completed') ?></th>
<th><?= t('Status') ?></th>
</tr>
<?php foreach ($tasks as $task): ?>
<tr>
<td class="task task-<?= $task['color_id'] ?>">
<a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>" title="<?= t('View this task') ?>"><?= Helper\escape($task['id']) ?></a>
</td>
<td>
<?= Helper\in_list($task['column_id'], $columns) ?>
</td>
<td>
<a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>" title="<?= t('View this task') ?>"><?= Helper\escape($task['title']) ?></a>
</td>
<td>
<?php if ($task['username']): ?>
<?= Helper\escape($task['username']) ?>
<?php else: ?>
<?= t('Unassigned') ?>
<?php endif ?>
</td>
<td>
<?= dt('%B %e, %G', $task['date_due']) ?>
</td>
<td>
<?= dt('%B %e, %G at %k:%M %p', $task['date_creation']) ?>
</td>
<td>
<?php if ($task['date_completed']): ?>
<?= dt('%B %e, %G at %k:%M %p', $task['date_completed']) ?>
<?php endif ?>
</td>
<td>
<?php if ($task['is_active'] == \Model\Task::STATUS_OPEN): ?>
<?= t('Open') ?>
<?php else: ?>
<?= t('Closed') ?>
<?php endif ?>
</td>
</tr>
<?php endforeach ?>
</table>
<?php endif ?>
</section>
</section>

View File

@ -3,10 +3,8 @@
<h2><?= t('Completed tasks for "%s"', $project['name']) ?><span id="page-counter"> (<?= $nb_tasks ?>)</span></h2>
<ul>
<li><a href="?controller=board&amp;action=show&amp;project_id=<?= $project['id'] ?>"><?= t('Back to the board') ?></a></li>
<li><a href="?controller=project&amp;action=search&amp;project_id=<?= $project['id'] ?>"><?= t('Search') ?></a></li>
<li><a href="?controller=project&amp;action=index"><?= t('List of projects') ?></a></li>
<?php if (Helper\is_admin()): ?>
<li><a href="?controller=project&amp;action=create"><?= t('New project') ?></a></li>
<?php endif ?>
</ul>
</div>
<section>
@ -19,6 +17,7 @@
<th><?= t('Column') ?></th>
<th><?= t('Title') ?></th>
<th><?= t('Assignee') ?></th>
<th><?= t('Due date') ?></th>
<th><?= t('Date created') ?></th>
<th><?= t('Date completed') ?></th>
</tr>
@ -34,7 +33,14 @@
<a href="?controller=task&amp;action=show&amp;task_id=<?= $task['id'] ?>" title="<?= t('View this task') ?>"><?= Helper\escape($task['title']) ?></a>
</td>
<td>
<?= Helper\escape($task['username']) ?>
<?php if ($task['username']): ?>
<?= Helper\escape($task['username']) ?>
<?php else: ?>
<?= t('Unassigned') ?>
<?php endif ?>
</td>
<td>
<?= dt('%B %e, %G', $task['date_due']) ?>
</td>
<td>
<?= dt('%B %e, %G at %k:%M %p', $task['date_creation']) ?>

View File

@ -13,8 +13,8 @@ class TaskTest extends Base
$p = new Project($this->db, $this->event);
$this->assertEquals(1, $p->create(array('name' => 'test1')));
$this->assertEquals(1, $t->create(array('title' => 'test a', 'project_id' => 1, 'column_id' => 3, 'owner_id' => 1)));
$this->assertEquals(2, $t->create(array('title' => 'test b', 'project_id' => 1, 'column_id' => 2, 'owner_id' => 2)));
$this->assertEquals(1, $t->create(array('title' => 'test a', 'project_id' => 1, 'column_id' => 3, 'owner_id' => 1, 'description' => 'biloute')));
$this->assertEquals(2, $t->create(array('title' => 'test b', 'project_id' => 1, 'column_id' => 2, 'owner_id' => 2, 'description' => 'toto et titi sont dans un bateau')));
$tasks = $t->find(array(array('column' => 'project_id', 'operator' => 'eq', 'value' => '1')));
$this->assertEquals(2, count($tasks));
@ -34,6 +34,45 @@ class TaskTest extends Base
));
$this->assertEquals(1, count($tasks));
$this->assertEquals(2, $tasks[0]['id']);
// Condition with OR
$search = 'bateau';
$filters = array(
array('column' => 'project_id', 'operator' => 'eq', 'value' => 1),
'or' => array(
array('column' => 'title', 'operator' => 'like', 'value' => '%'.$search.'%'),
array('column' => 'description', 'operator' => 'like', 'value' => '%'.$search.'%'),
)
);
$tasks = $t->find($filters);
$this->assertEquals(1, count($tasks));
$this->assertEquals(2, $tasks[0]['id']);
$search = 'toto et titi';
$filters = array(
array('column' => 'project_id', 'operator' => 'eq', 'value' => 1),
'or' => array(
array('column' => 'title', 'operator' => 'like', 'value' => '%'.$search.'%'),
array('column' => 'description', 'operator' => 'like', 'value' => '%'.$search.'%'),
)
);
$tasks = $t->find($filters);
$this->assertEquals(1, count($tasks));
$this->assertEquals(2, $tasks[0]['id']);
$search = 'john';
$filters = array(
array('column' => 'project_id', 'operator' => 'eq', 'value' => 1),
'or' => array(
array('column' => 'title', 'operator' => 'like', 'value' => '%'.$search.'%'),
array('column' => 'description', 'operator' => 'like', 'value' => '%'.$search.'%'),
)
);
$tasks = $t->find($filters);
$this->assertEquals(0, count($tasks));
}
public function testDateFormat()