summaryrefslogtreecommitdiff
path: root/app/Helper
diff options
context:
space:
mode:
Diffstat (limited to 'app/Helper')
-rw-r--r--app/Helper/AvatarHelper.php22
-rw-r--r--app/Helper/CalendarHelper.php112
-rw-r--r--app/Helper/ICalHelper.php38
-rw-r--r--app/Helper/ProjectActivityHelper.php105
-rw-r--r--app/Helper/ProjectHeaderHelper.php80
-rw-r--r--app/Helper/UserHelper.php2
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);
}