summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/Controller/Activity.php29
-rw-r--r--app/Controller/Base.php29
-rw-r--r--app/Controller/Board.php47
-rw-r--r--app/Controller/Calendar.php23
-rw-r--r--app/Controller/Listing.php37
-rw-r--r--app/Controller/Projectinfo.php95
-rw-r--r--app/Model/Acl.php3
-rw-r--r--app/Model/Board.php11
-rw-r--r--app/Model/TaskFilter.php17
-rw-r--r--app/Model/TaskFinder.php18
-rw-r--r--app/Model/TaskPosition.php5
-rw-r--r--app/Model/UserSession.php24
-rw-r--r--app/Template/activity/project.php (renamed from app/Template/projectinfo/activity.php)12
-rw-r--r--app/Template/analytic/layout.php12
-rw-r--r--app/Template/app/calendar.php5
-rw-r--r--app/Template/app/overview.php2
-rw-r--r--app/Template/board/filters.php43
-rw-r--r--app/Template/board/popover_assignee.php (renamed from app/Template/board/assignee.php)0
-rw-r--r--app/Template/board/popover_category.php (renamed from app/Template/board/category.php)0
-rw-r--r--app/Template/board/private_view.php (renamed from app/Template/board/index.php)8
-rw-r--r--app/Template/board/public_view.php (renamed from app/Template/board/public.php)2
-rw-r--r--app/Template/board/table_container.php (renamed from app/Template/board/show.php)2
-rw-r--r--app/Template/board/table_swimlane.php (renamed from app/Template/board/swimlane.php)0
-rw-r--r--app/Template/board/tooltip_comments.php (renamed from app/Template/board/comments.php)0
-rw-r--r--app/Template/board/tooltip_description.php (renamed from app/Template/board/description.php)0
-rw-r--r--app/Template/board/tooltip_files.php (renamed from app/Template/board/files.php)0
-rw-r--r--app/Template/board/tooltip_subtasks.php (renamed from app/Template/board/subtasks.php)0
-rw-r--r--app/Template/board/tooltip_tasklinks.php (renamed from app/Template/board/tasklinks.php)0
-rw-r--r--app/Template/calendar/show.php53
-rw-r--r--app/Template/calendar/sidebar.php40
-rw-r--r--app/Template/listing/show.php67
-rw-r--r--app/Template/project/dropdown.php14
-rw-r--r--app/Template/project/filters.php49
-rw-r--r--app/Template/project/index.php2
-rw-r--r--app/Template/project/layout.php6
-rw-r--r--app/Template/projectinfo/search.php43
-rw-r--r--app/Template/projectinfo/tasks.php33
-rw-r--r--app/Template/task/layout.php10
-rw-r--r--app/Template/task/new.php2
-rw-r--r--app/Template/task/table.php56
-rw-r--r--assets/css/app.css41
-rw-r--r--assets/css/print.css11
-rw-r--r--assets/css/src/base.css19
-rw-r--r--assets/css/src/board.css9
-rw-r--r--assets/css/src/dropdown.css6
-rw-r--r--assets/css/src/header.css6
-rw-r--r--assets/js/app.js42
-rw-r--r--assets/js/src/analytic.js5
-rw-r--r--assets/js/src/base.js1
-rw-r--r--assets/js/src/board.js92
-rw-r--r--assets/js/src/calendar.js188
-rw-r--r--assets/js/src/swimlane.js2
52 files changed, 463 insertions, 758 deletions
diff --git a/app/Controller/Activity.php b/app/Controller/Activity.php
new file mode 100644
index 00000000..2276b3b8
--- /dev/null
+++ b/app/Controller/Activity.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Controller;
+
+/**
+ * Activity stream
+ *
+ * @package controller
+ * @author Frederic Guillot
+ */
+class Activity extends Base
+{
+ /**
+ * Activity page for a project
+ *
+ * @access public
+ */
+ public function project()
+ {
+ $project = $this->getProject();
+
+ $this->response->html($this->template->layout('activity/project', array(
+ 'board_selector' => $this->projectPermission->getAllowedProjects($this->userSession->getId()),
+ 'events' => $this->projectActivity->getProject($project['id']),
+ 'project' => $project,
+ 'title' => t('%s\'s activity', $project['name'])
+ )));
+ }
+}
diff --git a/app/Controller/Base.php b/app/Controller/Base.php
index b7ee431f..9f5d6dc6 100644
--- a/app/Controller/Base.php
+++ b/app/Controller/Base.php
@@ -327,4 +327,33 @@ abstract class Base extends \Core\Base
return $user;
}
+
+ /**
+ * Common method to get project filters
+ *
+ * @access protected
+ */
+ protected function getProjectFilters($controller, $action)
+ {
+ $project = $this->getProject();
+ $search = $this->request->getStringParam('search', $this->userSession->getFilters($project['id']));
+ $board_selector = $this->projectPermission->getAllowedProjects($this->userSession->getId());
+ unset($board_selector[$project['id']]);
+
+ $filters = array(
+ 'controller' => $controller,
+ 'action' => $action,
+ 'project_id' => $project['id'],
+ 'search' => $search,
+ );
+
+ $this->userSession->setFilters($project['id'], $search);
+
+ return array(
+ 'project' => $project,
+ 'board_selector' => $board_selector,
+ 'filters' => $filters,
+ 'title' => $project['name'],
+ );
+ }
}
diff --git a/app/Controller/Board.php b/app/Controller/Board.php
index 0f38f910..caaa38ef 100644
--- a/app/Controller/Board.php
+++ b/app/Controller/Board.php
@@ -27,7 +27,7 @@ class Board extends Base
}
// Display the board with a specific layout
- $this->response->html($this->template->layout('board/public', array(
+ $this->response->html($this->template->layout('board/public_view', array(
'project' => $project,
'swimlanes' => $this->board->getBoard($project['id']),
'title' => $project['name'],
@@ -44,28 +44,17 @@ class Board extends Base
* Show a board for a given project
*
* @access public
- * @param integer $project_id Default project id
*/
- public function show($project_id = 0)
+ public function show()
{
- $project = $this->getProject($project_id);
- $projects = $this->projectPermission->getAllowedProjects($this->userSession->getId());
+ $params = $this->getProjectFilters('board', 'show');
- $board_selector = $projects;
- unset($board_selector[$project['id']]);
-
- $this->response->html($this->template->layout('board/index', array(
- 'users' => $this->projectPermission->getMemberList($project['id'], true, true),
- 'projects' => $projects,
- 'project' => $project,
- 'swimlanes' => $this->board->getBoard($project['id']),
- 'categories_listing' => $this->category->getList($project['id'], true, true),
- 'title' => $project['name'],
- 'description' => $project['description'],
- 'board_selector' => $board_selector,
+ $this->response->html($this->template->layout('board/private_view', array(
+ 'swimlanes' => $this->taskFilter->search($params['filters']['search'])->getBoard($params['project']['id']),
+ 'description' => $params['project']['description'],
'board_private_refresh_interval' => $this->config->get('board_private_refresh_interval'),
'board_highlight_period' => $this->config->get('board_highlight_period'),
- )));
+ ) + $params));
}
/**
@@ -100,9 +89,9 @@ class Board extends Base
}
$this->response->html(
- $this->template->render('board/show', array(
+ $this->template->render('board/table_container', array(
'project' => $this->project->getById($project_id),
- 'swimlanes' => $this->board->getBoard($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'),
)),
@@ -133,9 +122,9 @@ class Board extends Base
}
$this->response->html(
- $this->template->render('board/show', array(
+ $this->template->render('board/table_container', array(
'project' => $this->project->getById($project_id),
- 'swimlanes' => $this->board->getBoard($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'),
))
@@ -150,7 +139,7 @@ class Board extends Base
public function tasklinks()
{
$task = $this->getTask();
- $this->response->html($this->template->render('board/tasklinks', array(
+ $this->response->html($this->template->render('board/tooltip_tasklinks', array(
'links' => $this->taskLink->getAll($task['id']),
'task' => $task,
)));
@@ -164,7 +153,7 @@ class Board extends Base
public function subtasks()
{
$task = $this->getTask();
- $this->response->html($this->template->render('board/subtasks', array(
+ $this->response->html($this->template->render('board/tooltip_subtasks', array(
'subtasks' => $this->subtask->getAll($task['id']),
'task' => $task,
)));
@@ -179,7 +168,7 @@ class Board extends Base
{
$task = $this->getTask();
- $this->response->html($this->template->render('board/files', array(
+ $this->response->html($this->template->render('board/tooltip_files', array(
'files' => $this->file->getAllDocuments($task['id']),
'images' => $this->file->getAllImages($task['id']),
'task' => $task,
@@ -195,7 +184,7 @@ class Board extends Base
{
$task = $this->getTask();
- $this->response->html($this->template->render('board/comments', array(
+ $this->response->html($this->template->render('board/tooltip_comments', array(
'comments' => $this->comment->getAll($task['id'])
)));
}
@@ -209,7 +198,7 @@ class Board extends Base
{
$task = $this->getTask();
- $this->response->html($this->template->render('board/description', array(
+ $this->response->html($this->template->render('board/tooltip_description', array(
'task' => $task
)));
}
@@ -224,7 +213,7 @@ class Board extends Base
$task = $this->getTask();
$project = $this->project->getById($task['project_id']);
- $this->response->html($this->template->render('board/assignee', array(
+ $this->response->html($this->template->render('board/popover_assignee', array(
'values' => $task,
'users_list' => $this->projectPermission->getMemberList($project['id']),
'project' => $project,
@@ -262,7 +251,7 @@ class Board extends Base
$task = $this->getTask();
$project = $this->project->getById($task['project_id']);
- $this->response->html($this->template->render('board/category', array(
+ $this->response->html($this->template->render('board/popover_category', array(
'values' => $task,
'categories_list' => $this->category->getList($project['id']),
'project' => $project,
diff --git a/app/Controller/Calendar.php b/app/Controller/Calendar.php
index 41642a59..8a24d705 100644
--- a/app/Controller/Calendar.php
+++ b/app/Controller/Calendar.php
@@ -20,20 +20,9 @@ class Calendar extends Base
*/
public function show()
{
- $project = $this->getProject();
-
$this->response->html($this->template->layout('calendar/show', array(
'check_interval' => $this->config->get('board_private_refresh_interval'),
- 'users_list' => $this->projectPermission->getMemberList($project['id'], true, true),
- 'categories_list' => $this->category->getList($project['id'], true, true),
- 'columns_list' => $this->board->getColumnsList($project['id'], true),
- 'swimlanes_list' => $this->swimlane->getList($project['id'], true),
- 'colors_list' => $this->color->getList(true),
- 'status_list' => $this->taskStatus->getList(true),
- 'project' => $project,
- 'title' => t('Calendar for "%s"', $project['name']),
- 'board_selector' => $this->projectPermission->getAllowedProjects($this->userSession->getId()),
- )));
+ ) + $this->getProjectFilters('calendar', 'show')));
}
/**
@@ -49,14 +38,8 @@ class Calendar extends Base
// Common filter
$filter = $this->taskFilter
- ->create()
- ->filterByProject($project_id)
- ->filterByCategory($this->request->getIntegerParam('category_id', -1))
- ->filterByOwner($this->request->getIntegerParam('owner_id', -1))
- ->filterByColumn($this->request->getIntegerParam('column_id', -1))
- ->filterBySwimlane($this->request->getIntegerParam('swimlane_id', -1))
- ->filterByColor($this->request->getStringParam('color_id'))
- ->filterByStatus($this->request->getIntegerParam('is_active', -1));
+ ->search($this->userSession->getFilters($project_id))
+ ->filterByProject($project_id);
// Tasks
if ($this->config->get('calendar_project_tasks', 'date_started') === 'date_creation') {
diff --git a/app/Controller/Listing.php b/app/Controller/Listing.php
new file mode 100644
index 00000000..2c197e3e
--- /dev/null
+++ b/app/Controller/Listing.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Controller;
+
+use Model\Task as TaskModel;
+
+/**
+ * List view controller
+ *
+ * @package controller
+ * @author Frederic Guillot
+ */
+class Listing extends Base
+{
+ /**
+ * Show list view for projects
+ *
+ * @access public
+ */
+ public function show()
+ {
+ $params = $this->getProjectFilters('listing', 'show');
+ $query = $this->taskFilter->search($params['filters']['search'])->filterByProject($params['project']['id'])->getQuery();
+
+ $paginator = $this->paginator
+ ->setUrl('listing', 'show', array('project_id' => $params['project']['id']))
+ ->setMax(30)
+ ->setOrder(TaskModel::TABLE.'.id')
+ ->setDirection('DESC')
+ ->setQuery($query)
+ ->calculate();
+
+ $this->response->html($this->template->layout('listing/show', $params + array(
+ 'paginator' => $paginator,
+ )));
+ }
+}
diff --git a/app/Controller/Projectinfo.php b/app/Controller/Projectinfo.php
deleted file mode 100644
index 22b9861c..00000000
--- a/app/Controller/Projectinfo.php
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-
-namespace Controller;
-
-/**
- * Project Info controller (ActivityStream + completed tasks)
- *
- * @package controller
- * @author Frederic Guillot
- */
-class Projectinfo extends Base
-{
- /**
- * Activity page for a project
- *
- * @access public
- */
- public function activity()
- {
- $project = $this->getProject();
-
- $this->response->html($this->template->layout('projectinfo/activity', array(
- 'board_selector' => $this->projectPermission->getAllowedProjects($this->userSession->getId()),
- 'events' => $this->projectActivity->getProject($project['id']),
- 'project' => $project,
- 'title' => t('%s\'s activity', $project['name'])
- )));
- }
-
- /**
- * Task search for a given project
- *
- * @access public
- */
- public function search()
- {
- $project = $this->getProject();
- $search = $this->request->getStringParam('search');
- $nb_tasks = 0;
-
- $paginator = $this->paginator
- ->setUrl('projectinfo', 'search', array('search' => $search, 'project_id' => $project['id']))
- ->setMax(30)
- ->setOrder('tasks.id')
- ->setDirection('DESC');
-
- if ($search !== '') {
- $paginator->setQuery($this->taskFilter->search($search)->filterByProject($project['id'])->getQuery())
- ->calculate();
-
- $nb_tasks = $paginator->getTotal();
- }
-
- $this->response->html($this->template->layout('projectinfo/search', array(
- 'board_selector' => $this->projectPermission->getAllowedProjects($this->userSession->getId()),
- 'values' => array(
- 'search' => $search,
- 'controller' => 'projectinfo',
- 'action' => 'search',
- 'project_id' => $project['id'],
- ),
- 'paginator' => $paginator,
- 'project' => $project,
- 'columns' => $this->board->getColumnsList($project['id']),
- 'categories' => $this->category->getList($project['id'], false),
- 'title' => t('Search in the project "%s"', $project['name']).($nb_tasks > 0 ? ' ('.$nb_tasks.')' : '')
- )));
- }
-
- /**
- * List of completed tasks for a given project
- *
- * @access public
- */
- public function tasks()
- {
- $project = $this->getProject();
- $paginator = $this->paginator
- ->setUrl('projectinfo', 'tasks', array('project_id' => $project['id']))
- ->setMax(30)
- ->setOrder('tasks.id')
- ->setDirection('DESC')
- ->setQuery($this->taskFinder->getClosedTaskQuery($project['id']))
- ->calculate();
-
- $this->response->html($this->template->layout('projectinfo/tasks', array(
- 'board_selector' => $this->projectPermission->getAllowedProjects($this->userSession->getId()),
- 'project' => $project,
- 'columns' => $this->board->getColumnsList($project['id']),
- 'categories' => $this->category->getList($project['id'], false),
- 'paginator' => $paginator,
- 'title' => t('Completed tasks for "%s"', $project['name']).' ('.$paginator->getTotal().')'
- )));
- }
-}
diff --git a/app/Model/Acl.php b/app/Model/Acl.php
index 91ed035b..09638302 100644
--- a/app/Model/Acl.php
+++ b/app/Model/Acl.php
@@ -37,7 +37,8 @@ class Acl extends Base
'comment' => '*',
'file' => '*',
'project' => array('show'),
- 'projectinfo' => array('tasks', 'search', 'activity'),
+ 'listing' => '*',
+ 'activity' => '*',
'subtask' => '*',
'task' => '*',
'tasklink' => '*',
diff --git a/app/Model/Board.php b/app/Model/Board.php
index f6f968f4..bcf77b3e 100644
--- a/app/Model/Board.php
+++ b/app/Model/Board.php
@@ -237,10 +237,11 @@ class Board extends Base
* Get all tasks sorted by columns and swimlanes
*
* @access public
- * @param integer $project_id Project id
+ * @param integer $project_id
+ * @param callable $callback
* @return array
*/
- public function getBoard($project_id)
+ public function getBoard($project_id, $callback = null)
{
$swimlanes = $this->swimlane->getSwimlanes($project_id);
$columns = $this->getColumns($project_id);
@@ -253,7 +254,11 @@ class Board extends Base
$swimlanes[$i]['nb_tasks'] = 0;
for ($j = 0; $j < $nb_columns; $j++) {
- $swimlanes[$i]['columns'][$j]['tasks'] = $this->taskFinder->getTasksByColumnAndSwimlane($project_id, $columns[$j]['id'], $swimlanes[$i]['id']);
+
+ $column_id = $columns[$j]['id'];
+ $swimlane_id = $swimlanes[$i]['id'];
+
+ $swimlanes[$i]['columns'][$j]['tasks'] = $callback === null ? $this->taskFinder->getTasksByColumnAndSwimlane($project_id, $column_id, $swimlane_id) : $callback($project_id, $column_id, $swimlane_id);
$swimlanes[$i]['columns'][$j]['nb_tasks'] = count($swimlanes[$i]['columns'][$j]['tasks']);
$swimlanes[$i]['columns'][$j]['score'] = $this->getColumnSum($swimlanes[$i]['columns'][$j]['tasks'], 'score');
$swimlanes[$i]['nb_tasks'] += $swimlanes[$i]['columns'][$j]['nb_tasks'];
diff --git a/app/Model/TaskFilter.php b/app/Model/TaskFilter.php
index 31080cb5..e9d9ccbd 100644
--- a/app/Model/TaskFilter.php
+++ b/app/Model/TaskFilter.php
@@ -513,6 +513,23 @@ class TaskFilter extends Base
}
/**
+ * Get swimlanes and tasks to display the board
+ *
+ * @access public
+ * @return array
+ */
+ public function getBoard($project_id)
+ {
+ $tasks = $this->filterByProject($project_id)->query->asc(Task::TABLE.'.position')->findAll();
+
+ return $this->board->getBoard($project_id, function ($project_id, $column_id, $swimlane_id) use ($tasks) {
+ return array_filter($tasks, function(array $task) use ($column_id, $swimlane_id) {
+ return $task['column_id'] == $column_id && $task['swimlane_id'] == $swimlane_id;
+ });
+ });
+ }
+
+ /**
* Format the results to the ajax autocompletion
*
* @access public
diff --git a/app/Model/TaskFinder.php b/app/Model/TaskFinder.php
index b91f4bad..2b0453a5 100644
--- a/app/Model/TaskFinder.php
+++ b/app/Model/TaskFinder.php
@@ -13,20 +13,6 @@ use PDO;
class TaskFinder extends Base
{
/**
- * Get query for closed tasks
- *
- * @access public
- * @param integer $project_id Project id
- * @return \PicoDb\Table
- */
- public function getClosedTaskQuery($project_id)
- {
- return $this->getExtendedQuery()
- ->eq(Task::TABLE.'.project_id', $project_id)
- ->eq(Task::TABLE.'.is_active', Task::STATUS_CLOSED);
- }
-
- /**
* Get query for assigned user tasks
*
* @access public
@@ -142,8 +128,8 @@ class TaskFinder extends Base
{
return $this->db
->table(Task::TABLE)
- ->eq('project_id', $project_id)
- ->eq('is_active', $status_id)
+ ->eq(Task::TABLE.'.project_id', $project_id)
+ ->eq(Task::TABLE.'.is_active', $status_id)
->findAll();
}
diff --git a/app/Model/TaskPosition.php b/app/Model/TaskPosition.php
index 0c4beb2d..a33a4029 100644
--- a/app/Model/TaskPosition.php
+++ b/app/Model/TaskPosition.php
@@ -28,6 +28,11 @@ class TaskPosition extends Base
{
$original_task = $this->taskFinder->getById($task_id);
+ // Ignore closed tasks
+ if ($original_task['is_active'] == Task::STATUS_CLOSED) {
+ return true;
+ }
+
$result = $this->calculateAndSave($project_id, $task_id, $column_id, $position, $swimlane_id);
if ($result) {
diff --git a/app/Model/UserSession.php b/app/Model/UserSession.php
index f1f2ffee..6de4a182 100644
--- a/app/Model/UserSession.php
+++ b/app/Model/UserSession.php
@@ -94,4 +94,28 @@ class UserSession extends Base
{
return ! empty($this->session['user']);
}
+
+ /**
+ * Get project filters from the session
+ *
+ * @access public
+ * @param integer $project_id
+ * @return string
+ */
+ public function getFilters($project_id)
+ {
+ return ! empty($_SESSION['filters'][$project_id]) ? $_SESSION['filters'][$project_id] : 'status:open';
+ }
+
+ /**
+ * Save project filters in the session
+ *
+ * @access public
+ * @param integer $project_id
+ * @param string $filters
+ */
+ public function setFilters($project_id, $filters)
+ {
+ $_SESSION['filters'][$project_id] = $filters;
+ }
}
diff --git a/app/Template/projectinfo/activity.php b/app/Template/activity/project.php
index d458ea3d..480bbadd 100644
--- a/app/Template/projectinfo/activity.php
+++ b/app/Template/activity/project.php
@@ -12,10 +12,20 @@
</span>
</li>
<li>
- <i class="fa fa-table fa-fw"></i>
+ <i class="fa fa-th fa-fw"></i>
<?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?>
</li>
<li>
+ <i class="fa fa-calendar fa-fw"></i>
+ <?= $this->url->link(t('Back to the calendar'), 'calendar', 'show', array('project_id' => $project['id'])) ?>
+ </li>
+ <?php if ($this->user->isManager($project['id'])): ?>
+ <li>
+ <i class="fa fa-cog fa-fw"></i>
+ <?= $this->url->link(t('Project settings'), 'project', 'show', array('project_id' => $project['id'])) ?>
+ </li>
+ <?php endif ?>
+ <li>
<i class="fa fa-folder fa-fw"></i>
<?= $this->url->link(t('All projects'), 'project', 'index') ?>
</li>
diff --git a/app/Template/analytic/layout.php b/app/Template/analytic/layout.php
index 41c6a2ab..9d6bf77c 100644
--- a/app/Template/analytic/layout.php
+++ b/app/Template/analytic/layout.php
@@ -12,10 +12,20 @@
</span>
</li>
<li>
- <i class="fa fa-table fa-fw"></i>
+ <i class="fa fa-th fa-fw"></i>
<?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?>
</li>
<li>
+ <i class="fa fa-calendar fa-fw"></i>
+ <?= $this->url->link(t('Back to the calendar'), 'calendar', 'show', array('project_id' => $project['id'])) ?>
+ </li>
+ <?php if ($this->user->isManager($project['id'])): ?>
+ <li>
+ <i class="fa fa-cog fa-fw"></i>
+ <?= $this->url->link(t('Project settings'), 'project', 'show', array('project_id' => $project['id'])) ?>
+ </li>
+ <?php endif ?>
+ <li>
<i class="fa fa-folder fa-fw"></i>
<?= $this->url->link(t('All projects'), 'project', 'index') ?>
</li>
diff --git a/app/Template/app/calendar.php b/app/Template/app/calendar.php
index 6acee6ec..a154203b 100644
--- a/app/Template/app/calendar.php
+++ b/app/Template/app/calendar.php
@@ -1,6 +1,5 @@
-<div id="user-calendar"
- data-check-url="<?= $this->url->href('calendar', 'user') ?>"
- data-user-id="<?= $user['id'] ?>"
+<div id="calendar"
+ data-check-url="<?= $this->url->href('calendar', 'user', array('user_id' => $user['id'])) ?>"
data-save-url="<?= $this->url->href('calendar', 'save') ?>"
>
</div>
diff --git a/app/Template/app/overview.php b/app/Template/app/overview.php
index a2301cd0..66bcaa63 100644
--- a/app/Template/app/overview.php
+++ b/app/Template/app/overview.php
@@ -1,7 +1,7 @@
<form method="get" action="?" autocomplete="off">
<?= $this->form->hidden('controller', array('controller' => 'search')) ?>
<?= $this->form->hidden('action', array('controller' => 'index')) ?>
- <?= $this->form->text('search', array(), array(), array('required', 'placeholder="'.t('Search').'"'), 'form-input-large') ?>
+ <?= $this->form->text('search', array(), array(), array('placeholder="'.t('Search').'"'), 'form-input-large') ?>
<input type="submit" value="<?= t('Search') ?>" class="btn btn-blue"/>
</form>
diff --git a/app/Template/board/filters.php b/app/Template/board/filters.php
deleted file mode 100644
index b80234a0..00000000
--- a/app/Template/board/filters.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<div class="page-header">
- <ul class="board-filters">
- <li>
- <span class="dropdown">
- <span>
- <i class="fa fa-caret-down"></i> <a href="#" class="dropdown-menu"><?= t('Actions') ?></a>
- <ul>
- <li>
- <span class="filter-collapse">
- <i class="fa fa-compress fa-fw"></i> <a href="#" class="filter-collapse-link"><?= t('Collapse tasks') ?></a>
- </span>
- <span class="filter-expand" style="display: none">
- <i class="fa fa-expand fa-fw"></i> <a href="#" class="filter-expand-link"><?= t('Expand tasks') ?></a>
- </span>
- </li>
- <li>
- <span class="filter-compact">
- <i class="fa fa-th fa-fw"></i> <a href="#" class="filter-toggle-scrolling"><?= t('Compact view') ?></a>
- </span>
- <span class="filter-wide" style="display: none">
- <i class="fa fa-arrows-h fa-fw"></i> <a href="#" class="filter-toggle-scrolling"><?= t('Horizontal scrolling') ?></a>
- </span>
- </li>
- <?= $this->render('project/dropdown', array('project' => $project)) ?>
- </ul>
- </span>
- </span>
- </li>
- <li>
- <?= $this->form->select('user_id', $users, array(), array(), array('data-placeholder="'.t('Filter by user').'"', 'data-notfound="'.t('No results match:').'"', 'tabindex=="-1"'), 'apply-filters chosen-select') ?>
- </li>
- <li>
- <?= $this->form->select('category_id', $categories, array(), array(), array('data-placeholder="'.t('Filter by category').'"', 'data-notfound="'.t('No results match:').'"', 'tabindex=="-1"'), 'apply-filters chosen-select') ?>
- </li>
- <li>
- <select id="more-filters" multiple data-placeholder="<?= t('More filters') ?>" data-notfound="<?= t('No results match:') ?>" class="apply-filters hide-mobile" tabindex="-1">
- <option value=""></option>
- <option value="filter-due-date"><?= t('Filter by due date') ?></option>
- <option value="filter-recent"><?= t('Filter recently updated') ?></option>
- </select>
- </li>
- </ul>
-</div> \ No newline at end of file
diff --git a/app/Template/board/assignee.php b/app/Template/board/popover_assignee.php
index 4af19cf7..4af19cf7 100644
--- a/app/Template/board/assignee.php
+++ b/app/Template/board/popover_assignee.php
diff --git a/app/Template/board/category.php b/app/Template/board/popover_category.php
index b38758d3..b38758d3 100644
--- a/app/Template/board/category.php
+++ b/app/Template/board/popover_category.php
diff --git a/app/Template/board/index.php b/app/Template/board/private_view.php
index 6f6fddbe..5fdaa7fc 100644
--- a/app/Template/board/index.php
+++ b/app/Template/board/private_view.php
@@ -1,12 +1,12 @@
<section id="main">
- <?= $this->render('board/filters', array(
- 'categories' => $categories_listing,
- 'users' => $users,
+ <?= $this->render('project/filters', array(
'project' => $project,
+ 'filters' => $filters,
+ 'is_board' => true,
)) ?>
- <?= $this->render('board/show', array(
+ <?= $this->render('board/table_container', array(
'project' => $project,
'swimlanes' => $swimlanes,
'board_private_refresh_interval' => $board_private_refresh_interval,
diff --git a/app/Template/board/public.php b/app/Template/board/public_view.php
index ad7515db..aea72031 100644
--- a/app/Template/board/public.php
+++ b/app/Template/board/public_view.php
@@ -1,6 +1,6 @@
<section id="main" class="public-board">
- <?= $this->render('board/show', array(
+ <?= $this->render('board/table_container', array(
'project' => $project,
'swimlanes' => $swimlanes,
'board_private_refresh_interval' => $board_private_refresh_interval,
diff --git a/app/Template/board/show.php b/app/Template/board/table_container.php
index c0aa5d36..9d3a1134 100644
--- a/app/Template/board/show.php
+++ b/app/Template/board/table_container.php
@@ -17,7 +17,7 @@
<p class="alert alert-error"><?= t('There is no column in your project!') ?></p>
<?php break ?>
<?php else: ?>
- <?= $this->render('board/swimlane', array(
+ <?= $this->render('board/table_swimlane', array(
'project' => $project,
'swimlane' => $swimlane,
'board_highlight_period' => $board_highlight_period,
diff --git a/app/Template/board/swimlane.php b/app/Template/board/table_swimlane.php
index b86fc446..b86fc446 100644
--- a/app/Template/board/swimlane.php
+++ b/app/Template/board/table_swimlane.php
diff --git a/app/Template/board/comments.php b/app/Template/board/tooltip_comments.php
index 2e2c0c1e..2e2c0c1e 100644
--- a/app/Template/board/comments.php
+++ b/app/Template/board/tooltip_comments.php
diff --git a/app/Template/board/description.php b/app/Template/board/tooltip_description.php
index 7e0e3430..7e0e3430 100644
--- a/app/Template/board/description.php
+++ b/app/Template/board/tooltip_description.php
diff --git a/app/Template/board/files.php b/app/Template/board/tooltip_files.php
index 81136659..81136659 100644
--- a/app/Template/board/files.php
+++ b/app/Template/board/tooltip_files.php
diff --git a/app/Template/board/subtasks.php b/app/Template/board/tooltip_subtasks.php
index 950da925..950da925 100644
--- a/app/Template/board/subtasks.php
+++ b/app/Template/board/tooltip_subtasks.php
diff --git a/app/Template/board/tasklinks.php b/app/Template/board/tooltip_tasklinks.php
index 25aa91aa..25aa91aa 100644
--- a/app/Template/board/tasklinks.php
+++ b/app/Template/board/tooltip_tasklinks.php
diff --git a/app/Template/calendar/show.php b/app/Template/calendar/show.php
index cf2a20ec..0406414c 100644
--- a/app/Template/calendar/show.php
+++ b/app/Template/calendar/show.php
@@ -1,46 +1,13 @@
<section id="main">
- <div class="page-header">
- <ul>
- <li>
- <span class="dropdown">
- <span>
- <i class="fa fa-caret-down"></i> <a href="#" class="dropdown-menu"><?= t('Actions') ?></a>
- <ul>
- <?= $this->render('project/dropdown', array('project' => $project)) ?>
- </ul>
- </span>
- </span>
- </li>
- <li>
- <i class="fa fa-table fa-fw"></i>
- <?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?>
- </li>
- <li>
- <i class="fa fa-folder fa-fw"></i>
- <?= $this->url->link(t('All projects'), 'project', 'index') ?>
- </li>
- </ul>
- </div>
- <section class="sidebar-container">
-
- <?= $this->render('calendar/sidebar', array(
- 'project' => $project,
- 'users_list' => $users_list,
- 'categories_list' => $categories_list,
- 'columns_list' => $columns_list,
- 'swimlanes_list' => $swimlanes_list,
- 'colors_list' => $colors_list,
- 'status_list' => $status_list
- )) ?>
+ <?= $this->render('project/filters', array(
+ 'project' => $project,
+ 'filters' => $filters,
+ )) ?>
- <div class="sidebar-content">
- <div id="calendar"
- data-project-id="<?= $project['id'] ?>"
- data-save-url="<?= $this->url->href('calendar', 'save') ?>"
- data-check-url="<?= $this->url->href('calendar', 'project', array('project_id' => $project['id'])) ?>"
- data-check-interval="<?= $check_interval ?>"
- >
- </div>
- </div>
- </section>
+ <div id="calendar"
+ data-save-url="<?= $this->url->href('calendar', 'save') ?>"
+ data-check-url="<?= $this->url->href('calendar', 'project', array('project_id' => $project['id'])) ?>"
+ data-check-interval="<?= $check_interval ?>"
+ >
+ </div>
</section> \ No newline at end of file
diff --git a/app/Template/calendar/sidebar.php b/app/Template/calendar/sidebar.php
deleted file mode 100644
index 6c4fb5b0..00000000
--- a/app/Template/calendar/sidebar.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<div class="sidebar">
- <ul class="no-bullet">
- <li>
- <?= t('Filter by user') ?>
- </li>
- <li>
- <?= $this->form->select('owner_id', $users_list, array(), array(), array(), 'calendar-filter') ?>
- </li>
- <li>
- <?= t('Filter by category') ?>
- </li>
- <li>
- <?= $this->form->select('category_id', $categories_list, array(), array(), array(), 'calendar-filter') ?>
- </li>
- <li>
- <?= t('Filter by column') ?>
- </li>
- <li>
- <?= $this->form->select('column_id', $columns_list, array(), array(), array(), 'calendar-filter') ?>
- </li>
- <li>
- <?= t('Filter by swimlane') ?>
- </li>
- <li>
- <?= $this->form->select('swimlane_id', $swimlanes_list, array(), array(), array(), 'calendar-filter') ?>
- </li>
- <li>
- <?= t('Filter by color') ?>
- </li>
- <li>
- <?= $this->form->select('color_id', $colors_list, array(), array(), array(), 'calendar-filter') ?>
- </li>
- <li>
- <?= t('Filter by status') ?>
- </li>
- <li>
- <?= $this->form->select('is_active', $status_list, array(), array(), array(), 'calendar-filter') ?>
- </li>
- </ul>
-</div>
diff --git a/app/Template/listing/show.php b/app/Template/listing/show.php
new file mode 100644
index 00000000..06940678
--- /dev/null
+++ b/app/Template/listing/show.php
@@ -0,0 +1,67 @@
+<section id="main">
+ <?= $this->render('project/filters', array(
+ 'project' => $project,
+ 'filters' => $filters,
+ )) ?>
+
+ <?php if (! empty($values['search']) && $paginator->isEmpty()): ?>
+ <p class="alert"><?= t('No tasks found.') ?></p>
+ <?php elseif (! $paginator->isEmpty()): ?>
+ <table class="table-fixed table-small">
+ <tr>
+ <th class="column-5"><?= $paginator->order(t('Id'), 'tasks.id') ?></th>
+ <th class="column-8"><?= $paginator->order(t('Column'), 'tasks.column_id') ?></th>
+ <th class="column-8"><?= $paginator->order(t('Category'), 'tasks.category_id') ?></th>
+ <th><?= $paginator->order(t('Title'), 'tasks.title') ?></th>
+ <th class="column-10"><?= $paginator->order(t('Assignee'), 'users.username') ?></th>
+ <th class="column-10"><?= $paginator->order(t('Due date'), 'tasks.date_due') ?></th>
+ <th class="column-10"><?= $paginator->order(t('Date created'), 'tasks.date_creation') ?></th>
+ <th class="column-10"><?= $paginator->order(t('Date completed'), 'tasks.date_completed') ?></th>
+ <th class="column-5"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th>
+ </tr>
+ <?php foreach ($paginator->getCollection() as $task): ?>
+ <tr>
+ <td class="task-table color-<?= $task['color_id'] ?>">
+ <?= $this->url->link('#'.$this->e($task['id']), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ </td>
+ <td>
+ <?= $this->e($task['column_name']) ?>
+ </td>
+ <td>
+ <?= $this->e($task['category_name']) ?>
+ </td>
+ <td>
+ <?= $this->url->link($this->e($task['title']), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
+ </td>
+ <td>
+ <?php if ($task['assignee_username']): ?>
+ <?= $this->e($task['assignee_name'] ?: $task['assignee_username']) ?>
+ <?php else: ?>
+ <?= t('Unassigned') ?>
+ <?php endif ?>
+ </td>
+ <td>
+ <?= dt('%B %e, %Y', $task['date_due']) ?>
+ </td>
+ <td>
+ <?= dt('%B %e, %Y', $task['date_creation']) ?>
+ </td>
+ <td>
+ <?php if ($task['date_completed']): ?>
+ <?= dt('%B %e, %Y', $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>
+
+ <?= $paginator ?>
+ <?php endif ?>
+</section> \ No newline at end of file
diff --git a/app/Template/project/dropdown.php b/app/Template/project/dropdown.php
index 2e2650a7..aa4322e6 100644
--- a/app/Template/project/dropdown.php
+++ b/app/Template/project/dropdown.php
@@ -1,18 +1,6 @@
<li>
- <i class="fa fa-search fa-fw"></i>
- <?= $this->url->link(t('Search'), 'projectinfo', 'search', array('project_id' => $project['id'])) ?>
-</li>
-<li>
- <i class="fa fa-check-square-o fa-fw"></i>
- <?= $this->url->link(t('Completed tasks'), 'projectinfo', 'tasks', array('project_id' => $project['id'])) ?>
-</li>
-<li>
<i class="fa fa-dashboard fa-fw"></i>
- <?= $this->url->link(t('Activity'), 'projectinfo', 'activity', array('project_id' => $project['id'])) ?>
-</li>
-<li>
- <i class="fa fa-calendar fa-fw"></i>
- <?= $this->url->link(t('Calendar'), 'calendar', 'show', array('project_id' => $project['id'])) ?>
+ <?= $this->url->link(t('Activity'), 'activity', 'project', array('project_id' => $project['id'])) ?>
</li>
<?php if ($project['is_public']): ?>
diff --git a/app/Template/project/filters.php b/app/Template/project/filters.php
new file mode 100644
index 00000000..402807d7
--- /dev/null
+++ b/app/Template/project/filters.php
@@ -0,0 +1,49 @@
+<div class="page-header">
+ <div class="dropdown">
+ <span>
+ <i class="fa fa-caret-down"></i> <a href="#" class="dropdown-menu"><?= t('Actions') ?></a>
+ <ul>
+ <?php if (isset($is_board)): ?>
+ <li>
+ <span class="filter-collapse">
+ <i class="fa fa-compress fa-fw"></i> <a href="#" class="filter-collapse-link"><?= t('Collapse tasks') ?></a>
+ </span>
+ <span class="filter-expand" style="display: none">
+ <i class="fa fa-expand fa-fw"></i> <a href="#" class="filter-expand-link"><?= t('Expand tasks') ?></a>
+ </span>
+ </li>
+ <li>
+ <span class="filter-compact">
+ <i class="fa fa-th fa-fw"></i> <a href="#" class="filter-toggle-scrolling"><?= t('Compact view') ?></a>
+ </span>
+ <span class="filter-wide" style="display: none">
+ <i class="fa fa-arrows-h fa-fw"></i> <a href="#" class="filter-toggle-scrolling"><?= t('Horizontal scrolling') ?></a>
+ </span>
+ </li>
+ <?php endif ?>
+ <?= $this->render('project/dropdown', array('project' => $project)) ?>
+ </ul>
+ </span>
+ </div>
+ <ul class="views">
+ <li <?= $filters['controller'] === 'board' ? 'class="active"' : '' ?>>
+ <i class="fa fa-th fa-fw"></i>
+ <?= $this->url->link(t('Board'), 'board', 'show', array('project_id' => $project['id'], 'search' => $filters['search'])) ?>
+ </li>
+ <li <?= $filters['controller'] === 'calendar' ? 'class="active"' : '' ?>>
+ <i class="fa fa-calendar fa-fw"></i>
+ <?= $this->url->link(t('Calendar'), 'calendar', 'show', array('project_id' => $project['id'], 'search' => $filters['search'])) ?>
+ </li>
+ <li <?= $filters['controller'] === 'listing' ? 'class="active"' : '' ?>>
+ <i class="fa fa-list fa-fw"></i>
+ <?= $this->url->link(t('List'), 'listing', 'show', array('project_id' => $project['id'], 'search' => $filters['search'])) ?>
+ </li>
+ </ul>
+ <form method="get" action="?" class="search">
+ <?= $this->form->hidden('project_id', $filters) ?>
+ <?= $this->form->hidden('controller', $filters) ?>
+ <?= $this->form->hidden('action', $filters) ?>
+ <?= $this->form->text('search', $filters, array(), array('placeholder="'.t('Filter').'"'), 'form-input-large') ?>
+ </form>
+
+</div> \ No newline at end of file
diff --git a/app/Template/project/index.php b/app/Template/project/index.php
index 1080968e..7a03ec16 100644
--- a/app/Template/project/index.php
+++ b/app/Template/project/index.php
@@ -35,7 +35,7 @@
<?= $this->e($project['identifier']) ?>
</td>
<td>
- <?= $this->url->link('<i class="fa fa-table"></i>', 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Board')) ?>&nbsp;
+ <?= $this->url->link('<i class="fa fa-th"></i>', 'board', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Board')) ?>&nbsp;
<?php if ($project['is_public']): ?>
<i class="fa fa-share-alt fa-fw"></i>
diff --git a/app/Template/project/layout.php b/app/Template/project/layout.php
index 7bb3d478..8ba92ef9 100644
--- a/app/Template/project/layout.php
+++ b/app/Template/project/layout.php
@@ -12,10 +12,14 @@
</span>
</li>
<li>
- <i class="fa fa-table fa-fw"></i>
+ <i class="fa fa-th fa-fw"></i>
<?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?>
</li>
<li>
+ <i class="fa fa-calendar fa-fw"></i>
+ <?= $this->url->link(t('Back to the calendar'), 'calendar', 'show', array('project_id' => $project['id'])) ?>
+ </li>
+ <li>
<i class="fa fa-folder fa-fw"></i>
<?= $this->url->link(t('All projects'), 'project', 'index') ?>
</li>
diff --git a/app/Template/projectinfo/search.php b/app/Template/projectinfo/search.php
deleted file mode 100644
index 4b7c8f70..00000000
--- a/app/Template/projectinfo/search.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<section id="main">
- <div class="page-header">
- <ul>
- <li>
- <span class="dropdown">
- <span>
- <i class="fa fa-caret-down"></i> <a href="#" class="dropdown-menu"><?= t('Actions') ?></a>
- <ul>
- <?= $this->render('project/dropdown', array('project' => $project)) ?>
- </ul>
- </span>
- </span>
- </li>
- <li>
- <i class="fa fa-table fa-fw"></i>
- <?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?>
- </li>
- <li>
- <i class="fa fa-folder fa-fw"></i>
- <?= $this->url->link(t('All projects'), 'project', 'index') ?>
- </li>
- </ul>
- </div>
-
- <form method="get" action="?" autocomplete="off">
- <?= $this->form->hidden('controller', $values) ?>
- <?= $this->form->hidden('action', $values) ?>
- <?= $this->form->hidden('project_id', $values) ?>
- <?= $this->form->text('search', $values, array(), array('autofocus', 'required', 'placeholder="'.t('Search').'"'), 'form-input-large') ?>
- <input type="submit" value="<?= t('Search') ?>" class="btn btn-blue"/>
- </form>
-
- <?php if (! empty($values['search']) && $paginator->isEmpty()): ?>
- <p class="alert"><?= t('Nothing found.') ?></p>
- <?php elseif (! $paginator->isEmpty()): ?>
- <?= $this->render('task/table', array(
- 'paginator' => $paginator,
- 'categories' => $categories,
- 'columns' => $columns,
- )) ?>
- <?php endif ?>
-
-</section> \ No newline at end of file
diff --git a/app/Template/projectinfo/tasks.php b/app/Template/projectinfo/tasks.php
deleted file mode 100644
index 41884783..00000000
--- a/app/Template/projectinfo/tasks.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<section id="main">
- <div class="page-header">
- <ul>
- <li>
- <span class="dropdown">
- <span>
- <i class="fa fa-caret-down"></i> <a href="#" class="dropdown-menu"><?= t('Actions') ?></a>
- <ul>
- <?= $this->render('project/dropdown', array('project' => $project)) ?>
- </ul>
- </span>
- </span>
- </li>
- <li>
- <i class="fa fa-table fa-fw"></i>
- <?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?>
- </li>
- <li>
- <i class="fa fa-folder fa-fw"></i>
- <?= $this->url->link(t('All projects'), 'project', 'index') ?>
- </li>
- </ul>
- </div>
- <?php if ($paginator->isEmpty()): ?>
- <p class="alert"><?= t('There is no completed tasks at the moment.') ?></p>
- <?php else: ?>
- <?= $this->render('task/table', array(
- 'paginator' => $paginator,
- 'categories' => $categories,
- 'columns' => $columns,
- )) ?>
- <?php endif ?>
-</section> \ No newline at end of file
diff --git a/app/Template/task/layout.php b/app/Template/task/layout.php
index 5a14fb39..ddce4bce 100644
--- a/app/Template/task/layout.php
+++ b/app/Template/task/layout.php
@@ -2,19 +2,19 @@
<div class="page-header">
<ul>
<li>
- <i class="fa fa-table fa-fw"></i>
+ <i class="fa fa-th fa-fw"></i>
<?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $task['project_id']), false, '', '', false, 'swimlane-'.$task['swimlane_id']) ?>
</li>
+ <li>
+ <i class="fa fa-calendar fa-fw"></i>
+ <?= $this->url->link(t('Back to the calendar'), 'calendar', 'show', array('project_id' => $task['project_id'])) ?>
+ </li>
<?php if ($this->user->isManager($task['project_id'])): ?>
<li>
<i class="fa fa-cog fa-fw"></i>
<?= $this->url->link(t('Project settings'), 'project', 'show', array('project_id' => $task['project_id'])) ?>
</li>
<?php endif ?>
- <li>
- <i class="fa fa-calendar fa-fw"></i>
- <?= $this->url->link(t('Project calendar'), 'calendar', 'show', array('project_id' => $task['project_id'])) ?>
- </li>
</ul>
</div>
<section class="sidebar-container" id="task-section">
diff --git a/app/Template/task/new.php b/app/Template/task/new.php
index 181b82bf..8fcdacdf 100644
--- a/app/Template/task/new.php
+++ b/app/Template/task/new.php
@@ -1,7 +1,7 @@
<?php if (! $ajax): ?>
<div class="page-header">
<ul>
- <li><i class="fa fa-table fa-fw"></i><?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $values['project_id'])) ?></li>
+ <li><i class="fa fa-th fa-fw"></i><?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $values['project_id'])) ?></li>
</ul>
</div>
<?php else: ?>
diff --git a/app/Template/task/table.php b/app/Template/task/table.php
deleted file mode 100644
index d06bc7b7..00000000
--- a/app/Template/task/table.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<table class="table-fixed table-small">
- <tr>
- <th class="column-8"><?= $paginator->order(t('Id'), 'tasks.id') ?></th>
- <th class="column-8"><?= $paginator->order(t('Column'), 'tasks.column_id') ?></th>
- <th class="column-8"><?= $paginator->order(t('Category'), 'tasks.category_id') ?></th>
- <th><?= $paginator->order(t('Title'), 'tasks.title') ?></th>
- <th class="column-10"><?= $paginator->order(t('Assignee'), 'users.username') ?></th>
- <th class="column-10"><?= $paginator->order(t('Due date'), 'tasks.date_due') ?></th>
- <th class="column-10"><?= $paginator->order(t('Date created'), 'tasks.date_creation') ?></th>
- <th class="column-10"><?= $paginator->order(t('Date completed'), 'tasks.date_completed') ?></th>
- <th class="column-5"><?= $paginator->order(t('Status'), 'tasks.is_active') ?></th>
- </tr>
- <?php foreach ($paginator->getCollection() as $task): ?>
- <tr>
- <td class="task-table color-<?= $task['color_id'] ?>">
- <?= $this->url->link('#'.$this->e($task['id']), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
- </td>
- <td>
- <?= $this->text->in($task['column_id'], $columns) ?>
- </td>
- <td>
- <?= $this->text->in($task['category_id'], $categories, '') ?>
- </td>
- <td>
- <?= $this->url->link($this->e($task['title']), 'task', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), false, '', t('View this task')) ?>
- </td>
- <td>
- <?php if ($task['assignee_username']): ?>
- <?= $this->e($task['assignee_name'] ?: $task['assignee_username']) ?>
- <?php else: ?>
- <?= t('Unassigned') ?>
- <?php endif ?>
- </td>
- <td>
- <?= dt('%B %e, %Y', $task['date_due']) ?>
- </td>
- <td>
- <?= dt('%B %e, %Y', $task['date_creation']) ?>
- </td>
- <td>
- <?php if ($task['date_completed']): ?>
- <?= dt('%B %e, %Y', $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>
-
-<?= $paginator ?>
diff --git a/assets/css/app.css b/assets/css/app.css
index 3f751d3d..790886fa 100644
--- a/assets/css/app.css
+++ b/assets/css/app.css
@@ -37,10 +37,11 @@ body {
padding-bottom: 20px;
color: #333;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
- -webkit-font-smoothing: antialiased;
- font-smoothing: antialiased;
text-rendering: optimizeLegibility;
- -webkit-text-size-adjust: 100%;
+}
+
+.page {
+ clear: both;
}
ul.no-bullet li {
@@ -67,7 +68,18 @@ hr {
.avatar {
float: left;
margin-right: 10px;
-}/* links */
+}
+
+.views {
+ display: inline-block;
+}
+
+.views li.active a {
+ font-weight: bold;
+ color: #000;
+ text-decoration: none;
+}
+/* links */
a {
color: #3366CC;
border: none;
@@ -717,7 +729,7 @@ nav .active a {
/* page header */
.page-header {
- margin-bottom: 25px;
+ margin-bottom: 20px;
}
.page-header h2 {
@@ -748,6 +760,10 @@ nav .active a {
font-size: 0.9em;
}
+.page-header form {
+ display: inline;
+}
+
@media only screen and (max-width: 640px) {
.page-header-mobile li {
@@ -755,15 +771,6 @@ nav .active a {
margin-bottom: 5px;
}
}
-/* board filters */
-.board-filters {
- font-size: 0.95em;
-}
-
-#more-filters {
- display: none; /* Hide this filter initially, to avoid re-layout */
-}
-
/* public board */
.public-board {
margin-top: 5px;
@@ -1603,6 +1610,12 @@ span.task-board-date-overdue {
padding-right: 10px;
}
+.page-header div.dropdown {
+ font-size: 0.9em;
+ padding-right: 10px;
+}
+
+.page-header div.dropdown,
.page-header ul.dropdown {
display: inline;
}
diff --git a/assets/css/print.css b/assets/css/print.css
index a27312d4..7e5f9f9d 100644
--- a/assets/css/print.css
+++ b/assets/css/print.css
@@ -142,16 +142,7 @@ th a:hover {
.column-70 {
width: 70%;
-}/* board filters */
-.board-filters {
- font-size: 0.95em;
-}
-
-#more-filters {
- display: none; /* Hide this filter initially, to avoid re-layout */
-}
-
-/* public board */
+}/* public board */
.public-board {
margin-top: 5px;
}
diff --git a/assets/css/src/base.css b/assets/css/src/base.css
index 10a3ee8e..fabe4f82 100644
--- a/assets/css/src/base.css
+++ b/assets/css/src/base.css
@@ -20,10 +20,11 @@ body {
padding-bottom: 20px;
color: #333;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
- -webkit-font-smoothing: antialiased;
- font-smoothing: antialiased;
text-rendering: optimizeLegibility;
- -webkit-text-size-adjust: 100%;
+}
+
+.page {
+ clear: both;
}
ul.no-bullet li {
@@ -50,4 +51,14 @@ hr {
.avatar {
float: left;
margin-right: 10px;
-} \ No newline at end of file
+}
+
+.views {
+ display: inline-block;
+}
+
+.views li.active a {
+ font-weight: bold;
+ color: #000;
+ text-decoration: none;
+}
diff --git a/assets/css/src/board.css b/assets/css/src/board.css
index 5a303969..ca4ba5c0 100644
--- a/assets/css/src/board.css
+++ b/assets/css/src/board.css
@@ -1,12 +1,3 @@
-/* board filters */
-.board-filters {
- font-size: 0.95em;
-}
-
-#more-filters {
- display: none; /* Hide this filter initially, to avoid re-layout */
-}
-
/* public board */
.public-board {
margin-top: 5px;
diff --git a/assets/css/src/dropdown.css b/assets/css/src/dropdown.css
index 2b9f9044..4ddcbf29 100644
--- a/assets/css/src/dropdown.css
+++ b/assets/css/src/dropdown.css
@@ -36,6 +36,12 @@
padding-right: 10px;
}
+.page-header div.dropdown {
+ font-size: 0.9em;
+ padding-right: 10px;
+}
+
+.page-header div.dropdown,
.page-header ul.dropdown {
display: inline;
}
diff --git a/assets/css/src/header.css b/assets/css/src/header.css
index c7bb6843..95320842 100644
--- a/assets/css/src/header.css
+++ b/assets/css/src/header.css
@@ -66,7 +66,7 @@ nav .active a {
/* page header */
.page-header {
- margin-bottom: 25px;
+ margin-bottom: 20px;
}
.page-header h2 {
@@ -97,6 +97,10 @@ nav .active a {
font-size: 0.9em;
}
+.page-header form {
+ display: inline;
+}
+
@media only screen and (max-width: 640px) {
.page-header-mobile li {
diff --git a/assets/js/app.js b/assets/js/app.js
index 44c9085b..2ac0060c 100644
--- a/assets/js/app.js
+++ b/assets/js/app.js
@@ -144,30 +144,24 @@ $("body").data("login-url")}}})},Init:function(){$(".chosen-select").chosen({wid
Mousetrap.bind("b",function(a){a.preventDefault();$("#board-selector").trigger("chosen:open")});$.datepicker.setDefaults($.datepicker.regional[$("body").data("js-lang")]);Kanboard.InitAfterAjax()},InitAfterAjax:function(){$(document).on("click",".popover",Kanboard.Popover);$("[autofocus]").each(function(a,c){$(this).focus()});$(".form-date").datepicker({showOtherMonths:!0,selectOtherMonths:!0,dateFormat:"yy-mm-dd",constrainInput:!1});$("#markdown-preview").click(Kanboard.MarkdownPreview);$("#markdown-write").click(Kanboard.MarkdownWriter);
$(".auto-select").focus(function(){$(this).select()});$(".dropit-submenu").hide();$(".dropdown").not(".dropit").dropit({triggerParentEl:"span"});$(".task-autocomplete").length&&(""==$(".opposite_task_id").val()&&$(".task-autocomplete").parent().find("input[type=submit]").attr("disabled","disabled"),$(".task-autocomplete").autocomplete({source:$(".task-autocomplete").data("search-url"),minLength:1,select:function(a,c){var b=$(".task-autocomplete").data("dst-field");$("input[name="+b+"]").val(c.item.id);
$(".task-autocomplete").parent().find("input[type=submit]").removeAttr("disabled")}}));$(".column-tooltip").tooltip({content:function(){return'<div class="markdown">'+$(this).attr("title")+"</div>"},position:{my:"left-20 top",at:"center bottom+9",using:function(a,c){$(this).css(a);var b=c.target.left+c.target.width/2-c.element.left-20;$("<div>").addClass("tooltip-arrow").addClass(c.vertical).addClass(0==b?"align-left":"align-right").appendTo(this)}}});Kanboard.Exists("screenshot-zone")&&Kanboard.Screenshot.Init()}}}();
-Kanboard.Board=function(){function a(a){a.preventDefault();a.stopPropagation();Kanboard.Popover(a,Kanboard.InitAfterAjax)}function c(){Mousetrap.bind("n",function(){Kanboard.OpenPopover($("#board").data("task-creation-url"),Kanboard.InitAfterAjax)});Mousetrap.bind("s",function(){"expanded"===(Kanboard.GetStorageItem(d())||"expanded")?(e(),Kanboard.SetStorageItem(d(),"collapsed")):(f(),Kanboard.SetStorageItem(d(),"expanded"))});Mousetrap.bind("c",function(){q()})}function b(){$(".filter-expand-link").click(function(a){a.preventDefault();
-f();Kanboard.SetStorageItem(d(),"expanded")});$(".filter-collapse-link").click(function(a){a.preventDefault();e();Kanboard.SetStorageItem(d(),"collapsed")});g()}function d(){return"board_stacking_"+$("#board").data("project-id")}function e(){$(".filter-collapse").hide();$(".task-board-collapsed").show();$(".filter-expand").show();$(".task-board-expanded").hide()}function f(){$(".filter-collapse").show();$(".task-board-collapsed").hide();$(".filter-expand").hide();$(".task-board-expanded").show()}
-function g(){"expanded"===(Kanboard.GetStorageItem(d())||"expanded")?f():e()}function h(){$(".column").sortable({delay:300,distance:5,connectWith:".column",placeholder:"draggable-placeholder",stop:function(a,b){k(b.item.attr("data-task-id"),b.item.parent().attr("data-column-id"),b.item.index()+1,b.item.parent().attr("data-swimlane-id"))}});$("#board").on("click",".task-board-popover",a);$("#board").on("click",".task-board",function(){window.location=$(this).data("task-url")});$(".task-board-tooltip").tooltip({track:!1,
-position:{my:"left-20 top",at:"center bottom+9",using:function(a,b){$(this).css(a);var c=b.target.left+b.target.width/2-b.element.left-20;$("<div>").addClass("tooltip-arrow").addClass(b.vertical).addClass(0==c?"align-left":"align-right").appendTo(this)}},content:function(a){if(a=$(this).attr("data-href")){var b=this;$.get(a,function r(a){$(".ui-tooltip-content:visible").html(a);a=$(".ui-tooltip:visible");a.css({top:"",left:""});a.children(".tooltip-arrow").remove();var c=$(b).tooltip("option","position");
-c.of=$(b);a.position(c);$("#tooltip-subtasks a").not(".popover").click(function(a){a.preventDefault();a.stopPropagation();$(this).hasClass("popover-subtask-restriction")?(Kanboard.OpenPopover($(this).attr("href")),$(b).tooltip("close")):$.get($(this).attr("href"),r)})});return'<i class="fa fa-refresh fa-spin fa-2x"></i>'}}}).on("mouseenter",function(){var a=this;$(this).tooltip("open");$(".ui-tooltip").on("mouseleave",function(){$(a).tooltip("close")})}).on("mouseleave focusout",function(a){a.stopImmediatePropagation();
-var b=this;setTimeout(function(){$(".ui-tooltip:hover").length||$(b).tooltip("close")},100)});var b=parseInt($("#board").attr("data-check-interval"));0<b&&(n=window.setInterval(p,1E3*b))}function k(a,b,c,d){clearInterval(n);$.ajax({cache:!1,url:$("#board").attr("data-save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:a,column_id:b,swimlane_id:d,position:c}),success:function(a){$("#board-container").remove();$("#main").append(a);Kanboard.InitAfterAjax();
-h();l();g();m()}})}function p(){Kanboard.IsVisible()&&$.ajax({cache:!1,url:$("#board").attr("data-check-url"),statusCode:{200:function(a){$("#board-container").remove();$("#main").append(a);Kanboard.InitAfterAjax();clearInterval(n);h();l();g();m()}}})}function l(){var a=$("#form-user_id").val(),b=$("#form-category_id").val(),c=$("#more-filters option[value=filter-due-date]").is(":selected"),d=$("#more-filters option[value=filter-recent]").is(":selected"),g=$("#board").data("project-id");$("[data-task-id]").each(function(g,
-e){var f=e.getAttribute("data-owner-id"),h=e.getAttribute("data-due-date"),k=e.getAttribute("data-category-id"),p=$(e).hasClass("task-board-recent");e.style.display=f!=a&&-1!=a?"none":"block";!c||""!=h&&"0"!=h||(e.style.display="none");k!=b&&-1!=b&&(e.style.display="none");d&&!p&&(e.style.display="none")});Kanboard.SetStorageItem("board_filter_"+g+"_form-user_id",a);Kanboard.SetStorageItem("board_filter_"+g+"_form-category_id",b);Kanboard.SetStorageItem("board_filter_"+g+"_filter-due-date",~~c);Kanboard.SetStorageItem("board_filter_"+
-g+"_filter-recent",~~d)}function t(){var a=$("#board").data("project-id");$("#form-user_id").chosen({width:"180px",no_results_text:$("#form-user_id").data("notfound")});$("#form-category_id").chosen({width:"200px",no_results_text:$("#form-category_id").data("notfound")});$("#more-filters").chosen({width:"30%",no_results_text:$("#more-filters").data("notfound")});$(".apply-filters").change(function(a){l()});$("#form-user_id").val(Kanboard.GetStorageItem("board_filter_"+a+"_form-user_id")||-1);$("#form-user_id").trigger("chosen:updated");
-$("#form-category_id").val(Kanboard.GetStorageItem("board_filter_"+a+"_form-category_id")||-1);$("#form-category_id").trigger("chosen:updated");+Kanboard.GetStorageItem("board_filter_"+a+"_filter-due-date")&&$("#more-filters option[value=filter-due-date]").attr("selected",!0);+Kanboard.GetStorageItem("board_filter_"+a+"_filter-recent")&&$("#more-filters option[value=filter-recent]").attr("selected",!0);$("#more-filters").trigger("chosen:updated");l()}function u(){jQuery(document).on("click",".filter-toggle-scrolling",
-function(a){a.preventDefault();q()});m()}function q(){var a=Kanboard.GetStorageItem("horizontal_scroll")||1;Kanboard.SetStorageItem("horizontal_scroll",0==a?1:0);m()}function m(){0==Kanboard.GetStorageItem("horizontal_scroll")?($(".filter-wide").show(),$(".filter-compact").hide(),$("#board-container").addClass("board-container-compact"),$("#board th").addClass("board-column-compact")):($(".filter-wide").hide(),$(".filter-compact").show(),$("#board-container").removeClass("board-container-compact"),
-$("#board th").removeClass("board-column-compact"))}var n=null;jQuery(document).ready(function(){Kanboard.Exists("board")&&(h(),t(),b(),u(),c())})}();
-Kanboard.Calendar=function(){function a(a){var b=$("#calendar").data("save-url")||$("#user-calendar").data("save-url");$.ajax({cache:!1,url:b,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:a.id,date_due:a.start.format()})})}function c(){var a=$("#user-calendar"),b=a.data("check-url"),c={start:a.fullCalendar("getView").start.format(),end:a.fullCalendar("getView").end.format(),user_id:a.data("user-id")},d;for(d in c)b+="&"+d+"="+c[d];$.getJSON(b,function(b){a.fullCalendar("removeEvents");
-a.fullCalendar("addEventSource",b);a.fullCalendar("rerenderEvents")})}function b(a){var b=$("#calendar"),c=b.data("check-url"),d={start:b.fullCalendar("getView").start.format(),end:b.fullCalendar("getView").end.format()};jQuery.extend(d,a);for(var e in d)c+="&"+e+"="+d[e];$.getJSON(c,function(a){b.fullCalendar("removeEvents");b.fullCalendar("addEventSource",a);b.fullCalendar("rerenderEvents")})}function d(){var a=Kanboard.GetStorageItem(f);if(""!==a){var a=JSON.parse(a),c;for(c in a)$("select[name="+
-c+"]").val(a[c])}b(a||{});$(".calendar-filter").change(e)}function e(){var a={};$(".calendar-filter").each(function(){a[$(this).attr("name")]=$(this).val()});Kanboard.SetStorageItem(f,JSON.stringify(a));b(a)}var f="";jQuery(document).ready(function(){Kanboard.Exists("calendar")?(f="calendar_filters_"+$("#calendar").data("project-id"),$("#calendar").fullCalendar({lang:$("body").data("js-lang"),editable:!0,eventLimit:!0,defaultView:"month",header:{left:"prev,next today",center:"title",right:"month,agendaWeek,agendaDay"},
-viewRender:d,eventDrop:a}),d()):Kanboard.Exists("user-calendar")&&$("#user-calendar").fullCalendar({lang:$("body").data("js-lang"),editable:!0,eventLimit:!0,defaultView:"month",header:{left:"prev,next today",center:"title",right:"month,agendaWeek,agendaDay"},viewRender:c,eventDrop:a})})}();
-Kanboard.Analytic=function(){jQuery(document).ready(function(){if(Kanboard.Exists("analytic-task-repartition")){for(var a=$("#chart").data("metrics"),c=[],b=0;b<a.length;b++)c.push([a[b].column_title,a[b].nb_tasks]);c3.generate({data:{columns:c,type:"donut"}})}else if(Kanboard.Exists("analytic-user-repartition")){a=$("#chart").data("metrics");c=[];for(b=0;b<a.length;b++)c.push([a[b].user,a[b].nb_tasks]);c3.generate({data:{columns:c,type:"donut"}})}else if(Kanboard.Exists("analytic-cfd")){for(var a=
-$("#chart").data("metrics"),c=[],b=[],d=0;d<a.length;d++)for(var e=0;e<a[d].length;e++)0==d?(c.push([a[d][e]]),0<e&&b.push(a[d][e])):c[e].push(a[d][e]);c3.generate({data:{columns:c,x:a[0][0],type:"area-spline",groups:[b]},axis:{x:{type:"timeseries",tick:{format:$("#chart").data("date-format")}}}})}else if(Kanboard.Exists("analytic-burndown")){a=$("#chart").data("metrics");c=[[$("#chart").data("label-total")]];for(b=0;b<a.length;b++)for(d=0;d<a[b].length;d++)0==b?c.push([a[b][d]]):(c[d+1].push(a[b][d]),
-0<d&&(void 0==c[0][b]&&c[0].push(0),c[0][b]+=a[b][d]));c3.generate({data:{columns:c,x:a[0][0]},axis:{x:{type:"timeseries",tick:{format:$("#chart").data("date-format")}}}})}else if(Kanboard.Exists("budget-chart")){a=$("#chart").data("metrics");d=$("#chart").data("labels");c=[[d.date],[d["in"]],[d.left],[d.out]];b={};b[d["in"]]="#5858FA";b[d.left]="#04B404";b[d.out]="#DF3A01";for(d=0;d<a.length;d++)c[0].push(a[d].date),c[1].push(a[d]["in"]),c[2].push(a[d].left),c[3].push(a[d].out);c3.generate({data:{x:c[0][0],
-columns:c,colors:b,type:"bar"},axis:{x:{type:"timeseries",tick:{format:$("#chart").data("date-format")}}}})}});return{}}();
-Kanboard.Swimlane=function(){function a(a){$(".swimlane-row-"+a).css("display","none");$(".show-icon-swimlane-"+a).css("display","inline");$(".hide-icon-swimlane-"+a).css("display","none")}function c(){var a="hidden_swimlanes_"+$("#board").data("project-id");return JSON.parse(Kanboard.GetStorageItem(a))||[]}jQuery(document).ajaxComplete(function(){c().map(function(b){a(b)})});jQuery(document).ready(function(){c().map(function(b){a(b)})});jQuery(document).on("click",".board-swimlane-toggle",function(b){b.preventDefault();
+(function(){function a(a){a.preventDefault();a.stopPropagation();Kanboard.Popover(a,Kanboard.InitAfterAjax)}function c(){Mousetrap.bind("n",function(){Kanboard.OpenPopover($("#board").data("task-creation-url"),Kanboard.InitAfterAjax)});Mousetrap.bind("s",function(){"expanded"===(Kanboard.GetStorageItem(d())||"expanded")?(e(),Kanboard.SetStorageItem(d(),"collapsed")):(f(),Kanboard.SetStorageItem(d(),"expanded"))});Mousetrap.bind("c",function(){n()})}function b(){$(".filter-expand-link").click(function(a){a.preventDefault();
+f();Kanboard.SetStorageItem(d(),"expanded")});$(".filter-collapse-link").click(function(a){a.preventDefault();e();Kanboard.SetStorageItem(d(),"collapsed")});k()}function d(){return"board_stacking_"+$("#board").data("project-id")}function e(){$(".filter-collapse").hide();$(".task-board-collapsed").show();$(".filter-expand").show();$(".task-board-expanded").hide()}function f(){$(".filter-collapse").show();$(".task-board-collapsed").hide();$(".filter-expand").hide();$(".task-board-expanded").show()}
+function k(){"expanded"===(Kanboard.GetStorageItem(d())||"expanded")?f():e()}function l(){$(".column").sortable({delay:300,distance:5,connectWith:".column",placeholder:"draggable-placeholder",stop:function(a,b){g(b.item.attr("data-task-id"),b.item.parent().attr("data-column-id"),b.item.index()+1,b.item.parent().attr("data-swimlane-id"))}});$("#board").on("click",".task-board-popover",a);$("#board").on("click",".task-board",function(){window.location=$(this).data("task-url")});$(".task-board-tooltip").tooltip({track:!1,
+position:{my:"left-20 top",at:"center bottom+9",using:function(a,b){$(this).css(a);var c=b.target.left+b.target.width/2-b.element.left-20;$("<div>").addClass("tooltip-arrow").addClass(b.vertical).addClass(0==c?"align-left":"align-right").appendTo(this)}},content:function(a){if(a=$(this).attr("data-href")){var b=this;$.get(a,function p(a){$(".ui-tooltip-content:visible").html(a);a=$(".ui-tooltip:visible");a.css({top:"",left:""});a.children(".tooltip-arrow").remove();var c=$(b).tooltip("option","position");
+c.of=$(b);a.position(c);$("#tooltip-subtasks a").not(".popover").click(function(a){a.preventDefault();a.stopPropagation();$(this).hasClass("popover-subtask-restriction")?(Kanboard.OpenPopover($(this).attr("href")),$(b).tooltip("close")):$.get($(this).attr("href"),p)})});return'<i class="fa fa-refresh fa-spin fa-2x"></i>'}}}).on("mouseenter",function(){var a=this;$(this).tooltip("open");$(".ui-tooltip").on("mouseleave",function(){$(a).tooltip("close")})}).on("mouseleave focusout",function(a){a.stopImmediatePropagation();
+var b=this;setTimeout(function(){$(".ui-tooltip:hover").length||$(b).tooltip("close")},100)});var b=parseInt($("#board").attr("data-check-interval"));0<b&&(m=window.setInterval(q,1E3*b))}function g(a,b,c,d){clearInterval(m);$.ajax({cache:!1,url:$("#board").attr("data-save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:a,column_id:b,swimlane_id:d,position:c}),success:function(a){$("#board-container").remove();$("#main").append(a);Kanboard.InitAfterAjax();
+l();k();h()}})}function q(){Kanboard.IsVisible()&&$.ajax({cache:!1,url:$("#board").attr("data-check-url"),statusCode:{200:function(a){$("#board-container").remove();$("#main").append(a);Kanboard.InitAfterAjax();clearInterval(m);l();k();h()}}})}function r(){jQuery(document).on("click",".filter-toggle-scrolling",function(a){a.preventDefault();n()});h()}function n(){var a=Kanboard.GetStorageItem("horizontal_scroll")||1;Kanboard.SetStorageItem("horizontal_scroll",0==a?1:0);h()}function h(){0==Kanboard.GetStorageItem("horizontal_scroll")?
+($(".filter-wide").show(),$(".filter-compact").hide(),$("#board-container").addClass("board-container-compact"),$("#board th").addClass("board-column-compact")):($(".filter-wide").hide(),$(".filter-compact").show(),$("#board-container").removeClass("board-container-compact"),$("#board th").removeClass("board-column-compact"))}var m=null;jQuery(document).ready(function(){Kanboard.Exists("board")&&(l(),b(),r(),c())})})();
+(function(){jQuery(document).ready(function(){if(Kanboard.Exists("calendar")){var a=$("#calendar");a.fullCalendar({lang:$("body").data("js-lang"),editable:!0,eventLimit:!0,defaultView:"month",header:{left:"prev,next today",center:"title",right:"month,agendaWeek,agendaDay"},eventDrop:function(c){$.ajax({cache:!1,url:a.data("save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:c.id,date_due:c.start.format()})})},viewRender:function(){var c=a.data("check-url"),
+b={start:a.fullCalendar("getView").start.format(),end:a.fullCalendar("getView").end.format()},d;for(d in b)c+="&"+d+"="+b[d];$.getJSON(c,function(b){a.fullCalendar("removeEvents");a.fullCalendar("addEventSource",b);a.fullCalendar("rerenderEvents")})}})}})})();
+(function(){jQuery(document).ready(function(){if(Kanboard.Exists("analytic-task-repartition")){for(var a=$("#chart").data("metrics"),c=[],b=0;b<a.length;b++)c.push([a[b].column_title,a[b].nb_tasks]);c3.generate({data:{columns:c,type:"donut"}})}else if(Kanboard.Exists("analytic-user-repartition")){a=$("#chart").data("metrics");c=[];for(b=0;b<a.length;b++)c.push([a[b].user,a[b].nb_tasks]);c3.generate({data:{columns:c,type:"donut"}})}else if(Kanboard.Exists("analytic-cfd")){for(var a=$("#chart").data("metrics"),
+c=[],b=[],d=0;d<a.length;d++)for(var e=0;e<a[d].length;e++)0==d?(c.push([a[d][e]]),0<e&&b.push(a[d][e])):c[e].push(a[d][e]);c3.generate({data:{columns:c,x:a[0][0],type:"area-spline",groups:[b]},axis:{x:{type:"timeseries",tick:{format:$("#chart").data("date-format")}}}})}else if(Kanboard.Exists("analytic-burndown")){a=$("#chart").data("metrics");c=[[$("#chart").data("label-total")]];for(b=0;b<a.length;b++)for(d=0;d<a[b].length;d++)0==b?c.push([a[b][d]]):(c[d+1].push(a[b][d]),0<d&&(void 0==c[0][b]&&
+c[0].push(0),c[0][b]+=a[b][d]));c3.generate({data:{columns:c,x:a[0][0]},axis:{x:{type:"timeseries",tick:{format:$("#chart").data("date-format")}}}})}else if(Kanboard.Exists("budget-chart")){a=$("#chart").data("metrics");d=$("#chart").data("labels");c=[[d.date],[d["in"]],[d.left],[d.out]];b={};b[d["in"]]="#5858FA";b[d.left]="#04B404";b[d.out]="#DF3A01";for(d=0;d<a.length;d++)c[0].push(a[d].date),c[1].push(a[d]["in"]),c[2].push(a[d].left),c[3].push(a[d].out);c3.generate({data:{x:c[0][0],columns:c,colors:b,
+type:"bar"},axis:{x:{type:"timeseries",tick:{format:$("#chart").data("date-format")}}}})}})})();
+(function(){function a(a){$(".swimlane-row-"+a).css("display","none");$(".show-icon-swimlane-"+a).css("display","inline");$(".hide-icon-swimlane-"+a).css("display","none")}function c(){var a="hidden_swimlanes_"+$("#board").data("project-id");return JSON.parse(Kanboard.GetStorageItem(a))||[]}jQuery(document).ajaxComplete(function(){c().map(function(b){a(b)})});jQuery(document).ready(function(){c().map(function(b){a(b)})});jQuery(document).on("click",".board-swimlane-toggle",function(b){b.preventDefault();
b=$(this).data("swimlane-id");if(-1<c().indexOf(b)){var d="hidden_swimlanes_"+$("#board").data("project-id"),e=JSON.parse(Kanboard.GetStorageItem(d))||[],f=e.indexOf(b);-1<f&&e.splice(f,1);Kanboard.SetStorageItem(d,JSON.stringify(e));$(".swimlane-row-"+b).css("display","table-row");$(".show-icon-swimlane-"+b).css("display","none");$(".hide-icon-swimlane-"+b).css("display","inline")}else d="hidden_swimlanes_"+$("#board").data("project-id"),e=JSON.parse(Kanboard.GetStorageItem(d))||[],e.push(b),Kanboard.SetStorageItem(d,
-JSON.stringify(e)),a(b)})}();
-Kanboard.Screenshot=function(){function a(){window.Clipboard||(e=document.createElement("div"),e.setAttribute("contenteditable",""),e.style.opacity=0,document.body.appendChild(e),e.focus(),document.addEventListener("click",function(){e.focus()}));window.addEventListener("paste",c)}function c(a){if(a.clipboardData&&a.clipboardData.items){if(a=a.clipboardData.items)for(var c=0;c<a.length;c++)if(-1!==a[c].type.indexOf("image")){var e=a[c].getAsFile(),k=new FileReader;k.onload=function(a){d(a.target.result)};
-k.readAsDataURL(e)}}else setTimeout(b,100)}function b(){var a=e.childNodes[0];e.innerHTML="";a&&"IMG"===a.tagName&&d(a.src)}function d(a){var b=new Image;b.src=a;b.onload=function(){var b=a.split("base64,")[1];$("input[name=screenshot]").val(b)};document.getElementById("screenshot-inner").style.display="none";document.getElementById("screenshot-zone").className="screenshot-pasted";document.getElementById("screenshot-zone").appendChild(b)}var e=null;jQuery(document).ready(function(){Kanboard.Exists("screenshot-zone")&&
+JSON.stringify(e)),a(b)})})();
+Kanboard.Screenshot=function(){function a(){window.Clipboard||(e=document.createElement("div"),e.setAttribute("contenteditable",""),e.style.opacity=0,document.body.appendChild(e),e.focus(),document.addEventListener("click",function(){e.focus()}));window.addEventListener("paste",c)}function c(a){if(a.clipboardData&&a.clipboardData.items){if(a=a.clipboardData.items)for(var c=0;c<a.length;c++)if(-1!==a[c].type.indexOf("image")){var e=a[c].getAsFile(),g=new FileReader;g.onload=function(a){d(a.target.result)};
+g.readAsDataURL(e)}}else setTimeout(b,100)}function b(){var a=e.childNodes[0];e.innerHTML="";a&&"IMG"===a.tagName&&d(a.src)}function d(a){var b=new Image;b.src=a;b.onload=function(){var b=a.split("base64,")[1];$("input[name=screenshot]").val(b)};document.getElementById("screenshot-inner").style.display="none";document.getElementById("screenshot-zone").className="screenshot-pasted";document.getElementById("screenshot-zone").appendChild(b)}var e=null;jQuery(document).ready(function(){Kanboard.Exists("screenshot-zone")&&
a()});return{Init:a}}();
(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){(e.defineLocale||e.lang).call(e,"da",{months:"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag".split("_"),weekdaysShort:"søn_man_tir_ons_tor_fre_lør".split("_"),weekdaysMin:"sø_ma_ti_on_to_fr_lø".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd [d.] D. MMMM YYYY LT"},calendar:{sameDay:"[I dag kl.] LT",nextDay:"[I morgen kl.] LT",nextWeek:"dddd [kl.] LT",lastDay:"[I går kl.] LT",lastWeek:"[sidste] dddd [kl] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"%s siden",s:"få sekunder",m:"et minut",mm:"%d minutter",h:"en time",hh:"%d timer",d:"en dag",dd:"%d dage",M:"en måned",MM:"%d måneder",y:"et år",yy:"%d år"},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("da","da",{closeText:"Luk",prevText:"&#x3C;Forrige",nextText:"Næste&#x3E;",currentText:"Idag",monthNames:["Januar","Februar","Marts","April","Maj","Juni","Juli","August","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNames:["Søndag","Mandag","Tirsdag","Onsdag","Torsdag","Fredag","Lørdag"],dayNamesShort:["Søn","Man","Tir","Ons","Tor","Fre","Lør"],dayNamesMin:["Sø","Ma","Ti","On","To","Fr","Lø"],weekHeader:"Uge",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("da",{defaultButtonText:{month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},allDayText:"Hele dagen",eventLimitText:"flere"})});(function(t){"function"==typeof define&&define.amd?define(["jquery","moment"],t):t(jQuery,moment)})(function(t,e){function n(t,e,n){var i={m:["eine Minute","einer Minute"],h:["eine Stunde","einer Stunde"],d:["ein Tag","einem Tag"],dd:[t+" Tage",t+" Tagen"],M:["ein Monat","einem Monat"],MM:[t+" Monate",t+" Monaten"],y:["ein Jahr","einem Jahr"],yy:[t+" Jahre",t+" Jahren"]};return e?i[n][0]:i[n][1]}(e.defineLocale||e.lang).call(e,"de",{months:"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember".split("_"),monthsShort:"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.".split("_"),weekdays:"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag".split("_"),weekdaysShort:"So._Mo._Di._Mi._Do._Fr._Sa.".split("_"),weekdaysMin:"So_Mo_Di_Mi_Do_Fr_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"DD.MM.YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[Heute um] LT [Uhr]",sameElse:"L",nextDay:"[Morgen um] LT [Uhr]",nextWeek:"dddd [um] LT [Uhr]",lastDay:"[Gestern um] LT [Uhr]",lastWeek:"[letzten] dddd [um] LT [Uhr]"},relativeTime:{future:"in %s",past:"vor %s",s:"ein paar Sekunden",m:n,mm:"%d Minuten",h:n,hh:"%d Stunden",d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),t.fullCalendar.datepickerLang("de","de",{closeText:"Schließen",prevText:"&#x3C;Zurück",nextText:"Vor&#x3E;",currentText:"Heute",monthNames:["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"],monthNamesShort:["Jan","Feb","Mär","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"],dayNames:["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"],dayNamesShort:["So","Mo","Di","Mi","Do","Fr","Sa"],dayNamesMin:["So","Mo","Di","Mi","Do","Fr","Sa"],weekHeader:"KW",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),t.fullCalendar.lang("de",{defaultButtonText:{month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},allDayText:"Ganztägig",eventLimitText:function(t){return"+ weitere "+t}})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n="ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),i="ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic".split("_");(t.defineLocale||t.lang).call(t,"es",{months:"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?i[e.month()]:n[e.month()]},weekdays:"domingo_lunes_martes_miércoles_jueves_viernes_sábado".split("_"),weekdaysShort:"dom._lun._mar._mié._jue._vie._sáb.".split("_"),weekdaysMin:"Do_Lu_Ma_Mi_Ju_Vi_Sá".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY LT",LLLL:"dddd, D [de] MMMM [de] YYYY LT"},calendar:{sameDay:function(){return"[hoy a la"+(1!==this.hours()?"s":"")+"] LT"},nextDay:function(){return"[mañana a la"+(1!==this.hours()?"s":"")+"] LT"},nextWeek:function(){return"dddd [a la"+(1!==this.hours()?"s":"")+"] LT"},lastDay:function(){return"[ayer a la"+(1!==this.hours()?"s":"")+"] LT"},lastWeek:function(){return"[el] dddd [pasado a la"+(1!==this.hours()?"s":"")+"] LT"},sameElse:"L"},relativeTime:{future:"en %s",past:"hace %s",s:"unos segundos",m:"un minuto",mm:"%d minutos",h:"una hora",hh:"%d horas",d:"un día",dd:"%d días",M:"un mes",MM:"%d meses",y:"un año",yy:"%d años"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("es","es",{closeText:"Cerrar",prevText:"&#x3C;Ant",nextText:"Sig&#x3E;",currentText:"Hoy",monthNames:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],monthNamesShort:["ene","feb","mar","abr","may","jun","jul","ago","sep","oct","nov","dic"],dayNames:["domingo","lunes","martes","miércoles","jueves","viernes","sábado"],dayNamesShort:["dom","lun","mar","mié","jue","vie","sáb"],dayNamesMin:["D","L","M","X","J","V","S"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("es",{defaultButtonText:{month:"Mes",week:"Semana",day:"Día",list:"Agenda"},allDayHtml:"Todo<br/>el día",eventLimitText:"más"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n,r){var s="";switch(n){case"s":return r?"muutaman sekunnin":"muutama sekunti";case"m":return r?"minuutin":"minuutti";case"mm":s=r?"minuutin":"minuuttia";break;case"h":return r?"tunnin":"tunti";case"hh":s=r?"tunnin":"tuntia";break;case"d":return r?"päivän":"päivä";case"dd":s=r?"päivän":"päivää";break;case"M":return r?"kuukauden":"kuukausi";case"MM":s=r?"kuukauden":"kuukautta";break;case"y":return r?"vuoden":"vuosi";case"yy":s=r?"vuoden":"vuotta"}return s=i(e,r)+" "+s}function i(e,t){return 10>e?t?s[e]:r[e]:e}var r="nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän".split(" "),s=["nolla","yhden","kahden","kolmen","neljän","viiden","kuuden",r[7],r[8],r[9]];(t.defineLocale||t.lang).call(t,"fi",{months:"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu".split("_"),monthsShort:"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu".split("_"),weekdays:"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai".split("_"),weekdaysShort:"su_ma_ti_ke_to_pe_la".split("_"),weekdaysMin:"su_ma_ti_ke_to_pe_la".split("_"),longDateFormat:{LT:"HH.mm",LTS:"HH.mm.ss",L:"DD.MM.YYYY",LL:"Do MMMM[ta] YYYY",LLL:"Do MMMM[ta] YYYY, [klo] LT",LLLL:"dddd, Do MMMM[ta] YYYY, [klo] LT",l:"D.M.YYYY",ll:"Do MMM YYYY",lll:"Do MMM YYYY, [klo] LT",llll:"ddd, Do MMM YYYY, [klo] LT"},calendar:{sameDay:"[tänään] [klo] LT",nextDay:"[huomenna] [klo] LT",nextWeek:"dddd [klo] LT",lastDay:"[eilen] [klo] LT",lastWeek:"[viime] dddd[na] [klo] LT",sameElse:"L"},relativeTime:{future:"%s päästä",past:"%s sitten",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fi","fi",{closeText:"Sulje",prevText:"&#xAB;Edellinen",nextText:"Seuraava&#xBB;",currentText:"Tänään",monthNames:["Tammikuu","Helmikuu","Maaliskuu","Huhtikuu","Toukokuu","Kesäkuu","Heinäkuu","Elokuu","Syyskuu","Lokakuu","Marraskuu","Joulukuu"],monthNamesShort:["Tammi","Helmi","Maalis","Huhti","Touko","Kesä","Heinä","Elo","Syys","Loka","Marras","Joulu"],dayNamesShort:["Su","Ma","Ti","Ke","To","Pe","La"],dayNames:["Sunnuntai","Maanantai","Tiistai","Keskiviikko","Torstai","Perjantai","Lauantai"],dayNamesMin:["Su","Ma","Ti","Ke","To","Pe","La"],weekHeader:"Vk",dateFormat:"d.m.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fi",{defaultButtonText:{month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},allDayText:"Koko päivä",eventLimitText:"lisää"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"fr",{months:"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre".split("_"),monthsShort:"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.".split("_"),weekdays:"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi".split("_"),weekdaysShort:"dim._lun._mar._mer._jeu._ven._sam.".split("_"),weekdaysMin:"Di_Lu_Ma_Me_Je_Ve_Sa".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Aujourd'hui à] LT",nextDay:"[Demain à] LT",nextWeek:"dddd [à] LT",lastDay:"[Hier à] LT",lastWeek:"dddd [dernier à] LT",sameElse:"L"},relativeTime:{future:"dans %s",past:"il y a %s",s:"quelques secondes",m:"une minute",mm:"%d minutes",h:"une heure",hh:"%d heures",d:"un jour",dd:"%d jours",M:"un mois",MM:"%d mois",y:"un an",yy:"%d ans"},ordinalParse:/\d{1,2}(er|)/,ordinal:function(e){return e+(1===e?"er":"")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("fr","fr",{closeText:"Fermer",prevText:"Précédent",nextText:"Suivant",currentText:"Aujourd'hui",monthNames:["janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre"],monthNamesShort:["janv.","févr.","mars","avr.","mai","juin","juil.","août","sept.","oct.","nov.","déc."],dayNames:["dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi"],dayNamesShort:["dim.","lun.","mar.","mer.","jeu.","ven.","sam."],dayNamesMin:["D","L","M","M","J","V","S"],weekHeader:"Sem.",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("fr",{defaultButtonText:{month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t,n,r){var i=e;switch(n){case"s":return r||t?"néhány másodperc":"néhány másodperce";case"m":return"egy"+(r||t?" perc":" perce");case"mm":return i+(r||t?" perc":" perce");case"h":return"egy"+(r||t?" óra":" órája");case"hh":return i+(r||t?" óra":" órája");case"d":return"egy"+(r||t?" nap":" napja");case"dd":return i+(r||t?" nap":" napja");case"M":return"egy"+(r||t?" hónap":" hónapja");case"MM":return i+(r||t?" hónap":" hónapja");case"y":return"egy"+(r||t?" év":" éve");case"yy":return i+(r||t?" év":" éve")}return""}function r(e){return(e?"":"[múlt] ")+"["+i[this.day()]+"] LT[-kor]"}var i="vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton".split(" ");(t.defineLocale||t.lang).call(t,"hu",{months:"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december".split("_"),monthsShort:"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec".split("_"),weekdays:"vasárnap_hétfő_kedd_szerda_csütörtök_péntek_szombat".split("_"),weekdaysShort:"vas_hét_kedd_sze_csüt_pén_szo".split("_"),weekdaysMin:"v_h_k_sze_cs_p_szo".split("_"),longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"YYYY.MM.DD.",LL:"YYYY. MMMM D.",LLL:"YYYY. MMMM D., LT",LLLL:"YYYY. MMMM D., dddd LT"},meridiemParse:/de|du/i,isPM:function(e){return"u"===e.charAt(1).toLowerCase()},meridiem:function(e,t,n){return 12>e?n===!0?"de":"DE":n===!0?"du":"DU"},calendar:{sameDay:"[ma] LT[-kor]",nextDay:"[holnap] LT[-kor]",nextWeek:function(){return r.call(this,!0)},lastDay:"[tegnap] LT[-kor]",lastWeek:function(){return r.call(this,!1)},sameElse:"L"},relativeTime:{future:"%s múlva",past:"%s",s:n,m:n,mm:n,h:n,hh:n,d:n,dd:n,M:n,MM:n,y:n,yy:n},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("hu","hu",{closeText:"bezár",prevText:"vissza",nextText:"előre",currentText:"ma",monthNames:["Január","Február","Március","Április","Május","Június","Július","Augusztus","Szeptember","Október","November","December"],monthNamesShort:["Jan","Feb","Már","Ápr","Máj","Jún","Júl","Aug","Szep","Okt","Nov","Dec"],dayNames:["Vasárnap","Hétfő","Kedd","Szerda","Csütörtök","Péntek","Szombat"],dayNamesShort:["Vas","Hét","Ked","Sze","Csü","Pén","Szo"],dayNamesMin:["V","H","K","Sze","Cs","P","Szo"],weekHeader:"Hét",dateFormat:"yy.mm.dd.",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:""}),e.fullCalendar.lang("hu",{defaultButtonText:{month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},allDayText:"Egész nap",eventLimitText:"további"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"it",{months:"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre".split("_"),monthsShort:"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic".split("_"),weekdays:"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato".split("_"),weekdaysShort:"Dom_Lun_Mar_Mer_Gio_Ven_Sab".split("_"),weekdaysMin:"D_L_Ma_Me_G_V_S".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Oggi alle] LT",nextDay:"[Domani alle] LT",nextWeek:"dddd [alle] LT",lastDay:"[Ieri alle] LT",lastWeek:function(){switch(this.day()){case 0:return"[la scorsa] dddd [alle] LT";default:return"[lo scorso] dddd [alle] LT"}},sameElse:"L"},relativeTime:{future:function(e){return(/^[0-9].+$/.test(e)?"tra":"in")+" "+e},past:"%s fa",s:"alcuni secondi",m:"un minuto",mm:"%d minuti",h:"un'ora",hh:"%d ore",d:"un giorno",dd:"%d giorni",M:"un mese",MM:"%d mesi",y:"un anno",yy:"%d anni"},ordinalParse:/\d{1,2}º/,ordinal:"%dº",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("it","it",{closeText:"Chiudi",prevText:"&#x3C;Prec",nextText:"Succ&#x3E;",currentText:"Oggi",monthNames:["Gennaio","Febbraio","Marzo","Aprile","Maggio","Giugno","Luglio","Agosto","Settembre","Ottobre","Novembre","Dicembre"],monthNamesShort:["Gen","Feb","Mar","Apr","Mag","Giu","Lug","Ago","Set","Ott","Nov","Dic"],dayNames:["Domenica","Lunedì","Martedì","Mercoledì","Giovedì","Venerdì","Sabato"],dayNamesShort:["Dom","Lun","Mar","Mer","Gio","Ven","Sab"],dayNamesMin:["Do","Lu","Ma","Me","Gi","Ve","Sa"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("it",{defaultButtonText:{month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e}})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"ja",{months:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"日曜日_月曜日_火曜日_水曜日_木曜日_金曜日_土曜日".split("_"),weekdaysShort:"日_月_火_水_木_金_土".split("_"),weekdaysMin:"日_月_火_水_木_金_土".split("_"),longDateFormat:{LT:"Ah時m分",LTS:"LTs秒",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日LT",LLLL:"YYYY年M月D日LT dddd"},meridiemParse:/午前|午後/i,isPM:function(e){return"午後"===e},meridiem:function(e){return 12>e?"午前":"午後"},calendar:{sameDay:"[今日] LT",nextDay:"[明日] LT",nextWeek:"[来週]dddd LT",lastDay:"[昨日] LT",lastWeek:"[前週]dddd LT",sameElse:"L"},relativeTime:{future:"%s後",past:"%s前",s:"数秒",m:"1分",mm:"%d分",h:"1時間",hh:"%d時間",d:"1日",dd:"%d日",M:"1ヶ月",MM:"%dヶ月",y:"1年",yy:"%d年"}}),e.fullCalendar.datepickerLang("ja","ja",{closeText:"閉じる",prevText:"&#x3C;前",nextText:"次&#x3E;",currentText:"今日",monthNames:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],monthNamesShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],dayNames:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"],dayNamesShort:["日","月","火","水","木","金","土"],dayNamesMin:["日","月","火","水","木","金","土"],weekHeader:"週",dateFormat:"yy/mm/dd",firstDay:0,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("ja",{defaultButtonText:{month:"月",week:"週",day:"日",list:"予定リスト"},allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"}})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n="jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),r="jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");(t.defineLocale||t.lang).call(t,"nl",{months:"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),monthsShort:function(e,t){return/-MMM-/.test(t)?r[e.month()]:n[e.month()]},weekdays:"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag".split("_"),weekdaysShort:"zo._ma._di._wo._do._vr._za.".split("_"),weekdaysMin:"Zo_Ma_Di_Wo_Do_Vr_Za".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD-MM-YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[vandaag om] LT",nextDay:"[morgen om] LT",nextWeek:"dddd [om] LT",lastDay:"[gisteren om] LT",lastWeek:"[afgelopen] dddd [om] LT",sameElse:"L"},relativeTime:{future:"over %s",past:"%s geleden",s:"een paar seconden",m:"één minuut",mm:"%d minuten",h:"één uur",hh:"%d uur",d:"één dag",dd:"%d dagen",M:"één maand",MM:"%d maanden",y:"één jaar",yy:"%d jaar"},ordinalParse:/\d{1,2}(ste|de)/,ordinal:function(e){return e+(1===e||8===e||e>=20?"ste":"de")},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("nl","nl",{closeText:"Sluiten",prevText:"←",nextText:"→",currentText:"Vandaag",monthNames:["januari","februari","maart","april","mei","juni","juli","augustus","september","oktober","november","december"],monthNamesShort:["jan","feb","mrt","apr","mei","jun","jul","aug","sep","okt","nov","dec"],dayNames:["zondag","maandag","dinsdag","woensdag","donderdag","vrijdag","zaterdag"],dayNamesShort:["zon","maa","din","woe","don","vri","zat"],dayNamesMin:["zo","ma","di","wo","do","vr","za"],weekHeader:"Wk",dateFormat:"dd-mm-yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("nl",{defaultButtonText:{month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e){return 5>e%10&&e%10>1&&1!==~~(e/10)%10}function i(e,t,i){var r=e+" ";switch(i){case"m":return t?"minuta":"minutę";case"mm":return r+(n(e)?"minuty":"minut");case"h":return t?"godzina":"godzinę";case"hh":return r+(n(e)?"godziny":"godzin");case"MM":return r+(n(e)?"miesiące":"miesięcy");case"yy":return r+(n(e)?"lata":"lat")}}var r="styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),a="stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");(t.defineLocale||t.lang).call(t,"pl",{months:function(e,t){return/D MMMM/.test(t)?a[e.month()]:r[e.month()]},monthsShort:"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru".split("_"),weekdays:"niedziela_poniedziałek_wtorek_środa_czwartek_piątek_sobota".split("_"),weekdaysShort:"nie_pon_wt_śr_czw_pt_sb".split("_"),weekdaysMin:"N_Pn_Wt_Śr_Cz_Pt_So".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[Dziś o] LT",nextDay:"[Jutro o] LT",nextWeek:"[W] dddd [o] LT",lastDay:"[Wczoraj o] LT",lastWeek:function(){switch(this.day()){case 0:return"[W zeszłą niedzielę o] LT";case 3:return"[W zeszłą środę o] LT";case 6:return"[W zeszłą sobotę o] LT";default:return"[W zeszły] dddd [o] LT"}},sameElse:"L"},relativeTime:{future:"za %s",past:"%s temu",s:"kilka sekund",m:i,mm:i,h:i,hh:i,d:"1 dzień",dd:"%d dni",M:"miesiąc",MM:i,y:"rok",yy:i},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("pl","pl",{closeText:"Zamknij",prevText:"&#x3C;Poprzedni",nextText:"Następny&#x3E;",currentText:"Dziś",monthNames:["Styczeń","Luty","Marzec","Kwiecień","Maj","Czerwiec","Lipiec","Sierpień","Wrzesień","Październik","Listopad","Grudzień"],monthNamesShort:["Sty","Lu","Mar","Kw","Maj","Cze","Lip","Sie","Wrz","Pa","Lis","Gru"],dayNames:["Niedziela","Poniedziałek","Wtorek","Środa","Czwartek","Piątek","Sobota"],dayNamesShort:["Nie","Pn","Wt","Śr","Czw","Pt","So"],dayNamesMin:["N","Pn","Wt","Śr","Cz","Pt","So"],weekHeader:"Tydz",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pl",{defaultButtonText:{month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},allDayText:"Cały dzień",eventLimitText:"więcej"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"pt-br",{months:"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro".split("_"),monthsShort:"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez".split("_"),weekdays:"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado".split("_"),weekdaysShort:"dom_seg_ter_qua_qui_sex_sáb".split("_"),weekdaysMin:"dom_2ª_3ª_4ª_5ª_6ª_sáb".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD/MM/YYYY",LL:"D [de] MMMM [de] YYYY",LLL:"D [de] MMMM [de] YYYY [às] LT",LLLL:"dddd, D [de] MMMM [de] YYYY [às] LT"},calendar:{sameDay:"[Hoje às] LT",nextDay:"[Amanhã às] LT",nextWeek:"dddd [às] LT",lastDay:"[Ontem às] LT",lastWeek:function(){return 0===this.day()||6===this.day()?"[Último] dddd [às] LT":"[Última] dddd [às] LT"},sameElse:"L"},relativeTime:{future:"em %s",past:"%s atrás",s:"segundos",m:"um minuto",mm:"%d minutos",h:"uma hora",hh:"%d horas",d:"um dia",dd:"%d dias",M:"um mês",MM:"%d meses",y:"um ano",yy:"%d anos"},ordinalParse:/\d{1,2}º/,ordinal:"%dº"}),e.fullCalendar.datepickerLang("pt-br","pt-BR",{closeText:"Fechar",prevText:"&#x3C;Anterior",nextText:"Próximo&#x3E;",currentText:"Hoje",monthNames:["Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro"],monthNamesShort:["Jan","Fev","Mar","Abr","Mai","Jun","Jul","Ago","Set","Out","Nov","Dez"],dayNames:["Domingo","Segunda-feira","Terça-feira","Quarta-feira","Quinta-feira","Sexta-feira","Sábado"],dayNamesShort:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],dayNamesMin:["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"],weekHeader:"Sm",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("pt-br",{defaultButtonText:{month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e}})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){function n(e,t){var n=e.split("_");return 1===t%10&&11!==t%100?n[0]:t%10>=2&&4>=t%10&&(10>t%100||t%100>=20)?n[1]:n[2]}function i(e,t,i){var a={mm:t?"минута_минуты_минут":"минуту_минуты_минут",hh:"час_часа_часов",dd:"день_дня_дней",MM:"месяц_месяца_месяцев",yy:"год_года_лет"};return"m"===i?t?"минута":"минуту":e+" "+n(a[i],+e)}function a(e,t){var n={nominative:"январь_февраль_март_апрель_май_июнь_июль_август_сентябрь_октябрь_ноябрь_декабрь".split("_"),accusative:"января_февраля_марта_апреля_мая_июня_июля_августа_сентября_октября_ноября_декабря".split("_")},i=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return n[i][e.month()]}function r(e,t){var n={nominative:"янв_фев_март_апр_май_июнь_июль_авг_сен_окт_ноя_дек".split("_"),accusative:"янв_фев_мар_апр_мая_июня_июля_авг_сен_окт_ноя_дек".split("_")},i=/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/.test(t)?"accusative":"nominative";return n[i][e.month()]}function s(e,t){var n={nominative:"воскресенье_понедельник_вторник_среда_четверг_пятница_суббота".split("_"),accusative:"воскресенье_понедельник_вторник_среду_четверг_пятницу_субботу".split("_")},i=/\[ ?[Вв] ?(?:прошлую|следующую|эту)? ?\] ?dddd/.test(t)?"accusative":"nominative";return n[i][e.day()]}(t.defineLocale||t.lang).call(t,"ru",{months:a,monthsShort:r,weekdays:s,weekdaysShort:"вс_пн_вт_ср_чт_пт_сб".split("_"),weekdaysMin:"вс_пн_вт_ср_чт_пт_сб".split("_"),monthsParse:[/^янв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|я]/i,/^июн/i,/^июл/i,/^авг/i,/^сен/i,/^окт/i,/^ноя/i,/^дек/i],longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY г.",LLL:"D MMMM YYYY г., LT",LLLL:"dddd, D MMMM YYYY г., LT"},calendar:{sameDay:"[Сегодня в] LT",nextDay:"[Завтра в] LT",lastDay:"[Вчера в] LT",nextWeek:function(){return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT"},lastWeek:function(e){if(e.week()===this.week())return 2===this.day()?"[Во] dddd [в] LT":"[В] dddd [в] LT";switch(this.day()){case 0:return"[В прошлое] dddd [в] LT";case 1:case 2:case 4:return"[В прошлый] dddd [в] LT";case 3:case 5:case 6:return"[В прошлую] dddd [в] LT"}},sameElse:"L"},relativeTime:{future:"через %s",past:"%s назад",s:"несколько секунд",m:i,mm:i,h:"час",hh:i,d:"день",dd:i,M:"месяц",MM:i,y:"год",yy:i},meridiemParse:/ночи|утра|дня|вечера/i,isPM:function(e){return/^(дня|вечера)$/.test(e)},meridiem:function(e){return 4>e?"ночи":12>e?"утра":17>e?"дня":"вечера"},ordinalParse:/\d{1,2}-(й|го|я)/,ordinal:function(e,t){switch(t){case"M":case"d":case"DDD":return e+"-й";case"D":return e+"-го";case"w":case"W":return e+"-я";default:return e}},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("ru","ru",{closeText:"Закрыть",prevText:"&#x3C;Пред",nextText:"След&#x3E;",currentText:"Сегодня",monthNames:["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],monthNamesShort:["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],dayNames:["воскресенье","понедельник","вторник","среда","четверг","пятница","суббота"],dayNamesShort:["вск","пнд","втр","срд","чтв","птн","сбт"],dayNamesMin:["Вс","Пн","Вт","Ср","Чт","Пт","Сб"],weekHeader:"Нед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("ru",{defaultButtonText:{month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e}})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"sv",{months:"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december".split("_"),monthsShort:"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec".split("_"),weekdays:"söndag_måndag_tisdag_onsdag_torsdag_fredag_lördag".split("_"),weekdaysShort:"sön_mån_tis_ons_tor_fre_lör".split("_"),weekdaysMin:"sö_må_ti_on_to_fr_lö".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"YYYY-MM-DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd D MMMM YYYY LT"},calendar:{sameDay:"[Idag] LT",nextDay:"[Imorgon] LT",lastDay:"[Igår] LT",nextWeek:"dddd LT",lastWeek:"[Förra] dddd[en] LT",sameElse:"L"},relativeTime:{future:"om %s",past:"för %s sedan",s:"några sekunder",m:"en minut",mm:"%d minuter",h:"en timme",hh:"%d timmar",d:"en dag",dd:"%d dagar",M:"en månad",MM:"%d månader",y:"ett år",yy:"%d år"},ordinalParse:/\d{1,2}(e|a)/,ordinal:function(e){var t=e%10,n=1===~~(e%100/10)?"e":1===t?"a":2===t?"a":3===t?"e":"e";return e+n},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("sv","sv",{closeText:"Stäng",prevText:"&#xAB;Förra",nextText:"Nästa&#xBB;",currentText:"Idag",monthNames:["Januari","Februari","Mars","April","Maj","Juni","Juli","Augusti","September","Oktober","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","Maj","Jun","Jul","Aug","Sep","Okt","Nov","Dec"],dayNamesShort:["Sön","Mån","Tis","Ons","Tor","Fre","Lör"],dayNames:["Söndag","Måndag","Tisdag","Onsdag","Torsdag","Fredag","Lördag"],dayNamesMin:["Sö","Må","Ti","On","To","Fr","Lö"],weekHeader:"Ve",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sv",{defaultButtonText:{month:"Månad",week:"Vecka",day:"Dag",list:"Program"},allDayText:"Heldag",eventLimitText:"till"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={words:{m:["jedan minut","jedne minute"],mm:["minut","minute","minuta"],h:["jedan sat","jednog sata"],hh:["sat","sata","sati"],dd:["dan","dana","dana"],MM:["mesec","meseca","meseci"],yy:["godina","godine","godina"]},correctGrammaticalCase:function(e,t){return 1===e?t[0]:e>=2&&4>=e?t[1]:t[2]},translate:function(e,t,a){var r=n.words[a];return 1===a.length?t?r[0]:r[1]:e+" "+n.correctGrammaticalCase(e,r)}};(t.defineLocale||t.lang).call(t,"sr",{months:["januar","februar","mart","april","maj","jun","jul","avgust","septembar","oktobar","novembar","decembar"],monthsShort:["jan.","feb.","mar.","apr.","maj","jun","jul","avg.","sep.","okt.","nov.","dec."],weekdays:["nedelja","ponedeljak","utorak","sreda","četvrtak","petak","subota"],weekdaysShort:["ned.","pon.","uto.","sre.","čet.","pet.","sub."],weekdaysMin:["ne","po","ut","sr","če","pe","su"],longDateFormat:{LT:"H:mm",LTS:"LT:ss",L:"DD. MM. YYYY",LL:"D. MMMM YYYY",LLL:"D. MMMM YYYY LT",LLLL:"dddd, D. MMMM YYYY LT"},calendar:{sameDay:"[danas u] LT",nextDay:"[sutra u] LT",nextWeek:function(){switch(this.day()){case 0:return"[u] [nedelju] [u] LT";case 3:return"[u] [sredu] [u] LT";case 6:return"[u] [subotu] [u] LT";case 1:case 2:case 4:case 5:return"[u] dddd [u] LT"}},lastDay:"[juče u] LT",lastWeek:function(){var e=["[prošle] [nedelje] [u] LT","[prošlog] [ponedeljka] [u] LT","[prošlog] [utorka] [u] LT","[prošle] [srede] [u] LT","[prošlog] [četvrtka] [u] LT","[prošlog] [petka] [u] LT","[prošle] [subote] [u] LT"];return e[this.day()]},sameElse:"L"},relativeTime:{future:"za %s",past:"pre %s",s:"nekoliko sekundi",m:n.translate,mm:n.translate,h:n.translate,hh:n.translate,d:"dan",dd:n.translate,M:"mesec",MM:n.translate,y:"godinu",yy:n.translate},ordinalParse:/\d{1,2}\./,ordinal:"%d.",week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("sr","sr",{closeText:"Затвори",prevText:"&#x3C;",nextText:"&#x3E;",currentText:"Данас",monthNames:["Јануар","Фебруар","Март","Април","Мај","Јун","Јул","Август","Септембар","Октобар","Новембар","Децембар"],monthNamesShort:["Јан","Феб","Мар","Апр","Мај","Јун","Јул","Авг","Сеп","Окт","Нов","Дец"],dayNames:["Недеља","Понедељак","Уторак","Среда","Четвртак","Петак","Субота"],dayNamesShort:["Нед","Пон","Уто","Сре","Чет","Пет","Суб"],dayNamesMin:["Не","По","Ут","Ср","Че","Пе","Су"],weekHeader:"Сед",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("sr",{defaultButtonText:{month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e}})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"th",{months:"มกราคม_กุมภาพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_กรกฎาคม_สิงหาคม_กันยายน_ตุลาคม_พฤศจิกายน_ธันวาคม".split("_"),monthsShort:"มกรา_กุมภา_มีนา_เมษา_พฤษภา_มิถุนา_กรกฎา_สิงหา_กันยา_ตุลา_พฤศจิกา_ธันวา".split("_"),weekdays:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุกร์_เสาร์".split("_"),weekdaysShort:"อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุกร์_เสาร์".split("_"),weekdaysMin:"อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),longDateFormat:{LT:"H นาฬิกา m นาที",LTS:"LT s วินาที",L:"YYYY/MM/DD",LL:"D MMMM YYYY",LLL:"D MMMM YYYY เวลา LT",LLLL:"วันddddที่ D MMMM YYYY เวลา LT"},meridiemParse:/ก่อนเที่ยง|หลังเที่ยง/,isPM:function(e){return"หลังเที่ยง"===e},meridiem:function(e){return 12>e?"ก่อนเที่ยง":"หลังเที่ยง"},calendar:{sameDay:"[วันนี้ เวลา] LT",nextDay:"[พรุ่งนี้ เวลา] LT",nextWeek:"dddd[หน้า เวลา] LT",lastDay:"[เมื่อวานนี้ เวลา] LT",lastWeek:"[วัน]dddd[ที่แล้ว เวลา] LT",sameElse:"L"},relativeTime:{future:"อีก %s",past:"%sที่แล้ว",s:"ไม่กี่วินาที",m:"1 นาที",mm:"%d นาที",h:"1 ชั่วโมง",hh:"%d ชั่วโมง",d:"1 วัน",dd:"%d วัน",M:"1 เดือน",MM:"%d เดือน",y:"1 ปี",yy:"%d ปี"}}),e.fullCalendar.datepickerLang("th","th",{closeText:"ปิด",prevText:"&#xAB;&#xA0;ย้อน",nextText:"ถัดไป&#xA0;&#xBB;",currentText:"วันนี้",monthNames:["มกราคม","กุมภาพันธ์","มีนาคม","เมษายน","พฤษภาคม","มิถุนายน","กรกฎาคม","สิงหาคม","กันยายน","ตุลาคม","พฤศจิกายน","ธันวาคม"],monthNamesShort:["ม.ค.","ก.พ.","มี.ค.","เม.ย.","พ.ค.","มิ.ย.","ก.ค.","ส.ค.","ก.ย.","ต.ค.","พ.ย.","ธ.ค."],dayNames:["อาทิตย์","จันทร์","อังคาร","พุธ","พฤหัสบดี","ศุกร์","เสาร์"],dayNamesShort:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],dayNamesMin:["อา.","จ.","อ.","พ.","พฤ.","ศ.","ส."],weekHeader:"Wk",dateFormat:"dd/mm/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("th",{defaultButtonText:{month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){var n={1:"'inci",5:"'inci",8:"'inci",70:"'inci",80:"'inci",2:"'nci",7:"'nci",20:"'nci",50:"'nci",3:"'üncü",4:"'üncü",100:"'üncü",6:"'ncı",9:"'uncu",10:"'uncu",30:"'uncu",60:"'ıncı",90:"'ıncı"};(t.defineLocale||t.lang).call(t,"tr",{months:"Ocak_Şubat_Mart_Nisan_Mayıs_Haziran_Temmuz_Ağustos_Eylül_Ekim_Kasım_Aralık".split("_"),monthsShort:"Oca_Şub_Mar_Nis_May_Haz_Tem_Ağu_Eyl_Eki_Kas_Ara".split("_"),weekdays:"Pazar_Pazartesi_Salı_Çarşamba_Perşembe_Cuma_Cumartesi".split("_"),weekdaysShort:"Paz_Pts_Sal_Çar_Per_Cum_Cts".split("_"),weekdaysMin:"Pz_Pt_Sa_Ça_Pe_Cu_Ct".split("_"),longDateFormat:{LT:"HH:mm",LTS:"LT:ss",L:"DD.MM.YYYY",LL:"D MMMM YYYY",LLL:"D MMMM YYYY LT",LLLL:"dddd, D MMMM YYYY LT"},calendar:{sameDay:"[bugün saat] LT",nextDay:"[yarın saat] LT",nextWeek:"[haftaya] dddd [saat] LT",lastDay:"[dün] LT",lastWeek:"[geçen hafta] dddd [saat] LT",sameElse:"L"},relativeTime:{future:"%s sonra",past:"%s önce",s:"birkaç saniye",m:"bir dakika",mm:"%d dakika",h:"bir saat",hh:"%d saat",d:"bir gün",dd:"%d gün",M:"bir ay",MM:"%d ay",y:"bir yıl",yy:"%d yıl"},ordinalParse:/\d{1,2}'(inci|nci|üncü|ncı|uncu|ıncı)/,ordinal:function(e){if(0===e)return e+"'ıncı";var t=e%10,a=e%100-t,r=e>=100?100:null;return e+(n[t]||n[a]||n[r])},week:{dow:1,doy:7}}),e.fullCalendar.datepickerLang("tr","tr",{closeText:"kapat",prevText:"&#x3C;geri",nextText:"ileri&#x3e",currentText:"bugün",monthNames:["Ocak","Şubat","Mart","Nisan","Mayıs","Haziran","Temmuz","Ağustos","Eylül","Ekim","Kasım","Aralık"],monthNamesShort:["Oca","Şub","Mar","Nis","May","Haz","Tem","Ağu","Eyl","Eki","Kas","Ara"],dayNames:["Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi"],dayNamesShort:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],dayNamesMin:["Pz","Pt","Sa","Ça","Pe","Cu","Ct"],weekHeader:"Hf",dateFormat:"dd.mm.yy",firstDay:1,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""}),e.fullCalendar.lang("tr",{defaultButtonText:{next:"ileri",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},allDayText:"Tüm gün",eventLimitText:"daha fazla"})});(function(e){"function"==typeof define&&define.amd?define(["jquery","moment"],e):e(jQuery,moment)})(function(e,t){(t.defineLocale||t.lang).call(t,"zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"Ah点mm",LTS:"Ah点m分s秒",L:"YYYY-MM-DD",LL:"YYYY年MMMD日",LLL:"YYYY年MMMD日LT",LLLL:"YYYY年MMMD日ddddLT",l:"YYYY-MM-DD",ll:"YYYY年MMMD日",lll:"YYYY年MMMD日LT",llll:"YYYY年MMMD日ddddLT"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return 12===e&&(e=0),"凌晨"===t||"早上"===t||"上午"===t?e:"下午"===t||"晚上"===t?e+12:e>=11?e:e+12},meridiem:function(e,t){var n=100*e+t;return 600>n?"凌晨":900>n?"早上":1130>n?"上午":1230>n?"中午":1800>n?"下午":"晚上"},calendar:{sameDay:function(){return 0===this.minutes()?"[今天]Ah[点整]":"[今天]LT"},nextDay:function(){return 0===this.minutes()?"[明天]Ah[点整]":"[明天]LT"},lastDay:function(){return 0===this.minutes()?"[昨天]Ah[点整]":"[昨天]LT"},nextWeek:function(){var e,n;return e=t().startOf("week"),n=this.unix()-e.unix()>=604800?"[下]":"[本]",0===this.minutes()?n+"dddAh点整":n+"dddAh点mm"},lastWeek:function(){var e,n;return e=t().startOf("week"),n=this.unix()<e.unix()?"[上]":"[本]",0===this.minutes()?n+"dddAh点整":n+"dddAh点mm"},sameElse:"LL"},ordinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}}),e.fullCalendar.datepickerLang("zh-cn","zh-CN",{closeText:"关闭",prevText:"&#x3C;上月",nextText:"下月&#x3E;",currentText:"今天",monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthNamesShort:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],dayNamesShort:["周日","周一","周二","周三","周四","周五","周六"],dayNamesMin:["日","一","二","三","四","五","六"],weekHeader:"周",dateFormat:"yy-mm-dd",firstDay:1,isRTL:!1,showMonthAfterYear:!0,yearSuffix:"年"}),e.fullCalendar.lang("zh-cn",{defaultButtonText:{month:"月",week:"周",day:"日",list:"日程"},allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"}})}); \ No newline at end of file
diff --git a/assets/js/src/analytic.js b/assets/js/src/analytic.js
index 8066165b..bec4d76e 100644
--- a/assets/js/src/analytic.js
+++ b/assets/js/src/analytic.js
@@ -1,5 +1,4 @@
-
-Kanboard.Analytic = (function() {
+(function() {
// CFD diagram
function drawCfd()
@@ -185,6 +184,4 @@ Kanboard.Analytic = (function() {
}
});
- return {};
-
})();
diff --git a/assets/js/src/base.js b/assets/js/src/base.js
index 0d46b503..992342e9 100644
--- a/assets/js/src/base.js
+++ b/assets/js/src/base.js
@@ -1,4 +1,3 @@
-// Common functions
var Kanboard = (function() {
jQuery(document).ready(function() {
diff --git a/assets/js/src/board.js b/assets/js/src/board.js
index 9f93a869..d11e39f5 100644
--- a/assets/js/src/board.js
+++ b/assets/js/src/board.js
@@ -1,4 +1,4 @@
-Kanboard.Board = (function() {
+(function() {
var checkInterval = null;
@@ -243,7 +243,6 @@ Kanboard.Board = (function() {
$("#main").append(data);
Kanboard.InitAfterAjax();
board_load_events();
- filter_apply();
stack_show();
compactview_reload();
}
@@ -264,7 +263,6 @@ Kanboard.Board = (function() {
Kanboard.InitAfterAjax();
board_unload_events();
board_load_events();
- filter_apply();
stack_show();
compactview_reload();
}
@@ -273,93 +271,6 @@ Kanboard.Board = (function() {
}
}
- // Apply user or date filter (change tasks opacity)
- function filter_apply()
- {
- var selectedUserId = $("#form-user_id").val();
- var selectedCategoryId = $("#form-category_id").val();
- var filterDueDate = $("#more-filters option[value=filter-due-date]").is(":selected")
- var filterRecent = $("#more-filters option[value=filter-recent]").is(":selected")
- var projectId = $('#board').data('project-id');
-
- $("[data-task-id]").each(function(index, item) {
-
- var ownerId = item.getAttribute("data-owner-id");
- var dueDate = item.getAttribute("data-due-date");
- var categoryId = item.getAttribute("data-category-id");
- var recent = $(item).hasClass("task-board-recent");
-
- if (ownerId != selectedUserId && selectedUserId != -1) {
- item.style.display = "none";
- }
- else {
- item.style.display = "block";
- }
-
- if (filterDueDate && (dueDate == "" || dueDate == "0")) {
- item.style.display = "none";
- }
-
- if (categoryId != selectedCategoryId && selectedCategoryId != -1) {
- item.style.display = "none";
- }
-
- if (filterRecent && ! recent) {
- item.style.display = "none";
- }
- });
-
- // Save filter settings
- Kanboard.SetStorageItem("board_filter_" + projectId + "_form-user_id", selectedUserId);
- Kanboard.SetStorageItem("board_filter_" + projectId + "_form-category_id", selectedCategoryId);
- Kanboard.SetStorageItem("board_filter_" + projectId + "_filter-due-date", ~~(filterDueDate));
- Kanboard.SetStorageItem("board_filter_" + projectId + "_filter-recent", ~~(filterRecent));
- }
-
- // Load filter events
- function filter_load_events()
- {
- var projectId = $('#board').data('project-id');
-
- $("#form-user_id").chosen({
- width: "180px",
- no_results_text: $("#form-user_id").data("notfound")
- });
-
- $("#form-category_id").chosen({
- width: "200px",
- no_results_text: $("#form-category_id").data("notfound")
- });
-
- $("#more-filters").chosen({
- width: "30%",
- no_results_text: $("#more-filters").data("notfound")
- });
-
- $(".apply-filters").change(function(e) {
- filter_apply();
- });
-
- // Get and set filters from localStorage
- $("#form-user_id").val(Kanboard.GetStorageItem("board_filter_" + projectId + "_form-user_id") || -1);
- $("#form-user_id").trigger("chosen:updated");
-
- $("#form-category_id").val(Kanboard.GetStorageItem("board_filter_" + projectId + "_form-category_id") || -1);
- $("#form-category_id").trigger("chosen:updated");
-
- if (+Kanboard.GetStorageItem("board_filter_" + projectId + "_filter-due-date")) {
- $("#more-filters option[value=filter-due-date]").attr("selected", true);
- }
-
- if (+Kanboard.GetStorageItem("board_filter_" + projectId + "_filter-recent")) {
- $("#more-filters option[value=filter-recent]").attr("selected", true);
- }
-
- $("#more-filters").trigger("chosen:updated");
-
- filter_apply();
- }
-
function compactview_load_events()
{
jQuery(document).on('click', ".filter-toggle-scrolling", function(e) {
@@ -401,7 +312,6 @@ Kanboard.Board = (function() {
if (Kanboard.Exists("board")) {
board_load_events();
- filter_load_events();
stack_load_events();
compactview_load_events();
keyboard_shortcuts();
diff --git a/assets/js/src/calendar.js b/assets/js/src/calendar.js
index 5e20f962..68da57ee 100644
--- a/assets/js/src/calendar.js
+++ b/assets/js/src/calendar.js
@@ -1,150 +1,50 @@
-Kanboard.Calendar = (function() {
-
- var filter_storage_key = "";
-
- // Save the new due date for a moved task
- function move_calendar_event(calendar_event)
- {
- var url = $("#calendar").data("save-url") || $("#user-calendar").data("save-url");
-
- $.ajax({
- cache: false,
- url: url,
- contentType: "application/json",
- type: "POST",
- processData: false,
- data: JSON.stringify({
- "task_id": calendar_event.id,
- "date_due": calendar_event.start.format()
- })
- });
- }
-
- // Show the user calendar
- function show_user_calendar()
- {
- var calendar = $("#user-calendar");
-
- calendar.fullCalendar({
- lang: $("body").data("js-lang"),
- editable: true,
- eventLimit: true,
- defaultView: "month",
- header: {
- left: 'prev,next today',
- center: 'title',
- right: 'month,agendaWeek,agendaDay'
- },
- viewRender: refresh_user_calendar,
- eventDrop: move_calendar_event
- });
- }
-
- // Refresh the calendar events
- function refresh_user_calendar()
- {
- var calendar = $("#user-calendar");
- var url = calendar.data("check-url");
- var params = {
- "start": calendar.fullCalendar('getView').start.format(),
- "end": calendar.fullCalendar('getView').end.format(),
- "user_id": calendar.data("user-id")
- };
-
- for (var key in params) {
- url += "&" + key + "=" + params[key];
- }
-
- $.getJSON(url, function(events) {
- calendar.fullCalendar('removeEvents');
- calendar.fullCalendar('addEventSource', events);
- calendar.fullCalendar('rerenderEvents');
- });
- }
-
- // Show the project calendar
- function show_project_calendar()
- {
- var calendar = $("#calendar");
-
- calendar.fullCalendar({
- lang: $("body").data("js-lang"),
- editable: true,
- eventLimit: true,
- defaultView: "month",
- header: {
- left: 'prev,next today',
- center: 'title',
- right: 'month,agendaWeek,agendaDay'
- },
- viewRender: load_project_filters,
- eventDrop: move_calendar_event
- });
- }
-
- // Refresh the calendar events
- function refresh_project_calendar(filters)
- {
- var calendar = $("#calendar");
- var url = calendar.data("check-url");
- var params = {
- "start": calendar.fullCalendar('getView').start.format(),
- "end": calendar.fullCalendar('getView').end.format()
- };
-
- jQuery.extend(params, filters);
-
- for (var key in params) {
- url += "&" + key + "=" + params[key];
- }
-
- $.getJSON(url, function(events) {
- calendar.fullCalendar('removeEvents');
- calendar.fullCalendar('addEventSource', events);
- calendar.fullCalendar('rerenderEvents');
- });
- }
-
- // Restore saved filters
- function load_project_filters()
- {
- var filters = Kanboard.GetStorageItem(filter_storage_key);
-
- if (filters !== "") {
- filters = JSON.parse(filters);
-
- for (var filter in filters) {
- $("select[name=" + filter + "]").val(filters[filter]);
- }
- }
-
- refresh_project_calendar(filters || {});
-
- $('.calendar-filter').change(apply_project_filters);
- }
-
- // Apply filters on change
- function apply_project_filters()
- {
- var filters = {};
-
- $('.calendar-filter').each(function() {
- filters[$(this).attr("name")] = $(this).val();
- });
-
- Kanboard.SetStorageItem(filter_storage_key, JSON.stringify(filters));
- refresh_project_calendar(filters);
- }
+(function() {
jQuery(document).ready(function() {
-
if (Kanboard.Exists("calendar")) {
- filter_storage_key = "calendar_filters_" + $("#calendar").data("project-id");
- show_project_calendar();
- load_project_filters();
- }
- else if (Kanboard.Exists("user-calendar")) {
- show_user_calendar();
+ var calendar = $('#calendar');
+
+ calendar.fullCalendar({
+ lang: $("body").data("js-lang"),
+ editable: true,
+ eventLimit: true,
+ defaultView: "month",
+ header: {
+ left: 'prev,next today',
+ center: 'title',
+ right: 'month,agendaWeek,agendaDay'
+ },
+ eventDrop: function(event) {
+ $.ajax({
+ cache: false,
+ url: calendar.data("save-url"),
+ contentType: "application/json",
+ type: "POST",
+ processData: false,
+ data: JSON.stringify({
+ "task_id": event.id,
+ "date_due": event.start.format()
+ })
+ });
+ },
+ viewRender: function() {
+ var url = calendar.data("check-url");
+ var params = {
+ "start": calendar.fullCalendar('getView').start.format(),
+ "end": calendar.fullCalendar('getView').end.format()
+ };
+
+ for (var key in params) {
+ url += "&" + key + "=" + params[key];
+ }
+
+ $.getJSON(url, function(events) {
+ calendar.fullCalendar('removeEvents');
+ calendar.fullCalendar('addEventSource', events);
+ calendar.fullCalendar('rerenderEvents');
+ });
+ }
+ });
}
});
diff --git a/assets/js/src/swimlane.js b/assets/js/src/swimlane.js
index 77f45907..212d6d36 100644
--- a/assets/js/src/swimlane.js
+++ b/assets/js/src/swimlane.js
@@ -1,4 +1,4 @@
-Kanboard.Swimlane = (function() {
+(function() {
// Expand a Swimlane via display attributes
function expand(swimlaneId)