diff options
Diffstat (limited to 'app/Helper')
-rw-r--r-- | app/Helper/AvatarHelper.php | 22 | ||||
-rw-r--r-- | app/Helper/CalendarHelper.php | 112 | ||||
-rw-r--r-- | app/Helper/ICalHelper.php | 38 | ||||
-rw-r--r-- | app/Helper/ProjectActivityHelper.php | 105 | ||||
-rw-r--r-- | app/Helper/ProjectHeaderHelper.php | 80 | ||||
-rw-r--r-- | app/Helper/UserHelper.php | 2 |
6 files changed, 349 insertions, 10 deletions
diff --git a/app/Helper/AvatarHelper.php b/app/Helper/AvatarHelper.php index c4e27ed9..a36d9b4a 100644 --- a/app/Helper/AvatarHelper.php +++ b/app/Helper/AvatarHelper.php @@ -20,16 +20,17 @@ class AvatarHelper extends Base * @param string $username * @param string $name * @param string $email + * @param string $avatar_path * @param string $css * @param int $size * @return string */ - public function render($user_id, $username, $name, $email, $css = 'avatar-left', $size = 48) + public function render($user_id, $username, $name, $email, $avatar_path, $css = 'avatar-left', $size = 48) { if (empty($user_id) && empty($username)) { $html = $this->avatarManager->renderDefault($size); } else { - $html = $this->avatarManager->render($user_id, $username, $name, $email, $size); + $html = $this->avatarManager->render($user_id, $username, $name, $email, $avatar_path, $size); } return '<div class="avatar avatar-'.$size.' '.$css.'">'.$html.'</div>'; @@ -39,26 +40,29 @@ class AvatarHelper extends Base * Render small user avatar * * @access public - * @param string $user_id - * @param string $username - * @param string $name - * @param string $email + * @param string $user_id + * @param string $username + * @param string $name + * @param string $email + * @param string $avatar_path + * @param string $css * @return string */ - public function small($user_id, $username, $name, $email, $css = '') + public function small($user_id, $username, $name, $email, $avatar_path, $css = '') { - return $this->render($user_id, $username, $name, $email, $css, 20); + return $this->render($user_id, $username, $name, $email, $avatar_path, $css, 20); } /** * Get a small avatar for the current user * * @access public + * @param string $css * @return string */ public function currentUserSmall($css = '') { $user = $this->userSession->getAll(); - return $this->small($user['id'], $user['username'], $user['name'], $user['email'], $css); + return $this->small($user['id'], $user['username'], $user['name'], $user['email'], $user['avatar_path'], $css); } } diff --git a/app/Helper/CalendarHelper.php b/app/Helper/CalendarHelper.php new file mode 100644 index 00000000..d5f4af21 --- /dev/null +++ b/app/Helper/CalendarHelper.php @@ -0,0 +1,112 @@ +<?php + +namespace Kanboard\Helper; + +use Kanboard\Core\Base; +use Kanboard\Core\Filter\QueryBuilder; +use Kanboard\Filter\TaskDueDateRangeFilter; +use Kanboard\Formatter\SubtaskTimeTrackingCalendarFormatter; +use Kanboard\Formatter\TaskCalendarFormatter; + +/** + * Calendar Helper + * + * @package helper + * @author Frederic Guillot + */ +class CalendarHelper extends Base +{ + /** + * Get formatted calendar task due events + * + * @access public + * @param QueryBuilder $queryBuilder + * @param string $start + * @param string $end + * @return array + */ + public function getTaskDateDueEvents(QueryBuilder $queryBuilder, $start, $end) + { + $formatter = new TaskCalendarFormatter($this->container); + $formatter->setFullDay(); + $formatter->setColumns('date_due'); + + return $queryBuilder + ->withFilter(new TaskDueDateRangeFilter(array($start, $end))) + ->format($formatter); + } + + /** + * Get formatted calendar task events + * + * @access public + * @param QueryBuilder $queryBuilder + * @param string $start + * @param string $end + * @return array + */ + public function getTaskEvents(QueryBuilder $queryBuilder, $start, $end) + { + $startColumn = $this->config->get('calendar_project_tasks', 'date_started'); + + $queryBuilder->getQuery()->addCondition($this->getCalendarCondition( + $this->dateParser->getTimestampFromIsoFormat($start), + $this->dateParser->getTimestampFromIsoFormat($end), + $startColumn, + 'date_due' + )); + + $formatter = new TaskCalendarFormatter($this->container); + $formatter->setColumns($startColumn, 'date_due'); + + return $queryBuilder->format($formatter); + } + + /** + * Get formatted calendar subtask time tracking events + * + * @access public + * @param integer $user_id + * @param string $start + * @param string $end + * @return array + */ + public function getSubtaskTimeTrackingEvents($user_id, $start, $end) + { + $formatter = new SubtaskTimeTrackingCalendarFormatter($this->container); + return $formatter + ->withQuery($this->subtaskTimeTracking->getUserQuery($user_id) + ->addCondition($this->getCalendarCondition( + $this->dateParser->getTimestampFromIsoFormat($start), + $this->dateParser->getTimestampFromIsoFormat($end), + 'start', + 'end' + )) + ) + ->format(); + } + + /** + * Build SQL condition for a given time range + * + * @access public + * @param string $start_time Start timestamp + * @param string $end_time End timestamp + * @param string $start_column Start column name + * @param string $end_column End column name + * @return string + */ + public function getCalendarCondition($start_time, $end_time, $start_column, $end_column) + { + $start_column = $this->db->escapeIdentifier($start_column); + $end_column = $this->db->escapeIdentifier($end_column); + + $conditions = array( + "($start_column >= '$start_time' AND $start_column <= '$end_time')", + "($start_column <= '$start_time' AND $end_column >= '$start_time')", + "($start_column <= '$start_time' AND ($end_column = '0' OR $end_column IS NULL))", + ); + + return $start_column.' IS NOT NULL AND '.$start_column.' > 0 AND ('.implode(' OR ', $conditions).')'; + } +} diff --git a/app/Helper/ICalHelper.php b/app/Helper/ICalHelper.php new file mode 100644 index 00000000..dc399bf8 --- /dev/null +++ b/app/Helper/ICalHelper.php @@ -0,0 +1,38 @@ +<?php + +namespace Kanboard\Helper; + +use Kanboard\Core\Base; +use Kanboard\Core\Filter\QueryBuilder; +use Kanboard\Filter\TaskDueDateRangeFilter; +use Kanboard\Formatter\TaskICalFormatter; +use Eluceo\iCal\Component\Calendar as iCalendar; + +/** + * ICal Helper + * + * @package helper + * @author Frederic Guillot + */ +class ICalHelper extends Base +{ + /** + * Get formatted calendar task due events + * + * @access public + * @param QueryBuilder $queryBuilder + * @param iCalendar $calendar + * @param string $start + * @param string $end + */ + public function addTaskDateDueEvents(QueryBuilder $queryBuilder, iCalendar $calendar, $start, $end) + { + $queryBuilder->withFilter(new TaskDueDateRangeFilter(array($start, $end))); + + $formatter = new TaskICalFormatter($this->container); + $formatter->setColumns('date_due'); + $formatter->setCalendar($calendar); + $formatter->withQuery($queryBuilder->getQuery()); + $formatter->addFullDayEvents(); + } +} diff --git a/app/Helper/ProjectActivityHelper.php b/app/Helper/ProjectActivityHelper.php new file mode 100644 index 00000000..0638a978 --- /dev/null +++ b/app/Helper/ProjectActivityHelper.php @@ -0,0 +1,105 @@ +<?php + +namespace Kanboard\Helper; + +use Kanboard\Core\Base; +use Kanboard\Filter\ProjectActivityProjectIdFilter; +use Kanboard\Filter\ProjectActivityProjectIdsFilter; +use Kanboard\Filter\ProjectActivityTaskIdFilter; +use Kanboard\Formatter\ProjectActivityEventFormatter; +use Kanboard\Model\ProjectActivity; + +/** + * Project Activity Helper + * + * @package helper + * @author Frederic Guillot + */ +class ProjectActivityHelper extends Base +{ + /** + * Search events + * + * @access public + * @param string $search + * @return array + */ + public function searchEvents($search) + { + $projects = $this->projectUserRole->getProjectsByUser($this->userSession->getId()); + $events = array(); + + if ($search !== '') { + $queryBuilder = $this->projectActivityLexer->build($search); + $queryBuilder + ->withFilter(new ProjectActivityProjectIdsFilter(array_keys($projects))) + ->getQuery() + ->desc(ProjectActivity::TABLE.'.id') + ->limit(500) + ; + + $events = $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + } + + return $events; + } + + /** + * Get project activity events + * + * @access public + * @param integer $project_id + * @param int $limit + * @return array + */ + public function getProjectEvents($project_id, $limit = 50) + { + $queryBuilder = $this->projectActivityQuery + ->withFilter(new ProjectActivityProjectIdFilter($project_id)); + + $queryBuilder->getQuery() + ->desc(ProjectActivity::TABLE.'.id') + ->limit($limit) + ; + + return $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + } + + /** + * Get projects activity events + * + * @access public + * @param int[] $project_ids + * @param int $limit + * @return array + */ + public function getProjectsEvents(array $project_ids, $limit = 50) + { + $queryBuilder = $this->projectActivityQuery + ->withFilter(new ProjectActivityProjectIdsFilter($project_ids)); + + $queryBuilder->getQuery() + ->desc(ProjectActivity::TABLE.'.id') + ->limit($limit) + ; + + return $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + } + + /** + * Get task activity events + * + * @access public + * @param integer $task_id + * @return array + */ + public function getTaskEvents($task_id) + { + $queryBuilder = $this->projectActivityQuery + ->withFilter(new ProjectActivityTaskIdFilter($task_id)); + + $queryBuilder->getQuery()->desc(ProjectActivity::TABLE.'.id'); + + return $queryBuilder->format(new ProjectActivityEventFormatter($this->container)); + } +} diff --git a/app/Helper/ProjectHeaderHelper.php b/app/Helper/ProjectHeaderHelper.php new file mode 100644 index 00000000..19570059 --- /dev/null +++ b/app/Helper/ProjectHeaderHelper.php @@ -0,0 +1,80 @@ +<?php + +namespace Kanboard\Helper; + +use Kanboard\Core\Base; + +/** + * Project Header Helper + * + * @package helper + * @author Frederic Guillot + */ +class ProjectHeaderHelper extends Base +{ + /** + * Get current search query + * + * @access public + * @param array $project + * @return string + */ + public function getSearchQuery(array $project) + { + $search = $this->request->getStringParam('search', $this->userSession->getFilters($project['id'])); + $this->userSession->setFilters($project['id'], $search); + return urldecode($search); + } + + /** + * Render project header (views switcher and search box) + * + * @access public + * @param array $project + * @param string $controller + * @param string $action + * @param bool $boardView + * @return string + */ + public function render(array $project, $controller, $action, $boardView = false) + { + $filters = array( + 'controller' => $controller, + 'action' => $action, + 'project_id' => $project['id'], + 'search' => $this->getSearchQuery($project), + ); + + return $this->template->render('project_header/header', array( + 'project' => $project, + 'filters' => $filters, + 'categories_list' => $this->category->getList($project['id'], false), + 'users_list' => $this->projectUserRole->getAssignableUsersList($project['id'], false), + 'custom_filters_list' => $this->customFilter->getAll($project['id'], $this->userSession->getId()), + 'board_view' => $boardView, + )); + } + + /** + * Get project description + * + * @access public + * @param array &$project + * @return string + */ + public function getDescription(array &$project) + { + if ($project['owner_id'] > 0) { + $description = t('Project owner: ').'**'.$this->helper->text->e($project['owner_name'] ?: $project['owner_username']).'**'.PHP_EOL.PHP_EOL; + + if (! empty($project['description'])) { + $description .= '***'.PHP_EOL.PHP_EOL; + $description .= $project['description']; + } + } else { + $description = $project['description']; + } + + return $description; + } +} diff --git a/app/Helper/UserHelper.php b/app/Helper/UserHelper.php index ee7d8ba5..c3369dfd 100644 --- a/app/Helper/UserHelper.php +++ b/app/Helper/UserHelper.php @@ -34,7 +34,7 @@ class UserHelper extends Base { $initials = ''; - foreach (explode(' ', $name) as $string) { + foreach (explode(' ', $name, 2) as $string) { $initials .= mb_substr($string, 0, 1); } |