Add a basic task search
This commit is contained in:
@@ -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
|
* List of completed tasks for a given project
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -43,4 +43,9 @@ class Request
|
|||||||
|
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isPost()
|
||||||
|
{
|
||||||
|
return isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,6 +52,10 @@ namespace Translator {
|
|||||||
|
|
||||||
function datetime($format, $timestamp)
|
function datetime($format, $timestamp)
|
||||||
{
|
{
|
||||||
|
if (! $timestamp) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
return strftime(get($format, $format), (int) $timestamp);
|
return strftime(get($format, $format), (int) $timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -283,4 +283,10 @@ return array(
|
|||||||
// 'Filter by user' => '',
|
// 'Filter by user' => '',
|
||||||
// 'Filter by due date' => ',
|
// 'Filter by due date' => ',
|
||||||
// 'Everybody' => '',
|
// '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 user' => 'Filtrer par utilisateur',
|
||||||
'Filter by due date' => 'Filtrer par date d\'échéance',
|
'Filter by due date' => 'Filtrer par date d\'échéance',
|
||||||
'Everybody' => 'Tout le monde',
|
'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 user' => '',
|
||||||
// 'Filter by due date' => ',
|
// 'Filter by due date' => ',
|
||||||
// 'Everybody' => '',
|
// 'Everybody' => '',
|
||||||
|
// 'Open' => '',
|
||||||
|
// 'Closed' => '',
|
||||||
|
// 'Search' => '',
|
||||||
|
// 'Nothing found.' => '',
|
||||||
|
// 'Search in the project "%s"' => '',
|
||||||
|
// 'Due date' => '',
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -284,4 +284,10 @@ return array(
|
|||||||
// 'Filter by user' => '',
|
// 'Filter by user' => '',
|
||||||
// 'Filter by due date' => ',
|
// 'Filter by due date' => ',
|
||||||
// 'Everybody' => '',
|
// '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');
|
->join('users', 'id', 'owner_id');
|
||||||
|
|
||||||
foreach ($filters as $filter) {
|
foreach ($filters as $key => $filter) {
|
||||||
$table->$filter['operator']($filter['column'], $filter['value']);
|
|
||||||
|
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)) {
|
if (empty($sorting)) {
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
<?= Helper\form_select('user_id', $users, $filters) ?>
|
<?= Helper\form_select('user_id', $users, $filters) ?>
|
||||||
</li>
|
</li>
|
||||||
<li><a href="#" id="filter-due-date"><?= t('Filter by due date') ?></a></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>
|
<li><a href="?controller=project&action=tasks&project_id=<?= $current_project_id ?>"><?= t('Completed tasks') ?></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
80
templates/project_search.php
Normal file
80
templates/project_search.php
Normal 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&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>
|
<h2><?= t('Completed tasks for "%s"', $project['name']) ?><span id="page-counter"> (<?= $nb_tasks ?>)</span></h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="?controller=board&action=show&project_id=<?= $project['id'] ?>"><?= t('Back to the board') ?></a></li>
|
<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>
|
<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>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<section>
|
<section>
|
||||||
@@ -19,6 +17,7 @@
|
|||||||
<th><?= t('Column') ?></th>
|
<th><?= t('Column') ?></th>
|
||||||
<th><?= t('Title') ?></th>
|
<th><?= t('Title') ?></th>
|
||||||
<th><?= t('Assignee') ?></th>
|
<th><?= t('Assignee') ?></th>
|
||||||
|
<th><?= t('Due date') ?></th>
|
||||||
<th><?= t('Date created') ?></th>
|
<th><?= t('Date created') ?></th>
|
||||||
<th><?= t('Date completed') ?></th>
|
<th><?= t('Date completed') ?></th>
|
||||||
</tr>
|
</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>
|
<a href="?controller=task&action=show&task_id=<?= $task['id'] ?>" title="<?= t('View this task') ?>"><?= Helper\escape($task['title']) ?></a>
|
||||||
</td>
|
</td>
|
||||||
<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>
|
||||||
<td>
|
<td>
|
||||||
<?= dt('%B %e, %G at %k:%M %p', $task['date_creation']) ?>
|
<?= 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);
|
$p = new Project($this->db, $this->event);
|
||||||
|
|
||||||
$this->assertEquals(1, $p->create(array('name' => 'test1')));
|
$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(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)));
|
$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')));
|
$tasks = $t->find(array(array('column' => 'project_id', 'operator' => 'eq', 'value' => '1')));
|
||||||
$this->assertEquals(2, count($tasks));
|
$this->assertEquals(2, count($tasks));
|
||||||
@@ -34,6 +34,45 @@ class TaskTest extends Base
|
|||||||
));
|
));
|
||||||
$this->assertEquals(1, count($tasks));
|
$this->assertEquals(1, count($tasks));
|
||||||
$this->assertEquals(2, $tasks[0]['id']);
|
$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()
|
public function testDateFormat()
|
||||||
|
|||||||
Reference in New Issue
Block a user