Filter refactoring
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Filter\TaskProjectFilter;
|
||||
use Kanboard\Model\Task as TaskModel;
|
||||
|
||||
/**
|
||||
@@ -44,13 +45,15 @@ class Analytic extends Base
|
||||
public function compareHours()
|
||||
{
|
||||
$project = $this->getProject();
|
||||
$query = $this->taskFilter->create()->filterByProject($project['id'])->getQuery();
|
||||
|
||||
$paginator = $this->paginator
|
||||
->setUrl('analytic', 'compareHours', array('project_id' => $project['id']))
|
||||
->setMax(30)
|
||||
->setOrder(TaskModel::TABLE.'.id')
|
||||
->setQuery($query)
|
||||
->setQuery($this->taskQuery
|
||||
->withFilter(new TaskProjectFilter($project['id']))
|
||||
->getQuery()
|
||||
)
|
||||
->calculate();
|
||||
|
||||
$this->response->html($this->helper->layout->analytic('analytic/compare_hours', array(
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Formatter\BoardFormatter;
|
||||
|
||||
/**
|
||||
* Board controller
|
||||
*
|
||||
@@ -51,12 +53,14 @@ class Board extends Base
|
||||
$search = $this->helper->projectHeader->getSearchQuery($project);
|
||||
|
||||
$this->response->html($this->helper->layout->app('board/view_private', array(
|
||||
'swimlanes' => $this->taskFilter->search($search)->getBoard($project['id']),
|
||||
'project' => $project,
|
||||
'title' => $project['name'],
|
||||
'description' => $this->helper->projectHeader->getDescription($project),
|
||||
'board_private_refresh_interval' => $this->config->get('board_private_refresh_interval'),
|
||||
'board_highlight_period' => $this->config->get('board_highlight_period'),
|
||||
'swimlanes' => $this->taskLexer
|
||||
->build($search)
|
||||
->format(BoardFormatter::getInstance($this->container)->setProjectId($project['id']))
|
||||
)));
|
||||
}
|
||||
|
||||
@@ -178,9 +182,11 @@ class Board extends Base
|
||||
{
|
||||
return $this->template->render('board/table_container', array(
|
||||
'project' => $this->project->getById($project_id),
|
||||
'swimlanes' => $this->taskFilter->search($this->userSession->getFilters($project_id))->getBoard($project_id),
|
||||
'board_private_refresh_interval' => $this->config->get('board_private_refresh_interval'),
|
||||
'board_highlight_period' => $this->config->get('board_highlight_period'),
|
||||
'swimlanes' => $this->taskLexer
|
||||
->build($this->userSession->getFilters($project_id))
|
||||
->format(BoardFormatter::getInstance($this->container)->setProjectId($project_id))
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Filter\TaskAssigneeFilter;
|
||||
use Kanboard\Filter\TaskProjectFilter;
|
||||
use Kanboard\Filter\TaskStatusFilter;
|
||||
use Kanboard\Model\Task as TaskModel;
|
||||
|
||||
/**
|
||||
@@ -40,21 +43,11 @@ class Calendar extends Base
|
||||
$project_id = $this->request->getIntegerParam('project_id');
|
||||
$start = $this->request->getStringParam('start');
|
||||
$end = $this->request->getStringParam('end');
|
||||
$search = $this->userSession->getFilters($project_id);
|
||||
$queryBuilder = $this->taskLexer->build($search)->withFilter(new TaskProjectFilter($project_id));
|
||||
|
||||
// Common filter
|
||||
$filter = $this->taskFilterCalendarFormatter
|
||||
->search($this->userSession->getFilters($project_id))
|
||||
->filterByProject($project_id);
|
||||
|
||||
// Tasks
|
||||
if ($this->config->get('calendar_project_tasks', 'date_started') === 'date_creation') {
|
||||
$events = $filter->copy()->filterByCreationDateRange($start, $end)->setColumns('date_creation', 'date_completed')->format();
|
||||
} else {
|
||||
$events = $filter->copy()->filterByStartDateRange($start, $end)->setColumns('date_started', 'date_completed')->format();
|
||||
}
|
||||
|
||||
// Tasks with due date
|
||||
$events = array_merge($events, $filter->copy()->filterByDueDateRange($start, $end)->setColumns('date_due')->setFullDay()->format());
|
||||
$events = $this->helper->calendar->getTaskDateDueEvents(clone($queryBuilder), $start, $end);
|
||||
$events = array_merge($events, $this->helper->calendar->getTaskEvents(clone($queryBuilder), $start, $end));
|
||||
|
||||
$events = $this->hook->merge('controller:calendar:project:events', $events, array(
|
||||
'project_id' => $project_id,
|
||||
@@ -75,21 +68,15 @@ class Calendar extends Base
|
||||
$user_id = $this->request->getIntegerParam('user_id');
|
||||
$start = $this->request->getStringParam('start');
|
||||
$end = $this->request->getStringParam('end');
|
||||
$filter = $this->taskFilterCalendarFormatter->create()->filterByOwner($user_id)->filterByStatus(TaskModel::STATUS_OPEN);
|
||||
$queryBuilder = $this->taskQuery
|
||||
->withFilter(new TaskAssigneeFilter($user_id))
|
||||
->withFilter(new TaskStatusFilter(TaskModel::STATUS_OPEN));
|
||||
|
||||
// Task with due date
|
||||
$events = $filter->copy()->filterByDueDateRange($start, $end)->setColumns('date_due')->setFullDay()->format();
|
||||
$events = $this->helper->calendar->getTaskDateDueEvents(clone($queryBuilder), $start, $end);
|
||||
$events = array_merge($events, $this->helper->calendar->getTaskEvents(clone($queryBuilder), $start, $end));
|
||||
|
||||
// Tasks
|
||||
if ($this->config->get('calendar_user_tasks', 'date_started') === 'date_creation') {
|
||||
$events = array_merge($events, $filter->copy()->filterByCreationDateRange($start, $end)->setColumns('date_creation', 'date_completed')->format());
|
||||
} else {
|
||||
$events = array_merge($events, $filter->copy()->filterByStartDateRange($start, $end)->setColumns('date_started', 'date_completed')->format());
|
||||
}
|
||||
|
||||
// Subtasks time tracking
|
||||
if ($this->config->get('calendar_user_subtasks_time_tracking') == 1) {
|
||||
$events = array_merge($events, $this->subtaskTimeTracking->getUserCalendarEvents($user_id, $start, $end));
|
||||
$events = array_merge($events, $this->helper->calendar->getSubtaskTimeTrackingEvents($user_id, $start, $end));
|
||||
}
|
||||
|
||||
$events = $this->hook->merge('controller:calendar:user:events', $events, array(
|
||||
|
||||
@@ -2,7 +2,14 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Filter\ProjectIdsFilter;
|
||||
use Kanboard\Filter\ProjectStatusFilter;
|
||||
use Kanboard\Filter\ProjectTypeFilter;
|
||||
use Kanboard\Filter\TaskProjectFilter;
|
||||
use Kanboard\Formatter\ProjectGanttFormatter;
|
||||
use Kanboard\Formatter\TaskGanttFormatter;
|
||||
use Kanboard\Model\Task as TaskModel;
|
||||
use Kanboard\Model\Project as ProjectModel;
|
||||
|
||||
/**
|
||||
* Gantt controller
|
||||
@@ -17,14 +24,16 @@ class Gantt extends Base
|
||||
*/
|
||||
public function projects()
|
||||
{
|
||||
if ($this->userSession->isAdmin()) {
|
||||
$project_ids = $this->project->getAllIds();
|
||||
} else {
|
||||
$project_ids = $this->projectPermission->getActiveProjectIds($this->userSession->getId());
|
||||
}
|
||||
$project_ids = $this->projectPermission->getActiveProjectIds($this->userSession->getId());
|
||||
$filter = $this->projectQuery
|
||||
->withFilter(new ProjectTypeFilter(ProjectModel::TYPE_TEAM))
|
||||
->withFilter(new ProjectStatusFilter(ProjectModel::ACTIVE))
|
||||
->withFilter(new ProjectIdsFilter($project_ids));
|
||||
|
||||
$filter->getQuery()->asc(ProjectModel::TABLE.'.start_date');
|
||||
|
||||
$this->response->html($this->helper->layout->app('gantt/projects', array(
|
||||
'projects' => $this->projectGanttFormatter->filter($project_ids)->format(),
|
||||
'projects' => $filter->format(new ProjectGanttFormatter($this->container)),
|
||||
'title' => t('Gantt chart for all projects'),
|
||||
)));
|
||||
}
|
||||
@@ -56,8 +65,8 @@ class Gantt extends Base
|
||||
{
|
||||
$project = $this->getProject();
|
||||
$search = $this->helper->projectHeader->getSearchQuery($project);
|
||||
$filter = $this->taskFilterGanttFormatter->search($search)->filterByProject($project['id']);
|
||||
$sorting = $this->request->getStringParam('sorting', 'board');
|
||||
$filter = $this->taskLexer->build($search)->withFilter(new TaskProjectFilter($project['id']));
|
||||
|
||||
if ($sorting === 'date') {
|
||||
$filter->getQuery()->asc(TaskModel::TABLE.'.date_started')->asc(TaskModel::TABLE.'.date_creation');
|
||||
@@ -70,7 +79,7 @@ class Gantt extends Base
|
||||
'title' => $project['name'],
|
||||
'description' => $this->helper->projectHeader->getDescription($project),
|
||||
'sorting' => $sorting,
|
||||
'tasks' => $filter->format(),
|
||||
'tasks' => $filter->format(new TaskGanttFormatter($this->container)),
|
||||
)));
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Formatter\GroupAutoCompleteFormatter;
|
||||
|
||||
/**
|
||||
* Group Helper
|
||||
*
|
||||
@@ -11,14 +13,14 @@ namespace Kanboard\Controller;
|
||||
class GroupHelper extends Base
|
||||
{
|
||||
/**
|
||||
* Group autocompletion (Ajax)
|
||||
* Group auto-completion (Ajax)
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
public function autocomplete()
|
||||
{
|
||||
$search = $this->request->getStringParam('term');
|
||||
$groups = $this->groupManager->find($search);
|
||||
$this->response->json($this->groupAutoCompleteFormatter->setGroups($groups)->format());
|
||||
$formatter = new GroupAutoCompleteFormatter($this->groupManager->find($search));
|
||||
$this->response->json($formatter->format());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Model\TaskFilter;
|
||||
use Kanboard\Core\Filter\QueryBuilder;
|
||||
use Kanboard\Filter\TaskAssigneeFilter;
|
||||
use Kanboard\Filter\TaskProjectFilter;
|
||||
use Kanboard\Filter\TaskStatusFilter;
|
||||
use Kanboard\Formatter\TaskICalFormatter;
|
||||
use Kanboard\Model\Task as TaskModel;
|
||||
use Eluceo\iCal\Component\Calendar as iCalendar;
|
||||
|
||||
@@ -30,10 +34,11 @@ class Ical extends Base
|
||||
}
|
||||
|
||||
// Common filter
|
||||
$filter = $this->taskFilterICalendarFormatter
|
||||
->create()
|
||||
->filterByStatus(TaskModel::STATUS_OPEN)
|
||||
->filterByOwner($user['id']);
|
||||
$queryBuilder = new QueryBuilder();
|
||||
$queryBuilder
|
||||
->withQuery($this->taskFinder->getICalQuery())
|
||||
->withFilter(new TaskStatusFilter(TaskModel::STATUS_OPEN))
|
||||
->withFilter(new TaskAssigneeFilter($user['id']));
|
||||
|
||||
// Calendar properties
|
||||
$calendar = new iCalendar('Kanboard');
|
||||
@@ -41,7 +46,7 @@ class Ical extends Base
|
||||
$calendar->setDescription($user['name'] ?: $user['username']);
|
||||
$calendar->setPublishedTTL('PT1H');
|
||||
|
||||
$this->renderCalendar($filter, $calendar);
|
||||
$this->renderCalendar($queryBuilder, $calendar);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -60,10 +65,11 @@ class Ical extends Base
|
||||
}
|
||||
|
||||
// Common filter
|
||||
$filter = $this->taskFilterICalendarFormatter
|
||||
->create()
|
||||
->filterByStatus(TaskModel::STATUS_OPEN)
|
||||
->filterByProject($project['id']);
|
||||
$queryBuilder = new QueryBuilder();
|
||||
$queryBuilder
|
||||
->withQuery($this->taskFinder->getICalQuery())
|
||||
->withFilter(new TaskStatusFilter(TaskModel::STATUS_OPEN))
|
||||
->withFilter(new TaskProjectFilter($project['id']));
|
||||
|
||||
// Calendar properties
|
||||
$calendar = new iCalendar('Kanboard');
|
||||
@@ -71,7 +77,7 @@ class Ical extends Base
|
||||
$calendar->setDescription($project['name']);
|
||||
$calendar->setPublishedTTL('PT1H');
|
||||
|
||||
$this->renderCalendar($filter, $calendar);
|
||||
$this->renderCalendar($queryBuilder, $calendar);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -79,37 +85,14 @@ class Ical extends Base
|
||||
*
|
||||
* @access private
|
||||
*/
|
||||
private function renderCalendar(TaskFilter $filter, iCalendar $calendar)
|
||||
private function renderCalendar(QueryBuilder $queryBuilder, iCalendar $calendar)
|
||||
{
|
||||
$start = $this->request->getStringParam('start', strtotime('-2 month'));
|
||||
$end = $this->request->getStringParam('end', strtotime('+6 months'));
|
||||
|
||||
// Tasks
|
||||
if ($this->config->get('calendar_project_tasks', 'date_started') === 'date_creation') {
|
||||
$filter
|
||||
->copy()
|
||||
->filterByCreationDateRange($start, $end)
|
||||
->setColumns('date_creation', 'date_completed')
|
||||
->setCalendar($calendar)
|
||||
->addDateTimeEvents();
|
||||
} else {
|
||||
$filter
|
||||
->copy()
|
||||
->filterByStartDateRange($start, $end)
|
||||
->setColumns('date_started', 'date_completed')
|
||||
->setCalendar($calendar)
|
||||
->addDateTimeEvents($calendar);
|
||||
}
|
||||
$this->helper->ical->addTaskDateDueEvents($queryBuilder, $calendar, $start, $end);
|
||||
|
||||
// Tasks with due date
|
||||
$filter
|
||||
->copy()
|
||||
->filterByDueDateRange($start, $end)
|
||||
->setColumns('date_due')
|
||||
->setCalendar($calendar)
|
||||
->addFullDayEvents($calendar);
|
||||
|
||||
$this->response->contentType('text/calendar; charset=utf-8');
|
||||
echo $filter->setCalendar($calendar)->format();
|
||||
$formatter = new TaskICalFormatter($this->container);
|
||||
$this->response->ical($formatter->setCalendar($calendar)->format());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Filter\TaskProjectFilter;
|
||||
use Kanboard\Model\Task as TaskModel;
|
||||
|
||||
/**
|
||||
@@ -21,14 +22,17 @@ class Listing extends Base
|
||||
{
|
||||
$project = $this->getProject();
|
||||
$search = $this->helper->projectHeader->getSearchQuery($project);
|
||||
$query = $this->taskFilter->search($search)->filterByProject($project['id'])->getQuery();
|
||||
|
||||
$paginator = $this->paginator
|
||||
->setUrl('listing', 'show', array('project_id' => $project['id']))
|
||||
->setMax(30)
|
||||
->setOrder(TaskModel::TABLE.'.id')
|
||||
->setDirection('DESC')
|
||||
->setQuery($query)
|
||||
->setQuery($this->taskLexer
|
||||
->build($search)
|
||||
->withFilter(new TaskProjectFilter($project['id']))
|
||||
->getQuery()
|
||||
)
|
||||
->calculate();
|
||||
|
||||
$this->response->html($this->helper->layout->app('listing/show', array(
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Filter\TaskProjectsFilter;
|
||||
|
||||
/**
|
||||
* Search controller
|
||||
*
|
||||
@@ -23,14 +25,12 @@ class Search extends Base
|
||||
->setDirection('DESC');
|
||||
|
||||
if ($search !== '' && ! empty($projects)) {
|
||||
$query = $this
|
||||
->taskFilter
|
||||
->search($search)
|
||||
->filterByProjects(array_keys($projects))
|
||||
->getQuery();
|
||||
|
||||
$paginator
|
||||
->setQuery($query)
|
||||
->setQuery($this->taskLexer
|
||||
->build($search)
|
||||
->withFilter(new TaskProjectsFilter(array_keys($projects)))
|
||||
->getQuery()
|
||||
)
|
||||
->calculate();
|
||||
|
||||
$nb_tasks = $paginator->getTotal();
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Filter\TaskIdExclusionFilter;
|
||||
use Kanboard\Filter\TaskIdFilter;
|
||||
use Kanboard\Filter\TaskProjectsFilter;
|
||||
use Kanboard\Filter\TaskTitleFilter;
|
||||
use Kanboard\Formatter\TaskAutoCompleteFormatter;
|
||||
|
||||
/**
|
||||
* Task Ajax Helper
|
||||
*
|
||||
@@ -11,31 +17,33 @@ namespace Kanboard\Controller;
|
||||
class TaskHelper extends Base
|
||||
{
|
||||
/**
|
||||
* Task autocompletion (Ajax)
|
||||
* Task auto-completion (Ajax)
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
public function autocomplete()
|
||||
{
|
||||
$search = $this->request->getStringParam('term');
|
||||
$projects = $this->projectPermission->getActiveProjectIds($this->userSession->getId());
|
||||
$project_ids = $this->projectPermission->getActiveProjectIds($this->userSession->getId());
|
||||
$exclude_task_id = $this->request->getIntegerParam('exclude_task_id');
|
||||
|
||||
if (empty($projects)) {
|
||||
if (empty($project_ids)) {
|
||||
$this->response->json(array());
|
||||
}
|
||||
|
||||
$filter = $this->taskFilterAutoCompleteFormatter
|
||||
->create()
|
||||
->filterByProjects($projects)
|
||||
->excludeTasks(array($this->request->getIntegerParam('exclude_task_id')));
|
||||
|
||||
// Search by task id or by title
|
||||
if (ctype_digit($search)) {
|
||||
$filter->filterById($search);
|
||||
} else {
|
||||
$filter->filterByTitle($search);
|
||||
}
|
||||
|
||||
$this->response->json($filter->format());
|
||||
$filter = $this->taskQuery->withFilter(new TaskProjectsFilter($project_ids));
|
||||
|
||||
if (! empty($exclude_task_id)) {
|
||||
$filter->withFilter(new TaskIdExclusionFilter(array($exclude_task_id)));
|
||||
}
|
||||
|
||||
if (ctype_digit($search)) {
|
||||
$filter->withFilter(new TaskIdFilter($search));
|
||||
} else {
|
||||
$filter->withFilter(new TaskTitleFilter($search));
|
||||
}
|
||||
|
||||
$this->response->json($filter->format(new TaskAutoCompleteFormatter($this->container)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,10 @@
|
||||
|
||||
namespace Kanboard\Controller;
|
||||
|
||||
use Kanboard\Filter\UserNameFilter;
|
||||
use Kanboard\Formatter\UserAutoCompleteFormatter;
|
||||
use Kanboard\Model\User as UserModel;
|
||||
|
||||
/**
|
||||
* User Helper
|
||||
*
|
||||
@@ -11,19 +15,20 @@ namespace Kanboard\Controller;
|
||||
class UserHelper extends Base
|
||||
{
|
||||
/**
|
||||
* User autocompletion (Ajax)
|
||||
* User auto-completion (Ajax)
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
public function autocomplete()
|
||||
{
|
||||
$search = $this->request->getStringParam('term');
|
||||
$users = $this->userFilterAutoCompleteFormatter->create($search)->filterByUsernameOrByName()->format();
|
||||
$this->response->json($users);
|
||||
$filter = $this->userQuery->withFilter(new UserNameFilter($search));
|
||||
$filter->getQuery()->asc(UserModel::TABLE.'.name')->asc(UserModel::TABLE.'.username');
|
||||
$this->response->json($filter->format(new UserAutoCompleteFormatter($this->container)));
|
||||
}
|
||||
|
||||
/**
|
||||
* User mention autocompletion (Ajax)
|
||||
* User mention auto-completion (Ajax)
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user