Add a basic task search
This commit is contained in:
parent
6551609d1b
commit
096b282a47
|
|
@ -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
|
||||
*
|
||||
|
|
|
|||
|
|
@ -43,4 +43,9 @@ class Request
|
|||
|
||||
return '';
|
||||
}
|
||||
|
||||
public function isPost()
|
||||
{
|
||||
return isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST';
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,10 @@ namespace Translator {
|
|||
|
||||
function datetime($format, $timestamp)
|
||||
{
|
||||
if (! $timestamp) {
|
||||
return '';
|
||||
}
|
||||
|
||||
return strftime(get($format, $format), (int) $timestamp);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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' => '',
|
||||
);
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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&action=search&project_id=<?= $current_project_id ?>"><?= t('Search') ?></a></li>
|
||||
<li><a href="?controller=project&action=tasks&project_id=<?= $current_project_id ?>"><?= t('Completed tasks') ?></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -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&action=show&project_id=<?= $project['id'] ?>"><?= t('Back to the board') ?></a></li>
|
||||
<li><a href="?controller=project&action=tasks&project_id=<?= $project['id'] ?>"><?= t('Completed tasks') ?></a></li>
|
||||
<li><a href="?controller=project&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&action=show&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&action=show&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>
|
||||
|
|
@ -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&action=show&project_id=<?= $project['id'] ?>"><?= t('Back to the board') ?></a></li>
|
||||
<li><a href="?controller=project&action=search&project_id=<?= $project['id'] ?>"><?= t('Search') ?></a></li>
|
||||
<li><a href="?controller=project&action=index"><?= t('List of projects') ?></a></li>
|
||||
<?php if (Helper\is_admin()): ?>
|
||||
<li><a href="?controller=project&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&action=show&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']) ?>
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in New Issue