diff options
author | Frédéric Guillot <fguillot@users.noreply.github.com> | 2014-04-27 15:14:13 -0400 |
---|---|---|
committer | Frédéric Guillot <fguillot@users.noreply.github.com> | 2014-04-27 15:14:13 -0400 |
commit | 096b282a473fa2b27c3bfe3061f54b5fd83c75e0 (patch) | |
tree | fc358e47860c50ab8505e0666043d76196e48016 | |
parent | 6551609d1b248011d301080c1be7c48085dc5d55 (diff) |
Add a basic task search
-rw-r--r-- | controllers/project.php | 51 | ||||
-rw-r--r-- | core/request.php | 5 | ||||
-rw-r--r-- | core/translator.php | 4 | ||||
-rw-r--r-- | locales/es_ES/translations.php | 6 | ||||
-rw-r--r-- | locales/fr_FR/translations.php | 6 | ||||
-rw-r--r-- | locales/pl_PL/translations.php | 6 | ||||
-rw-r--r-- | locales/pt_BR/translations.php | 6 | ||||
-rw-r--r-- | models/task.php | 17 | ||||
-rw-r--r-- | templates/board_index.php | 1 | ||||
-rw-r--r-- | templates/project_search.php | 80 | ||||
-rw-r--r-- | templates/project_tasks.php | 14 | ||||
-rw-r--r-- | tests/TaskTest.php | 43 |
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&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> 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&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>
\ 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&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']) ?> 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() |