summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controllers/project.php51
-rw-r--r--core/request.php5
-rw-r--r--core/translator.php4
-rw-r--r--locales/es_ES/translations.php6
-rw-r--r--locales/fr_FR/translations.php6
-rw-r--r--locales/pl_PL/translations.php6
-rw-r--r--locales/pt_BR/translations.php6
-rw-r--r--models/task.php17
-rw-r--r--templates/board_index.php1
-rw-r--r--templates/project_search.php80
-rw-r--r--templates/project_tasks.php14
-rw-r--r--tests/TaskTest.php43
12 files changed, 231 insertions, 8 deletions
diff --git a/controllers/project.php b/controllers/project.php
index 6085caec..a9ce8634 100644
--- a/controllers/project.php
+++ b/controllers/project.php
@@ -26,6 +26,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
*
* @access public
diff --git a/core/request.php b/core/request.php
index b2c3e12e..f2fa4d9f 100644
--- a/core/request.php
+++ b/core/request.php
@@ -43,4 +43,9 @@ class Request
return '';
}
+
+ public function isPost()
+ {
+ return isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST';
+ }
}
diff --git a/core/translator.php b/core/translator.php
index 0f8c3d89..09480111 100644
--- a/core/translator.php
+++ b/core/translator.php
@@ -52,6 +52,10 @@ namespace Translator {
function datetime($format, $timestamp)
{
+ if (! $timestamp) {
+ return '';
+ }
+
return strftime(get($format, $format), (int) $timestamp);
}
diff --git a/locales/es_ES/translations.php b/locales/es_ES/translations.php
index 8b331c49..bf6f80e6 100644
--- a/locales/es_ES/translations.php
+++ b/locales/es_ES/translations.php
@@ -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' => '',
);
diff --git a/locales/fr_FR/translations.php b/locales/fr_FR/translations.php
index 563ccc91..54659276 100644
--- a/locales/fr_FR/translations.php
+++ b/locales/fr_FR/translations.php
@@ -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',
);
diff --git a/locales/pl_PL/translations.php b/locales/pl_PL/translations.php
index 3ecbc471..ed16779f 100644
--- a/locales/pl_PL/translations.php
+++ b/locales/pl_PL/translations.php
@@ -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' => '',
);
diff --git a/locales/pt_BR/translations.php b/locales/pt_BR/translations.php
index 53ff4b15..54b357db 100644
--- a/locales/pt_BR/translations.php
+++ b/locales/pt_BR/translations.php
@@ -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' => '',
);
diff --git a/models/task.php b/models/task.php
index b61fb13f..bef92f20 100644
--- a/models/task.php
+++ b/models/task.php
@@ -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)) {
diff --git a/templates/board_index.php b/templates/board_index.php
index fc7a4932..f7fa4bdd 100644
--- a/templates/board_index.php
+++ b/templates/board_index.php
@@ -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>
diff --git a/templates/project_search.php b/templates/project_search.php
new file mode 100644
index 00000000..d7d7748e
--- /dev/null
+++ b/templates/project_search.php
@@ -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> \ No newline at end of file
diff --git a/templates/project_tasks.php b/templates/project_tasks.php
index d54565f3..1ffd52ac 100644
--- a/templates/project_tasks.php
+++ b/templates/project_tasks.php
@@ -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']) ?>
diff --git a/tests/TaskTest.php b/tests/TaskTest.php
index 0c5e2496..701ba611 100644
--- a/tests/TaskTest.php
+++ b/tests/TaskTest.php
@@ -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()