diff options
author | Frederic Guillot <fred@kanboard.net> | 2017-04-01 17:04:18 -0400 |
---|---|---|
committer | Frederic Guillot <fred@kanboard.net> | 2017-04-01 17:04:18 -0400 |
commit | 5cc488947305eea5b9762997222c84d6007761c8 (patch) | |
tree | 5f602bb06ade363aa40eda99b4fe9a61f592609f | |
parent | 253d5a9331e4b4775066ec8cb9664da9a2aa6ac9 (diff) |
Move Gantt charts to external plugin
49 files changed, 5 insertions, 1306 deletions
@@ -4,6 +4,7 @@ Version 1.0.42 Breaking Changes: * Move calendar to external plugin: https://github.com/kanboard/plugin-calendar +* Move Gantt charts to external plugin: https://github.com/kanboard/plugin-gantt Version 1.0.41 -------------- diff --git a/app/Controller/ProjectGanttController.php b/app/Controller/ProjectGanttController.php deleted file mode 100644 index 8239005e..00000000 --- a/app/Controller/ProjectGanttController.php +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -namespace Kanboard\Controller; - -use Kanboard\Filter\ProjectIdsFilter; -use Kanboard\Filter\ProjectStatusFilter; -use Kanboard\Filter\ProjectTypeFilter; -use Kanboard\Model\ProjectModel; - -/** - * Projects Gantt Controller - * - * @package Kanboard\Controller - * @author Frederic Guillot - */ -class ProjectGanttController extends BaseController -{ - /** - * Show Gantt chart for all projects - */ - public function show() - { - $project_ids = $this->projectPermissionModel->getActiveProjectIds($this->userSession->getId()); - $filter = $this->projectQuery - ->withFilter(new ProjectTypeFilter(ProjectModel::TYPE_TEAM)) - ->withFilter(new ProjectStatusFilter(ProjectModel::ACTIVE)) - ->withFilter(new ProjectIdsFilter($project_ids)); - - $filter->getQuery()->asc(ProjectModel::TABLE.'.start_date'); - - $this->response->html($this->helper->layout->app('project_gantt/show', array( - 'projects' => $filter->format($this->projectGanttFormatter), - 'title' => t('Gantt chart for all projects'), - ))); - } - - /** - * Save new project start date and end date - */ - public function save() - { - $values = $this->request->getJson(); - - $result = $this->projectModel->update(array( - 'id' => $values['id'], - 'start_date' => $this->dateParser->getIsoDate(strtotime($values['start'])), - 'end_date' => $this->dateParser->getIsoDate(strtotime($values['end'])), - )); - - if (! $result) { - $this->response->json(array('message' => 'Unable to save project'), 400); - } else { - $this->response->json(array('message' => 'OK'), 201); - } - } -} diff --git a/app/Controller/TaskGanttController.php b/app/Controller/TaskGanttController.php deleted file mode 100644 index b03b9d00..00000000 --- a/app/Controller/TaskGanttController.php +++ /dev/null @@ -1,61 +0,0 @@ -<?php - -namespace Kanboard\Controller; - -use Kanboard\Filter\TaskProjectFilter; -use Kanboard\Model\TaskModel; - -/** - * Tasks Gantt Controller - * - * @package Kanboard\Controller - * @author Frederic Guillot - */ -class TaskGanttController extends BaseController -{ - /** - * Show Gantt chart for one project - */ - public function show() - { - $project = $this->getProject(); - $search = $this->helper->projectHeader->getSearchQuery($project); - $sorting = $this->request->getStringParam('sorting', 'board'); - $filter = $this->taskLexer->build($search)->withFilter(new TaskProjectFilter($project['id'])); - - if ($sorting === 'date') { - $filter->getQuery()->asc(TaskModel::TABLE.'.date_started')->asc(TaskModel::TABLE.'.date_creation'); - } else { - $filter->getQuery()->asc('column_position')->asc(TaskModel::TABLE.'.position'); - } - - $this->response->html($this->helper->layout->app('task_gantt/show', array( - 'project' => $project, - 'title' => $project['name'], - 'description' => $this->helper->projectHeader->getDescription($project), - 'sorting' => $sorting, - 'tasks' => $filter->format($this->taskGanttFormatter), - ))); - } - - /** - * Save new task start date and due date - */ - public function save() - { - $this->getProject(); - $values = $this->request->getJson(); - - $result = $this->taskModificationModel->update(array( - 'id' => $values['id'], - 'date_started' => strtotime($values['start']), - 'date_due' => strtotime($values['end']), - )); - - if (! $result) { - $this->response->json(array('message' => 'Unable to save task'), 400); - } else { - $this->response->json(array('message' => 'OK'), 201); - } - } -} diff --git a/app/Core/Base.php b/app/Core/Base.php index ba610be6..e3dc2f23 100644 --- a/app/Core/Base.php +++ b/app/Core/Base.php @@ -68,11 +68,9 @@ use Pimple\Container; * @property \Kanboard\Formatter\BoardTaskFormatter $boardTaskFormatter * @property \Kanboard\Formatter\GroupAutoCompleteFormatter $groupAutoCompleteFormatter * @property \Kanboard\Formatter\ProjectActivityEventFormatter $projectActivityEventFormatter - * @property \Kanboard\Formatter\ProjectGanttFormatter $projectGanttFormatter * @property \Kanboard\Formatter\SubtaskListFormatter $subtaskListFormatter * @property \Kanboard\Formatter\SubtaskTimeTrackingCalendarFormatter $subtaskTimeTrackingCalendarFormatter * @property \Kanboard\Formatter\TaskAutoCompleteFormatter $taskAutoCompleteFormatter - * @property \Kanboard\Formatter\TaskGanttFormatter $taskGanttFormatter * @property \Kanboard\Formatter\TaskICalFormatter $taskICalFormatter * @property \Kanboard\Formatter\TaskListFormatter $taskListFormatter * @property \Kanboard\Formatter\TaskListSubtaskFormatter $taskListSubtaskFormatter diff --git a/app/Formatter/ProjectGanttFormatter.php b/app/Formatter/ProjectGanttFormatter.php deleted file mode 100644 index af04f498..00000000 --- a/app/Formatter/ProjectGanttFormatter.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php - -namespace Kanboard\Formatter; - -use Kanboard\Core\Filter\FormatterInterface; - -/** - * Gantt chart formatter for projects - * - * @package formatter - * @author Frederic Guillot - */ -class ProjectGanttFormatter extends BaseFormatter implements FormatterInterface -{ - /** - * Format projects to be displayed in the Gantt chart - * - * @access public - * @return array - */ - public function format() - { - $projects = $this->query->findAll(); - $colors = $this->colorModel->getDefaultColors(); - $bars = array(); - - foreach ($projects as $project) { - $start = empty($project['start_date']) ? time() : strtotime($project['start_date']); - $end = empty($project['end_date']) ? $start : strtotime($project['end_date']); - $color = next($colors) ?: reset($colors); - - $bars[] = array( - 'type' => 'project', - 'id' => $project['id'], - 'title' => $project['name'], - 'start' => array( - (int) date('Y', $start), - (int) date('n', $start), - (int) date('j', $start), - ), - 'end' => array( - (int) date('Y', $end), - (int) date('n', $end), - (int) date('j', $end), - ), - 'link' => $this->helper->url->href('ProjectViewController', 'show', array('project_id' => $project['id'])), - 'board_link' => $this->helper->url->href('BoardViewController', 'show', array('project_id' => $project['id'])), - 'gantt_link' => $this->helper->url->href('TaskGanttController', 'show', array('project_id' => $project['id'])), - 'color' => $color, - 'not_defined' => empty($project['start_date']) || empty($project['end_date']), - 'users' => $this->projectUserRoleModel->getAllUsersGroupedByRole($project['id']), - ); - } - - return $bars; - } -} diff --git a/app/Formatter/TaskGanttFormatter.php b/app/Formatter/TaskGanttFormatter.php deleted file mode 100644 index ddb3f93a..00000000 --- a/app/Formatter/TaskGanttFormatter.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php - -namespace Kanboard\Formatter; - -use Kanboard\Core\Filter\FormatterInterface; - -/** - * Task Gantt Formatter - * - * @package formatter - * @author Frederic Guillot - */ -class TaskGanttFormatter extends BaseFormatter implements FormatterInterface -{ - /** - * Local cache for project columns - * - * @access private - * @var array - */ - private $columns = array(); - - /** - * Apply formatter - * - * @access public - * @return array - */ - public function format() - { - $bars = array(); - - foreach ($this->query->findAll() as $task) { - $bars[] = $this->formatTask($task); - } - - return $bars; - } - - /** - * Format a single task - * - * @access private - * @param array $task - * @return array - */ - private function formatTask(array $task) - { - if (! isset($this->columns[$task['project_id']])) { - $this->columns[$task['project_id']] = $this->columnModel->getList($task['project_id']); - } - - $start = $task['date_started'] ?: time(); - $end = $task['date_due'] ?: $start; - - return array( - 'type' => 'task', - 'id' => $task['id'], - 'title' => $task['title'], - 'start' => array( - (int) date('Y', $start), - (int) date('n', $start), - (int) date('j', $start), - ), - 'end' => array( - (int) date('Y', $end), - (int) date('n', $end), - (int) date('j', $end), - ), - 'column_title' => $task['column_name'], - 'assignee' => $task['assignee_name'] ?: $task['assignee_username'], - 'progress' => $this->taskModel->getProgress($task, $this->columns[$task['project_id']]).'%', - 'link' => $this->helper->url->href('TaskViewController', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])), - 'color' => $this->colorModel->getColorProperties($task['color_id']), - 'not_defined' => empty($task['date_due']) || empty($task['date_started']), - ); - } -} diff --git a/app/Locale/bs_BA/translations.php b/app/Locale/bs_BA/translations.php index fc771db5..761f2c8b 100644 --- a/app/Locale/bs_BA/translations.php +++ b/app/Locale/bs_BA/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Licenca:', 'License' => 'Licenca', 'Enter the text below' => 'Unesi tekst ispod', - 'Sort by position' => 'Sortiraj po poziciji', - 'Sort by date' => 'Sortiraj po datumu', - 'Add task' => 'Dodaj zadatak', 'Start date:' => 'Početno vrijeme:', 'Due date:' => 'Vrijeme do kada treba završiti:', - 'There is no start date or due date for this task.' => 'Nema početnog datuma ili datuma do kada treba završiti ovaj zadatak.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Premještanje ili promjena veličine zadatka će promijeniti datum početka i datum do kada treba završiti zadatak.', - 'There is no task in your project.' => 'Nema zadataka u projektu.', - 'Gantt chart' => 'Gantogram', 'People who are project managers' => 'Osobe koji su menadžeri projekta', 'People who are project members' => 'Osobe koje su članovi projekta', 'NOK - Norwegian Krone' => 'NOK - Norveška kruna', @@ -749,22 +742,15 @@ return array( 'Members' => 'Članovi', 'Shared project' => 'Dijeljeni projekti', 'Project managers' => 'Menadžeri projekta', - 'Gantt chart for all projects' => 'Gantogram za sve projekte', 'Projects list' => 'Lista projekata', - 'Gantt chart for this project' => 'Gantogram za ovaj projekat', - 'Project board' => 'Ploča projekta', 'End date:' => 'Datum završetka:', - 'There is no start date or end date for this project.' => 'Nema početnog ili krajnjeg datuma za ovaj projekat.', - 'Projects Gantt chart' => 'Gantogram projekata', 'Change task color when using a specific task link' => 'Promijeni boju zadatka kada se koristi određena veza na zadatku', 'Task link creation or modification' => 'Veza na zadatku je napravljena ili izmijenjena', 'Milestone' => 'Prekretnica', 'Documentation: %s' => 'Dokumentacija: %s', - 'Switch to the Gantt chart view' => 'Promijeni u gantogram pregled', 'Reset the search/filter box' => 'Vrati na početno pretragu/filtere', 'Documentation' => 'Dokumentacija', 'Table of contents' => 'Sadržaj', - 'Gantt' => 'Gantogram', 'Author' => 'Autor', 'Version' => 'Verzija', 'Plugins' => 'Dodaci', diff --git a/app/Locale/cs_CZ/translations.php b/app/Locale/cs_CZ/translations.php index b308987a..acf10d3c 100644 --- a/app/Locale/cs_CZ/translations.php +++ b/app/Locale/cs_CZ/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Licence:', 'License' => 'Licence', 'Enter the text below' => 'Zadejte text níže', - 'Sort by position' => 'Třídit podle pozice', - 'Sort by date' => 'Třídit podle datumu', - 'Add task' => 'Přidat úkol', 'Start date:' => 'Termín zahájení:', 'Due date:' => 'Termín dokončení:', - 'There is no start date or due date for this task.' => 'Úkol nemá nastaven termín zahájení a dokončení.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Posunutím nebo prodloužením úkolu se změní počáteční a konečné datum úkolu. ', - 'There is no task in your project.' => 'Projekt neobsahuje žádné úkoly.', - 'Gantt chart' => 'Gantt graf', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( // 'Members' => '', // 'Shared project' => '', // 'Project managers' => '', - // 'Gantt chart for all projects' => '', // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', // 'Documentation' => '', // 'Table of contents' => '', - // 'Gantt' => '', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php index ff60ae0b..6cba57b4 100644 --- a/app/Locale/da_DK/translations.php +++ b/app/Locale/da_DK/translations.php @@ -729,15 +729,8 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - 'Sort by position' => 'Sorter udfra position', - 'Sort by date' => 'Sorter ud fra dato', - 'Add task' => 'Tilføj opgave', 'Start date:' => 'Start dato:', 'Due date:' => 'Forfaldsdato:', - // 'There is no start date or due date for this task.' => '', - 'Moving or resizing a task will change the start and due date of the task.' => 'Hvis du flytter eller trækker i en opgave vil det ændre start -og forfaldsdato', - 'There is no task in your project.' => 'Der er ikke nogle opgaver i dette projekt', - // 'Gantt chart' => '', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( 'Members' => 'Medlemmer', 'Shared project' => 'Delt projekt', 'Project managers' => 'Projekt managers', - 'Gantt chart for all projects' => 'Gantt chart for alle projekter', 'Projects list' => 'Projekt liste', - 'Gantt chart for this project' => 'Gantt chart for dette projekt', - 'Project board' => 'Projekt tavle', 'End date:' => 'Slut dato:', - 'There is no start date or end date for this project.' => 'Der er ikke nogen start eller slut dato for dette projekt.', - 'Projects Gantt chart' => 'Gantt chart på Projekter', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', 'Milestone' => 'Milepæl', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', // 'Documentation' => '', // 'Table of contents' => '', - // 'Gantt' => '', 'Author' => 'Forfatter', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php index 6a8024f5..abf32bda 100644 --- a/app/Locale/de_DE/translations.php +++ b/app/Locale/de_DE/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Lizenz:', 'License' => 'Lizenz', 'Enter the text below' => 'Text unten eingeben', - 'Sort by position' => 'Nach Position sortieren', - 'Sort by date' => 'Nach Datum sortieren', - 'Add task' => 'Aufgabe hinzufügen', 'Start date:' => 'Startdatum:', 'Due date:' => 'Ablaufdatum:', - 'There is no start date or due date for this task.' => 'Diese Aufgabe hat kein Start oder Ablaufdatum.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Aufgabe verschieben/ändern, ändert auch Start- und Ablaufdatum der Aufgabe.', - 'There is no task in your project.' => 'Es gibt keine Aufgabe in deinem Projekt', - 'Gantt chart' => 'Gantt Diagramm', 'People who are project managers' => 'Benutzer die Projektmanager sind', 'People who are project members' => 'Benutzer die Projektmitglieder sind', 'NOK - Norwegian Krone' => 'NOK - Norwegische Kronen', @@ -749,22 +742,15 @@ return array( 'Members' => 'Mitglieder', 'Shared project' => 'Geteiltes Projekt', 'Project managers' => 'Projektmanager', - 'Gantt chart for all projects' => 'Gantt Diagramm für alle Projekte', 'Projects list' => 'Projektliste', - 'Gantt chart for this project' => 'Gantt Diagramm für dieses Projekt', - 'Project board' => 'Projekt Pinnwand', 'End date:' => 'Endedatum:', - 'There is no start date or end date for this project.' => 'Es gibt kein Startdatum oder Endedatum für dieses Projekt', - 'Projects Gantt chart' => 'Projekt Gantt Diagramm', 'Change task color when using a specific task link' => 'Aufgabefarbe ändern bei bestimmter Aufgabenverbindung', 'Task link creation or modification' => 'Aufgabenverbindung erstellen oder bearbeiten', 'Milestone' => 'Meilenstein', 'Documentation: %s' => 'Dokumentation: %s', - 'Switch to the Gantt chart view' => 'Zur Gantt-Diagramm Ansicht wechseln', 'Reset the search/filter box' => 'Suche/Filter-Box zurücksetzen', 'Documentation' => 'Dokumentation', 'Table of contents' => 'Inhaltsverzeichnis', - 'Gantt' => 'Gantt', 'Author' => 'Autor', 'Version' => 'Version', 'Plugins' => 'Plugins', diff --git a/app/Locale/el_GR/translations.php b/app/Locale/el_GR/translations.php index 3938413b..57f5f98e 100644 --- a/app/Locale/el_GR/translations.php +++ b/app/Locale/el_GR/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Άδεια:', 'License' => 'Άδεια', 'Enter the text below' => 'Πληκτρολογήστε το παρακάτω κείμενο', - 'Sort by position' => 'Ταξινόμηση κατά Θέση', - 'Sort by date' => 'Ταξινόμηση κατά ημέρα', - 'Add task' => 'Προσθήκη εργασίας', 'Start date:' => 'Ημερομηνία εκκίνησης :', 'Due date:' => 'Ημερομηνία λήξης:', - 'There is no start date or due date for this task.' => 'Δεν υπάρχει ημερομηνία έναρξης ή ημερομηνία λήξης καθηκόντων για το έργο αυτό.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Μετακίνηση ή αλλαγή μεγέθους μιας εργασίας θα αλλάξει την ώρα έναρξης και ημερομηνία λήξης της εργασίας.', - 'There is no task in your project.' => 'Δεν υπάρχει καμία εργασία στο έργο σας.', - 'Gantt chart' => 'Διαγράμματα Gantt', 'People who are project managers' => 'Οι άνθρωποι που είναι οι διευθυντές έργων', 'People who are project members' => 'Οι άνθρωποι που είναι μέλη των έργων', 'NOK - Norwegian Krone' => 'NOK - Norwegian Krone', @@ -749,22 +742,15 @@ return array( 'Members' => 'Μέλη', 'Shared project' => 'Κοινόχρηστο έργο', 'Project managers' => 'Διευθυντές έργου', - 'Gantt chart for all projects' => 'Διάγραμμα Gantt για όλα τα έργα', 'Projects list' => 'Λίστα έργων', - 'Gantt chart for this project' => 'Διάγραμμα Gantt για το έργο', - 'Project board' => 'Κεντρικός πίνακας έργου', 'End date:' => 'Ημερομηνία λήξης :', - 'There is no start date or end date for this project.' => 'Δεν υπάρχει ημερομηνία έναρξης ή λήξης για το έργο αυτό.', - 'Projects Gantt chart' => 'Διάγραμμα Gantt έργων', 'Change task color when using a specific task link' => 'Αλλαγή χρώματος εργασίας χρησιμοποιώντας συγκεκριμένο σύνδεσμο εργασίας', 'Task link creation or modification' => 'Σύνδεσμος δημιουργίας ή τροποποίησης εργασίας', 'Milestone' => 'Ορόσημο', 'Documentation: %s' => 'Τεκμηρίωση: %s', - 'Switch to the Gantt chart view' => 'Μεταφορά σε προβολή διαγράμματος Gantt', 'Reset the search/filter box' => 'Αρχικοποίηση του πεδίου αναζήτησης/φιλτραρίσματος', 'Documentation' => 'Τεκμηρίωση', 'Table of contents' => 'Πίνακας περιεχομένων', - 'Gantt' => 'Gantt', 'Author' => 'Δημιουργός', 'Version' => 'Έκδοση', 'Plugins' => 'Πρόσθετα', diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php index 7b3d2255..cc8f4d09 100644 --- a/app/Locale/es_ES/translations.php +++ b/app/Locale/es_ES/translations.php @@ -729,15 +729,8 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', // 'Start date:' => '', // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( // 'Members' => '', // 'Shared project' => '', // 'Project managers' => '', - // 'Gantt chart for all projects' => '', // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', // 'Documentation' => '', // 'Table of contents' => '', - // 'Gantt' => '', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php index 2566fa7b..5a942a2c 100644 --- a/app/Locale/fi_FI/translations.php +++ b/app/Locale/fi_FI/translations.php @@ -729,15 +729,8 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', // 'Start date:' => '', // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( // 'Members' => '', // 'Shared project' => '', // 'Project managers' => '', - // 'Gantt chart for all projects' => '', // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', // 'Documentation' => '', // 'Table of contents' => '', - // 'Gantt' => '', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php index 3bb5b0be..0d3fb35d 100644 --- a/app/Locale/fr_FR/translations.php +++ b/app/Locale/fr_FR/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Licence :', 'License' => 'Licence', 'Enter the text below' => 'Entrez le texte ci-dessous', - 'Sort by position' => 'Trier par position', - 'Sort by date' => 'Trier par date', - 'Add task' => 'Ajouter une tâche', 'Start date:' => 'Date de début :', 'Due date:' => 'Date d\'échéance :', - 'There is no start date or due date for this task.' => 'Il n\'y a pas de date de début ou de date de fin pour cette tâche.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Déplacer ou redimensionner une tâche va changer la date de début et la date de fin de la tâche.', - 'There is no task in your project.' => 'Il n\'y a aucune tâche dans votre projet.', - 'Gantt chart' => 'Diagramme de Gantt', 'People who are project managers' => 'Personnes qui sont gestionnaires de projet', 'People who are project members' => 'Personnes qui sont membres de projet', 'NOK - Norwegian Krone' => 'NOK - Couronne norvégienne', @@ -749,22 +742,15 @@ return array( 'Members' => 'Membres', 'Shared project' => 'Projet partagé', 'Project managers' => 'Gestionnaires de projet', - 'Gantt chart for all projects' => 'Diagramme de Gantt pour tous les projets', 'Projects list' => 'Liste des projets', - 'Gantt chart for this project' => 'Diagramme de Gantt pour ce projet', - 'Project board' => 'Tableau du projet', 'End date:' => 'Date de fin :', - 'There is no start date or end date for this project.' => 'Il n\'y a pas de date de début ou de date de fin pour ce projet.', - 'Projects Gantt chart' => 'Diagramme de Gantt des projets', 'Change task color when using a specific task link' => 'Changer la couleur de la tâche lorsqu\'un lien spécifique est utilisé', 'Task link creation or modification' => 'Création ou modification d\'un lien sur une tâche', 'Milestone' => 'Étape importante', 'Documentation: %s' => 'Documentation : %s', - 'Switch to the Gantt chart view' => 'Passer à la vue en diagramme de Gantt', 'Reset the search/filter box' => 'Réinitialiser le champ de recherche', 'Documentation' => 'Documentation', 'Table of contents' => 'Table des matières', - 'Gantt' => 'Gantt', 'Author' => 'Auteur', 'Version' => 'Version', 'Plugins' => 'Extensions', diff --git a/app/Locale/hr_HR/translations.php b/app/Locale/hr_HR/translations.php index 8965623d..9bb7a9e4 100644 --- a/app/Locale/hr_HR/translations.php +++ b/app/Locale/hr_HR/translations.php @@ -729,15 +729,8 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', // 'Start date:' => '', // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( 'Members' => 'Članovi', // 'Shared project' => '', // 'Project managers' => '', - // 'Gantt chart for all projects' => '', // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', 'Documentation' => 'Dokumentacija', // 'Table of contents' => '', - // 'Gantt' => '', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php index 9685486b..7e153029 100644 --- a/app/Locale/hu_HU/translations.php +++ b/app/Locale/hu_HU/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Engedély:', 'License' => 'Engedély', 'Enter the text below' => 'Adja be a lenti szöveget', - 'Sort by position' => 'Rendezés hely szerint', - 'Sort by date' => 'Rendezés idő szerint', - 'Add task' => 'Feladat hozzáadása', 'Start date:' => 'Kezdés ideje: ', 'Due date:' => 'Határidő: ', - 'There is no start date or due date for this task.' => 'Ehhez a feladathoz nem adtak meg kezdési időt vagy határidőt.', - 'Moving or resizing a task will change the start and due date of the task.' => 'A feladat elmozgatása vagy méretének megváltoztatása meg fogja változtatni a feladat kezdési idejét és határidejét.', - 'There is no task in your project.' => 'Az ön projektjében nincsenek feladatok.', - 'Gantt chart' => 'Gantt diagram', 'People who are project managers' => 'Projekt vezetők', 'People who are project members' => 'Projekt tagok', 'NOK - Norwegian Krone' => 'NOK - Norvég korona', @@ -749,22 +742,15 @@ return array( 'Members' => 'Tagok', 'Shared project' => 'Közös projekt', 'Project managers' => 'Projektvezetők', - 'Gantt chart for all projects' => 'Gantt diagram az összes projektre vonatkozóan', 'Projects list' => 'Projekt lista', - 'Gantt chart for this project' => 'Gantt diagram erre a projektre vonatkozóan', - 'Project board' => 'Projekt tábla', 'End date:' => 'Befejezés dátuma: ', - 'There is no start date or end date for this project.' => 'Ennél a projektnél nem adták meg a kezdés és a befejezés dátumát.', - 'Projects Gantt chart' => 'A projektek Gantt diagramja', 'Change task color when using a specific task link' => 'Az egyes specifikus feladat hivatkozások használatakor a feladat színének megváltoztatása', 'Task link creation or modification' => 'Feladat hivatkozás létrehozása vagy módosítása', 'Milestone' => 'Mérföldkő', 'Documentation: %s' => 'Dokumentáció: %s', - 'Switch to the Gantt chart view' => 'Átkapcsolás a Gantt diagram nézetre', 'Reset the search/filter box' => 'A keresés/szűrés doboz alaphelyzetbe állítása', 'Documentation' => 'Dokumentáció', 'Table of contents' => 'Tartalomjegyzék', - 'Gantt' => 'Gantt', 'Author' => 'Szerző', 'Version' => 'Verzió', 'Plugins' => 'Plugin-ek', diff --git a/app/Locale/id_ID/translations.php b/app/Locale/id_ID/translations.php index e0c402c3..358e77b6 100644 --- a/app/Locale/id_ID/translations.php +++ b/app/Locale/id_ID/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Lisensi:', 'License' => 'Lisensi', 'Enter the text below' => 'Masukkan teks di bawah', - 'Sort by position' => 'Urutkan berdasarkan posisi', - 'Sort by date' => 'Urutkan berdasarkan tanggal', - 'Add task' => 'Tambah tugas', 'Start date:' => 'Tanggal mulai:', 'Due date:' => 'Batas waktu:', - 'There is no start date or due date for this task.' => 'Tidak ada tanggal mulai dan batas waktu untuk tugas ini.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Memindahkan atau mengubah ukuran tugas anda akan mengubah tanggal mulai dan batas waktu dari tugas ini.', - 'There is no task in your project.' => 'Tidak ada tugas didalam proyek anda.', - 'Gantt chart' => 'Grafik Gantt', 'People who are project managers' => 'Orang-orang yang menjadi manajer proyek', 'People who are project members' => 'Orang-orang yang menjadi anggota proyek', 'NOK - Norwegian Krone' => 'NOK - Krone Norwegia', @@ -749,22 +742,15 @@ return array( 'Members' => 'Anggota', 'Shared project' => 'Proyek bersama', 'Project managers' => 'Manajer proyek', - 'Gantt chart for all projects' => 'Grafik Gantt untuk semua proyek', 'Projects list' => 'Daftar proyek', - 'Gantt chart for this project' => 'Grafik Gantt untuk proyek ini', - 'Project board' => 'Papan proyek', 'End date:' => 'Waktu berakhir:', - 'There is no start date or end date for this project.' => 'Tidak ada waktu mulai atau waktu berakhir untuk proyek ini', - 'Projects Gantt chart' => 'Grafik Gantt proyek', 'Change task color when using a specific task link' => 'Ganti warna tugas ketika menggunakan tautan tugas yang spesifik', 'Task link creation or modification' => 'Tautan pembuatan atau modifikasi tugas ', 'Milestone' => 'Milestone', 'Documentation: %s' => 'Dokumentasi: %s', - 'Switch to the Gantt chart view' => 'Beralih ke tampilan grafik Gantt', 'Reset the search/filter box' => 'Reset kotak pencarian/saringan', 'Documentation' => 'Dokumentasi', 'Table of contents' => 'Daftar isi', - 'Gantt' => 'Gantt', 'Author' => 'Penulis', 'Version' => 'Versi', 'Plugins' => 'Plugin', diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php index db9174fe..cbed6a8b 100644 --- a/app/Locale/it_IT/translations.php +++ b/app/Locale/it_IT/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Licenza:', 'License' => 'Licenza', 'Enter the text below' => 'Inserisci il testo qui sotto', - 'Sort by position' => 'Ordina per posizione', - 'Sort by date' => 'Ordina per data', - 'Add task' => 'Aggiungi task', 'Start date:' => 'Data di inizio:', 'Due date:' => 'Data di completamento:', - 'There is no start date or due date for this task.' => 'Nessuna data di inizio o di scadenza per questo task.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Spostando o ridimensionado un task ne modifca la data di inizio e di scadenza.', - 'There is no task in your project.' => 'Non ci sono task nel tuo progetto.', - 'Gantt chart' => 'Grafici Gantt', 'People who are project managers' => 'Persone che sono manager di progetto', 'People who are project members' => 'Persone che sono membri di progetto', 'NOK - Norwegian Krone' => 'NOK - Corone norvegesi', @@ -749,22 +742,15 @@ return array( 'Members' => 'Membri', 'Shared project' => 'Progetto condiviso', 'Project managers' => 'Manager di progetto', - 'Gantt chart for all projects' => 'Grafico Gantt per tutti i progetti', 'Projects list' => 'Elenco progetti', - 'Gantt chart for this project' => 'Grafico Gantt per questo progetto', - 'Project board' => 'Bacheca del progetto', 'End date:' => 'Data di fine:', - 'There is no start date or end date for this project.' => 'Non è prevista una data di inizio o fine per questo progetto.', - 'Projects Gantt chart' => 'Grafico Gantt dei progetti', 'Change task color when using a specific task link' => 'Cambia colore del task quando si un utilizza una determinata relazione di task', 'Task link creation or modification' => 'Creazione o modifica di relazione di task', // 'Milestone' => '', 'Documentation: %s' => 'Documentazione: %s', - 'Switch to the Gantt chart view' => 'Passa alla vista Grafico Gantt', 'Reset the search/filter box' => 'Resetta la riceca/filtro', 'Documentation' => 'Documentazione', 'Table of contents' => 'Indice dei contenuti', - 'Gantt' => 'Gantt', 'Author' => 'Autore', 'Version' => 'Versione', 'Plugins' => 'Plugin', diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php index 8114afb9..e5084b4f 100644 --- a/app/Locale/ja_JP/translations.php +++ b/app/Locale/ja_JP/translations.php @@ -729,15 +729,8 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', // 'Start date:' => '', // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( // 'Members' => '', // 'Shared project' => '', // 'Project managers' => '', - // 'Gantt chart for all projects' => '', // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', // 'Documentation' => '', // 'Table of contents' => '', - // 'Gantt' => '', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/ko_KR/translations.php b/app/Locale/ko_KR/translations.php index c5c3b669..ef343e18 100644 --- a/app/Locale/ko_KR/translations.php +++ b/app/Locale/ko_KR/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => '라이센스:', 'License' => '라이센스', 'Enter the text below' => '아랫글로 들어가기', - 'Sort by position' => '위치별 정렬', - 'Sort by date' => '날짜별 정렬', - 'Add task' => '할일 추가', 'Start date:' => '시작일:', 'Due date:' => '만기일:', - 'There is no start date or due date for this task.' => '할일의 시작일 또는 만기일이 없습니다', - 'Moving or resizing a task will change the start and due date of the task.' => '할일의 이동 혹은 리사이징으로 시작시간과 마감시간이 변경됩니다.', - 'There is no task in your project.' => '프로젝트에 할일이 없습니다.', - 'Gantt chart' => '간트 차트', 'People who are project managers' => '프로젝트 매니저', 'People who are project members' => '프로젝트 멤버', 'NOK - Norwegian Krone' => 'NOK - 노르웨이 크로네', @@ -749,22 +742,15 @@ return array( 'Members' => '멤버', 'Shared project' => '프로젝트 공유', 'Project managers' => '프로젝트 매니저', - 'Gantt chart for all projects' => '모든 프로젝트의 간트 차트', 'Projects list' => '프로젝트 리스트', - 'Gantt chart for this project' => '이 프로젝트 간트차트', - 'Project board' => '프로젝트 보드', 'End date:' => '날짜 수정', - 'There is no start date or end date for this project.' => '이 프로젝트에는 시작날짜와 종료날짜가 없습니다', - 'Projects Gantt chart' => '프로젝트 간트차트', 'Change task color when using a specific task link' => '특정 할일 링크를 사용할때 할일의 색깔 변경', 'Task link creation or modification' => '할일 링크 생성 혹은 수정', 'Milestone' => '마일스톤', 'Documentation: %s' => '문서: %s', - 'Switch to the Gantt chart view' => '간트 차트 보기로 변경', 'Reset the search/filter box' => '찾기/필터 박스 초기화', 'Documentation' => '문서', 'Table of contents' => '목차', - 'Gantt' => '간트', 'Author' => '글쓴이', 'Version' => '버전', 'Plugins' => '플러그인', diff --git a/app/Locale/my_MY/translations.php b/app/Locale/my_MY/translations.php index 40327f6c..0b11a1b3 100644 --- a/app/Locale/my_MY/translations.php +++ b/app/Locale/my_MY/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Lesen:', 'License' => 'Lesen', 'Enter the text below' => 'Masukkan teks di bawah', - 'Sort by position' => 'Urutkan berdasarkan posisi', - 'Sort by date' => 'Urutkan berdasarkan tanggal', - 'Add task' => 'Tambah tugas', 'Start date:' => 'Tanggal mulai:', 'Due date:' => 'Batas waktu:', - 'There is no start date or due date for this task.' => 'Tiada tanggal mulai dan batas waktu untuk tugas ini.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Memindahkan atau mengubah ukuran tugas anda akan mengubah tanggal mulai dan batas waktu dari tugas ini.', - 'There is no task in your project.' => 'Tiada tugas didalam projek anda.', - 'Gantt chart' => 'Carta Gantt', 'People who are project managers' => 'Orang-orang yang menjadi pengurus projek', 'People who are project members' => 'Orang-orang yang menjadi anggota projek', 'NOK - Norwegian Krone' => 'NOK - Krone Norwegia', @@ -749,22 +742,15 @@ return array( 'Members' => 'Anggota', 'Shared project' => 'projek bersama', 'Project managers' => 'Pengurus projek', - 'Gantt chart for all projects' => 'Carta Gantt untuk kesemua projek', 'Projects list' => 'Senarai projek', - 'Gantt chart for this project' => 'Carta Gantt untuk projek ini', - 'Project board' => 'Papan projek', 'End date:' => 'Waktu berakhir :', - 'There is no start date or end date for this project.' => 'Tidak ada waktu mula atau waktu berakhir pada projek ini', - 'Projects Gantt chart' => 'projekkan carta Gantt', 'Change task color when using a specific task link' => 'Rubah warna tugas ketika menggunakan Pautan tugas yang spesifik', 'Task link creation or modification' => 'Pautan tugas pada penciptaan atau penyuntingan', 'Milestone' => 'Batu Tanda', 'Documentation: %s' => 'Dokumentasi : %s', - 'Switch to the Gantt chart view' => 'Beralih ke tampilan Carta Gantt', 'Reset the search/filter box' => 'Tetap semula pencarian/saringan', 'Documentation' => 'Dokumentasi', 'Table of contents' => 'Isi kandungan', - 'Gantt' => 'Gantt', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/nb_NO/translations.php b/app/Locale/nb_NO/translations.php index 3f1f211a..0e07f0a3 100644 --- a/app/Locale/nb_NO/translations.php +++ b/app/Locale/nb_NO/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Lisens:', 'License' => 'Lisens', 'Enter the text below' => 'Legg inn teksten nedenfor', - // 'Sort by position' => '', - 'Sort by date' => 'Sorter etter dato', - 'Add task' => 'Legg til oppgave', 'Start date:' => 'Startdato:', 'Due date:' => 'Frist:', - 'There is no start date or due date for this task.' => 'Det er ingen startdato eller frist for denne oppgaven', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - 'There is no task in your project.' => 'Det er ingen oppgaver i dette prosjektet', - 'Gantt chart' => 'Gantt skjema', 'People who are project managers' => 'Prosjektledere', 'People who are project members' => 'Prosjektmedlemmer', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( 'Members' => 'Medlemmer', 'Shared project' => 'Delt prosjekt', 'Project managers' => 'Prosjektledere', - // 'Gantt chart for all projects' => '', 'Projects list' => 'Prosjektliste', - 'Gantt chart for this project' => 'Gantt skjema for dette prosjektet', - 'Project board' => 'Prosjektsiden', 'End date:' => 'Sluttdato:', - // 'There is no start date or end date for this project.' => '', - 'Projects Gantt chart' => 'Gantt skjema for prosjekter', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', 'Milestone' => 'Milepæl', 'Documentation: %s' => 'Dokumentasjon: %s', - 'Switch to the Gantt chart view' => 'Gantt skjema visning', 'Reset the search/filter box' => 'Nullstill søk/filter', 'Documentation' => 'Dokumentasjon', 'Table of contents' => 'Innholdsfortegnelse', - 'Gantt' => 'Gantt', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php index 2b8fdbc4..4567cb33 100644 --- a/app/Locale/nl_NL/translations.php +++ b/app/Locale/nl_NL/translations.php @@ -729,15 +729,8 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', // 'Start date:' => '', // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( 'Members' => 'Leden', // 'Shared project' => '', // 'Project managers' => '', - // 'Gantt chart for all projects' => '', // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', 'Milestone' => 'Mijlpaal', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', // 'Documentation' => '', // 'Table of contents' => '', - // 'Gantt' => '', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php index d23df58e..1741987c 100644 --- a/app/Locale/pl_PL/translations.php +++ b/app/Locale/pl_PL/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Licencja:', 'License' => 'Licencja', 'Enter the text below' => 'Wpisz tekst poniżej', - 'Sort by position' => 'Sortuj wg pozycji', - 'Sort by date' => 'Sortuj wg daty', - 'Add task' => 'Dodaj zadanie', 'Start date:' => 'Data rozpoczęcia:', 'Due date:' => 'Termin', - 'There is no start date or due date for this task.' => 'Brak daty rozpoczęcia lub terminu zadania', - 'Moving or resizing a task will change the start and due date of the task.' => 'Przeniesienie bądź edycja zmieni datę rozpoczęcia oraz termin ukończenia zadania.', - 'There is no task in your project.' => 'Brak zadań w projekcie.', - 'Gantt chart' => 'Wykres Gantta', 'People who are project managers' => 'Użytkownicy będący menedżerami projektu', 'People who are project members' => 'Użytkownicy będący uczestnikami projektu', 'NOK - Norwegian Krone' => 'NOK - Korona norweska', @@ -749,22 +742,15 @@ return array( 'Members' => 'Członkowie', 'Shared project' => 'Projekt udostępniony', 'Project managers' => 'Menedżerowie projektu', - 'Gantt chart for all projects' => 'Wykres Gantta dla wszystkich projektów', 'Projects list' => 'Lista projektów', - 'Gantt chart for this project' => 'Wykres Gantta dla bieżacego projektu', - 'Project board' => 'Talica projektu', 'End date:' => 'Data zakończenia:', - 'There is no start date or end date for this project.' => 'Nie zdefiniowano czasu trwania projektu', - 'Projects Gantt chart' => 'Wykres Gantta dla projektów', 'Change task color when using a specific task link' => 'Zmień kolor zadania używając specjalnego adresu URL', 'Task link creation or modification' => 'Adres URL do utworzenia zadania lub modyfikacji', 'Milestone' => 'Kamień milowy', 'Documentation: %s' => 'Dokumentacja: %s', - 'Switch to the Gantt chart view' => 'Przełącz na wykres Gantta', 'Reset the search/filter box' => 'Zresetuj pole wyszukiwania/filtrowania', 'Documentation' => 'Dokumentacja', 'Table of contents' => 'Tablica zawartości', - // 'Gantt' => '', 'Author' => 'Autor', 'Version' => 'Wersja', 'Plugins' => 'Wtyczki', diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php index 4a8202de..d19ada1e 100644 --- a/app/Locale/pt_BR/translations.php +++ b/app/Locale/pt_BR/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Licença:', 'License' => 'Licença', 'Enter the text below' => 'Entre o texto abaixo', - 'Sort by position' => 'Ordenar por posição', - 'Sort by date' => 'Ordenar por data', - 'Add task' => 'Adicionar uma tarefa', 'Start date:' => 'Data de início:', 'Due date:' => 'Data fim estimada:', - 'There is no start date or due date for this task.' => 'Não existe data de início ou data fim estimada para esta tarefa.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Mover ou redimensionar uma tarefa irá alterar a data de início e conclusão estimada da tarefa.', - 'There is no task in your project.' => 'Não há tarefas em seu projeto.', - 'Gantt chart' => 'Gráfico de Gantt', 'People who are project managers' => 'Pessoas que são gerente de projeto', 'People who are project members' => 'Pessoas que são membro de projeto', 'NOK - Norwegian Krone' => 'NOK - Coroa Norueguesa', @@ -749,22 +742,15 @@ return array( 'Members' => 'Membros', 'Shared project' => 'Projeto compartilhado', 'Project managers' => 'Gerentes de projeto', - 'Gantt chart for all projects' => 'Gráfico de Gantt para todos os projetos', 'Projects list' => 'Lista dos projetos', - 'Gantt chart for this project' => 'Gráfico de Gantt para este projeto', - 'Project board' => 'Painel do projeto', 'End date:' => 'Data de término:', - 'There is no start date or end date for this project.' => 'Não há data de início ou data de término para este projeto.', - 'Projects Gantt chart' => 'Gráfico de Gantt dos projetos', 'Change task color when using a specific task link' => 'Mudar a cor da tarefa quando um link específico é utilizado', 'Task link creation or modification' => 'Criação ou modificação de um link em uma tarefa', 'Milestone' => 'Milestone', 'Documentation: %s' => 'Documentação: %s', - 'Switch to the Gantt chart view' => 'Mudar para a vista gráfico de Gantt', 'Reset the search/filter box' => 'Reiniciar o campo de pesquisa', 'Documentation' => 'Documentação', 'Table of contents' => 'Índice', - 'Gantt' => 'Gantt', 'Author' => 'Autor', 'Version' => 'Versão', 'Plugins' => 'Extensões', diff --git a/app/Locale/pt_PT/translations.php b/app/Locale/pt_PT/translations.php index 769ab8c5..06b0791d 100644 --- a/app/Locale/pt_PT/translations.php +++ b/app/Locale/pt_PT/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Licença:', 'License' => 'Licença', 'Enter the text below' => 'Escreva o texto em baixo', - 'Sort by position' => 'Ordenar por posição', - 'Sort by date' => 'Ordenar por data', - 'Add task' => 'Adicionar tarefa', 'Start date:' => 'Data de inicio:', 'Due date:' => 'Data de vencimento:', - 'There is no start date or due date for this task.' => 'Não existe data de inicio ou data de vencimento para esta tarefa.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Mover ou redimensionar a tarefa irá alterar a data de inicio e vencimento da tarefa.', - 'There is no task in your project.' => 'Não existe tarefa no seu projeto.', - 'Gantt chart' => 'Gráfico de Gantt', 'People who are project managers' => 'Pessoas que são gestores do projeto', 'People who are project members' => 'Pessoas que são membros do projeto', 'NOK - Norwegian Krone' => 'NOK - Coroa Norueguesa', @@ -749,22 +742,15 @@ return array( 'Members' => 'Membros', 'Shared project' => 'Projeto partilhado', 'Project managers' => 'Gestores do projeto', - 'Gantt chart for all projects' => 'Gráfico de Gantt para todos os projetos', 'Projects list' => 'Lista de projetos', - 'Gantt chart for this project' => 'Gráfico de Gantt para este projeto', - 'Project board' => 'Quadro de projeto', 'End date:' => 'Data de fim:', - 'There is no start date or end date for this project.' => 'Não existe data de inicio ou fim para este projeto.', - 'Projects Gantt chart' => 'Gráfico de Gantt dos projetos', 'Change task color when using a specific task link' => 'Alterar cor da tarefa quando se usar um tipo especifico de ligação de tarefa', 'Task link creation or modification' => 'Criação ou modificação de ligação de tarefa', 'Milestone' => 'Objectivo', 'Documentation: %s' => 'Documentação: %s', - 'Switch to the Gantt chart view' => 'Mudar para vista de gráfico de Gantt', 'Reset the search/filter box' => 'Repor caixa de procura/filtro', 'Documentation' => 'Documentação', 'Table of contents' => 'Tabela de conteúdos', - 'Gantt' => 'Gantt', 'Author' => 'Autor', 'Version' => 'Versão', 'Plugins' => 'Plugins', diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php index 122013ff..e7f44cfa 100644 --- a/app/Locale/ru_RU/translations.php +++ b/app/Locale/ru_RU/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Лицензия:', 'License' => 'Лицензия', 'Enter the text below' => 'Введите текст ниже', - 'Sort by position' => 'Сортировать по позиции', - 'Sort by date' => 'Сортировать по дате', - 'Add task' => 'Добавить задачу', 'Start date:' => 'Дата начала:', 'Due date:' => 'Дата завершения:', - 'There is no start date or due date for this task.' => 'Для этой задачи нет даты начала или завершения.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Изменение или перемещение задачи повлечет изменение даты начала и завершения задачи.', - 'There is no task in your project.' => 'В Вашем проекте задач нет.', - 'Gantt chart' => 'Диаграмма Ганта', 'People who are project managers' => 'Люди, которые менеджеры проекта', 'People who are project members' => 'Люди, которые участники проекта', 'NOK - Norwegian Krone' => 'НК - Норвежская крона', @@ -749,22 +742,15 @@ return array( 'Members' => 'Участники', 'Shared project' => 'Общие/публичные проекты', 'Project managers' => 'Менеджер проекта', - 'Gantt chart for all projects' => 'Диаграмма Ганта для всех проектов', 'Projects list' => 'Список проектов', - 'Gantt chart for this project' => 'Диаграмма Ганта для этого проекта', - 'Project board' => 'Доска проекта', 'End date:' => 'Дата завершения:', - 'There is no start date or end date for this project.' => 'В проекте не указаны дата начала или завершения.', - 'Projects Gantt chart' => 'Диаграмма Ганта проектов', 'Change task color when using a specific task link' => 'Изменение цвета задач при использовании ссылки на определенные задачи', 'Task link creation or modification' => 'Ссылка на создание или модификацию задачи', 'Milestone' => 'Веха', 'Documentation: %s' => 'Документация: %s', - 'Switch to the Gantt chart view' => 'Переключиться в режим диаграммы Ганта', 'Reset the search/filter box' => 'Сбросить поиск/фильтр', 'Documentation' => 'Документация', 'Table of contents' => 'Содержание', - 'Gantt' => 'Гант', 'Author' => 'Автор', 'Version' => 'Версия', 'Plugins' => 'Плагины', diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php index 0a8cd77f..9c3de8f2 100644 --- a/app/Locale/sr_Latn_RS/translations.php +++ b/app/Locale/sr_Latn_RS/translations.php @@ -729,15 +729,8 @@ return array( // 'License:' => '', // 'License' => '', // 'Enter the text below' => '', - // 'Sort by position' => '', - // 'Sort by date' => '', - // 'Add task' => '', // 'Start date:' => '', // 'Due date:' => '', - // 'There is no start date or due date for this task.' => '', - // 'Moving or resizing a task will change the start and due date of the task.' => '', - // 'There is no task in your project.' => '', - // 'Gantt chart' => '', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( // 'Members' => '', // 'Shared project' => '', // 'Project managers' => '', - // 'Gantt chart for all projects' => '', // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', // 'Documentation' => '', // 'Table of contents' => '', - // 'Gantt' => '', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php index 27ba52a9..2d366c74 100644 --- a/app/Locale/sv_SE/translations.php +++ b/app/Locale/sv_SE/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Licens:', 'License' => 'Licens', 'Enter the text below' => 'Fyll i texten nedan', - 'Sort by position' => 'Sortera efter position', - 'Sort by date' => 'Sortera efter datum', - 'Add task' => 'Lägg till uppgift', 'Start date:' => 'Startdatum:', 'Due date:' => 'Slutdatum:', - 'There is no start date or due date for this task.' => 'Det finns inget startdatum eller slutdatum för uppgiften.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Flytt eller storleksändring av uppgiften ändrar start och slutdatum för uppgiften', - 'There is no task in your project.' => 'Det finns ingen uppgift i ditt projekt.', - 'Gantt chart' => 'Gantt-schema', // 'People who are project managers' => '', // 'People who are project members' => '', // 'NOK - Norwegian Krone' => '', @@ -749,22 +742,15 @@ return array( // 'Members' => '', // 'Shared project' => '', // 'Project managers' => '', - // 'Gantt chart for all projects' => '', // 'Projects list' => '', - // 'Gantt chart for this project' => '', - // 'Project board' => '', // 'End date:' => '', - // 'There is no start date or end date for this project.' => '', - // 'Projects Gantt chart' => '', // 'Change task color when using a specific task link' => '', // 'Task link creation or modification' => '', // 'Milestone' => '', // 'Documentation: %s' => '', - // 'Switch to the Gantt chart view' => '', // 'Reset the search/filter box' => '', // 'Documentation' => '', // 'Table of contents' => '', - // 'Gantt' => '', // 'Author' => '', // 'Version' => '', // 'Plugins' => '', diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php index f9a537f0..eda6344e 100644 --- a/app/Locale/th_TH/translations.php +++ b/app/Locale/th_TH/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'สัญญาอนุญาต:', 'License' => 'สัญญาอนุญาต', 'Enter the text below' => 'พิมพ์ข้อความด้านล่าง', - 'Sort by position' => 'เรียงตามตำแหน่ง', - 'Sort by date' => 'เรียงตามวัน', - 'Add task' => 'เพิ่มงาน', 'Start date:' => 'วันที่เริ่ม:', 'Due date:' => 'วันครบกำหนด:', - 'There is no start date or due date for this task.' => 'งานนี้ไม่มีวันที่เริ่มหรือวันครบกำหนด', - 'Moving or resizing a task will change the start and due date of the task.' => 'การย้ายหรือปรับขนาดงานจะมีการเปลี่ยนแปลงที่วันเริ่มต้นและวันที่ครบกำหนดของงาน', - 'There is no task in your project.' => 'โปรเจคนี้ไม่มีงาน', - 'Gantt chart' => 'แผนภูมิแกรนท์', 'People who are project managers' => 'คนที่เป็นผู้จัดการโปรเจค', 'People who are project members' => 'คนที่เป็นสมาชิกโปรเจค', 'NOK - Norwegian Krone' => 'NOK - โครนนอร์เวย์', @@ -749,22 +742,15 @@ return array( 'Members' => 'สมาชิก', 'Shared project' => 'แชร์โปรเจค', 'Project managers' => 'ผู้จัดการโปรเจค', - 'Gantt chart for all projects' => 'แผนภูมิแกรนท์สำหรับทุกโปรเจค', 'Projects list' => 'รายการโปรเจค', - 'Gantt chart for this project' => 'แผนภูมิแกรนท์สำหรับโปรเจคนี้', - 'Project board' => 'บอร์ดโปรเจค', 'End date:' => 'วันที่จบ:', - 'There is no start date or end date for this project.' => 'ไม่มีวันที่เริ่มหรือวันที่จบของโปรเจคนี้', - 'Projects Gantt chart' => 'แผนภูมิแกรน์ของโปรเจค', 'Change task color when using a specific task link' => 'เปลี่ยนสีงานเมื่อมีการใช้การเชื่อมโยงงาน', 'Task link creation or modification' => 'การสร้างการเชื่อมโยงงานหรือการปรับเปลี่ยน', 'Milestone' => 'ขั้น', 'Documentation: %s' => 'เอกสาร: %s', - 'Switch to the Gantt chart view' => 'เปลี่ยนเป็นมุมมองแผนภูมิแกรนท์', 'Reset the search/filter box' => 'รีเซตกล่องค้นหา/ตัวกรอง', 'Documentation' => 'เอกสาร', 'Table of contents' => 'สารบัญ', - 'Gantt' => 'แกรนท์', 'Author' => 'ผู้แต่ง', 'Version' => 'เวอร์ชัน', 'Plugins' => 'ปลั๊กอิน', diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php index 56971fd2..a235d638 100644 --- a/app/Locale/tr_TR/translations.php +++ b/app/Locale/tr_TR/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => 'Lisans:', 'License' => 'Lisans', 'Enter the text below' => 'Aşağıdaki metni girin', - 'Sort by position' => 'Pozisyona göre sırala', - 'Sort by date' => 'Tarihe göre sırala', - 'Add task' => 'Görev ekle', 'Start date:' => 'Başlangıç tarihi:', 'Due date:' => 'Tamamlanması gereken tarih:', - 'There is no start date or due date for this task.' => 'Bu görev için başlangıç veya tamamlanması gereken tarih yok.', - 'Moving or resizing a task will change the start and due date of the task.' => 'Bir görevin boyutunu değiştirmek, görevin başlangıç ve tamamlanması gereken tarihlerini değiştirir.', - 'There is no task in your project.' => 'Projenizde hiç görev yok.', - 'Gantt chart' => 'Gantt diyagramı', 'People who are project managers' => 'Proje müdürü olan kişiler', 'People who are project members' => 'Proje üyesi olan kişiler', 'NOK - Norwegian Krone' => ' NOK - Norveç Kronu', @@ -749,22 +742,15 @@ return array( 'Members' => 'Üyeler', 'Shared project' => 'Paylaşılan proje', 'Project managers' => 'Proje müdürleri', - 'Gantt chart for all projects' => 'Tüm projeler için Gantt diyagramı', 'Projects list' => 'Proje listesi', - 'Gantt chart for this project' => 'Bu proje için Gantt diyagramı', - 'Project board' => 'Proje Panosu', 'End date:' => 'Bitiş tarihi:', - 'There is no start date or end date for this project.' => 'Bu proje için başlangıç veya bitiş tarihi yok.', - 'Projects Gantt chart' => 'Projeler Gantt diyagramı', 'Change task color when using a specific task link' => 'Belirli bir görev bağlantısı kullanıldığında görevin rengini değiştir', 'Task link creation or modification' => 'Görev bağlantısı oluşturulması veya değiştirilmesi', 'Milestone' => 'Kilometre taşı', 'Documentation: %s' => 'Dokümantasyon: %s', - 'Switch to the Gantt chart view' => 'Gantt diyagramı görünümüne geç', 'Reset the search/filter box' => 'Arama/Filtre kutusunu sıfırla', 'Documentation' => 'Dokümantasyon', 'Table of contents' => 'İçindekiler', - 'Gantt' => 'Gantt', 'Author' => 'Yazar', 'Version' => 'Versiyon', 'Plugins' => 'Eklentiler', diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php index 908f7989..5c5d19f0 100644 --- a/app/Locale/zh_CN/translations.php +++ b/app/Locale/zh_CN/translations.php @@ -729,15 +729,8 @@ return array( 'License:' => '授权许可:', 'License' => '授权许可', 'Enter the text below' => '输入下方的文本', - 'Sort by position' => '按位置排序', - 'Sort by date' => '按日期排序', - 'Add task' => '添加任务', 'Start date:' => '开始日期', 'Due date:' => '到期日期', - 'There is no start date or due date for this task.' => '当前任务没有开始或结束时间。', - 'Moving or resizing a task will change the start and due date of the task.' => '移动或者重设任务将改变任务开始和结束时间。', - 'There is no task in your project.' => '当前项目还没有任务', - 'Gantt chart' => '甘特图', 'People who are project managers' => '项目管理员', 'People who are project members' => '项目成员', 'NOK - Norwegian Krone' => '克朗', @@ -749,22 +742,15 @@ return array( 'Members' => '成员', 'Shared project' => '公开项目', 'Project managers' => '项目管理员', - 'Gantt chart for all projects' => '所有项目的甘特图', 'Projects list' => '项目列表', - 'Gantt chart for this project' => '此项目的甘特图', - 'Project board' => '项目面板', 'End date:' => '结束日期', - 'There is no start date or end date for this project.' => '当前项目没有开始或结束日期', - 'Projects Gantt chart' => '项目甘特图', 'Change task color when using a specific task link' => '当任务关联到指定任务时改变颜色', 'Task link creation or modification' => '任务链接创建或更新时间', 'Milestone' => '里程碑', 'Documentation: %s' => '文档:%s', - 'Switch to the Gantt chart view' => '切换到甘特图', 'Reset the search/filter box' => '重置搜索/过滤框', 'Documentation' => '文档', 'Table of contents' => '表内容', - 'Gantt' => '甘特图', 'Author' => '作者', 'Version' => '版本', 'Plugins' => '插件', diff --git a/app/ServiceProvider/AuthenticationProvider.php b/app/ServiceProvider/AuthenticationProvider.php index 868696e0..a384e822 100644 --- a/app/ServiceProvider/AuthenticationProvider.php +++ b/app/ServiceProvider/AuthenticationProvider.php @@ -89,7 +89,6 @@ class AuthenticationProvider implements ServiceProviderInterface $acl->add('CustomFilterController', '*', Role::PROJECT_MEMBER); $acl->add('ExportController', '*', Role::PROJECT_MANAGER); $acl->add('TaskFileController', array('screenshot', 'create', 'save', 'remove', 'confirm'), Role::PROJECT_MEMBER); - $acl->add('TaskGanttController', '*', Role::PROJECT_MANAGER); $acl->add('ProjectViewController', array('share', 'updateSharing', 'integrations', 'updateIntegrations', 'notifications', 'updateNotifications', 'duplicate', 'doDuplication'), Role::PROJECT_MANAGER); $acl->add('ProjectPermissionController', '*', Role::PROJECT_MANAGER); $acl->add('ProjectEditController', '*', Role::PROJECT_MANAGER); @@ -145,7 +144,6 @@ class AuthenticationProvider implements ServiceProviderInterface $acl->add('TagController', '*', Role::APP_ADMIN); $acl->add('PluginController', '*', Role::APP_ADMIN); $acl->add('CurrencyController', '*', Role::APP_ADMIN); - $acl->add('ProjectGanttController', '*', Role::APP_MANAGER); $acl->add('GroupListController', '*', Role::APP_ADMIN); $acl->add('GroupCreationController', '*', Role::APP_ADMIN); $acl->add('GroupModificationController', '*', Role::APP_ADMIN); diff --git a/app/ServiceProvider/FormatterProvider.php b/app/ServiceProvider/FormatterProvider.php index a65b1162..a31bf357 100644 --- a/app/ServiceProvider/FormatterProvider.php +++ b/app/ServiceProvider/FormatterProvider.php @@ -22,11 +22,9 @@ class FormatterProvider implements ServiceProviderInterface 'BoardTaskFormatter', 'GroupAutoCompleteFormatter', 'ProjectActivityEventFormatter', - 'ProjectGanttFormatter', 'SubtaskListFormatter', 'SubtaskTimeTrackingCalendarFormatter', 'TaskAutoCompleteFormatter', - 'TaskGanttFormatter', 'TaskICalFormatter', 'TaskListFormatter', 'TaskListSubtaskFormatter', diff --git a/app/ServiceProvider/RouteProvider.php b/app/ServiceProvider/RouteProvider.php index 28ced7fe..5b9eca98 100644 --- a/app/ServiceProvider/RouteProvider.php +++ b/app/ServiceProvider/RouteProvider.php @@ -122,10 +122,6 @@ class RouteProvider implements ServiceProviderInterface $container['route']->addRoute('list/:project_id', 'TaskListController', 'show'); $container['route']->addRoute('l/:project_id', 'TaskListController', 'show'); - // Gantt routes - $container['route']->addRoute('gantt/:project_id', 'TaskGanttController', 'show'); - $container['route']->addRoute('gantt/:project_id/sort/:sorting', 'TaskGanttController', 'show'); - // Feed routes $container['route']->addRoute('feed/project/:token', 'FeedController', 'project'); $container['route']->addRoute('feed/user/:token', 'FeedController', 'user'); diff --git a/app/Template/config/keyboard_shortcuts.php b/app/Template/config/keyboard_shortcuts.php index ed9ea541..4e78dbe0 100644 --- a/app/Template/config/keyboard_shortcuts.php +++ b/app/Template/config/keyboard_shortcuts.php @@ -7,7 +7,6 @@ <li><?= t('Switch to the project overview') ?> = <strong>v o</strong></li> <li><?= t('Switch to the board view') ?> = <strong>v b</strong></li> <li><?= t('Switch to the list view') ?> = <strong>v l</strong></li> - <li><?= t('Switch to the Gantt chart view') ?> = <strong>v g</strong></li> </ul> <h3><?= t('Board view') ?></h3> <ul> diff --git a/app/Template/project/dropdown.php b/app/Template/project/dropdown.php index 39cb985c..28fd9ba2 100644 --- a/app/Template/project/dropdown.php +++ b/app/Template/project/dropdown.php @@ -7,12 +7,6 @@ <li> <?= $this->url->icon('list', t('Listing'), 'TaskListController', 'show', array('project_id' => $project['id'])) ?> </li> - <?php if ($this->user->hasProjectAccess('TaskGanttController', 'show', $project['id'])): ?> - <li> - <?= $this->url->icon('sliders', t('Gantt'), 'TaskGanttController', 'show', array('project_id' => $project['id'])) ?> - </li> - <?php endif ?> - <li> <?= $this->modal->medium('dashboard', t('Activity'), 'ActivityController', 'project', array('project_id' => $project['id'])) ?> </li> diff --git a/app/Template/project_gantt/show.php b/app/Template/project_gantt/show.php deleted file mode 100644 index 725f348d..00000000 --- a/app/Template/project_gantt/show.php +++ /dev/null @@ -1,42 +0,0 @@ -<section id="main"> - <div class="page-header"> - <ul> - <?php if ($this->user->hasAccess('ProjectCreationController', 'create')): ?> - <li> - <?= $this->modal->medium('plus', t('New project'), 'ProjectCreationController', 'create') ?> - </li> - <?php endif ?> - <?php if ($this->app->config('disable_private_project', 0) == 0): ?> - <li> - <?= $this->modal->medium('lock', t('New private project'), 'ProjectCreationController', 'createPrivate') ?> - </li> - <?php endif ?> - <li> - <?= $this->url->icon('folder', t('Projects list'), 'ProjectListController', 'show') ?> - </li> - <?php if ($this->user->hasAccess('ProjectUserOverviewController', 'managers')): ?> - <li> - <?= $this->url->icon('user', t('Users overview'), 'ProjectUserOverviewController', 'managers') ?> - </li> - <?php endif ?> - </ul> - </div> - <section> - <?php if (empty($projects)): ?> - <p class="alert"><?= t('No project') ?></p> - <?php else: ?> - <div - id="gantt-chart" - data-records='<?= json_encode($projects, JSON_HEX_APOS) ?>' - data-save-url="<?= $this->url->href('ProjectGanttController', 'save') ?>" - data-label-project-manager="<?= t('Project managers') ?>" - data-label-project-member="<?= t('Project members') ?>" - data-label-gantt-link="<?= t('Gantt chart for this project') ?>" - data-label-board-link="<?= t('Project board') ?>" - data-label-start-date="<?= t('Start date:') ?>" - data-label-end-date="<?= t('End date:') ?>" - data-label-not-defined="<?= t('There is no start date or end date for this project.') ?>" - ></div> - <?php endif ?> - </section> -</section> diff --git a/app/Template/project_header/views.php b/app/Template/project_header/views.php index f200801a..4203595e 100644 --- a/app/Template/project_header/views.php +++ b/app/Template/project_header/views.php @@ -8,10 +8,6 @@ <li <?= $this->app->checkMenuSelection('TaskListController') ?>> <?= $this->url->icon('list', t('List'), 'TaskListController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-listing', t('Keyboard shortcut: "%s"', 'v l')) ?> </li> - <?php if ($this->user->hasProjectAccess('TaskGanttController', 'show', $project['id'])): ?> - <li <?= $this->app->checkMenuSelection('TaskGanttController') ?>> - <?= $this->url->icon('sliders', t('Gantt'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-gantt', t('Keyboard shortcut: "%s"', 'v g')) ?> - </li> - <?php endif ?> + <?= $this->hook->render('template:project-header:view-switcher', array('project' => $project, 'filters' => $filters)) ?> </ul> diff --git a/app/Template/project_list/listing.php b/app/Template/project_list/listing.php index f8c46729..6f6c93c1 100644 --- a/app/Template/project_list/listing.php +++ b/app/Template/project_list/listing.php @@ -18,10 +18,6 @@ <li><?= $this->url->icon('user', t('Users overview'), 'ProjectUserOverviewController', 'managers') ?></li> <?php endif ?> - <?php if ($this->user->hasAccess('ProjectGanttController', 'show')): ?> - <li><?= $this->url->icon('sliders', t('Projects Gantt chart'), 'ProjectGanttController', 'show') ?></li> - <?php endif ?> - <?= $this->hook->render('template:project-list:menu:after') ?> </ul> </div> diff --git a/app/Template/project_user_overview/layout.php b/app/Template/project_user_overview/layout.php index 9115ef3c..c97106f7 100644 --- a/app/Template/project_user_overview/layout.php +++ b/app/Template/project_user_overview/layout.php @@ -14,11 +14,6 @@ <li> <?= $this->url->icon('folder', t('Projects list'), 'ProjectListController', 'show') ?> </li> - <?php if ($this->user->hasAccess('ProjectGanttController', 'show')): ?> - <li> - <?= $this->url->icon('sliders', t('Projects Gantt chart'), 'ProjectGanttController', 'show') ?> - </li> - <?php endif ?> </ul> </div> <section class="sidebar-container"> diff --git a/app/Template/project_user_overview/roles.php b/app/Template/project_user_overview/roles.php index b8c67323..f53e7fa3 100644 --- a/app/Template/project_user_overview/roles.php +++ b/app/Template/project_user_overview/roles.php @@ -14,7 +14,6 @@ </td> <td> <?= $this->url->link('<i class="fa fa-th"></i>', 'BoardViewController', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Board')) ?> - <?= $this->url->link('<i class="fa fa-sliders fa-fw"></i>', 'TaskGanttController', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Gantt chart')) ?> <?= $this->url->link('<i class="fa fa-cog fa-fw"></i>', 'ProjectViewController', 'show', array('project_id' => $project['id']), false, 'dashboard-table-link', t('Project settings')) ?> <?= $this->text->e($project['project_name']) ?> diff --git a/app/Template/task_gantt/show.php b/app/Template/task_gantt/show.php deleted file mode 100644 index 61a476b7..00000000 --- a/app/Template/task_gantt/show.php +++ /dev/null @@ -1,31 +0,0 @@ -<section id="main"> - <?= $this->projectHeader->render($project, 'TaskGanttController', 'show') ?> - <div class="menu-inline"> - <ul> - <li <?= $sorting === 'board' ? 'class="active"' : '' ?>> - <?= $this->url->icon('sort-numeric-asc', t('Sort by position'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'sorting' => 'board')) ?> - </li> - <li <?= $sorting === 'date' ? 'class="active"' : '' ?>> - <?= $this->url->icon('sort-amount-asc', t('Sort by date'), 'TaskGanttController', 'show', array('project_id' => $project['id'], 'sorting' => 'date')) ?> - </li> - <li> - <?= $this->modal->large('plus', t('Add task'), 'TaskCreationController', 'show', array('project_id' => $project['id'])) ?> - </li> - </ul> - </div> - - <?php if (! empty($tasks)): ?> - <div - id="gantt-chart" - data-records='<?= json_encode($tasks, JSON_HEX_APOS) ?>' - data-save-url="<?= $this->url->href('TaskGanttController', 'save', array('project_id' => $project['id'])) ?>" - data-label-start-date="<?= t('Start date:') ?>" - data-label-end-date="<?= t('Due date:') ?>" - data-label-assignee="<?= t('Assignee:') ?>" - data-label-not-defined="<?= t('There is no start date or due date for this task.') ?>" - ></div> - <p class="alert alert-info"><?= t('Moving or resizing a task will change the start and due date of the task.') ?></p> - <?php else: ?> - <p class="alert"><?= t('There is no task in your project.') ?></p> - <?php endif ?> -</section> diff --git a/assets/css/app.min.css b/assets/css/app.min.css index 376ab805..87b3779f 100644 --- a/assets/css/app.min.css +++ b/assets/css/app.min.css @@ -1 +1 @@ -h1,li,ul,ol,table,tr,td,th,p,blockquote,body{margin:0;padding:0;font-size:100%}body{margin-left:10px;margin-right:10px;padding-bottom:10px;color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;text-rendering:optimizeLegibility}small{font-size:0.8em}hr{border:0;height:0;border-top:1px solid rgba(0,0,0,0.1);border-bottom:1px solid rgba(255,255,255,0.3)}.margin-top{margin-top:20px}.margin-bottom{margin-bottom:20px}.pull-right{text-align:right}ul.no-bullet li{list-style-type:none;margin-left:0}#app-loading-icon{position:fixed;right:3px;bottom:3px}.assign-me{vertical-align:bottom}a{color:#36c;border:none}a:focus{outline:0;color:#DF5353;text-decoration:none}a:hover{color:#333;text-decoration:none}a .fa{padding-right:3px;text-decoration:none;color:#333}h1,h2,h3{font-weight:normal;color:#333}h1{font-size:1.5em}h2{font-size:1.4em;margin-bottom:10px}h3{margin-top:10px;font-size:1.2em}table{width:100%;border-collapse:collapse;border-spacing:0;margin-bottom:20px}table.table-fixed{table-layout:fixed;white-space:nowrap}table.table-fixed th{overflow:hidden}table.table-fixed td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}table.table-small{font-size:0.8em}table.table-striped tr:nth-child(odd){background:#fefefe}@media (max-width: 768px){table.table-scrolling{overflow-x:auto;display:inline-block;vertical-align:top;max-width:100%;white-space:nowrap}}table th{text-align:left;padding:0.5em 3px;border:1px solid #eee;background:#fbfbfb}table th a{text-decoration:none;color:#333}table th a:focus,table th a:hover{text-decoration:underline}table td{border:1px solid #eee;padding:0.5em 3px;vertical-align:top}table td li{margin-left:20px}.column-1{width:1%}.column-2{width:2%}.column-3{width:3%}.column-4{width:4%}.column-5{width:5%}.column-6{width:6%}.column-7{width:7%}.column-8{width:8%}.column-9{width:9%}.column-10{width:10%}.column-11{width:11%}.column-12{width:12%}.column-13{width:13%}.column-14{width:14%}.column-15{width:15%}.column-16{width:16%}.column-17{width:17%}.column-18{width:18%}.column-19{width:19%}.column-20{width:20%}.column-21{width:21%}.column-22{width:22%}.column-23{width:23%}.column-24{width:24%}.column-25{width:25%}.column-26{width:26%}.column-27{width:27%}.column-28{width:28%}.column-29{width:29%}.column-30{width:30%}.column-31{width:31%}.column-32{width:32%}.column-33{width:33%}.column-34{width:34%}.column-35{width:35%}.column-36{width:36%}.column-37{width:37%}.column-38{width:38%}.column-39{width:39%}.column-40{width:40%}.column-41{width:41%}.column-42{width:42%}.column-43{width:43%}.column-44{width:44%}.column-45{width:45%}.column-46{width:46%}.column-47{width:47%}.column-48{width:48%}.column-49{width:49%}.column-50{width:50%}.column-51{width:51%}.column-52{width:52%}.column-53{width:53%}.column-54{width:54%}.column-55{width:55%}.column-56{width:56%}.column-57{width:57%}.column-58{width:58%}.column-59{width:59%}.column-60{width:60%}.column-61{width:61%}.column-62{width:62%}.column-63{width:63%}.column-64{width:64%}.column-65{width:65%}.column-66{width:66%}.column-67{width:67%}.column-68{width:68%}.column-69{width:69%}.column-70{width:70%}.column-71{width:71%}.column-72{width:72%}.column-73{width:73%}.column-74{width:74%}.column-75{width:75%}.column-76{width:76%}.column-77{width:77%}.column-78{width:78%}.column-79{width:79%}.column-80{width:80%}.column-81{width:81%}.column-82{width:82%}.column-83{width:83%}.column-84{width:84%}.column-85{width:85%}.column-86{width:86%}.column-87{width:87%}.column-88{width:88%}.column-89{width:89%}.column-90{width:90%}.column-91{width:91%}.column-92{width:92%}.column-93{width:93%}.column-94{width:94%}.column-95{width:95%}.column-96{width:96%}.column-97{width:97%}.column-98{width:98%}.column-99{width:99%}.column-100{width:100%}.draggable-row-handle{cursor:move;color:#dedede}.draggable-row-handle:hover{color:#333}tr.draggable-item-selected{background:#fff;border:2px solid #666;box-shadow:4px 2px 10px -4px rgba(0,0,0,0.55)}tr.draggable-item-selected td{border-top:none;border-bottom:none}tr.draggable-item-selected td:first-child{border-left:none}tr.draggable-item-selected td:last-child{border-right:none}.table-stripped tr.draggable-item-hover,.table-stripped tr.draggable-item-hover{background:#FEFFF2}.table-list{font-size:0.9em;margin-bottom:20px}.table-list-header{background:#fbfbfb;border:1px solid #e5e5e5;border-radius:5px 5px 0 0;line-height:35px;padding-left:3px;padding-right:3px}.table-list-header a{color:#333;font-weight:500;text-decoration:none;margin-right:10px}.table-list-header a:hover,.table-list-header a:focus{color:#767676}.table-list-header .table-list-header-count{color:#767676;display:inline-block;float:left}.table-list-header .table-list-header-menu{text-align:right}.table-list-row{padding-left:3px;padding-right:3px;border-bottom:1px solid #e5e5e5;border-right:1px solid #e5e5e5}.table-list-row.table-border-left{border-left:1px solid #e5e5e5}.table-list-row:nth-child(odd){background:#fefefe}.table-list-row:last-child{border-radius:0 0 5px 5px}.table-list-row:hover{background:#fff8dc;border-bottom:1px solid #ffeb8e;border-right:1px solid #ffeb8e}.table-list-row .table-list-title{font-weight:500;line-height:23px}.table-list-row .table-list-title.status-closed{text-decoration:line-through;margin-right:10px}.table-list-row .table-list-title.status-closed a{font-style:italic}.table-list-row .table-list-title a{color:#333;text-decoration:none}.table-list-row .table-list-title a:hover,.table-list-row .table-list-title a:focus{text-decoration:underline}.table-list-row .table-list-details{color:#999;font-weight:300;line-height:30px}.table-list-row .table-list-details span{margin-left:5px}.table-list-row .table-list-details span:first-child{margin-left:0}.table-list-row .table-list-details li{display:inline;list-style-type:none}.table-list-row .table-list-details li:after{content:', '}.table-list-row .table-list-details li:last-child:after{content:''}.table-list-row .table-list-details-with-icons{float:left}@media (max-width: 768px){.table-list-row .table-list-details-with-icons{float:none}}.table-list-row .table-list-icons{font-size:0.8em;text-align:right;line-height:30px}@media (max-width: 768px){.table-list-row .table-list-icons{text-align:left;line-height:20px}}.table-list-row .table-list-icons span{margin-left:5px}.table-list-row .table-list-icons a{text-decoration:none}.table-list-row .table-list-icons a:hover{color:#333}.table-list-row .table-list-icons a:hover i{color:#333}.table-list-category{font-size:0.9em;font-weight:500;color:#000;padding:1px 2px 1px 2px;border-radius:3px;background:#fcfcfc;border:1px solid #ccc}.table-list-category a{text-decoration:none;color:#000}.table-list-category a:hover{color:#36c}fieldset{border:1px solid #ccc;margin-top:20px}legend{font-weight:500;font-size:1.2em}label{cursor:pointer;display:block;margin-top:10px;font-weight:400}input[type="number"],input[type="date"],input[type="email"],input[type="password"],input[type="text"]:not(.input-addon-field){color:#999;border:1px solid #ccc;width:300px;max-width:95%;font-size:1em;height:25px;padding-bottom:0;font-family:sans-serif;-webkit-appearance:none;-moz-appearance:none}input[type="number"]::-webkit-input-placeholder,input[type="date"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="text"]:not(.input-addon-field)::-webkit-input-placeholder{color:#dedede}input[type="number"]::-moz-placeholder,input[type="date"]::-moz-placeholder,input[type="email"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="text"]:not(.input-addon-field)::-moz-placeholder{color:#dedede}input[type="number"]:-ms-input-placeholder,input[type="date"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="text"]:not(.input-addon-field):-ms-input-placeholder{color:#dedede}input[type="number"]:focus,input[type="date"]:focus,input[type="email"]:focus,input[type="password"]:focus,input[type="text"]:focus{color:#000;border-color:rgba(82,168,236,0.8);outline:0;box-shadow:0 0 8px rgba(82,168,236,0.6)}input[type="number"]{width:70px}input[type="text"]:not(.input-addon-field).form-numeric{width:70px}input[type="text"]:not(.input-addon-field).form-datetime,input[type="text"]:not(.input-addon-field).form-date{width:150px}input[type="text"]:not(.input-addon-field).form-input-large{width:400px}input[type="text"]:not(.input-addon-field).form-input-small{width:150px}textarea:focus{color:#000;border-color:rgba(82,168,236,0.8);outline:0;box-shadow:0 0 8px rgba(82,168,236,0.6)}textarea{padding:3px;border:1px solid #ccc;width:400px;max-width:99%;height:200px;font-family:sans-serif;font-size:1em}textarea::-webkit-input-placeholder{color:#dedede}textarea::-moz-placeholder{color:#dedede}textarea:-ms-input-placeholder{color:#dedede}select{font-size:1.0em;max-width:95%}select:focus{outline:0}select[multiple]{width:300px}.tag-autocomplete{width:400px}span.select2-container{margin-top:2px}.form-actions{padding-top:20px;clear:both}.form-required{color:red;padding-left:5px;font-weight:bold}@media (max-width: 480px){.form-required{display:none}}input.form-error,textarea.form-error{border:2px solid #b94a48}input.form-error:focus,textarea.form-error:focus{box-shadow:none;border:2px solid #b94a48}.form-errors{color:#b94a48;list-style-type:none}ul.form-errors li{margin-left:0}.form-help{font-size:0.8em;color:brown;margin-bottom:15px}.form-inline{padding:0;margin:0;border:none}.form-inline label{display:inline;padding-right:3px}.form-inline input,.form-inline select{margin:0 15px 0 0}.form-inline .form-required{display:none}.form-inline .form-actions{display:inline-block}.form-inline .js-submit-buttons-rendered{display:inline-block}.form-inline-group{display:inline}.form-columns{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:flex-start;justify-content:flex-start}.form-columns .form-column{margin-right:25px;flex-grow:1}.form-columns fieldset{margin-top:0}.form-login{max-width:350px;margin:5% auto 0}.form-login li{margin-left:25px;line-height:25px}.form-login h2{margin-bottom:30px;font-weight:bold}.reset-password{margin-top:20px;margin-bottom:20px}.reset-password a{color:#999}.input-addon{display:flex}.input-addon-field{flex:1;font-size:1em;color:#999;margin:0;-webkit-appearance:none;-moz-appearance:none}.input-addon-field:first-child{border-radius:5px 0 0 5px}.input-addon-field:last-child{border-radius:0 5px 5px 0}.input-addon-item{background-color:rgba(147,128,108,0.1);color:#666;font:inherit;font-weight:normal}.input-addon-item:first-child{border-radius:5px 0 0 5px}.input-addon-item:last-child{border-radius:0 5px 5px 0}@media (max-width: 480px){.input-addon-item .dropdown .fa-caret-down{display:none}}.input-addon-field,.input-addon-item{border:1px solid rgba(147,128,108,0.25);padding:4px 0.75em}.input-addon-field:not(:first-child),.input-addon-item:not(:first-child){border-left:0}.icon-success{color:#468847}.icon-error{color:#b94a48}.icon-fade-out{opacity:1;animation:icon-fadeout 5s linear forwards}@keyframes icon-fadeout{0%{opacity:1}100%{opacity:0}}.alert{padding:8px 35px 8px 14px;margin-top:5px;margin-bottom:5px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:4px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-normal{color:#333;background-color:#f0f0f0;border-color:#ddd}.alert ul{margin-top:10px;margin-bottom:10px}.alert li{margin-left:25px}.alert-fade-out{text-align:center;position:fixed;bottom:0;left:20%;width:60%;padding-top:5px;padding-bottom:5px;margin-bottom:0;border-width:1px 0 0;border-radius:4px 4px 0 0;z-index:9999;opacity:1;animation:fadeout 5s linear forwards}@keyframes fadeout{0%{opacity:1}100%{opacity:0}}a.btn{text-decoration:none}.btn{-webkit-appearance:none;-moz-appearance:none;font-size:1.2em;font-weight:normal;cursor:pointer;display:inline-block;border-radius:2px;padding:3px 10px;margin:0;border:1px solid #ddd;background:#f5f5f5;color:#333}.btn:hover,.btn:focus{border-color:#bbb;background:#fafafa;color:#000}.btn-red{border-color:#b0281a;background:#d14836;color:#fff}.btn-red:hover,.btn-red:focus{border-color:#b0281a;background:#c53727;color:#fff}.btn-blue{border-color:#3079ed;background:#4d90fe;color:#fff}.btn-blue:hover,.btn-blue:focus{border-color:#3079ed;background:#357ae8;color:#fff}.btn:disabled{color:#ccc;border-color:#ccc;background:#f7f7f7}.buttons-header{font-size:0.8em;margin-top:5px;margin-bottom:15px}.tooltip-arrow:after{background:#fff;border:1px solid #aaaaaa;box-shadow:0 0 5px #aaa}div.ui-tooltip{min-width:200px;max-width:600px}.tooltip-arrow{width:20px;height:10px;overflow:hidden;position:absolute}.tooltip-arrow.top{top:-10px}.tooltip-arrow.bottom{bottom:-10px}.tooltip-arrow.align-left{left:10px}.tooltip-arrow.align-right{right:10px}.tooltip-arrow:after{content:"";position:absolute;width:14px;height:14px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.tooltip-arrow.bottom:after{top:-10px}.tooltip-arrow.top:after{bottom:-10px}.tooltip-arrow.align-left:after{left:0}.tooltip-arrow.align-right:after{right:0}.tooltip-large{width:600px}.ui-tooltip-content .markdown p{margin-bottom:0}.ui-tooltip li{list-style-type:none}.tooltip .fa-info-circle{color:#999}h2 .dropdown ul{display:none}.dropdown{display:inline;position:relative}.dropdown ul{display:none}ul.dropdown-submenu-open{display:block;position:absolute;z-index:1000;min-width:285px;list-style:none;margin:3px 0 0 1px;padding:6px 0;background-color:#fff;border:1px solid #b2b2b2;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.15)}.dropdown-submenu-open li{display:block;margin:0;padding:8px 10px;font-size:0.9em;border-bottom:1px solid #f8f8f8;cursor:pointer}.dropdown-submenu-open li.no-hover{cursor:default}.dropdown-submenu-open li:last-child{border:none}.dropdown-submenu-open li:not(.no-hover):hover{background:#4078C0;color:#fff}.dropdown-submenu-open li:hover a{color:#fff}.dropdown-submenu-open a{text-decoration:none;color:#333}.dropdown-submenu-open a:focus{text-decoration:underline}.dropdown-menu-link-text,.dropdown-menu-link-icon{color:#333;text-decoration:none}.dropdown-menu-link-text:hover{text-decoration:underline}td a.dropdown-menu strong{color:#333}td a.dropdown-menu strong i{color:#333}td a.dropdown-menu i{color:#dedede}td a.dropdown-menu:hover strong{color:#555}td a.dropdown-menu:hover strong i{color:#555}td a.dropdown-menu:hover i{color:#333}.accordion-title{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEQ5RDgxQzc2RjQ5MTFFMjhEMUNENzFGRUMwRjhBRTciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NEQ5RDgxQzg2RjQ5MTFFMjhEMUNENzFGRUMwRjhBRTciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0RDlEODFDNTZGNDkxMUUyOEQxQ0Q3MUZFQzBGOEFFNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0RDlEODFDNjZGNDkxMUUyOEQxQ0Q3MUZFQzBGOEFFNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvXFWFAAAAAYSURBVHjaYvj//z8D0/Pnz/8zgFgAAQYAS5UJscReGMIAAAAASUVORK5CYII=) repeat-x scroll 0 10px}.accordion-title h3{display:inline;padding-right:5px;background:#fff}.accordion-content{margin-top:15px;margin-bottom:25px}.accordion-toggle{color:#333;text-decoration:none}.accordion-toggle:focus{color:#333}.accordion-toggle:hover{color:#999}.accordion-toggle:before{content:"\f0d7"}.accordion-collapsed{margin-bottom:25px}.accordion-collapsed .accordion-toggle:before{content:"\f0da"}.accordion-collapsed .accordion-content{display:none}#select-dropdown-menu{position:absolute;display:block;z-index:1000;min-width:160px;padding:5px 0;background:#fff;list-style:none;border:1px solid #ccc;border-radius:3px;box-shadow:0 6px 12px rgba(0,0,0,0.175);overflow:scroll}.select-dropdown-menu-item{white-space:nowrap;overflow:hidden;padding:3px 10px;color:#555;cursor:pointer;border-bottom:1px solid #f8f8f8;line-height:1.5em;font-weight:400}.select-dropdown-menu-item.active{color:#fff;background:#428bca}.select-dropdown-menu-item:last-child{border:none}.select-dropdown-input-container{position:relative;border:1px solid #ccc;border-radius:5px}.select-dropdown-input-container input.select-dropdown-input{margin:0 0 0 5px;border:none;height:23px}.select-dropdown-input-container input.select-dropdown-input:focus{border:none;box-shadow:none}.select-dropdown-input-container .select-dropdown-chevron{color:#555;position:absolute;top:4px;right:5px;cursor:pointer}.select-dropdown-input-container .select-loading-icon{color:#555;position:absolute;top:4px;right:5px}#suggest-menu{position:absolute;display:block;z-index:1000;min-width:160px;padding:5px 0;background:#fff;list-style:none;border:1px solid #ccc;border-radius:3px;box-shadow:0 6px 12px rgba(0,0,0,0.175)}.suggest-menu-item{white-space:nowrap;padding:3px 10px;color:#333;font-weight:bold;cursor:pointer}.suggest-menu-item.active{color:#fff;background:#428bca}.suggest-menu-item.active small{color:#fff}.suggest-menu-item small{color:#999;font-weight:normal}#modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.9);overflow:auto;z-index:100}#modal-box{position:fixed;max-height:calc(100% - 30px);top:2%;left:50%;transform:translateX(-50%);background:#fff;overflow:auto;border-radius:5px}#modal-content{padding:0 5px 5px}#modal-header{text-align:right;padding-right:5px}#modal-close-button{color:#333}#modal-close-button:hover{color:#b94a48}.pagination{text-align:center}.pagination-showing{margin-right:5px;padding-right:5px;border-right:1px solid #999}.pagination-next{margin-left:5px}.pagination-previous{margin-right:5px}header{box-sizing:border-box;display:flex;flex-wrap:wrap;margin-top:5px;margin-bottom:5px;border-bottom:1px solid #dedede}header>*{box-sizing:border-box}header>*{width:1%}header .menus-container{width:10%}@media (min-width: 768px) and (max-width: 1150px){header .menus-container{width:15%}}@media (max-width: 768px){header .menus-container{width:20%;order:2}header .menus-container .header-creation-menu{display:none}}header .board-selector-container{width:25%}@media (min-width: 768px) and (max-width: 1150px){header .board-selector-container{width:20%}}@media (max-width: 768px){header .board-selector-container{width:80%;order:1;margin-bottom:5px}}header .title-container{width:65%}@media (max-width: 768px){header .title-container{width:100%;order:3}}header h1{font-size:1.5em}header h1 .tooltip{opacity:0.3;font-size:0.7em}a i.web-notification-icon{color:#36c}a i.web-notification-icon:focus,a i.web-notification-icon:hover{color:#000}.logo a{opacity:0.5;color:#d40000;text-decoration:none}.logo span{color:#333}.logo a:hover{opacity:0.8;color:#333}.logo a:focus span,.logo a:hover span{color:#d40000}.page-header{margin-bottom:20px}.page-header .dropdown{padding-right:10px}.page-header h2{margin:0;padding:0;font-weight:bold;border-bottom:1px dotted #ccc}.page-header h2 a{color:#333;text-decoration:none}.page-header h2 a:focus,.page-header h2 a:hover{color:#999}.page-header ul{text-align:left;margin-top:5px;display:inline-block}.page-header li{display:inline;padding-right:15px}@media (max-width: 480px){.page-header li{display:block;line-height:1.5em}}.page-header li.active a{color:#333;text-decoration:none;font-weight:bold}.page-header li.active a:hover,.page-header li.active a:focus{text-decoration:underline}.menu-inline{margin-bottom:5px}.menu-inline li{display:inline;padding-right:15px}.menu-inline li .active a{font-weight:bold;color:#000;text-decoration:none}.sidebar-container{box-sizing:border-box;display:flex;flex-wrap:wrap}.sidebar-container>*{box-sizing:border-box}.sidebar-container>*{width:1%}.sidebar-content{padding-left:10px;width:82%}@media (max-width: 480px){.sidebar-content{width:100%}}.sidebar{max-width:240px;min-width:190px;width:18%}@media (max-width: 480px){.sidebar{width:100%;max-width:99%;min-width:0}}.sidebar h2{margin-top:0}.sidebar>ul a{text-decoration:none;color:#999;font-weight:300}.sidebar>ul a:hover{color:#333}.sidebar>ul li{list-style-type:none;line-height:35px;border-bottom:1px dotted #efefef;padding-left:13px}.sidebar>ul li:hover{border-left:5px solid #555;padding-left:8px}.sidebar>ul li.active{border-left:5px solid #333;padding-left:8px}.sidebar>ul li.active a{color:#333;font-weight:bold}.sidebar-icons>ul li{padding-left:0}.sidebar-icons>ul li:hover,.sidebar-icons>ul li.active{padding-left:0;border-left:none}.sidebar>ul li.active a:focus,.sidebar>ul li.active a:hover{color:#555}.sidebar>ul li:last-child{margin-bottom:15px}.avatar img{vertical-align:bottom}.avatar-left{float:left;margin-right:10px}.avatar-inline{display:inline-block;margin-right:3px}.avatar-48 img,.avatar-48 div{border-radius:30px}.avatar-48 .avatar-letter{line-height:48px;width:48px;font-size:25px}.avatar-20 img,.avatar-20 div{border-radius:10px}.avatar-20 .avatar-letter{line-height:20px;width:20px;font-size:11px}.avatar-letter{color:#fff;text-align:center}#file-dropzone,#screenshot-zone{position:relative;border:2px dashed #ccc;width:99%;height:250px;overflow:auto}#file-dropzone-inner,#screenshot-inner{position:absolute;left:0;bottom:48%;width:100%;text-align:center;color:#aaa}#screenshot-zone.screenshot-pasted{border:2px solid #333}#file-list{margin:20px}#file-list li{list-style-type:none;padding-top:8px;padding-bottom:8px;border-bottom:1px dotted #ddd;width:95%}#file-list li .file-error{font-weight:bold;color:#b94a48}.file-thumbnails{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:flex-start;justify-content:flex-start}.file-thumbnail{width:250px;border:1px solid #efefef;border-radius:5px;margin-bottom:20px;box-shadow:4px 2px 10px -6px rgba(0,0,0,0.55);margin-right:15px}.file-thumbnail img{cursor:pointer;border-top-left-radius:5px;border-top-right-radius:5px}.file-thumbnail img:hover{opacity:0.5}.file-thumbnail-content{padding-left:8px;padding-right:8px}.file-thumbnail-title{font-weight:700;font-size:0.9em;color:#555;overflow:hidden;text-overflow:ellipsis}.file-thumbnail-description{font-size:0.8em;color:#999;margin-top:8px;margin-bottom:5px}.file-viewer{position:relative}.file-viewer img{max-width:95%;max-height:85%;margin-top:10px}.color-picker{width:180px}.color-picker-option{height:25px}.color-picker-square{display:inline-block;width:18px;height:18px;margin-right:5px;border:1px solid #000}.color-picker-label{display:inline-block;vertical-align:bottom;padding-bottom:3px}.filter-box{max-width:800px}.action-menu{color:#333;text-decoration:none}.action-menu:hover,.action-menu:focus{text-decoration:underline}.js-project-creation-options{max-width:500px;border-left:3px dotted #efefef;margin-top:20px;padding-left:15px;padding-bottom:5px;padding-top:5px}.project-overview-columns{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;margin-bottom:20px;font-size:1.4em}@media (max-width: 480px){.project-overview-columns{display:block}}.project-overview-column{text-align:center;margin-right:3%;margin-top:5px;padding:3px 15px 3px 15px;border:1px dashed #ddd}@media (max-width: 480px){.project-overview-column{text-align:left}}.project-overview-column small{color:#999}.project-overview-column strong{color:#555;display:block}@media (max-width: 480px){.project-overview-column strong{display:inline}}.project-header{box-sizing:border-box;display:flex;flex-wrap:wrap;margin-bottom:8px}.project-header>*{box-sizing:border-box}.project-header>*{width:1%}.project-header .dropdown-component{margin-top:4px;width:5%}@media (min-width: 768px) and (max-width: 1150px){.project-header .dropdown-component{width:8%}}@media (max-width: 768px){.project-header .dropdown-component{width:100%}}.project-header .views-switcher-component{margin-top:4px;width:38%}@media (max-width: 1300px){.project-header .views-switcher-component{width:45%}}@media (min-width: 768px) and (max-width: 1150px){.project-header .views-switcher-component{width:92%}}@media (max-width: 768px){.project-header .views-switcher-component{margin-top:0;width:100%}}.project-header .filter-box-component{margin:0;width:55%}@media (max-width: 1300px){.project-header .filter-box-component{width:50%}}@media (min-width: 768px) and (max-width: 1150px){.project-header .filter-box-component{width:100%;margin-top:10px}.project-header .filter-box-component .filter-box{max-width:100%}}@media (max-width: 768px){.project-header .filter-box-component{width:100%;margin-top:10px}.project-header .filter-box-component .filter-box{max-width:100%}}.project-header .filter-box-component form{margin:0}.views{display:inline-block;margin-right:10px;font-size:0.9em}@media (max-width: 560px){.views{width:100%}}@media (max-width: 768px){.views{margin-top:10px;font-size:1em}}@media (max-width: 480px){.views{margin-top:5px}}.views li{white-space:nowrap;background:#fafafa;border:1px solid #ddd;border-right:none;padding:4px 8px;display:inline}@media (max-width: 560px){.views li{display:block;margin-top:5px;border-radius:5px;border:1px solid #ddd}}.views li.active a{font-weight:bold;color:#000;text-decoration:none}.views li:first-child{border-top-left-radius:5px;border-bottom-left-radius:5px}.views li:last-child{border-right:1px solid #ddd;border-top-right-radius:5px;border-bottom-right-radius:5px}.views a{color:#555;text-decoration:none}.views a:hover{color:#333;text-decoration:underline}.dashboard-project-stats small{margin-right:10px;color:#999}.dashboard-table-link{font-weight:bold;color:#000;text-decoration:none}.dashboard-table-link:focus,.dashboard-table-link:hover{color:#999}.public-board{margin-top:5px}.public-task{max-width:800px;margin:5px auto 0}#board-container{overflow-x:auto}#board{table-layout:fixed;margin-bottom:0}#board th.board-column-header{width:240px}#board td{vertical-align:top}.board-container-compact{overflow-x:initial}@media all and (-ms-high-contrast: active), (-ms-high-contrast: none){.board-container-compact #board{table-layout:auto}}#board th.board-column-header.board-column-compact{width:initial}.board-column-collapsed{display:none}td.board-column-task-collapsed{font-weight:bold;background-color:#fbfbfb}#board th.board-column-header-collapsed{width:28px;min-width:28px;text-align:center;overflow:hidden}.board-rotation-wrapper{position:relative;padding:8px 4px;min-height:150px;overflow:hidden}.board-rotation{white-space:nowrap;-webkit-backface-visibility:hidden;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.board-column-title .dropdown-menu{text-decoration:none}.board-add-icon{float:left;padding:0 5px}.board-add-icon i{text-decoration:none;color:#36c;font-size:1.4em}.board-add-icon i:focus,.board-add-icon i:hover{text-decoration:none;color:red}.board-column-header-task-count{color:#999;font-weight:normal}a.board-swimlane-toggle{text-decoration:none}a.board-swimlane-toggle:hover,a.board-swimlane-toggle:focus{color:#000;text-decoration:none;border:none}.board-task-list{min-height:60px}.board-task-list-limit{background-color:#DF5353}.draggable-item{cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none}.draggable-placeholder{border:2px dashed #000;background:#fafafa;height:70px;margin-bottom:10px}div.draggable-item-selected{border:1px solid #000}.task-board-sort-handle{float:left;padding-right:5px}.task-board{position:relative;margin-bottom:4px;border:1px solid #000;padding:2px;word-wrap:break-word;font-size:0.9em;border-radius:6px}div.task-board-recent{border-width:2px}div.task-board-status-closed{user-select:none;border:1px dotted #555}.task-board a{color:#000;text-decoration:none}.task-board-collapsed{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.task-board-title{margin-top:5px;margin-bottom:8px}.task-board-title a:hover{text-decoration:underline}.task-board-saving-state{opacity:0.3}.task-board-saving-icon{position:absolute;margin:auto;width:100%;text-align:center;color:#000}.task-board-avatars{text-align:right;float:right}.task-board-change-assignee{cursor:pointer}.task-board-change-assignee:hover{opacity:0.6}.task-list-avatars{display:inline-block;float:left}@media (max-width: 768px){.task-list-avatars{float:none;display:block}}.task-list-avatars .task-avatar-assignee{font-weight:300;color:#999}.task-list-avatars:hover .task-avatar-assignee{font-weight:400;color:#000}.task-board-icons,.task-list-icons{font-size:0.8em;text-align:right}.task-board-icons a,.task-list-icons a{text-decoration:none}.task-board-icons a:hover,.task-list-icons a:hover{color:#333}.task-board-icons a:hover i,.task-list-icons a:hover i{color:#333}.task-board-icons .task-score,.task-list-icons .task-score{font-weight:bold}.task-board-icons .flag-milestone,.task-list-icons .flag-milestone{color:green}.task-board-icons{margin-top:7px}.task-board-icons a{opacity:0.5}.task-board-icons span{opacity:0.5;margin-left:4px}.task-board-icons a:hover{opacity:1.0;font-weight:bold}.task-board-icons .task-board-icons-row{line-height:22px}.task-list-icons{line-height:22px}.task-list-icons a,.task-list-icons span,.task-list-icons i{color:#999;opacity:1.0}.task-list-icons span{margin-left:5px}@media (max-width: 768px){.task-list-icons{text-align:left}}.task-icon-age{display:inline-block}span.task-icon-age-total{border:1px solid #e5e5e5;padding:1px 3px 1px 3px;border-top-left-radius:3px;border-bottom-left-radius:3px}span.task-icon-age-column{border:1px solid #e5e5e5;border-left:none;margin-left:-5px;padding:1px 3px 1px 3px;border-top-right-radius:3px;border-bottom-right-radius:3px}.task-board span.task-icon-age-total,.task-board span.task-icon-age-column{border-color:#666}.task-board-category-container{text-align:right;margin-top:8px;margin-bottom:8px}.task-board-category{border:1px solid #555;font-size:0.9em;font-weight:500;color:#000;padding:1px 3px 1px 2px;border-radius:3px}.task-board-category a:hover{text-decoration:underline}.task-date{font-weight:500;color:#000}span.task-date-today{opacity:1.0;color:#36c}span.task-date-overdue{opacity:1.0;color:#b94a48}.task-tags li{display:inline-block;margin:3px 3px 0 0;padding:1px 3px 1px 3px;color:#333;border:1px solid #333;border-radius:4px}.task-summary-container .task-tags{margin-top:10px}.task-list-tag{background:#ffeb8e;border-color:#333}#task-summary{margin-bottom:15px}#task-summary h2{color:#555;font-size:1.6em;margin-top:0;padding-top:0}.task-summary-container{border:2px solid #000;border-radius:8px;padding:15px}.task-summary-columns{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}@media (max-width: 480px){.task-summary-columns{display:block}}.task-summary-column{color:#333}.task-summary-column span{color:#555}.task-summary-column li{line-height:23px}#external-task-view{padding:10px;margin-top:10px;margin-bottom:10px;border:1px dotted #ccc}.task-form-container{box-sizing:border-box;display:flex;flex-wrap:wrap}.task-form-container>*{box-sizing:border-box}.task-form-container>*{width:1%}.task-form-main-column{width:60%}@media (max-width: 1000px){.task-form-main-column{width:100%}}.task-form-main-column input[type="text"]{width:700px;max-width:99%}.task-form-secondary-column{max-width:250px;min-width:200px;max-height:600px;padding-left:10px;overflow:auto;width:20%}@media (max-width: 1000px){.task-form-secondary-column{width:100%;max-width:99%;max-height:none}}@media (max-width: 768px){.task-form-secondary-column{padding-left:0}}.task-form-secondary-column label:first-child{margin-top:0}@media (max-width: 1000px){.task-form-secondary-column label:first-child{margin-top:10px}}.task-form-bottom{width:100%}.comment-sorting{text-align:right}.comment-sorting a{color:#555;font-weight:normal;text-decoration:none}.comment-sorting a:hover{color:#999}.comment{padding:5px;margin-bottom:15px}.comment-title{border-bottom:1px dotted #eee;margin-left:55px}.comment-date{color:#999;font-weight:200}.comment-actions{text-align:right}.comment-content{margin-left:55px}.comments .text-editor textarea{height:90px}.comments .text-editor .text-editor-preview-area{height:90px}.comments .comment-highlighted{background-color:#fff8dc;border:2px solid #ffeb8e}.comments .comment-highlighted:hover{background-color:#fff8dc}.comments .comment:hover{background:#fff8dc}.comments .comment:nth-child(even):not(.comment-highlighted){background:#fbfbfb}.comments .comment:nth-child(even):not(.comment-highlighted):hover{background:#fff8dc}.subtask-cell{padding:4px 10px;border-top:1px dotted #dedede;border-left:1px dotted #dedede;display:table-cell;vertical-align:middle}.subtask-cell a{color:#333;text-decoration:none}.subtask-cell a:hover,.subtask-cell a:focus{color:#36c}.subtask-cell:first-child{border-left:none}@media (max-width: 768px){.subtask-cell{width:90%;display:block;border-left:none}}.task-list-subtasks{display:table;width:100%}@media (max-width: 768px){.task-list-subtasks{display:block}}.task-list-subtask{display:table-row}@media (max-width: 768px){.task-list-subtask{display:block}}@media (max-width: 768px){.subtask-assignee,.subtask-time-tracking-cell{display:none}}.task-links-table td{vertical-align:middle}.task-links-task-count{color:#999;font-weight:normal}.task-link-closed{text-decoration:line-through}.text-editor{margin-top:10px}.text-editor a{font-size:1em;color:#999;text-decoration:none;margin-right:10px}.text-editor a:hover{color:#36c}.text-editor .text-editor-preview-area{border:1px solid #dedede;width:700px;max-width:99%;height:250px;overflow:auto;padding:2px}.text-editor textarea{width:700px;max-width:98%;height:250px}.markdown{line-height:1.4em}.markdown h1{margin-top:5px;margin-bottom:10px;font-weight:bold}.markdown h2{font-weight:bold}.markdown p{margin-bottom:10px}.markdown ol,.markdown ul{margin-left:25px;margin-top:10px;margin-bottom:10px}.markdown pre{background:#fbfbfb;padding:10px;border-radius:5px;border:1px solid #ddd;overflow:auto;color:#555}.markdown blockquote{font-style:italic;border-left:3px solid #ddd;padding-left:10px;margin-bottom:10px;margin-left:20px}.markdown img{display:block;max-width:80%;margin-top:10px}.documentation{margin:0 auto;padding:20px;max-width:850px;background:#fefefe;border:1px solid #ccc;border-radius:5px;color:#555}.documentation img{border:1px solid #333}.documentation h1{text-decoration:none;margin-bottom:30px}.documentation h2{text-decoration:none;border-bottom:1px solid #ccc;margin-bottom:25px}.documentation li{line-height:30px}.panel{border-radius:4px;padding:8px 35px 8px 10px;margin-top:10px;margin-bottom:15px;border:1px solid #ddd;color:#333;background-color:#fcfcfc;overflow:auto}.panel li{list-style-type:square;margin-left:20px;line-height:1.35em}.activity-event{margin-bottom:15px;padding:10px}.activity-event:nth-child(even){background:#fafafa}.activity-event:hover{background:#fff8dc}.activity-date{margin-left:10px;font-weight:normal;color:#999}.activity-content{margin-left:55px}.activity-title{font-weight:bold;color:#000;border-bottom:1px dotted #efefef}.activity-description{color:#555;margin-top:10px}@media (max-width: 480px){.activity-description{overflow:auto}}.activity-description li{list-style-type:circle}.activity-description ul{margin-top:10px;margin-left:20px}div.ganttview-hzheader-month,div.ganttview-hzheader-day,div.ganttview-vtheader,div.ganttview-vtheader-item-name,div.ganttview-vtheader-series,div.ganttview-grid,div.ganttview-grid-row-cell{float:left}div.ganttview-hzheader-month,div.ganttview-hzheader-day{text-align:center}div.ganttview-grid-row-cell.last,div.ganttview-hzheader-day.last,div.ganttview-hzheader-month.last{border-right:none}div.ganttview{border:1px solid #999}div.ganttview-hzheader-month{width:60px;height:20px;border-right:1px solid #d0d0d0;line-height:20px;overflow:hidden}div.ganttview-hzheader-day{width:20px;height:20px;border-right:1px solid #f0f0f0;border-top:1px solid #d0d0d0;line-height:20px;color:#555}div.ganttview-vtheader{margin-top:41px;width:400px;overflow:hidden;background-color:#fff}div.ganttview-vtheader-item{color:#555}div.ganttview-vtheader-series-name{width:400px;height:31px;line-height:31px;padding-left:3px;border-top:1px solid #d0d0d0;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}div.ganttview-vtheader-series-name a{color:#555;text-decoration:none}div.ganttview-vtheader-series-name a:hover{color:#333;text-decoration:underline}div.ganttview-vtheader-series-name a i{color:#000}div.ganttview-vtheader-series-name a:hover i{color:#555}div.ganttview-slide-container{overflow:auto;border-left:1px solid #999}div.ganttview-grid-row-cell{width:20px;height:31px;border-right:1px solid #f0f0f0;border-top:1px solid #f0f0f0}div.ganttview-grid-row-cell.ganttview-weekend{background-color:#fafafa}div.ganttview-blocks{margin-top:40px}div.ganttview-block-container{height:28px;padding-top:4px}div.ganttview-block{position:relative;height:25px;background-color:#E5ECF9;border:1px solid #c0c0c0;border-radius:3px}.ganttview-block-movable{cursor:move}div.ganttview-block-not-defined{border-color:#000;background-color:#000}div.ganttview-block-text{position:absolute;height:12px;font-size:0.7em;color:#999;padding:2px 3px}div.ganttview-block div.ui-resizable-handle.ui-resizable-s{bottom:-0}.user-mention-link{font-weight:bold;color:#000;text-decoration:none}.user-mention-link:hover{color:#555}.image-slideshow-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.95);overflow:auto;z-index:100}.image-slideshow-overlay img{display:block;margin:auto}.image-slideshow-overlay figcaption{color:#fff;opacity:0.7;position:absolute;bottom:5px;right:15px}.slideshow-icon{color:#fff;position:absolute;font-size:2.5em;opacity:0.6}.slideshow-icon:hover{opacity:0.9;cursor:pointer}.slideshow-previous-icon{left:10px;top:45%}.slideshow-next-icon{right:10px;top:45%}.slideshow-close-icon{right:10px;top:10px;font-size:1.4em}.slideshow-download-icon{left:10px;bottom:10px;font-size:1.3em} +h1,li,ul,ol,table,tr,td,th,p,blockquote,body{margin:0;padding:0;font-size:100%}body{margin-left:10px;margin-right:10px;padding-bottom:10px;color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;text-rendering:optimizeLegibility}small{font-size:0.8em}hr{border:0;height:0;border-top:1px solid rgba(0,0,0,0.1);border-bottom:1px solid rgba(255,255,255,0.3)}.margin-top{margin-top:20px}.margin-bottom{margin-bottom:20px}.pull-right{text-align:right}ul.no-bullet li{list-style-type:none;margin-left:0}#app-loading-icon{position:fixed;right:3px;bottom:3px}.assign-me{vertical-align:bottom}a{color:#36c;border:none}a:focus{outline:0;color:#DF5353;text-decoration:none}a:hover{color:#333;text-decoration:none}a .fa{padding-right:3px;text-decoration:none;color:#333}h1,h2,h3{font-weight:normal;color:#333}h1{font-size:1.5em}h2{font-size:1.4em;margin-bottom:10px}h3{margin-top:10px;font-size:1.2em}table{width:100%;border-collapse:collapse;border-spacing:0;margin-bottom:20px}table.table-fixed{table-layout:fixed;white-space:nowrap}table.table-fixed th{overflow:hidden}table.table-fixed td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}table.table-small{font-size:0.8em}table.table-striped tr:nth-child(odd){background:#fefefe}@media (max-width: 768px){table.table-scrolling{overflow-x:auto;display:inline-block;vertical-align:top;max-width:100%;white-space:nowrap}}table th{text-align:left;padding:0.5em 3px;border:1px solid #eee;background:#fbfbfb}table th a{text-decoration:none;color:#333}table th a:focus,table th a:hover{text-decoration:underline}table td{border:1px solid #eee;padding:0.5em 3px;vertical-align:top}table td li{margin-left:20px}.column-1{width:1%}.column-2{width:2%}.column-3{width:3%}.column-4{width:4%}.column-5{width:5%}.column-6{width:6%}.column-7{width:7%}.column-8{width:8%}.column-9{width:9%}.column-10{width:10%}.column-11{width:11%}.column-12{width:12%}.column-13{width:13%}.column-14{width:14%}.column-15{width:15%}.column-16{width:16%}.column-17{width:17%}.column-18{width:18%}.column-19{width:19%}.column-20{width:20%}.column-21{width:21%}.column-22{width:22%}.column-23{width:23%}.column-24{width:24%}.column-25{width:25%}.column-26{width:26%}.column-27{width:27%}.column-28{width:28%}.column-29{width:29%}.column-30{width:30%}.column-31{width:31%}.column-32{width:32%}.column-33{width:33%}.column-34{width:34%}.column-35{width:35%}.column-36{width:36%}.column-37{width:37%}.column-38{width:38%}.column-39{width:39%}.column-40{width:40%}.column-41{width:41%}.column-42{width:42%}.column-43{width:43%}.column-44{width:44%}.column-45{width:45%}.column-46{width:46%}.column-47{width:47%}.column-48{width:48%}.column-49{width:49%}.column-50{width:50%}.column-51{width:51%}.column-52{width:52%}.column-53{width:53%}.column-54{width:54%}.column-55{width:55%}.column-56{width:56%}.column-57{width:57%}.column-58{width:58%}.column-59{width:59%}.column-60{width:60%}.column-61{width:61%}.column-62{width:62%}.column-63{width:63%}.column-64{width:64%}.column-65{width:65%}.column-66{width:66%}.column-67{width:67%}.column-68{width:68%}.column-69{width:69%}.column-70{width:70%}.column-71{width:71%}.column-72{width:72%}.column-73{width:73%}.column-74{width:74%}.column-75{width:75%}.column-76{width:76%}.column-77{width:77%}.column-78{width:78%}.column-79{width:79%}.column-80{width:80%}.column-81{width:81%}.column-82{width:82%}.column-83{width:83%}.column-84{width:84%}.column-85{width:85%}.column-86{width:86%}.column-87{width:87%}.column-88{width:88%}.column-89{width:89%}.column-90{width:90%}.column-91{width:91%}.column-92{width:92%}.column-93{width:93%}.column-94{width:94%}.column-95{width:95%}.column-96{width:96%}.column-97{width:97%}.column-98{width:98%}.column-99{width:99%}.column-100{width:100%}.draggable-row-handle{cursor:move;color:#dedede}.draggable-row-handle:hover{color:#333}tr.draggable-item-selected{background:#fff;border:2px solid #666;box-shadow:4px 2px 10px -4px rgba(0,0,0,0.55)}tr.draggable-item-selected td{border-top:none;border-bottom:none}tr.draggable-item-selected td:first-child{border-left:none}tr.draggable-item-selected td:last-child{border-right:none}.table-stripped tr.draggable-item-hover,.table-stripped tr.draggable-item-hover{background:#FEFFF2}.table-list{font-size:0.9em;margin-bottom:20px}.table-list-header{background:#fbfbfb;border:1px solid #e5e5e5;border-radius:5px 5px 0 0;line-height:35px;padding-left:3px;padding-right:3px}.table-list-header a{color:#333;font-weight:500;text-decoration:none;margin-right:10px}.table-list-header a:hover,.table-list-header a:focus{color:#767676}.table-list-header .table-list-header-count{color:#767676;display:inline-block;float:left}.table-list-header .table-list-header-menu{text-align:right}.table-list-row{padding-left:3px;padding-right:3px;border-bottom:1px solid #e5e5e5;border-right:1px solid #e5e5e5}.table-list-row.table-border-left{border-left:1px solid #e5e5e5}.table-list-row:nth-child(odd){background:#fefefe}.table-list-row:last-child{border-radius:0 0 5px 5px}.table-list-row:hover{background:#fff8dc;border-bottom:1px solid #ffeb8e;border-right:1px solid #ffeb8e}.table-list-row .table-list-title{font-weight:500;line-height:23px}.table-list-row .table-list-title.status-closed{text-decoration:line-through;margin-right:10px}.table-list-row .table-list-title.status-closed a{font-style:italic}.table-list-row .table-list-title a{color:#333;text-decoration:none}.table-list-row .table-list-title a:hover,.table-list-row .table-list-title a:focus{text-decoration:underline}.table-list-row .table-list-details{color:#999;font-weight:300;line-height:30px}.table-list-row .table-list-details span{margin-left:5px}.table-list-row .table-list-details span:first-child{margin-left:0}.table-list-row .table-list-details li{display:inline;list-style-type:none}.table-list-row .table-list-details li:after{content:', '}.table-list-row .table-list-details li:last-child:after{content:''}.table-list-row .table-list-details-with-icons{float:left}@media (max-width: 768px){.table-list-row .table-list-details-with-icons{float:none}}.table-list-row .table-list-icons{font-size:0.8em;text-align:right;line-height:30px}@media (max-width: 768px){.table-list-row .table-list-icons{text-align:left;line-height:20px}}.table-list-row .table-list-icons span{margin-left:5px}.table-list-row .table-list-icons a{text-decoration:none}.table-list-row .table-list-icons a:hover{color:#333}.table-list-row .table-list-icons a:hover i{color:#333}.table-list-category{font-size:0.9em;font-weight:500;color:#000;padding:1px 2px 1px 2px;border-radius:3px;background:#fcfcfc;border:1px solid #ccc}.table-list-category a{text-decoration:none;color:#000}.table-list-category a:hover{color:#36c}fieldset{border:1px solid #ccc;margin-top:20px}legend{font-weight:500;font-size:1.2em}label{cursor:pointer;display:block;margin-top:10px;font-weight:400}input[type="number"],input[type="date"],input[type="email"],input[type="password"],input[type="text"]:not(.input-addon-field){color:#999;border:1px solid #ccc;width:300px;max-width:95%;font-size:1em;height:25px;padding-bottom:0;font-family:sans-serif;-webkit-appearance:none;-moz-appearance:none}input[type="number"]::-webkit-input-placeholder,input[type="date"]::-webkit-input-placeholder,input[type="email"]::-webkit-input-placeholder,input[type="password"]::-webkit-input-placeholder,input[type="text"]:not(.input-addon-field)::-webkit-input-placeholder{color:#dedede}input[type="number"]::-moz-placeholder,input[type="date"]::-moz-placeholder,input[type="email"]::-moz-placeholder,input[type="password"]::-moz-placeholder,input[type="text"]:not(.input-addon-field)::-moz-placeholder{color:#dedede}input[type="number"]:-ms-input-placeholder,input[type="date"]:-ms-input-placeholder,input[type="email"]:-ms-input-placeholder,input[type="password"]:-ms-input-placeholder,input[type="text"]:not(.input-addon-field):-ms-input-placeholder{color:#dedede}input[type="number"]:focus,input[type="date"]:focus,input[type="email"]:focus,input[type="password"]:focus,input[type="text"]:focus{color:#000;border-color:rgba(82,168,236,0.8);outline:0;box-shadow:0 0 8px rgba(82,168,236,0.6)}input[type="number"]{width:70px}input[type="text"]:not(.input-addon-field).form-numeric{width:70px}input[type="text"]:not(.input-addon-field).form-datetime,input[type="text"]:not(.input-addon-field).form-date{width:150px}input[type="text"]:not(.input-addon-field).form-input-large{width:400px}input[type="text"]:not(.input-addon-field).form-input-small{width:150px}textarea:focus{color:#000;border-color:rgba(82,168,236,0.8);outline:0;box-shadow:0 0 8px rgba(82,168,236,0.6)}textarea{padding:3px;border:1px solid #ccc;width:400px;max-width:99%;height:200px;font-family:sans-serif;font-size:1em}textarea::-webkit-input-placeholder{color:#dedede}textarea::-moz-placeholder{color:#dedede}textarea:-ms-input-placeholder{color:#dedede}select{font-size:1.0em;max-width:95%}select:focus{outline:0}select[multiple]{width:300px}.tag-autocomplete{width:400px}span.select2-container{margin-top:2px}.form-actions{padding-top:20px;clear:both}.form-required{color:red;padding-left:5px;font-weight:bold}@media (max-width: 480px){.form-required{display:none}}input.form-error,textarea.form-error{border:2px solid #b94a48}input.form-error:focus,textarea.form-error:focus{box-shadow:none;border:2px solid #b94a48}.form-errors{color:#b94a48;list-style-type:none}ul.form-errors li{margin-left:0}.form-help{font-size:0.8em;color:brown;margin-bottom:15px}.form-inline{padding:0;margin:0;border:none}.form-inline label{display:inline;padding-right:3px}.form-inline input,.form-inline select{margin:0 15px 0 0}.form-inline .form-required{display:none}.form-inline .form-actions{display:inline-block}.form-inline .js-submit-buttons-rendered{display:inline-block}.form-inline-group{display:inline}.form-columns{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:flex-start;justify-content:flex-start}.form-columns .form-column{margin-right:25px;flex-grow:1}.form-columns fieldset{margin-top:0}.form-login{max-width:350px;margin:5% auto 0}.form-login li{margin-left:25px;line-height:25px}.form-login h2{margin-bottom:30px;font-weight:bold}.reset-password{margin-top:20px;margin-bottom:20px}.reset-password a{color:#999}.input-addon{display:flex}.input-addon-field{flex:1;font-size:1em;color:#999;margin:0;-webkit-appearance:none;-moz-appearance:none}.input-addon-field:first-child{border-radius:5px 0 0 5px}.input-addon-field:last-child{border-radius:0 5px 5px 0}.input-addon-item{background-color:rgba(147,128,108,0.1);color:#666;font:inherit;font-weight:normal}.input-addon-item:first-child{border-radius:5px 0 0 5px}.input-addon-item:last-child{border-radius:0 5px 5px 0}@media (max-width: 480px){.input-addon-item .dropdown .fa-caret-down{display:none}}.input-addon-field,.input-addon-item{border:1px solid rgba(147,128,108,0.25);padding:4px 0.75em}.input-addon-field:not(:first-child),.input-addon-item:not(:first-child){border-left:0}.icon-success{color:#468847}.icon-error{color:#b94a48}.icon-fade-out{opacity:1;animation:icon-fadeout 5s linear forwards}@keyframes icon-fadeout{0%{opacity:1}100%{opacity:0}}.alert{padding:8px 35px 8px 14px;margin-top:5px;margin-bottom:5px;color:#c09853;background-color:#fcf8e3;border:1px solid #fbeed5;border-radius:4px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-normal{color:#333;background-color:#f0f0f0;border-color:#ddd}.alert ul{margin-top:10px;margin-bottom:10px}.alert li{margin-left:25px}.alert-fade-out{text-align:center;position:fixed;bottom:0;left:20%;width:60%;padding-top:5px;padding-bottom:5px;margin-bottom:0;border-width:1px 0 0;border-radius:4px 4px 0 0;z-index:9999;opacity:1;animation:fadeout 5s linear forwards}@keyframes fadeout{0%{opacity:1}100%{opacity:0}}a.btn{text-decoration:none}.btn{-webkit-appearance:none;-moz-appearance:none;font-size:1.2em;font-weight:normal;cursor:pointer;display:inline-block;border-radius:2px;padding:3px 10px;margin:0;border:1px solid #ddd;background:#f5f5f5;color:#333}.btn:hover,.btn:focus{border-color:#bbb;background:#fafafa;color:#000}.btn-red{border-color:#b0281a;background:#d14836;color:#fff}.btn-red:hover,.btn-red:focus{border-color:#b0281a;background:#c53727;color:#fff}.btn-blue{border-color:#3079ed;background:#4d90fe;color:#fff}.btn-blue:hover,.btn-blue:focus{border-color:#3079ed;background:#357ae8;color:#fff}.btn:disabled{color:#ccc;border-color:#ccc;background:#f7f7f7}.buttons-header{font-size:0.8em;margin-top:5px;margin-bottom:15px}.tooltip-arrow:after{background:#fff;border:1px solid #aaaaaa;box-shadow:0 0 5px #aaa}div.ui-tooltip{min-width:200px;max-width:600px}.tooltip-arrow{width:20px;height:10px;overflow:hidden;position:absolute}.tooltip-arrow.top{top:-10px}.tooltip-arrow.bottom{bottom:-10px}.tooltip-arrow.align-left{left:10px}.tooltip-arrow.align-right{right:10px}.tooltip-arrow:after{content:"";position:absolute;width:14px;height:14px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.tooltip-arrow.bottom:after{top:-10px}.tooltip-arrow.top:after{bottom:-10px}.tooltip-arrow.align-left:after{left:0}.tooltip-arrow.align-right:after{right:0}.tooltip-large{width:600px}.ui-tooltip-content .markdown p{margin-bottom:0}.ui-tooltip li{list-style-type:none}.tooltip .fa-info-circle{color:#999}h2 .dropdown ul{display:none}.dropdown{display:inline;position:relative}.dropdown ul{display:none}ul.dropdown-submenu-open{display:block;position:absolute;z-index:1000;min-width:285px;list-style:none;margin:3px 0 0 1px;padding:6px 0;background-color:#fff;border:1px solid #b2b2b2;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,0.15)}.dropdown-submenu-open li{display:block;margin:0;padding:8px 10px;font-size:0.9em;border-bottom:1px solid #f8f8f8;cursor:pointer}.dropdown-submenu-open li.no-hover{cursor:default}.dropdown-submenu-open li:last-child{border:none}.dropdown-submenu-open li:not(.no-hover):hover{background:#4078C0;color:#fff}.dropdown-submenu-open li:hover a{color:#fff}.dropdown-submenu-open a{text-decoration:none;color:#333}.dropdown-submenu-open a:focus{text-decoration:underline}.dropdown-menu-link-text,.dropdown-menu-link-icon{color:#333;text-decoration:none}.dropdown-menu-link-text:hover{text-decoration:underline}td a.dropdown-menu strong{color:#333}td a.dropdown-menu strong i{color:#333}td a.dropdown-menu i{color:#dedede}td a.dropdown-menu:hover strong{color:#555}td a.dropdown-menu:hover strong i{color:#555}td a.dropdown-menu:hover i{color:#333}.accordion-title{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAADCAYAAABS3WWCAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NEQ5RDgxQzc2RjQ5MTFFMjhEMUNENzFGRUMwRjhBRTciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NEQ5RDgxQzg2RjQ5MTFFMjhEMUNENzFGRUMwRjhBRTciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo0RDlEODFDNTZGNDkxMUUyOEQxQ0Q3MUZFQzBGOEFFNyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo0RDlEODFDNjZGNDkxMUUyOEQxQ0Q3MUZFQzBGOEFFNyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PvXFWFAAAAAYSURBVHjaYvj//z8D0/Pnz/8zgFgAAQYAS5UJscReGMIAAAAASUVORK5CYII=) repeat-x scroll 0 10px}.accordion-title h3{display:inline;padding-right:5px;background:#fff}.accordion-content{margin-top:15px;margin-bottom:25px}.accordion-toggle{color:#333;text-decoration:none}.accordion-toggle:focus{color:#333}.accordion-toggle:hover{color:#999}.accordion-toggle:before{content:"\f0d7"}.accordion-collapsed{margin-bottom:25px}.accordion-collapsed .accordion-toggle:before{content:"\f0da"}.accordion-collapsed .accordion-content{display:none}#select-dropdown-menu{position:absolute;display:block;z-index:1000;min-width:160px;padding:5px 0;background:#fff;list-style:none;border:1px solid #ccc;border-radius:3px;box-shadow:0 6px 12px rgba(0,0,0,0.175);overflow:scroll}.select-dropdown-menu-item{white-space:nowrap;overflow:hidden;padding:3px 10px;color:#555;cursor:pointer;border-bottom:1px solid #f8f8f8;line-height:1.5em;font-weight:400}.select-dropdown-menu-item.active{color:#fff;background:#428bca}.select-dropdown-menu-item:last-child{border:none}.select-dropdown-input-container{position:relative;border:1px solid #ccc;border-radius:5px}.select-dropdown-input-container input.select-dropdown-input{margin:0 0 0 5px;border:none;height:23px}.select-dropdown-input-container input.select-dropdown-input:focus{border:none;box-shadow:none}.select-dropdown-input-container .select-dropdown-chevron{color:#555;position:absolute;top:4px;right:5px;cursor:pointer}.select-dropdown-input-container .select-loading-icon{color:#555;position:absolute;top:4px;right:5px}#suggest-menu{position:absolute;display:block;z-index:1000;min-width:160px;padding:5px 0;background:#fff;list-style:none;border:1px solid #ccc;border-radius:3px;box-shadow:0 6px 12px rgba(0,0,0,0.175)}.suggest-menu-item{white-space:nowrap;padding:3px 10px;color:#333;font-weight:bold;cursor:pointer}.suggest-menu-item.active{color:#fff;background:#428bca}.suggest-menu-item.active small{color:#fff}.suggest-menu-item small{color:#999;font-weight:normal}#modal-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.9);overflow:auto;z-index:100}#modal-box{position:fixed;max-height:calc(100% - 30px);top:2%;left:50%;transform:translateX(-50%);background:#fff;overflow:auto;border-radius:5px}#modal-content{padding:0 5px 5px}#modal-header{text-align:right;padding-right:5px}#modal-close-button{color:#333}#modal-close-button:hover{color:#b94a48}.pagination{text-align:center}.pagination-showing{margin-right:5px;padding-right:5px;border-right:1px solid #999}.pagination-next{margin-left:5px}.pagination-previous{margin-right:5px}header{box-sizing:border-box;display:flex;flex-wrap:wrap;margin-top:5px;margin-bottom:5px;border-bottom:1px solid #dedede}header>*{box-sizing:border-box}header>*{width:1%}header .menus-container{width:10%}@media (min-width: 768px) and (max-width: 1150px){header .menus-container{width:15%}}@media (max-width: 768px){header .menus-container{width:20%;order:2}header .menus-container .header-creation-menu{display:none}}header .board-selector-container{width:25%}@media (min-width: 768px) and (max-width: 1150px){header .board-selector-container{width:20%}}@media (max-width: 768px){header .board-selector-container{width:80%;order:1;margin-bottom:5px}}header .title-container{width:65%}@media (max-width: 768px){header .title-container{width:100%;order:3}}header h1{font-size:1.5em}header h1 .tooltip{opacity:0.3;font-size:0.7em}a i.web-notification-icon{color:#36c}a i.web-notification-icon:focus,a i.web-notification-icon:hover{color:#000}.logo a{opacity:0.5;color:#d40000;text-decoration:none}.logo span{color:#333}.logo a:hover{opacity:0.8;color:#333}.logo a:focus span,.logo a:hover span{color:#d40000}.page-header{margin-bottom:20px}.page-header .dropdown{padding-right:10px}.page-header h2{margin:0;padding:0;font-weight:bold;border-bottom:1px dotted #ccc}.page-header h2 a{color:#333;text-decoration:none}.page-header h2 a:focus,.page-header h2 a:hover{color:#999}.page-header ul{text-align:left;margin-top:5px;display:inline-block}.page-header li{display:inline;padding-right:15px}@media (max-width: 480px){.page-header li{display:block;line-height:1.5em}}.page-header li.active a{color:#333;text-decoration:none;font-weight:bold}.page-header li.active a:hover,.page-header li.active a:focus{text-decoration:underline}.menu-inline{margin-bottom:5px}.menu-inline li{display:inline;padding-right:15px}.menu-inline li .active a{font-weight:bold;color:#000;text-decoration:none}.sidebar-container{box-sizing:border-box;display:flex;flex-wrap:wrap}.sidebar-container>*{box-sizing:border-box}.sidebar-container>*{width:1%}.sidebar-content{padding-left:10px;width:82%}@media (max-width: 480px){.sidebar-content{width:100%}}.sidebar{max-width:240px;min-width:190px;width:18%}@media (max-width: 480px){.sidebar{width:100%;max-width:99%;min-width:0}}.sidebar h2{margin-top:0}.sidebar>ul a{text-decoration:none;color:#999;font-weight:300}.sidebar>ul a:hover{color:#333}.sidebar>ul li{list-style-type:none;line-height:35px;border-bottom:1px dotted #efefef;padding-left:13px}.sidebar>ul li:hover{border-left:5px solid #555;padding-left:8px}.sidebar>ul li.active{border-left:5px solid #333;padding-left:8px}.sidebar>ul li.active a{color:#333;font-weight:bold}.sidebar-icons>ul li{padding-left:0}.sidebar-icons>ul li:hover,.sidebar-icons>ul li.active{padding-left:0;border-left:none}.sidebar>ul li.active a:focus,.sidebar>ul li.active a:hover{color:#555}.sidebar>ul li:last-child{margin-bottom:15px}.avatar img{vertical-align:bottom}.avatar-left{float:left;margin-right:10px}.avatar-inline{display:inline-block;margin-right:3px}.avatar-48 img,.avatar-48 div{border-radius:30px}.avatar-48 .avatar-letter{line-height:48px;width:48px;font-size:25px}.avatar-20 img,.avatar-20 div{border-radius:10px}.avatar-20 .avatar-letter{line-height:20px;width:20px;font-size:11px}.avatar-letter{color:#fff;text-align:center}#file-dropzone,#screenshot-zone{position:relative;border:2px dashed #ccc;width:99%;height:250px;overflow:auto}#file-dropzone-inner,#screenshot-inner{position:absolute;left:0;bottom:48%;width:100%;text-align:center;color:#aaa}#screenshot-zone.screenshot-pasted{border:2px solid #333}#file-list{margin:20px}#file-list li{list-style-type:none;padding-top:8px;padding-bottom:8px;border-bottom:1px dotted #ddd;width:95%}#file-list li .file-error{font-weight:bold;color:#b94a48}.file-thumbnails{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:flex-start;justify-content:flex-start}.file-thumbnail{width:250px;border:1px solid #efefef;border-radius:5px;margin-bottom:20px;box-shadow:4px 2px 10px -6px rgba(0,0,0,0.55);margin-right:15px}.file-thumbnail img{cursor:pointer;border-top-left-radius:5px;border-top-right-radius:5px}.file-thumbnail img:hover{opacity:0.5}.file-thumbnail-content{padding-left:8px;padding-right:8px}.file-thumbnail-title{font-weight:700;font-size:0.9em;color:#555;overflow:hidden;text-overflow:ellipsis}.file-thumbnail-description{font-size:0.8em;color:#999;margin-top:8px;margin-bottom:5px}.file-viewer{position:relative}.file-viewer img{max-width:95%;max-height:85%;margin-top:10px}.color-picker{width:180px}.color-picker-option{height:25px}.color-picker-square{display:inline-block;width:18px;height:18px;margin-right:5px;border:1px solid #000}.color-picker-label{display:inline-block;vertical-align:bottom;padding-bottom:3px}.filter-box{max-width:800px}.action-menu{color:#333;text-decoration:none}.action-menu:hover,.action-menu:focus{text-decoration:underline}.js-project-creation-options{max-width:500px;border-left:3px dotted #efefef;margin-top:20px;padding-left:15px;padding-bottom:5px;padding-top:5px}.project-overview-columns{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;margin-bottom:20px;font-size:1.4em}@media (max-width: 480px){.project-overview-columns{display:block}}.project-overview-column{text-align:center;margin-right:3%;margin-top:5px;padding:3px 15px 3px 15px;border:1px dashed #ddd}@media (max-width: 480px){.project-overview-column{text-align:left}}.project-overview-column small{color:#999}.project-overview-column strong{color:#555;display:block}@media (max-width: 480px){.project-overview-column strong{display:inline}}.project-header{box-sizing:border-box;display:flex;flex-wrap:wrap;margin-bottom:8px}.project-header>*{box-sizing:border-box}.project-header>*{width:1%}.project-header .dropdown-component{margin-top:4px;width:5%}@media (min-width: 768px) and (max-width: 1150px){.project-header .dropdown-component{width:8%}}@media (max-width: 768px){.project-header .dropdown-component{width:100%}}.project-header .views-switcher-component{margin-top:4px;width:38%}@media (max-width: 1300px){.project-header .views-switcher-component{width:45%}}@media (min-width: 768px) and (max-width: 1150px){.project-header .views-switcher-component{width:92%}}@media (max-width: 768px){.project-header .views-switcher-component{margin-top:0;width:100%}}.project-header .filter-box-component{margin:0;width:55%}@media (max-width: 1300px){.project-header .filter-box-component{width:50%}}@media (min-width: 768px) and (max-width: 1150px){.project-header .filter-box-component{width:100%;margin-top:10px}.project-header .filter-box-component .filter-box{max-width:100%}}@media (max-width: 768px){.project-header .filter-box-component{width:100%;margin-top:10px}.project-header .filter-box-component .filter-box{max-width:100%}}.project-header .filter-box-component form{margin:0}.views{display:inline-block;margin-right:10px;font-size:0.9em}@media (max-width: 560px){.views{width:100%}}@media (max-width: 768px){.views{margin-top:10px;font-size:1em}}@media (max-width: 480px){.views{margin-top:5px}}.views li{white-space:nowrap;background:#fafafa;border:1px solid #ddd;border-right:none;padding:4px 8px;display:inline}@media (max-width: 560px){.views li{display:block;margin-top:5px;border-radius:5px;border:1px solid #ddd}}.views li.active a{font-weight:bold;color:#000;text-decoration:none}.views li:first-child{border-top-left-radius:5px;border-bottom-left-radius:5px}.views li:last-child{border-right:1px solid #ddd;border-top-right-radius:5px;border-bottom-right-radius:5px}.views a{color:#555;text-decoration:none}.views a:hover{color:#333;text-decoration:underline}.dashboard-project-stats small{margin-right:10px;color:#999}.dashboard-table-link{font-weight:bold;color:#000;text-decoration:none}.dashboard-table-link:focus,.dashboard-table-link:hover{color:#999}.public-board{margin-top:5px}.public-task{max-width:800px;margin:5px auto 0}#board-container{overflow-x:auto}#board{table-layout:fixed;margin-bottom:0}#board th.board-column-header{width:240px}#board td{vertical-align:top}.board-container-compact{overflow-x:initial}@media all and (-ms-high-contrast: active), (-ms-high-contrast: none){.board-container-compact #board{table-layout:auto}}#board th.board-column-header.board-column-compact{width:initial}.board-column-collapsed{display:none}td.board-column-task-collapsed{font-weight:bold;background-color:#fbfbfb}#board th.board-column-header-collapsed{width:28px;min-width:28px;text-align:center;overflow:hidden}.board-rotation-wrapper{position:relative;padding:8px 4px;min-height:150px;overflow:hidden}.board-rotation{white-space:nowrap;-webkit-backface-visibility:hidden;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg);-webkit-transform-origin:0 100%;-moz-transform-origin:0 100%;-ms-transform-origin:0 100%;transform-origin:0 100%}.board-column-title .dropdown-menu{text-decoration:none}.board-add-icon{float:left;padding:0 5px}.board-add-icon i{text-decoration:none;color:#36c;font-size:1.4em}.board-add-icon i:focus,.board-add-icon i:hover{text-decoration:none;color:red}.board-column-header-task-count{color:#999;font-weight:normal}a.board-swimlane-toggle{text-decoration:none}a.board-swimlane-toggle:hover,a.board-swimlane-toggle:focus{color:#000;text-decoration:none;border:none}.board-task-list{min-height:60px}.board-task-list-limit{background-color:#DF5353}.draggable-item{cursor:pointer;user-select:none;-webkit-user-select:none;-moz-user-select:none}.draggable-placeholder{border:2px dashed #000;background:#fafafa;height:70px;margin-bottom:10px}div.draggable-item-selected{border:1px solid #000}.task-board-sort-handle{float:left;padding-right:5px}.task-board{position:relative;margin-bottom:4px;border:1px solid #000;padding:2px;word-wrap:break-word;font-size:0.9em;border-radius:6px}div.task-board-recent{border-width:2px}div.task-board-status-closed{user-select:none;border:1px dotted #555}.task-board a{color:#000;text-decoration:none}.task-board-collapsed{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.task-board-title{margin-top:5px;margin-bottom:8px}.task-board-title a:hover{text-decoration:underline}.task-board-saving-state{opacity:0.3}.task-board-saving-icon{position:absolute;margin:auto;width:100%;text-align:center;color:#000}.task-board-avatars{text-align:right;float:right}.task-board-change-assignee{cursor:pointer}.task-board-change-assignee:hover{opacity:0.6}.task-list-avatars{display:inline-block;float:left}@media (max-width: 768px){.task-list-avatars{float:none;display:block}}.task-list-avatars .task-avatar-assignee{font-weight:300;color:#999}.task-list-avatars:hover .task-avatar-assignee{font-weight:400;color:#000}.task-board-icons,.task-list-icons{font-size:0.8em;text-align:right}.task-board-icons a,.task-list-icons a{text-decoration:none}.task-board-icons a:hover,.task-list-icons a:hover{color:#333}.task-board-icons a:hover i,.task-list-icons a:hover i{color:#333}.task-board-icons .task-score,.task-list-icons .task-score{font-weight:bold}.task-board-icons .flag-milestone,.task-list-icons .flag-milestone{color:green}.task-board-icons{margin-top:7px}.task-board-icons a{opacity:0.5}.task-board-icons span{opacity:0.5;margin-left:4px}.task-board-icons a:hover{opacity:1.0;font-weight:bold}.task-board-icons .task-board-icons-row{line-height:22px}.task-list-icons{line-height:22px}.task-list-icons a,.task-list-icons span,.task-list-icons i{color:#999;opacity:1.0}.task-list-icons span{margin-left:5px}@media (max-width: 768px){.task-list-icons{text-align:left}}.task-icon-age{display:inline-block}span.task-icon-age-total{border:1px solid #e5e5e5;padding:1px 3px 1px 3px;border-top-left-radius:3px;border-bottom-left-radius:3px}span.task-icon-age-column{border:1px solid #e5e5e5;border-left:none;margin-left:-5px;padding:1px 3px 1px 3px;border-top-right-radius:3px;border-bottom-right-radius:3px}.task-board span.task-icon-age-total,.task-board span.task-icon-age-column{border-color:#666}.task-board-category-container{text-align:right;margin-top:8px;margin-bottom:8px}.task-board-category{border:1px solid #555;font-size:0.9em;font-weight:500;color:#000;padding:1px 3px 1px 2px;border-radius:3px}.task-board-category a:hover{text-decoration:underline}.task-date{font-weight:500;color:#000}span.task-date-today{opacity:1.0;color:#36c}span.task-date-overdue{opacity:1.0;color:#b94a48}.task-tags li{display:inline-block;margin:3px 3px 0 0;padding:1px 3px 1px 3px;color:#333;border:1px solid #333;border-radius:4px}.task-summary-container .task-tags{margin-top:10px}.task-list-tag{background:#ffeb8e;border-color:#333}#task-summary{margin-bottom:15px}#task-summary h2{color:#555;font-size:1.6em;margin-top:0;padding-top:0}.task-summary-container{border:2px solid #000;border-radius:8px;padding:15px}.task-summary-columns{display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:space-between;justify-content:space-between}@media (max-width: 480px){.task-summary-columns{display:block}}.task-summary-column{color:#333}.task-summary-column span{color:#555}.task-summary-column li{line-height:23px}#external-task-view{padding:10px;margin-top:10px;margin-bottom:10px;border:1px dotted #ccc}.task-form-container{box-sizing:border-box;display:flex;flex-wrap:wrap}.task-form-container>*{box-sizing:border-box}.task-form-container>*{width:1%}.task-form-main-column{width:60%}@media (max-width: 1000px){.task-form-main-column{width:100%}}.task-form-main-column input[type="text"]{width:700px;max-width:99%}.task-form-secondary-column{max-width:250px;min-width:200px;max-height:600px;padding-left:10px;overflow:auto;width:20%}@media (max-width: 1000px){.task-form-secondary-column{width:100%;max-width:99%;max-height:none}}@media (max-width: 768px){.task-form-secondary-column{padding-left:0}}.task-form-secondary-column label:first-child{margin-top:0}@media (max-width: 1000px){.task-form-secondary-column label:first-child{margin-top:10px}}.task-form-bottom{width:100%}.comment-sorting{text-align:right}.comment-sorting a{color:#555;font-weight:normal;text-decoration:none}.comment-sorting a:hover{color:#999}.comment{padding:5px;margin-bottom:15px}.comment-title{border-bottom:1px dotted #eee;margin-left:55px}.comment-date{color:#999;font-weight:200}.comment-actions{text-align:right}.comment-content{margin-left:55px}.comments .text-editor textarea{height:90px}.comments .text-editor .text-editor-preview-area{height:90px}.comments .comment-highlighted{background-color:#fff8dc;border:2px solid #ffeb8e}.comments .comment-highlighted:hover{background-color:#fff8dc}.comments .comment:hover{background:#fff8dc}.comments .comment:nth-child(even):not(.comment-highlighted){background:#fbfbfb}.comments .comment:nth-child(even):not(.comment-highlighted):hover{background:#fff8dc}.subtask-cell{padding:4px 10px;border-top:1px dotted #dedede;border-left:1px dotted #dedede;display:table-cell;vertical-align:middle}.subtask-cell a{color:#333;text-decoration:none}.subtask-cell a:hover,.subtask-cell a:focus{color:#36c}.subtask-cell:first-child{border-left:none}@media (max-width: 768px){.subtask-cell{width:90%;display:block;border-left:none}}.task-list-subtasks{display:table;width:100%}@media (max-width: 768px){.task-list-subtasks{display:block}}.task-list-subtask{display:table-row}@media (max-width: 768px){.task-list-subtask{display:block}}@media (max-width: 768px){.subtask-assignee,.subtask-time-tracking-cell{display:none}}.task-links-table td{vertical-align:middle}.task-links-task-count{color:#999;font-weight:normal}.task-link-closed{text-decoration:line-through}.text-editor{margin-top:10px}.text-editor a{font-size:1em;color:#999;text-decoration:none;margin-right:10px}.text-editor a:hover{color:#36c}.text-editor .text-editor-preview-area{border:1px solid #dedede;width:700px;max-width:99%;height:250px;overflow:auto;padding:2px}.text-editor textarea{width:700px;max-width:98%;height:250px}.markdown{line-height:1.4em}.markdown h1{margin-top:5px;margin-bottom:10px;font-weight:bold}.markdown h2{font-weight:bold}.markdown p{margin-bottom:10px}.markdown ol,.markdown ul{margin-left:25px;margin-top:10px;margin-bottom:10px}.markdown pre{background:#fbfbfb;padding:10px;border-radius:5px;border:1px solid #ddd;overflow:auto;color:#555}.markdown blockquote{font-style:italic;border-left:3px solid #ddd;padding-left:10px;margin-bottom:10px;margin-left:20px}.markdown img{display:block;max-width:80%;margin-top:10px}.documentation{margin:0 auto;padding:20px;max-width:850px;background:#fefefe;border:1px solid #ccc;border-radius:5px;color:#555}.documentation img{border:1px solid #333}.documentation h1{text-decoration:none;margin-bottom:30px}.documentation h2{text-decoration:none;border-bottom:1px solid #ccc;margin-bottom:25px}.documentation li{line-height:30px}.panel{border-radius:4px;padding:8px 35px 8px 10px;margin-top:10px;margin-bottom:15px;border:1px solid #ddd;color:#333;background-color:#fcfcfc;overflow:auto}.panel li{list-style-type:square;margin-left:20px;line-height:1.35em}.activity-event{margin-bottom:15px;padding:10px}.activity-event:nth-child(even){background:#fafafa}.activity-event:hover{background:#fff8dc}.activity-date{margin-left:10px;font-weight:normal;color:#999}.activity-content{margin-left:55px}.activity-title{font-weight:bold;color:#000;border-bottom:1px dotted #efefef}.activity-description{color:#555;margin-top:10px}@media (max-width: 480px){.activity-description{overflow:auto}}.activity-description li{list-style-type:circle}.activity-description ul{margin-top:10px;margin-left:20px}.user-mention-link{font-weight:bold;color:#000;text-decoration:none}.user-mention-link:hover{color:#555}.image-slideshow-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.95);overflow:auto;z-index:100}.image-slideshow-overlay img{display:block;margin:auto}.image-slideshow-overlay figcaption{color:#fff;opacity:0.7;position:absolute;bottom:5px;right:15px}.slideshow-icon{color:#fff;position:absolute;font-size:2.5em;opacity:0.6}.slideshow-icon:hover{opacity:0.9;cursor:pointer}.slideshow-previous-icon{left:10px;top:45%}.slideshow-next-icon{right:10px;top:45%}.slideshow-close-icon{right:10px;top:10px;font-size:1.4em}.slideshow-download-icon{left:10px;bottom:10px;font-size:1.3em} diff --git a/assets/js/app.min.js b/assets/js/app.min.js index 7a814e40..e42460d1 100644 --- a/assets/js/app.min.js +++ b/assets/js/app.min.js @@ -1,3 +1,2 @@ -!function(){function t(t,a,i){if(!n)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var r=i&&i.debug||!1;if(r){var d=document.querySelector("#input-textarea-caret-position-mirror-div");d&&d.parentNode.removeChild(d)}var s=document.createElement("div");s.id="input-textarea-caret-position-mirror-div",document.body.appendChild(s);var l=s.style,c=window.getComputedStyle?getComputedStyle(t):t.currentStyle;l.whiteSpace="pre-wrap","INPUT"!==t.nodeName&&(l.wordWrap="break-word"),l.position="absolute",r||(l.visibility="hidden"),e.forEach(function(t){l[t]=c[t]}),o?t.scrollHeight>parseInt(c.height)&&(l.overflowY="scroll"):l.overflow="hidden",s.textContent=t.value.substring(0,a),"INPUT"===t.nodeName&&(s.textContent=s.textContent.replace(/\s/g," "));var u=document.createElement("span");u.textContent=t.value.substring(a)||".",s.appendChild(u);var p={top:u.offsetTop+parseInt(c.borderTopWidth),left:u.offsetLeft+parseInt(c.borderLeftWidth)};return r?u.style.backgroundColor="#aaa":document.body.removeChild(s),p}var e=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],n="undefined"!=typeof window,o=n&&null!=window.mozInnerScreenX;"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=t:n&&(window.getCaretCoordinates=t)}(),function(){function t(){if(!("KeyboardEvent"in window)||"key"in KeyboardEvent.prototype)return!1;var t={get:function(t){var e=n.keys[this.which||this.keyCode];return Array.isArray(e)&&(e=e[+this.shiftKey]),e}};return Object.defineProperty(KeyboardEvent.prototype,"key",t),t}var e,n={polyfill:t,keys:{3:"Cancel",6:"Help",8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",28:"Convert",29:"NonConvert",30:"Accept",31:"ModeChange",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",41:"Select",42:"Print",43:"Execute",44:"PrintScreen",45:"Insert",46:"Delete",48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],91:"OS",93:"ContextMenu",144:"NumLock",145:"ScrollLock",181:"VolumeMute",182:"VolumeDown",183:"VolumeUp",186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"'],224:"Meta",225:"AltGraph",246:"Attn",247:"CrSel",248:"ExSel",249:"EraseEof",250:"Play",251:"ZoomOut"}};for(e=1;e<25;e++)n.keys[111+e]="F"+e;var o="";for(e=65;e<91;e++)o=String.fromCharCode(e),n.keys[e]=[o.toLowerCase(),o.toUpperCase()];n.polyfill()}(),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(t){for(var e=(this.document||this.ownerDocument).querySelectorAll(t),n=e.length;--n>=0&&e.item(n)!==this;);return n>-1});var KB={components:{},utils:{},html:{},http:{},listeners:{clicks:{},changes:{},keys:[],internals:{}}};KB.on=function(t,e){this.listeners.internals.hasOwnProperty(t)||(this.listeners.internals[t]=[]),this.listeners.internals[t].push(e)},KB.trigger=function(t,e){if(this.listeners.internals.hasOwnProperty(t))for(var n=0;n<this.listeners.internals[t].length;n++)this.listeners.internals[t][n](e)},KB.removeListener=function(t,e){if(this.listeners.internals.hasOwnProperty(t))for(var n=0;n<this.listeners.internals[t].length;n++)this.listeners.internals[t][n]===e&&this.listeners.internals[t].splice(n,1)},KB.onClick=function(t,e,n){this.listeners.clicks[t]={callback:e,noPreventDefault:n===!0}},KB.onChange=function(t,e){this.listeners.changes[t]=e},KB.onKey=function(t,e,n,o,a){this.listeners.keys.push({combination:t,callback:e,ignoreInputField:n||!1,ctrlKey:o||!1,metaKey:a||!1})},KB.listen=function(){function t(t){for(var e in o.listeners.clicks)o.listeners.clicks.hasOwnProperty(e)&&t.target.matches(e)&&(o.listeners.clicks[e].noPreventDefault||t.preventDefault(),o.listeners.clicks[e].callback(t))}function e(t){for(var e in o.listeners.changes)o.listeners.changes.hasOwnProperty(e)&&t.target.matches(e)&&o.listeners.changes[e](t.target)}function n(t){var e=KB.utils.getKey(t),n=KB.utils.isInputField(t);if(n&&["Escape","Enter"].indexOf(e)===-1||a.push(e),a.length>0){for(var i=!0,r=0;r<o.listeners.keys.length;r++){var d=o.listeners.keys[r],s=d.combination,l=s.split("+");if(KB.utils.arraysIdentical(a,l)&&t.ctrlKey===d.ctrlKey&&t.metaKey===d.metaKey){if(n&&!d.ignoreInputField)return void(a=[]);t.preventDefault(),t.stopPropagation(),a=[],d.callback(t);break}KB.utils.arraysStartsWith(a,l)&&a.length<l.length&&(i=!1)}i&&(a=[])}}var o=this,a=[];document.addEventListener("click",t,!1),document.addEventListener("change",e,!1),window.addEventListener("keydown",n,!1)},KB.component=function(t,e){this.components[t]=e},KB.getComponent=function(t,e,n){var o=this.components[t];return new o(e,n)},KB.render=function(){for(var t in this.components)for(var e=document.querySelectorAll(".js-"+t),n=0;n<e.length;n++)if(this.components.hasOwnProperty(t)){var o;e[n].dataset.params&&(o=JSON.parse(e[n].dataset.params));var a=KB.getComponent(t,e[n],o);a.render(),e[n].className=e[n].className+"-rendered"}},KB.interval=function(t,e){setInterval(e,1e3*t)},KB.dom=function(t){function e(t){var e="string"==typeof t?document.createElement(t):t;this.attr=function(t,n){return null!==n&&"undefined"!=typeof n?(e.setAttribute(t,n),this):e.getAttribute(t)},this.data=function(t,n){return 1===arguments.length?e.dataset[t]:(e.dataset[t]=n,this)},this.hide=function(){return e.style.display="none",this},this.show=function(){return e.style.display="block",this},this.toggle=function(){return"none"===e.style.display?this.show():this.hide(),this},this.style=function(t,n){return e.style[t]=n,this},this.on=function(t,n,o){return e.addEventListener(t,function(t){o||t.preventDefault(),n(t.target)}),this},this.click=function(t){return this.on("click",t)},this.mouseover=function(t){return this.on("mouseover",t)},this.change=function(t){return this.on("change",t)},this.add=function(t){return e.appendChild(t),this},this.replace=function(t){return e.parentNode.replaceChild(t,e),this},this.html=function(t){return e.innerHTML=t,this},this.text=function(t){return e.appendChild(document.createTextNode(t)),this},this.replaceText=function(t){return e.textContent=t,this},this.addClass=function(t){return e.classList.add(t),this},this.removeClass=function(t){return e.classList.remove(t),this},this.toggleClass=function(t){return e.classList.toggle(t),this},this.hasClass=function(t){return e.classList.contains(t)},this.disable=function(){return e.disabled=!0,this},this.enable=function(){return e.disabled=!1,this},this.remove=function(){return e.parentNode.removeChild(e),this},this.empty=function(){for(;e.firstChild;)e.removeChild(e.firstChild);return this},this.parent=function(t){for(;e&&e!==document;e=e.parentNode)if(e.matches(t))return e;return null},this.find=function(t){return e.querySelector(t)},this.for=function(t,n){for(var o=0;o<n.length;o++){var a=n[o];if("object"!=typeof a)e.appendChild(KB.dom(t).text(a).build());else{var i=KB.dom(t);for(var r in a)a.hasOwnProperty(r)&&r in this&&"function"==typeof this[r]?i[r](a[r]):i.attr(r,a[r]);e.appendChild(i.build())}}return this},this.build=function(){return e}}return new e(t)},KB.find=function(t){var e=document.querySelector(t);return e?KB.dom(e):null},KB.exists=function(t){return!!document.querySelector(t)},KB.focus=function(t){var e=document.querySelector(t);if(e)return e.focus()},KB.html.label=function(t,e){return KB.dom("label").attr("for",e).text(t).build()},KB.html.radio=function(t,e,n){return KB.dom("label").add(KB.dom("input").attr("type","radio").attr("name",e).attr("value",n).build()).text(t).build()},KB.html.radios=function(t){var e=KB.dom("div");for(var n in t)t.hasOwnProperty(n)&&e.add(KB.html.radio(n.label,n.name,n.value))},KB.http.request=function(t,e,n,o){function a(t){var e=t.getResponseHeader("X-Ajax-Redirect"),n=t.getResponseHeader("Location");if("self"===e)window.location.reload();else if(e&&e.indexOf("#")>-1)window.location=e.split("#")[0];else if(e)window.location=e;else if(n)window.location=n;else if("application/json"===t.getResponseHeader("Content-Type"))try{return JSON.parse(t.responseText)}catch(t){}return t.responseText}var i=function(){},r=function(){};this.execute=function(){var d=new XMLHttpRequest;d.open(t,e,!0),d.setRequestHeader("X-Requested-With","XMLHttpRequest");for(var s in n)n.hasOwnProperty(s)&&d.setRequestHeader(s,n[s]);return d.onerror=function(){r()},d.onreadystatechange=function(){if(d.readyState===XMLHttpRequest.DONE){var t=a(d);200===d.status?i(t):r(t)}},d.send(o),this},this.success=function(t){return i=t,this},this.error=function(t){return r=t,this}},KB.http.get=function(t){return new KB.http.request("GET",t).execute()},KB.http.postJson=function(t,e){var n={"Content-Type":"application/json",Accept:"application/json"};return new KB.http.request("POST",t,n,JSON.stringify(e)).execute()},KB.http.postForm=function(t,e){var n=new FormData(e);return new KB.http.request("POST",t,{},n).execute()},KB.http.uploadFile=function(t,e,n,o,a,i){var r=new FormData;r.append("files[]",e);var d=new XMLHttpRequest;d.upload.addEventListener("progress",n),d.upload.addEventListener("error",a),d.open("POST",t,!0),d.setRequestHeader("X-Requested-With","XMLHttpRequest"),d.onreadystatechange=function(){d.readyState===XMLHttpRequest.DONE&&(200===d.status?o():"undefined"!=typeof i&&i(JSON.parse(d.responseText)))},d.send(r)},function(){function t(t){t.target.matches("#modal-overlay")&&(t.stopPropagation(),t.preventDefault(),s())}function e(){KB.trigger("modal.close")}function n(){KB.trigger("modal.loading"),a()}function o(){return document.querySelector("#modal-content form:not(.js-modal-ignore-form)")}function a(){var t=o();if(t){var e=t.getAttribute("action");e&&KB.http.postForm(e,t).success(function(t){KB.trigger("modal.stop"),t?r(t):s()})}}function i(){var t=KB.find("#modal-content form");t&&t.on("submit",n,!1);var e=document.querySelector("#modal-content input[autofocus]");e&&e.focus(),KB.render(),_KB.datePicker(),_KB.autoComplete(),_KB.tagAutoComplete(),_KB.get("Task").onPopoverOpened()}function r(t){var e=KB.find("#modal-content");e&&(e.replace(KB.dom("div").attr("id","modal-content").html(t).build()),i())}function d(n,o,a){var r=KB.dom("a").attr("href","#").attr("id","modal-close-button").html('<i class="fa fa-times"></i>').click(e).build(),d=KB.dom("div").attr("id","modal-header").add(r).build(),s=KB.dom("div").attr("id","modal-content").html(n).build(),l=KB.dom("div").attr("id","modal-box").style("width",o).add(d).add(s).build(),c=KB.dom("div").attr("id","modal-overlay").add(l).build();a&&c.addEventListener("click",t,!1),document.body.appendChild(c),i()}function s(){c=!1;var t=KB.find("#modal-overlay");t&&t.remove()}function l(t){var e=KB.utils.getViewportSize();if(e.width<700)return"99%";switch(t){case"large":return e.width<1350?"98%":"1350px";case"medium":return e.width<1024?"70%":"1024px"}return e.width<800?"75%":"800px"}var c=!1;KB.on("modal.close",function(){s()}),KB.on("modal.submit",function(){a()}),KB.modal={open:function(t,e,n){_KB.get("Dropdown").close(),s(),"undefined"==typeof n&&(n=!0),KB.http.get(t).success(function(t){c=!0,d(t,l(e),n)})},close:function(){s()},isOpen:function(){return c},replace:function(t){KB.http.get(t).success(function(t){r(t)})},getForm:o,submitForm:a}}(),KB.utils.formatDuration=function(t){return t>=86400?Math.round(t/86400)+"d":t>=3600?Math.round(t/3600)+"h":t>=60?Math.round(t/60)+"m":t+"s"},KB.utils.getSelectionPosition=function(t){var e,n;return e=t.value.length<t.selectionStart?t.value.length:t.selectionStart,n=t.selectionStart===t.selectionEnd?e:t.selectionEnd,{selectionStart:e,selectionEnd:n}},KB.utils.arraysIdentical=function(t,e){var n=t.length;if(n!==e.length)return!1;for(;n--;)if(t[n]!==e[n])return!1;return!0},KB.utils.arraysStartsWith=function(t,e){for(var n=Math.min(t.length,e.length),o=0;o<n;o++)if(t[o]!==e[o])return!1;return!0},KB.utils.isInputField=function(t){var e=t.target;return!("INPUT"!==e.tagName&&"SELECT"!==e.tagName&&"TEXTAREA"!==e.tagName&&!e.isContentEditable)},KB.utils.getKey=function(t){var e={Esc:"Escape",Up:"ArrowUp",Down:"ArrowDown",Left:"ArrowLeft",Right:"ArrowRight"};for(var n in e)if(e.hasOwnProperty(n)&&n===t.key)return e[n];return t.key},KB.utils.getViewportSize=function(){return{width:Math.max(document.documentElement.clientWidth,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight,window.innerHeight||0)}},KB.utils.isVisible=function(){var t="";return"undefined"!=typeof document.hidden?t="visibilityState":"undefined"!=typeof document.mozHidden?t="mozVisibilityState":"undefined"!=typeof document.msHidden?t="msVisibilityState":"undefined"!=typeof document.webkitHidden&&(t="webkitVisibilityState"),""===t||"visible"===document[t]},KB.onClick(".accordion-toggle",function(t){var e=KB.dom(t.target).parent(".accordion-section");e&&KB.dom(e).toggleClass("accordion-collapsed")}),function(){function t(t){var e=KB.dom(t.target).parent("a, .task-board-change-assignee");if(!e){var n=KB.dom(t.target).parent(".task-board");if(n){var o=KB.dom(n).data("taskUrl");o&&(window.location=o)}}}function e(t){var e=KB.dom(t.target).parent(".task-board-change-assignee"),n=KB.dom(e).data("url");n&&KB.modal.open(n,"medium",!1)}KB.onClick(".task-board *",t,!0),KB.onClick(".task-board-change-assignee *",e,!0)}(),KB.component("chart-project-avg-time-column",function(t,e){this.render=function(){var n=e.metrics,o=[e.label],a=[];for(var i in n)o.push(n[i].average),a.push(n[i].title);KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:[o],type:"bar"},bar:{width:{ratio:.5}},axis:{x:{type:"category",categories:a},y:{tick:{format:KB.utils.formatDuration}}},legend:{show:!1}})}}),KB.component("chart-project-burndown",function(t,e){this.render=function(){for(var n=e.metrics,o=[[e.labelTotal]],a=[],i=d3.time.format("%Y-%m-%d"),r=d3.time.format(e.dateFormat),d=0;d<n.length;d++)for(var s=0;s<n[d].length;s++){var l=n[d][s];0===d?s>0&&o.push([l]):s>0?(o[s].push(l),"undefined"==typeof o[0][d]&&o[0].push(0),o[0][d]+=l):a.push(r(i.parse(l)))}KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:o},axis:{x:{type:"category",categories:a}}})}}),KB.component("chart-project-cumulative-flow",function(t,e){this.render=function(){for(var n=e.metrics,o=[],a=[],i=[],r=d3.time.format("%Y-%m-%d"),d=d3.time.format(e.dateFormat),s=0;s<n.length;s++)for(var l=0;l<n[s].length;l++){var c=n[s][l];0===s?l>0&&(a.push(c),o.push([c])):l>0?o[l-1].push(c):i.push(d(r.parse(c)))}KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:o.reverse(),type:"area-spline",groups:[a],order:null},axis:{x:{type:"category",categories:i}}})}}),KB.component("chart-project-lead-cycle-time",function(t,e){this.render=function(){var n=e.metrics,o=[e.labelCycle],a=[e.labelLead],i=[],r={};r[e.labelCycle]="area",r[e.labelLead]="area-spline";var d={};d[e.labelLead]="#afb42b",d[e.labelCycle]="#4e342e";for(var s=0;s<n.length;s++)o.push(parseInt(n[s].avg_cycle_time)),a.push(parseInt(n[s].avg_lead_time)),i.push(n[s].day);KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:[a,o],types:r,colors:d},axis:{x:{type:"category",categories:i},y:{tick:{format:KB.utils.formatDuration}}}})}}),KB.component("chart-project-task-distribution",function(t,e){this.render=function(){for(var n=[],o=0;o<e.metrics.length;o++)n.push([e.metrics[o].column_title,e.metrics[o].nb_tasks]);KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:n,type:"donut"}})}}),KB.component("chart-project-time-comparison",function(t,e){this.render=function(){var n=[e.labelSpent],o=[e.labelEstimated],a=[];for(var i in e.metrics)n.push(e.metrics[i].time_spent),o.push(e.metrics[i].time_estimated),a.push("open"===i?e.labelOpen:e.labelClosed);KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:[n,o],type:"bar"},bar:{width:{ratio:.2}},axis:{x:{type:"category",categories:a}},legend:{show:!0}})}}),KB.component("chart-project-user-distribution",function(t,e){this.render=function(){for(var n=[],o=0;o<e.metrics.length;o++)n.push([e.metrics[o].user,e.metrics[o].nb_tasks]);KB.dom(t).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:n,type:"donut"}})}}),KB.component("chart-task-time-column",function(t,e){this.render=function(){for(var n=e.metrics,o=[e.label],a=[],i=0;i<n.length;i++)o.push(n[i].time_spent),a.push(n[i].title);KB.dom(t).add(KB.dom("div").attr("id","chart-task-time-column").build()),c3.generate({bindto:"#chart-task-time-column",data:{columns:[o],type:"bar"},bar:{width:{ratio:.5}},axis:{x:{type:"category",categories:a},y:{tick:{format:KB.utils.formatDuration}}},legend:{show:!1}})}}),KB.on("dom.ready",function(){function t(){if(0===window.location.hash.indexOf("#comment-")){var t=KB.find(window.location.hash);if(t){var e=document.querySelectorAll(".comment");e.forEach(function(t){KB.dom(t).removeClass("comment-highlighted")}),t.addClass("comment-highlighted")}}}window.addEventListener("hashchange",t),t()}),KB.component("confirm-buttons",function(t,e){function n(){r=!0,KB.find("#modal-confirm-button").replace(i()),KB.http.get(e.url)}function o(){KB.trigger("modal.close")}function a(){r=!1,KB.find("#modal-confirm-button").replace(i())}function i(){var t=KB.dom("button").click(n).attr("id","modal-confirm-button").attr("type","button").attr("class","btn btn-red");return r&&t.disable().add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).text(" "),e.tabindex&&t.attr("tabindex",e.tabindex),t.text(e.submitLabel).build()}var r=!1;this.render=function(){KB.on("modal.stop",a),KB.on("modal.close",function(){KB.removeListener("modal.stop",a)});var n=KB.dom("div").attr("class","form-actions").add(i()).text(" "+e.orLabel+" ").add(KB.dom("a").attr("href","#").click(o).text(e.cancelLabel).build()).build();t.appendChild(n)}}),KB.component("external-task-view",function(t,e){this.render=function(){$.ajax({cache:!1,url:e.url,success:function(e){KB.dom(t).html('<div id="external-task-view">'+e+"</div>")}})}}),KB.component("file-upload",function(t,e){function n(t){if(t.lengthComputable){var e=t.loaded/t.total,n=Math.floor(100*e);KB.find("#file-progress-"+w).attr("value",e),KB.find("#file-percentage-"+w).replaceText("("+n+"%)")}}function o(){var t=KB.dom("div").addClass("file-error").text(e.labelUploadError).build();KB.find("#file-item-"+w).add(t)}function a(t){var e=KB.dom("div").addClass("file-error").text(t.message).build();KB.find("#file-item-"+w).add(e),KB.trigger("modal.stop")}function i(){if(w++,w<y.length)KB.http.uploadFile(e.url,y[w],n,i,o,a);else{KB.trigger("modal.stop"),KB.trigger("modal.hide");var t=KB.dom("div").addClass("alert").addClass("alert-success").text(e.labelSuccess).build(),d=KB.dom("button").attr("type","button").addClass("btn").addClass("btn-blue").click(r).text(e.labelCloseSuccess).build();KB.dom(B).replace(KB.dom("div").add(t).add(d).build())}}function r(){window.location.reload()}function d(){w=0,p()}function s(){y=K.files,f()}function l(){y=[],w=0,K.click()}function c(t){t.stopPropagation(),t.preventDefault()}function u(t){t.stopPropagation(),t.preventDefault(),y=t.dataTransfer.files,f()}function p(){y.length>0&&KB.http.uploadFile(e.url,y[w],n,i,o,a)}function f(){y.length>0?(KB.trigger("modal.enable"),KB.dom(B).empty().add(b())):(KB.trigger("modal.disable"),KB.dom(B).empty().add(h()))}function m(){return KB.dom("input").attr("id","file-input-element").attr("type","file").attr("name","files[]").attr("multiple",!0).on("change",s).hide().build()}function h(){var t=KB.dom("a").attr("href","#").text(e.labelChooseFiles).click(l).build();return KB.dom("div").attr("id","file-dropzone-inner").text(e.labelDropzone+" "+e.labelOr+" ").add(t).build()}function g(){var t=KB.dom("div").attr("id","file-dropzone").add(h()).build();return t.ondragover=c,t.ondrop=u,t.ondragover=c,t}function v(t){var n=!1,o=KB.dom("progress").attr("id","file-progress-"+t).attr("value",0).build(),a=KB.dom("span").attr("id","file-percentage-"+t).text("(0%)").build(),i=KB.dom("li").attr("id","file-item-"+t).add(o).text(" "+y[t].name+" ").add(a);return y[t].size>e.maxSize&&(i.add(KB.dom("div").addClass("file-error").text(e.labelOversize).build()),n=!0),n&&KB.trigger("modal.disable"),i.build()}function b(){for(var t=KB.dom("ul").attr("id","file-list").build(),e=0;e<y.length;e++)t.appendChild(v(e));return t}var K=null,B=null,y=[],w=0;this.render=function(){KB.on("modal.submit",d),KB.on("modal.close",function(){KB.removeListener("modal.submit",d)}),K=m(),B=g(),t.appendChild(K),t.appendChild(B)}}),KB.onClick(".js-form-export",function(t){var e=document.querySelector("#modal-content form"),n=e.querySelector("#form-from"),o=e.querySelector("#form-to");""!==n.value&&""!==o.value&&e.submit()}),KB.component("image-slideshow",function(t,e){function n(t){switch(KB.utils.getKey(t)){case"Escape":s();break;case"ArrowRight":i();break;case"ArrowLeft":r()}}function o(t){t.matches(".slideshow-next-icon")?i():t.matches(".slideshow-previous-icon")?r():t.matches(".slideshow-download-icon")?window.location.href=t.href:s()}function a(t){var e=KB.dom(t).data("imageId"),n=l(e);d(n)}function i(){s();for(var t=0;t<e.images.length;t++)if(e.images[t].id===p.id){var n=t+1;n>=e.images.length&&(n=0),p=e.images[n];break}d()}function r(){s();for(var t=0;t<e.images.length;t++)if(e.images[t].id===p.id){var n=t-1;n<0&&(n=e.images.length-1),p=e.images[n];break}d()}function d(){var t=KB.dom("div").attr("class","fa fa-window-close slideshow-icon slideshow-close-icon").build(),e=KB.dom("a").attr("class","fa fa-download slideshow-icon slideshow-download-icon").attr("href",c(p,"download")).build(),a=KB.dom("div").attr("class","fa fa-chevron-circle-left slideshow-icon slideshow-previous-icon").build(),i=KB.dom("div").attr("class","fa fa-chevron-circle-right slideshow-icon slideshow-next-icon").build(),r=KB.dom("img").attr("src",c(p,"image")).attr("alt",p.name).attr("title",p.name).style("maxHeight",window.innerHeight-50+"px").build(),d=KB.dom("figcaption").text(p.name).build(),s=KB.dom("figure").add(r).add(d).build(),l=KB.dom("div").addClass("image-slideshow-overlay").add(t).add(e).add(a).add(i).add(s).click(o).build();document.body.appendChild(l),document.addEventListener("keydown",n,!1)}function s(){var t=KB.find(".image-slideshow-overlay");null!==t&&(document.removeEventListener("keydown",n,!1),t.remove())}function l(t){for(var n=0;n<e.images.length;n++)if(e.images[n].id===t)return e.images[n];return null}function c(t,n){var o=new RegExp(e.regex,"g");return e.url[n].replace(o,t.id)}function u(t){return KB.dom("img").attr("src",c(t,"thumbnail")).attr("alt",t.name).attr("title",t.name).data("imageId",t.id).click(a).build()}var p;this.render=function(){p=e.image,t.appendChild(u(p))}}),KB.keyboardShortcuts=function(){function t(t){if(!KB.modal.isOpen()){var e=KB.find(t);null!==e&&(window.location=e.attr("href"))}}function e(){if(KB.modal.isOpen())KB.modal.submitForm();else{var t=$("form");1==t.length?t.submit():t.length>1&&("INPUT"!==document.activeElement.tagName&&"TEXTAREA"!==document.activeElement.tagName||$(document.activeElement).parents("form").submit())}}KB.onKey("?",function(){KB.modal.isOpen()||KB.modal.open(KB.find("body").data("keyboardShortcutUrl"))}),KB.onKey("Escape",function(){KB.exists("#suggest-menu")||(KB.trigger("modal.close"),_KB.get("Dropdown").close())}),KB.onKey("Enter",e,!0,!0),KB.onKey("Enter",e,!0,!1,!0),KB.onKey("b",function(){KB.modal.isOpen()||KB.trigger("board.selector.open")}),KB.exists("#board")&&(KB.onKey("c",function(){KB.modal.isOpen()||_KB.get("BoardHorizontalScrolling").toggle()}),KB.onKey("s",function(){KB.modal.isOpen()||_KB.get("BoardCollapsedMode").toggle()}),KB.onKey("n",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#board").data("taskCreationUrl"),"large",!1)})),KB.exists("#task-view")&&(KB.onKey("e",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("editUrl"),"large",!1)}),KB.onKey("c",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("commentUrl"),"medium",!1)}),KB.onKey("s",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("subtaskUrl"),"medium",!1)}),KB.onKey("l",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("internalLinkUrl"),"medium",!1)})),KB.onKey("f",function(){KB.modal.isOpen()||KB.focus("#form-search")}),KB.onKey("r",function(){if(!KB.modal.isOpen()){var t=$(".filter-reset").data("filter"),e=$("#form-search");e.val(t),$("form.search").submit()}}),KB.onKey("v+o",function(){t("a.view-overview")}),KB.onKey("v+b",function(){t("a.view-board")}),KB.onKey("v+l",function(){t("a.view-listing")}),KB.onKey("v+g",function(){t("a.view-gantt")})},function(){function t(t){return"I"===t.target.tagName?t.target.parentNode.getAttribute("href"):t.target.getAttribute("href")}KB.onClick(".js-modal-large",function(e){KB.modal.open(t(e),"large",!1)}),KB.onClick(".js-modal-medium",function(e){KB.modal.isOpen()?KB.modal.replace(t(e)):KB.modal.open(t(e),"medium",!1)}),KB.onClick(".js-modal-small",function(e){KB.modal.open(t(e),"small",!1)}),KB.onClick(".js-modal-confirm",function(e){KB.modal.open(t(e),"small")}),KB.onClick(".js-modal-close",function(){KB.modal.close()}),KB.onClick(".js-modal-replace",function(e){var n=t(e);KB.modal.isOpen()?KB.modal.replace(n):window.location.href=n})}(),KB.onChange(".js-project-creation-select-options",function(t){var e=t.value;"0"===e?KB.find(".js-project-creation-options").hide():KB.find(".js-project-creation-options").show()}),KB.component("project-select-role",function(t,e){function n(t){d=!0,e.role=t.value,a(),o()}function o(){KB.http.postJson(e.url,{id:e.id,role:e.role}).success(function(){d=!1,s=!0,a()}).error(function(){d=!1,s=!1,l=!0,a()})}function a(){KB.dom(r).remove(),r=i(),t.appendChild(r)}function i(){var t=[],o=KB.dom("div");for(var a in e.roles)if(e.roles.hasOwnProperty(a)){var i={value:a,text:e.roles[a]};e.role===a&&(i.selected="selected"),t.push(i)}return o.add(KB.dom("select").change(n).for("option",t).build()),d?(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-spinner fa-pulse fa-fw").build())):s?(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-check fa-fw icon-fade-out icon-success").build())):l&&(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-check fa-fw icon-fade-out icon-error").build())),o.build()}var r,d=!1,s=!1,l=!1;this.render=function(){r=i(),t.appendChild(r)}}),KB.component("screenshot",function(t){function e(t){d(t.target.result)}function n(t){if(t.clipboardData&&t.clipboardData.items){var n=t.clipboardData.items;if(n)for(var o=0;o<n.length;o++)if(n[o].type.indexOf("image")!==-1){var a=n[o].getAsFile(),i=new FileReader;i.onload=e,i.readAsDataURL(a)}}else setTimeout(r,100)}function o(){a(),window.Clipboard||(s=document.createElement("div"),s.id="screenshot-pastezone",s.contentEditable=!0,s.style.opacity=0,s.style.position="fixed",s.style.top=0,s.style.right=0,s.style.width=0,document.body.insertBefore(s,document.body.firstChild),s.focus(),document.addEventListener("click",i),document.getElementById("screenshot-zone").addEventListener("click",i)),window.addEventListener("paste",n,!1)}function a(){KB.exists("#screenshot-pastezone")&&KB.find("#screenshot-pastezone").remove(),document.removeEventListener("click",i),s=null}function i(){null!==s&&s.focus()}function r(){var t=s.childNodes[0];t&&"IMG"===t.tagName&&d(t.src),s.innerHTML=""}function d(t){var e=new Image;e.src=t,e.onload=function(){var e=t.split("base64,");l.value=e[1]};var n=document.getElementById("screenshot-zone");n.innerHTML="",n.className="screenshot-pasted",n.appendChild(e),a(),o()}var s=null,l=null;KB.on("modal.close",function(){a()}),this.render=function(){l=KB.dom("input").attr("type","hidden").attr("name","screenshot").build(),t.appendChild(l),o()}}),KB.component("select-dropdown-autocomplete",function(t,e){function n(){KB.dom(C).show(),KB.dom(x).hide()}function o(){KB.dom(C).hide(),KB.dom(x).show()}function a(){var t=KB.find("#select-dropdown-menu");if(t){var e=y.getBoundingClientRect();t.style("top",document.body.scrollTop+e.bottom+"px")}}function i(t){switch(KB.utils.getKey(t)){case"Escape":w.value="",b();break;case"ArrowUp":t.preventDefault(),t.stopImmediatePropagation(),f();break;case"ArrowDown":t.preventDefault(),t.stopImmediatePropagation(),m();break;case"Enter":t.preventDefault(),t.stopImmediatePropagation(),u()}}function r(){b(),K()}function d(t){KB.dom(t).hasClass("select-dropdown-menu-item")&&(KB.find(".select-dropdown-menu-item.active").removeClass("active"),KB.dom(t).addClass("active"))}function s(){u()}function l(e){t.contains(e.target)||(w.value="",b())}function c(){var t=KB.find("#select-dropdown-menu");null===t?K():b()}function u(){var t=KB.find(".select-dropdown-menu-item.active"),o=t.data("value");k.value=o,w.value=e.items[o],b(),e.redirect?window.location=e.redirect.url.replace(new RegExp(e.redirect.regex,"g"),o):e.replace&&(n(),KB.modal.replace(e.replace.url.replace(new RegExp(e.replace.regex,"g"),o)))}function p(){for(var t=document.querySelectorAll(".select-dropdown-menu-item"),e=0;e<t.length;e++)if(KB.dom(t[e]).hasClass("active")){KB.dom(t[e]).removeClass("active");break}return{items:t,index:e}}function f(){var t=p();t.index>0&&(t.index=t.index-1),KB.dom(t.items[t.index]).addClass("active")}function m(){var t=p();t.index<t.items.length-1&&t.index++,KB.dom(t.items[t.index]).addClass("active")}function h(t){var n=[];for(var o in t)t.hasOwnProperty(o)&&n.push({class:"select-dropdown-menu-item",text:t[o],"data-label":t[o],"data-value":o});return e.sortByKeys?n.sort(function(t,e){var n=t["data-value"].toLowerCase(),o=e["data-value"].toLowerCase();return n<o?-1:n>o?1:0}):n.sort(function(t,e){var n=t["data-label"].toLowerCase(),o=e["data-label"].toLowerCase();return n<o?-1:n>o?1:0}),n}function g(t,n){for(var o=[],a=!1,i=0;i<n.length;i++)if(0===t.length||n[i]["data-label"].toLowerCase().indexOf(t.toLowerCase())>-1){var r=n[i];"undefined"!=typeof e.defaultValue&&String(e.defaultValue)===r["data-value"]&&(r.class+=" active",a=!0),o.push(r)}return!a&&o.length>0&&(o[0].class+=" active"),o}function v(){var t=g(w.value,h(e.items)),n=y.getBoundingClientRect();return 0===t.length?null:KB.dom("ul").attr("id","select-dropdown-menu").style("top",document.body.scrollTop+n.bottom+"px").style("left",n.left+"px").style("width",n.width+"px").style("maxHeight",window.innerHeight-n.bottom-20+"px").mouseover(d).click(s).for("li",t).build()}function b(){var t=KB.find("#select-dropdown-menu");null!==t&&t.remove(),document.removeEventListener("keydown",i,!1),document.removeEventListener("click",l,!1)}function K(){var t=v();null!==t&&document.body.appendChild(t),document.addEventListener("keydown",i,!1),document.addEventListener("click",l,!1)}function B(){return e.defaultValue&&e.defaultValue in e.items?e.items[e.defaultValue]:e.placeholder?e.placeholder:""}var y,w,k,x,C;this.render=function(){KB.on("select.dropdown.loading.start",n),KB.on("select.dropdown.loading.stop",o),KB.on("modal.close",function(){KB.removeListener("select.dropdown.loading.start",n),KB.removeListener("select.dropdown.loading.stop",o)}),x=KB.dom("i").attr("class","fa fa-chevron-down select-dropdown-chevron").click(c).build(),C=KB.dom("span").hide().addClass("select-loading-icon").add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).build(),k=KB.dom("input").attr("type","hidden").attr("name",e.name).attr("value",e.defaultValue||"").build(), -w=KB.dom("input").attr("type","text").attr("placeholder",B()).addClass("select-dropdown-input").style("width",t.offsetWidth-30+"px").on("focus",c).on("input",r,!0).build(),y=KB.dom("div").addClass("select-dropdown-input-container").add(k).add(w).add(x).add(C).build(),t.appendChild(y),e.onFocus&&e.onFocus.forEach(function(t){KB.on(t,function(){w.focus()})}),window.addEventListener("scroll",a,!1)}}),KB.interval(60,function(){var t=KB.find("body").data("statusUrl"),e=KB.find("body").data("loginUrl");null===KB.find(".form-login")&&KB.http.get(t).error(function(){window.location=e})}),KB.component("submit-buttons",function(t,e){function n(){u=!0,c(),KB.trigger("modal.submit")}function o(){KB.trigger("modal.close")}function a(){u=!1,c()}function i(){u=!1,p=!0,c()}function r(){u=!1,p=!1,c()}function d(){KB.dom(m).hide()}function s(t){f=t.submitLabel,c()}function l(){var t=KB.dom("button").attr("type","submit").attr("class","btn btn-"+(e.color||"blue"));return KB.modal.isOpen()&&t.click(n),e.tabindex&&t.attr("tabindex",e.tabindex),u&&t.disable().add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).text(" "),p&&t.disable(),t.text(f).build()}function c(){var t=l();KB.dom(h).replace(t),h=t}var u=!1,p=e.disabled||!1,f=e.submitLabel,m=null,h=null;this.render=function(){KB.on("modal.stop",a),KB.on("modal.disable",i),KB.on("modal.enable",r),KB.on("modal.hide",d),KB.on("modal.submit.label",s),KB.on("modal.close",function(){KB.removeListener("modal.stop",a),KB.removeListener("modal.disable",i),KB.removeListener("modal.enable",r),KB.removeListener("modal.hide",d),KB.removeListener("modal.submit.label",s)}),h=l();var n=KB.dom("div").attr("class","form-actions").add(h);KB.modal.isOpen()&&n.text(" "+e.orLabel+" ").add(KB.dom("a").attr("href","#").click(o).text(e.cancelLabel).build()),m=n.build(),t.appendChild(m)}}),KB.on("dom.ready",function(){function t(t,e){var n=$(".subtasks-table").data("save-position-url");$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({subtask_id:t,position:e})})}$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".subtasks-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(t,e){return e.children().each(function(){$(this).width($(this).width())}),e},stop:function(e,n){var o=n.item;o.removeClass("draggable-item-selected"),t(o.data("subtask-id"),o.index()+1)},start:function(t,e){e.item.addClass("draggable-item-selected")}}).disableSelection()}),KB.on("dom.ready",function(){$(document).on("click",".js-subtask-toggle-status",function(t){var e=$(this),n=e.attr("href");t.preventDefault(),$.ajax({cache:!1,url:n,success:function(t){n.indexOf("fragment=table")!=-1?$(".subtasks-table").replaceWith(t):n.indexOf("fragment=rows")!=-1?$(e).closest(".task-list-subtasks").replaceWith(t):$(e).closest(".subtask-title").replaceWith(t)}})}),$(document).on("click",".js-subtask-toggle-timer",function(t){var e=$(this);t.preventDefault(),$.ajax({cache:!1,url:e.attr("href"),success:function(t){$(e).closest(".subtask-time-tracking").replaceWith(t)}})})}),KB.component("suggest-menu",function(t,e){function n(t){switch(KB.utils.getKey(t)){case"Escape":u();break;case"ArrowUp":t.preventDefault(),t.stopImmediatePropagation(),l();break;case"ArrowDown":t.preventDefault(),t.stopImmediatePropagation(),c();break;case"Enter":t.preventDefault(),t.stopImmediatePropagation(),i()}}function o(){i()}function a(t){KB.dom(t).hasClass("suggest-menu-item")&&(KB.find(".suggest-menu-item.active").removeClass("active"),KB.dom(t).addClass("active"))}function i(){t.focus();var e=KB.find(".suggest-menu-item.active"),n=e.data("value"),o=e.data("trigger"),a=t.value,i=r(t),d=o+n+" ",s=KB.utils.getSelectionPosition(t),l=a.substring(0,s.selectionStart-i.length),c=a.substring(s.selectionEnd),p=l.length+d.length;t.value=l+d+c,t.setSelectionRange(p,p),u()}function r(t){var e=t.value.substring(0,t.selectionEnd).split("\n"),n=e[e.length-1],o=n.split(" ");return o[o.length-1]}function d(){for(var t=["#modal-content form","#modal-content","body"],e=0;e<t.length;e++){var n=document.querySelector(t[e]);if(null!==n)return n}return null}function s(){for(var t=document.querySelectorAll(".suggest-menu-item"),e=0;e<t.length;e++)if(KB.dom(t[e]).hasClass("active")){KB.dom(t[e]).removeClass("active");break}return{items:t,index:e}}function l(){var t=s();t.index>0&&(t.index=t.index-1),KB.dom(t.items[t.index]).addClass("active")}function c(){var t=s();t.index<t.items.length-1&&t.index++,KB.dom(t.items[t.index]).addClass("active")}function u(){var t=KB.find("#suggest-menu");null!==t&&t.remove(),document.removeEventListener("keydown",n,!1)}function p(t){var n=r(t),o=f(n,e.triggers);u(),null!==o&&m(o,n.substring(o.length),e.triggers[o])}function f(t,e){for(var n in e)if(e.hasOwnProperty(n)&&0===t.indexOf(n))return n;return null}function m(t,e,n){if("string"==typeof n){var o=new RegExp("SEARCH_TERM","g"),a=n.replace(o,e);KB.http.get(a).success(function(n){h(t,e,n)})}else h(t,e,n)}function h(t,e,n){n=g(e,n),n.length>0&&b(v(t,n))}function g(t,e){var n=[];if(0===t.length)return e;for(var o=0;o<e.length;o++)0===e[o].value.toLowerCase().indexOf(t.toLowerCase())&&n.push(e[o]);return n}function v(t,e){for(var n=[],o=0;o<e.length;o++){var a="suggest-menu-item";0===o&&(a+=" active"),n.push({class:a,html:e[o].html,"data-value":e[o].value,"data-trigger":t})}return n}function b(e){var i=d(),r=getCaretCoordinates(t,t.selectionEnd),s=r.left+t.offsetLeft-t.scrollLeft,l=r.top+t.offsetTop-t.scrollTop+16;document.addEventListener("keydown",n,!1);var c=KB.dom("ul").attr("id","suggest-menu").click(o).mouseover(a).style("left",s+"px").style("top",l+"px").for("li",e).build();i.appendChild(c)}this.render=function(){t.addEventListener("input",function(){p(this)})}}),KB.component("task-move-position",function(t,e){function n(t){var e=KB.dom(document).find("#"+t);return e?parseInt(e.options[e.selectedIndex].value):null}function o(){var t=n("form-swimlanes");return null===t?e.board[0].id:t}function a(){var t=n("form-columns");return null===t?e.board[0].columns[0].id:t}function i(){var t=n("form-position");return null===t?1:t}function r(){var t=KB.find("input[name=positionChoice]:checked");return t?t.value:"before"}function d(){var t=KB.dom(document).find("#form-columns");KB.dom(t).replace(p());var e=KB.dom(document).find("#form-tasks");KB.dom(e).replace(f())}function s(){var t=KB.dom(document).find("#form-tasks");KB.dom(t).replace(f())}function l(t){KB.trigger("modal.stop"),KB.find("#message-container").replace(KB.dom("div").attr("id","message-container").attr("class","alert alert-error").text(t).build())}function c(){var t=i(),n=r();"after"===n&&t++,KB.find("#message-container").replace(KB.dom("div").attr("id","message-container").build()),KB.http.postJson(e.saveUrl,{column_id:a(),swimlane_id:o(),position:t}).error(function(t){t&&l(t.message)})}function u(){var t=[];return e.board.forEach(function(e){t.push({value:e.id,text:e.name})}),KB.dom("select").attr("id","form-swimlanes").change(d).for("option",t).build()}function p(){var t=[],n=o();return e.board.forEach(function(e){n===e.id&&e.columns.forEach(function(e){t.push({value:e.id,text:e.title})})}),KB.dom("select").attr("id","form-columns").change(s).for("option",t).build()}function f(){var t=[],n=o(),i=a(),r=KB.dom("div").attr("id","form-tasks");return e.board.forEach(function(e){n===e.id&&e.columns.forEach(function(e){i===e.id&&e.tasks.forEach(function(e){t.push({value:e.position,text:"#"+e.id+" - "+e.title})})})}),t.length>0&&r.add(KB.html.label(e.positionLabel,"form-position")).add(KB.dom("select").attr("id","form-position").for("option",t).build()).add(KB.html.radio(e.beforeLabel,"positionChoice","before")).add(KB.html.radio(e.afterLabel,"positionChoice","after")),r.build()}this.render=function(){KB.on("modal.submit",c),KB.on("modal.close",function(){KB.removeListener("modal.submit",c)});var n=KB.dom("div").add(KB.dom("div").attr("id","message-container").build()).add(KB.html.label(e.swimlaneLabel,"form-swimlanes")).add(u()).add(KB.html.label(e.columnLabel,"form-columns")).add(p()).add(f()).build();t.appendChild(n)}}),KB.component("text-editor",function(t,e){function n(){var t=KB.dom("div").attr("class","text-editor-toolbar").for("a",[{href:"#",html:'<i class="fa fa-pencil-square-o fa-fw"></i> '+e.labelWrite,click:function(){a()}}]).build();return h=KB.dom("div").attr("class","text-editor-preview-area markdown").build(),KB.dom("div").attr("class","text-editor-view-mode").add(t).add(h).hide().build()}function o(){var t=KB.dom("div").attr("class","text-editor-toolbar").for("a",[{href:"#",html:'<i class="fa fa-eye fa-fw"></i> '+e.labelPreview,click:function(){a()}},{href:"#",html:'<i class="fa fa-bold fa-fw"></i>',click:function(){d("**")}},{href:"#",html:'<i class="fa fa-italic fa-fw"></i>',click:function(){d("_")}},{href:"#",html:'<i class="fa fa-strikethrough fa-fw"></i>',click:function(){d("~~")}},{href:"#",html:'<i class="fa fa-quote-right fa-fw"></i>',click:function(){l("> ")}},{href:"#",html:'<i class="fa fa-list-ul fa-fw"></i>',click:function(){l("* ")}},{href:"#",html:'<i class="fa fa-code fa-fw"></i>',click:function(){s("```")}}]).build(),n=KB.dom("textarea");return n.attr("name",e.name),e.tabindex&&n.attr("tabindex",e.tabindex),e.required&&n.attr("required","required"),n.text(e.text),e.placeholder&&n.attr("placeholder",e.placeholder),p=n.build(),e.suggestOptions&&KB.getComponent("suggest-menu",p,e.suggestOptions).render(),KB.dom("div").attr("class","text-editor-write-mode").add(t).add(p).build()}function a(){KB.dom(h).html(marked(p.value,{sanitize:!0})),KB.dom(f).toggle(),KB.dom(m).toggle()}function i(){return p.value.substring(p.selectionStart,p.selectionEnd)}function r(t,e,n,o){return t.substring(0,e)+o+t.substring(n)}function d(t){var e=i();c(t+e+t),u(t)}function s(t){var e=i();c("\n"+t+"\n"+e+"\n"+t),u(t,2)}function l(t){var e=i();if(e.indexOf("\n")===-1)c("\n"+t+e);else{for(var n=e.split("\n"),o=0;o<n.length;o++)n[o].indexOf(t)===-1&&(n[o]=t+n[o]);c(n.join("\n"))}u(t,1)}function c(t){p.focus();var e=!1,n=KB.utils.getSelectionPosition(p);if(g=n.selectionStart,v=n.selectionEnd,document.queryCommandSupported("insertText")&&(e=document.execCommand("insertText",!1,t)),!e){try{document.execCommand("ms-beginUndoUnit")}catch(t){}p.value=r(p.value,g,v,t);try{document.execCommand("ms-endUndoUnit")}catch(t){}}}function u(t,e){e=e||0;var n=v+t.length+e;p.setSelectionRange(n,n)}var p,f,m,h,g,v;this.render=function(){m=o(),f=n(),t.appendChild(KB.dom("div").attr("class","text-editor").add(f).add(m).build()),e.autofocus&&p.focus()}}),document.addEventListener("DOMContentLoaded",function(){KB.render(),KB.listen(),KB.keyboardShortcuts(),KB.trigger("dom.ready")});var Kanboard={};Kanboard.App=function(){this.controllers={}},Kanboard.App.prototype.get=function(t){return this.controllers[t]},Kanboard.App.prototype.execute=function(){for(var t in Kanboard)if("App"!==t){var e=new Kanboard[t](this);this.controllers[t]=e,"function"==typeof e.execute&&e.execute(),"function"==typeof e.listen&&e.listen(),"function"==typeof e.focus&&e.focus()}this.focus(),this.datePicker(),this.autoComplete(),this.tagAutoComplete()},Kanboard.App.prototype.focus=function(){$(document).on("focus",".auto-select",function(){$(this).select()}),$(document).on("mouseup",".auto-select",function(t){t.preventDefault()})},Kanboard.App.prototype.datePicker=function(){var t=$("body"),e=t.data("js-date-format"),n=t.data("js-time-format"),o=t.data("js-lang");$.datepicker.setDefaults($.datepicker.regional[o]),$.timepicker.setDefaults($.timepicker.regional[o]),$(".form-date").datepicker({showOtherMonths:!0,selectOtherMonths:!0,dateFormat:e,constrainInput:!1}),$(".form-datetime").datetimepicker({dateFormat:e,timeFormat:n,constrainInput:!1})},Kanboard.App.prototype.tagAutoComplete=function(){$(".tag-autocomplete").select2({tags:!0})},Kanboard.App.prototype.autoComplete=function(){$(".autocomplete").each(function(){var t=$(this),e=t.data("dst-field"),n=t.data("dst-extra-field");""===$("#form-"+e).val()&&t.parent().find("button[type=submit]").attr("disabled","disabled"),t.autocomplete({source:t.data("search-url"),minLength:1,select:function(o,a){$("input[name="+e+"]").val(a.item.id),n&&$("input[name="+n+"]").val(a.item[n]),t.parent().find("button[type=submit]").removeAttr("disabled")}})})},Kanboard.App.prototype.hasId=function(t){return!!document.getElementById(t)},Kanboard.App.prototype.showLoadingIcon=function(){$("body").append('<span id="app-loading-icon"> <i class="fa fa-spinner fa-spin"></i></span>')},Kanboard.App.prototype.hideLoadingIcon=function(){$("#app-loading-icon").remove()},Kanboard.BoardCollapsedMode=function(t){this.app=t},Kanboard.BoardCollapsedMode.prototype.toggle=function(){var t=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:$('.filter-display-mode:not([style="display: none;"]) a').attr("href"),success:function(e){$(".filter-display-mode").toggle(),t.app.get("BoardDragAndDrop").refresh(e)}})},Kanboard.BoardColumnView=function(t){this.app=t},Kanboard.BoardColumnView.prototype.execute=function(){this.app.hasId("board")&&this.render()},Kanboard.BoardColumnView.prototype.listen=function(){var t=this;$(document).on("click",".board-toggle-column-view",function(){t.toggle($(this).data("column-id"))})},Kanboard.BoardColumnView.prototype.onBoardRendered=function(){this.render()},Kanboard.BoardColumnView.prototype.render=function(){var t=this;$(".board-column-header").each(function(){var e=$(this).data("column-id");localStorage.getItem("hidden_column_"+e)&&t.hideColumn(e)})},Kanboard.BoardColumnView.prototype.toggle=function(t){localStorage.getItem("hidden_column_"+t)?this.showColumn(t):this.hideColumn(t),this.app.get("BoardDragAndDrop").dragAndDrop()},Kanboard.BoardColumnView.prototype.hideColumn=function(t){$(".board-column-"+t+" .board-column-expanded").hide(),$(".board-column-"+t+" .board-column-collapsed").show(),$(".board-column-header-"+t+" .board-column-expanded").hide(),$(".board-column-header-"+t+" .board-column-collapsed").show(),$(".board-column-header-"+t).each(function(){$(this).removeClass("board-column-compact"),$(this).addClass("board-column-header-collapsed")}),$(".board-column-"+t).each(function(){$(this).addClass("board-column-task-collapsed")}),$(".board-column-"+t+" .board-rotation").each(function(){$(this).css("width",$(".board-column-"+t).height())}),localStorage.setItem("hidden_column_"+t,1)},Kanboard.BoardColumnView.prototype.showColumn=function(t){$(".board-column-"+t+" .board-column-expanded").show(),$(".board-column-"+t+" .board-column-collapsed").hide(),$(".board-column-header-"+t+" .board-column-expanded").show(),$(".board-column-header-"+t+" .board-column-collapsed").hide(),$(".board-column-header-"+t).removeClass("board-column-header-collapsed"),$(".board-column-"+t).removeClass("board-column-task-collapsed"),0==localStorage.getItem("horizontal_scroll")&&$(".board-column-header-"+t).addClass("board-column-compact"),localStorage.removeItem("hidden_column_"+t)},Kanboard.BoardHorizontalScrolling=function(t){this.app=t},Kanboard.BoardHorizontalScrolling.prototype.execute=function(){this.app.hasId("board")&&this.render()},Kanboard.BoardHorizontalScrolling.prototype.listen=function(){var t=this;$(document).on("click",".filter-toggle-scrolling",function(e){e.preventDefault(),t.toggle()})},Kanboard.BoardHorizontalScrolling.prototype.onBoardRendered=function(){this.render()},Kanboard.BoardHorizontalScrolling.prototype.toggle=function(){var t=localStorage.getItem("horizontal_scroll")||1;localStorage.setItem("horizontal_scroll",0==t?1:0),this.render()},Kanboard.BoardHorizontalScrolling.prototype.render=function(){0==localStorage.getItem("horizontal_scroll")?($(".filter-wide").show(),$(".filter-compact").hide(),$("#board-container").addClass("board-container-compact"),$("#board th:not(.board-column-header-collapsed)").addClass("board-column-compact")):($(".filter-wide").hide(),$(".filter-compact").show(),$("#board-container").removeClass("board-container-compact"),$("#board th").removeClass("board-column-compact"))},Kanboard.BoardPolling=function(t){this.app=t},Kanboard.BoardPolling.prototype.execute=function(){if(this.app.hasId("board")){var t=parseInt($("#board").attr("data-check-interval"));t>0&&window.setInterval(this.check.bind(this),1e3*t)}},Kanboard.BoardPolling.prototype.check=function(){if(KB.utils.isVisible()&&!this.app.get("BoardDragAndDrop").savingInProgress){var t=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:$("#board").data("check-url"),statusCode:{200:function(e){t.app.get("BoardDragAndDrop").refresh(e)},304:function(){t.app.hideLoadingIcon()}}})}},Kanboard.Column=function(t){this.app=t},Kanboard.Column.prototype.listen=function(){this.dragAndDrop()},Kanboard.Column.prototype.dragAndDrop=function(){var t=this;$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".columns-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(t,e){return e.children().each(function(){$(this).width($(this).width())}),e},stop:function(e,n){var o=n.item;o.removeClass("draggable-item-selected"),t.savePosition(o.data("column-id"),o.index()+1)},start:function(t,e){e.item.addClass("draggable-item-selected")}}).disableSelection()},Kanboard.Column.prototype.savePosition=function(t,e){var n=$(".columns-table").data("save-position-url"),o=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({column_id:t,position:e}),complete:function(){o.app.hideLoadingIcon()}})},Kanboard.Dropdown=function(t){this.app=t},Kanboard.Dropdown.prototype.listen=function(){var t=this;$(document).on("click",function(){t.close()}),$(document).on("click",".dropdown-menu",function(e){e.preventDefault(),e.stopImmediatePropagation(),t.close();var n=$(this).next("ul"),o=$(this).offset();$("body").append(jQuery("<div>",{id:"dropdown"})),n.clone().appendTo("#dropdown");var a=$("#dropdown ul");a.addClass("dropdown-submenu-open");var i=a.outerHeight(),r=a.outerWidth();o.top+i-$(window).scrollTop()<$(window).height()||$(window).scrollTop()+o.top<i?a.css("top",o.top+$(this).height()):a.css("top",o.top-i-5),o.left+r>$(window).width()?a.css("left",o.left-r+$(this).outerWidth()):a.css("left",o.left)}),$(document).on("click",".dropdown-submenu-open li",function(t){$(t.target).is("li")&&$(this).find("a:visible")[0].click()})},Kanboard.Dropdown.prototype.close=function(){$("#dropdown").remove()},Kanboard.Gantt=function(t){this.app=t,this.data=[],this.options={container:"#gantt-chart",showWeekends:!0,allowMoves:!0,allowResizes:!0,cellWidth:21,cellHeight:31,slideWidth:1e3,vHeaderWidth:200}},Kanboard.Gantt.prototype.execute=function(){this.app.hasId("gantt-chart")&&this.show()},Kanboard.Gantt.prototype.saveRecord=function(t){this.app.showLoadingIcon(),$.ajax({cache:!1,url:$(this.options.container).data("save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify(t),complete:this.app.hideLoadingIcon.bind(this)})},Kanboard.Gantt.prototype.show=function(){this.data=this.prepareData($(this.options.container).data("records"));var t=Math.floor(this.options.slideWidth/this.options.cellWidth+5),e=this.getDateRange(t),n=e[0],o=e[1],a=$(this.options.container),i=jQuery("<div>",{class:"ganttview"});i.append(this.renderVerticalHeader()),i.append(this.renderSlider(n,o)),a.append(i),jQuery("div.ganttview-grid-row div.ganttview-grid-row-cell:last-child",a).addClass("last"),jQuery("div.ganttview-hzheader-days div.ganttview-hzheader-day:last-child",a).addClass("last"),jQuery("div.ganttview-hzheader-months div.ganttview-hzheader-month:last-child",a).addClass("last"),$(this.options.container).data("readonly")?(this.options.allowResizes=!1,this.options.allowMoves=!1):(this.listenForBlockResize(n),this.listenForBlockMove(n))},Kanboard.Gantt.prototype.renderVerticalHeader=function(){for(var t=jQuery("<div>",{class:"ganttview-vtheader"}),e=jQuery("<div>",{class:"ganttview-vtheader-item"}),n=jQuery("<div>",{class:"ganttview-vtheader-series"}),o=0;o<this.data.length;o++){var a=jQuery("<span>").append(jQuery("<i>",{class:"fa fa-info-circle tooltip",title:this.getVerticalHeaderTooltip(this.data[o])})).append(" ");"task"==this.data[o].type?a.append(jQuery("<a>",{href:this.data[o].link,title:this.data[o].title}).text(this.data[o].title)):a.append(jQuery("<a>",{href:this.data[o].board_link,title:$(this.options.container).data("label-board-link")}).append('<i class="fa fa-th"></i>')).append(" ").append(jQuery("<a>",{href:this.data[o].gantt_link,title:$(this.options.container).data("label-gantt-link")}).append('<i class="fa fa-sliders"></i>')).append(" ").append(jQuery("<a>",{href:this.data[o].link}).text(this.data[o].title)),n.append(jQuery("<div>",{class:"ganttview-vtheader-series-name"}).append(a))}return e.append(n),t.append(e),t},Kanboard.Gantt.prototype.renderSlider=function(t,e){var n=jQuery("<div>",{class:"ganttview-slide-container"}),o=this.getDates(t,e);return n.append(this.renderHorizontalHeader(o)),n.append(this.renderGrid(o)),n.append(this.addBlockContainers()),this.addBlocks(n,t),n},Kanboard.Gantt.prototype.renderHorizontalHeader=function(t){var e=jQuery("<div>",{class:"ganttview-hzheader"}),n=jQuery("<div>",{class:"ganttview-hzheader-months"}),o=jQuery("<div>",{class:"ganttview-hzheader-days"}),a=0;for(var i in t)for(var r in t[i]){var d=t[i][r].length*this.options.cellWidth;a+=d,n.append(jQuery("<div>",{class:"ganttview-hzheader-month",css:{width:d-1+"px"}}).append($.datepicker.regional[$("body").data("js-lang")].monthNames[r]+" "+i));for(var s in t[i][r])o.append(jQuery("<div>",{class:"ganttview-hzheader-day"}).append(t[i][r][s].getDate()))}return n.css("width",a+"px"),o.css("width",a+"px"),e.append(n).append(o),e},Kanboard.Gantt.prototype.renderGrid=function(t){var e=jQuery("<div>",{class:"ganttview-grid"}),n=jQuery("<div>",{class:"ganttview-grid-row"});for(var o in t)for(var a in t[o])for(var i in t[o][a]){var r=jQuery("<div>",{class:"ganttview-grid-row-cell"});this.options.showWeekends&&this.isWeekend(t[o][a][i])&&r.addClass("ganttview-weekend"),n.append(r)}var d=jQuery("div.ganttview-grid-row-cell",n).length*this.options.cellWidth;n.css("width",d+"px"),e.css("width",d+"px");for(var s=0;s<this.data.length;s++)e.append(n.clone());return e},Kanboard.Gantt.prototype.addBlockContainers=function(){for(var t=jQuery("<div>",{class:"ganttview-blocks"}),e=0;e<this.data.length;e++)t.append(jQuery("<div>",{class:"ganttview-block-container"}));return t},Kanboard.Gantt.prototype.addBlocks=function(t,e){for(var n=jQuery("div.ganttview-blocks div.ganttview-block-container",t),o=0,a=0;a<this.data.length;a++){var i=this.data[a],r=this.daysBetween(i.start,i.end)+1,d=this.daysBetween(e,i.start),s=jQuery("<div>",{class:"ganttview-block-text"}),l=jQuery("<div>",{class:"ganttview-block tooltip"+(this.options.allowMoves?" ganttview-block-movable":""),title:this.getBarTooltip(i),css:{width:r*this.options.cellWidth-9+"px","margin-left":d*this.options.cellWidth+"px"}}).append(s);r>=2&&s.append(i.progress),l.data("record",i),this.setBarColor(l,i),jQuery(n[o]).append(l),o+=1}},Kanboard.Gantt.prototype.getVerticalHeaderTooltip=function(t){var e="";if("task"==t.type)e=jQuery("<span>").append(jQuery("<strong>").text(t.column_title)).append(document.createTextNode(" ("+t.progress+")")).append(jQuery("<br>")).append(document.createTextNode(t.title)).prop("outerHTML");else{var n=["project-manager","project-member"];for(var o in n){var a=n[o];if(!jQuery.isEmptyObject(t.users[a])){var i=jQuery("<ul>");for(var r in t.users[a])r&&i.append(jQuery("<li>").text(t.users[a][r]));e+="<p><strong>"+$(this.options.container).data("label-"+a)+"</strong></p>"+i.prop("outerHTML")}}}return e},Kanboard.Gantt.prototype.getBarTooltip=function(t){var e="";if(t.not_defined)e=$(this.options.container).data("label-not-defined");else{if("task"==t.type){var n=$(this.options.container).data("label-assignee");e+=jQuery("<strong>").text(t.progress).prop("outerHTML"),e+="<br>",e+=jQuery("<span>").append(document.createTextNode(n+" "+(t.assignee?t.assignee:""))).prop("outerHTML"),e+="<br>"}e+=$(this.options.container).data("label-start-date")+" "+$.datepicker.formatDate("yy-mm-dd",t.start)+"<br/>",e+=$(this.options.container).data("label-end-date")+" "+$.datepicker.formatDate("yy-mm-dd",t.end)}return e},Kanboard.Gantt.prototype.setBarColor=function(t,e){e.not_defined?t.addClass("ganttview-block-not-defined"):(t.css("background-color",e.color.background),t.css("border-color",e.color.border),"0%"!=e.progress&&t.append(jQuery("<div>",{css:{"z-index":0,position:"absolute",top:0,bottom:0,"background-color":e.color.border,width:e.progress,opacity:.4}})))},Kanboard.Gantt.prototype.listenForBlockResize=function(t){var e=this;jQuery("div.ganttview-block",this.options.container).resizable({grid:this.options.cellWidth,handles:"e,w",delay:300,stop:function(){var n=jQuery(this);e.updateDataAndPosition(n,t),e.saveRecord(n.data("record"))}})},Kanboard.Gantt.prototype.listenForBlockMove=function(t){var e=this;jQuery("div.ganttview-block",this.options.container).draggable({axis:"x",delay:300,grid:[this.options.cellWidth,this.options.cellWidth],stop:function(){var n=jQuery(this);e.updateDataAndPosition(n,t),e.saveRecord(n.data("record"))}})},Kanboard.Gantt.prototype.updateDataAndPosition=function(t,e){var n=jQuery("div.ganttview-slide-container",this.options.container),o=n.scrollLeft(),a=t.offset().left-n.offset().left-1+o,i=t.data("record");i.not_defined=!1,this.setBarColor(t,i);var r=Math.round(a/this.options.cellWidth),d=this.addDays(this.cloneDate(e),r);i.start=d;var s=t.outerWidth(),l=Math.round(s/this.options.cellWidth)-1;i.end=this.addDays(this.cloneDate(d),l),"task"===i.type&&l>0&&jQuery("div.ganttview-block-text",t).text(i.progress),t.attr("title",this.getBarTooltip(i)),t.data("record",i),t.css("top","").css("left","").css("position","relative").css("margin-left",a+"px")},Kanboard.Gantt.prototype.getDates=function(t,e){var n=[];n[t.getFullYear()]=[],n[t.getFullYear()][t.getMonth()]=[t];for(var o=t;this.compareDate(o,e)==-1;){var a=this.addDays(this.cloneDate(o),1);n[a.getFullYear()]||(n[a.getFullYear()]=[]),n[a.getFullYear()][a.getMonth()]||(n[a.getFullYear()][a.getMonth()]=[]),n[a.getFullYear()][a.getMonth()].push(a),o=a}return n},Kanboard.Gantt.prototype.prepareData=function(t){for(var e=0;e<t.length;e++){var n=new Date(t[e].start[0],t[e].start[1]-1,t[e].start[2],0,0,0,0);t[e].start=n;var o=new Date(t[e].end[0],t[e].end[1]-1,t[e].end[2],0,0,0,0);t[e].end=o}return t},Kanboard.Gantt.prototype.getDateRange=function(t){for(var e=new Date,n=new Date,o=0;o<this.data.length;o++){var a=new Date;a.setTime(Date.parse(this.data[o].start));var i=new Date;i.setTime(Date.parse(this.data[o].end)),0==o&&(e=a,n=i),1==this.compareDate(e,a)&&(e=a),this.compareDate(n,i)==-1&&(n=i)}return this.daysBetween(e,n)<t&&(n=this.addDays(this.cloneDate(e),t)),e.setDate(e.getDate()-1),[e,n]},Kanboard.Gantt.prototype.daysBetween=function(t,e){if(!t||!e)return 0;for(var n=0,o=this.cloneDate(t);this.compareDate(o,e)==-1;)n+=1,this.addDays(o,1);return n},Kanboard.Gantt.prototype.isWeekend=function(t){return t.getDay()%6==0},Kanboard.Gantt.prototype.cloneDate=function(t){return new Date(t.getTime())},Kanboard.Gantt.prototype.addDays=function(t,e){return t.setDate(t.getDate()+1*e),t},Kanboard.Gantt.prototype.compareDate=function(t,e){if(isNaN(t)||isNaN(e))throw new Error(t+" - "+e);if(t instanceof Date&&e instanceof Date)return t<e?-1:t>e?1:0;throw new TypeError(t+" - "+e)},Kanboard.Search=function(t){this.app=t},Kanboard.Search.prototype.focus=function(){$(document).on("focus","#form-search",function(){var t=$("#form-search");if(t[0].setSelectionRange){var e=2*t.val().length;t[0].setSelectionRange(e,e)}})},Kanboard.Search.prototype.listen=function(){$(document).on("click",".filter-helper",function(t){t.preventDefault();var e=$(this).data("filter"),n=$(this).data("append-filter"),o=$(this).data("unique-filter"),a=$("#form-search");if(o){var i=o.substr(0,o.indexOf(":"));e=a.val().replace(new RegExp("("+i+":[#a-z0-9]+)","g"),""),e=e.replace(new RegExp("("+i+':"(.+)")',"g"),""),e=e.trim(),e+=" "+o}else n&&(e=a.val()+" "+n);a.val(e),$("form.search").submit()})},Kanboard.Swimlane=function(t){this.app=t},Kanboard.Swimlane.prototype.execute=function(){$(".swimlanes-table").length&&this.dragAndDrop()},Kanboard.Swimlane.prototype.listen=function(){var t=this;$(document).on("click",".board-swimlane-toggle",function(e){e.preventDefault();var n=$(this).data("swimlane-id");t.isCollapsed(n)?t.expand(n):t.collapse(n)})},Kanboard.Swimlane.prototype.onBoardRendered=function(){for(var t=this.getAllCollapsed(),e=0;e<t.length;e++)this.collapse(t[e])},Kanboard.Swimlane.prototype.getStorageKey=function(){return"hidden_swimlanes_"+$("#board").data("project-id")},Kanboard.Swimlane.prototype.expand=function(t){var e=this.getAllCollapsed(),n=e.indexOf(t);n>-1&&e.splice(n,1),localStorage.setItem(this.getStorageKey(),JSON.stringify(e)),$(".board-swimlane-columns-"+t).css("display","table-row"),$(".board-swimlane-tasks-"+t).css("display","table-row"),$(".hide-icon-swimlane-"+t).css("display","inline"),$(".show-icon-swimlane-"+t).css("display","none")},Kanboard.Swimlane.prototype.collapse=function(t){var e=this.getAllCollapsed();e.indexOf(t)<0&&(e.push(t),localStorage.setItem(this.getStorageKey(),JSON.stringify(e))),$(".board-swimlane-columns-"+t+":not(:first-child)").css("display","none"),$(".board-swimlane-tasks-"+t).css("display","none"),$(".hide-icon-swimlane-"+t).css("display","none"),$(".show-icon-swimlane-"+t).css("display","inline")},Kanboard.Swimlane.prototype.isCollapsed=function(t){return this.getAllCollapsed().indexOf(t)>-1},Kanboard.Swimlane.prototype.getAllCollapsed=function(){return JSON.parse(localStorage.getItem(this.getStorageKey()))||[]},Kanboard.Swimlane.prototype.dragAndDrop=function(){var t=this;$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".swimlanes-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(t,e){return e.children().each(function(){$(this).width($(this).width())}),e},stop:function(e,n){var o=n.item;o.removeClass("draggable-item-selected"),t.savePosition(o.data("swimlane-id"),o.index()+1)},start:function(t,e){e.item.addClass("draggable-item-selected")}}).disableSelection()},Kanboard.Swimlane.prototype.savePosition=function(t,e){var n=$(".swimlanes-table").data("save-position-url"),o=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({swimlane_id:t,position:e}),complete:function(){o.app.hideLoadingIcon()}})},Kanboard.Task=function(t){this.app=t},Kanboard.Task.prototype.onPopoverOpened=function(){var t=this;t.renderColorPicker(),$(document).on("click",".assign-me",function(t){var e=$(this).data("current-id"),n="#"+$(this).data("target-id");t.preventDefault(),$(n+" option[value="+e+"]").length&&$(n).val(e)})},Kanboard.Task.prototype.renderColorPicker=function(){function t(t){return $('<div class="color-picker-option"><div class="color-picker-square color-'+t.id+'"></div><div class="color-picker-label">'+t.text+"</div></div>")}$(".color-picker").select2({minimumResultsForSearch:1/0,templateResult:t,templateSelection:t})},Kanboard.Tooltip=function(t){this.app=t},Kanboard.Tooltip.prototype.onBoardRendered=function(){this.execute()},Kanboard.Tooltip.prototype.execute=function(){$(".tooltip").tooltip({track:!1,show:!1,hide:!1,position:{my:"left-20 top",at:"center bottom+9",using:function(t,e){$(this).css(t);var n=e.target.left+e.target.width/2-e.element.left-20; -$("<div>").addClass("tooltip-arrow").addClass(e.vertical).addClass(n<1?"align-left":"align-right").appendTo(this)}},content:function(){var t=this,e=$(this).attr("data-href");return e?($.get(e,function(e){var n=$(".ui-tooltip:visible");$(".ui-tooltip-content:visible").html(e),n.css({top:"",left:""}),n.children(".tooltip-arrow").remove();var o=$(t).tooltip("option","position");o.of=$(t),n.position(o)}),'<i class="fa fa-spinner fa-spin"></i>'):'<div class="markdown">'+$(this).attr("title")+"</div>"}}).on("mouseenter",function(){var t=this;$(this).tooltip("open"),$(".ui-tooltip").on("mouseleave",function(){$(t).tooltip("close")})}).on("mouseleave focusout",function(t){t.stopImmediatePropagation();var e=this;setTimeout(function(){$(".ui-tooltip:hover").length||$(e).tooltip("close")},100)})},Kanboard.BoardDragAndDrop=function(t){this.app=t,this.savingInProgress=!1},Kanboard.BoardDragAndDrop.prototype.execute=function(){this.app.hasId("board")&&(this.executeListeners(),this.dragAndDrop())},Kanboard.BoardDragAndDrop.prototype.dragAndDrop=function(){var t=this,e=$(".board-task-list"),n={forcePlaceholderSize:!0,tolerance:"pointer",connectWith:".sortable-column",placeholder:"draggable-placeholder",items:".draggable-item",stop:function(e,n){var o=n.item,a=o.attr("data-task-id"),i=o.attr("data-position"),r=o.attr("data-column-id"),d=o.attr("data-swimlane-id"),s=o.parent().attr("data-column-id"),l=o.parent().attr("data-swimlane-id"),c=o.index()+1;o.removeClass("draggable-item-selected"),s==r&&l==d&&c==i||(t.changeTaskState(a),t.save(a,r,s,c,l))},start:function(t,e){e.item.addClass("draggable-item-selected"),e.placeholder.height(e.item.height())}};isMobile.any&&($(".task-board-sort-handle").css("display","inline"),n.handle=".task-board-sort-handle"),e.each(function(){$(this).css("min-height",$(this).parent().height())}),e.sortable(n)},Kanboard.BoardDragAndDrop.prototype.changeTaskState=function(t){var e=$("div[data-task-id="+t+"]");e.addClass("task-board-saving-state"),e.find(".task-board-saving-icon").show()},Kanboard.BoardDragAndDrop.prototype.save=function(t,e,n,o,a){var i=this;i.app.showLoadingIcon(),i.savingInProgress=!0,$.ajax({cache:!1,url:$("#board").data("save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:t,src_column_id:e,dst_column_id:n,swimlane_id:a,position:o}),success:function(t){i.refresh(t),i.savingInProgress=!1},error:function(){i.app.hideLoadingIcon(),i.savingInProgress=!1},statusCode:{403:function(t){window.alert(t.responseJSON.message),document.location.reload(!0)}}})},Kanboard.BoardDragAndDrop.prototype.refresh=function(t){$("#board-container").replaceWith(t),this.app.hideLoadingIcon(),this.executeListeners(),this.dragAndDrop()},Kanboard.BoardDragAndDrop.prototype.executeListeners=function(){for(var t in this.app.controllers){var e=this.app.get(t);"function"==typeof e.onBoardRendered&&e.onBoardRendered()}};var _KB=null;jQuery(document).ready(function(){_KB=new Kanboard.App,_KB.execute()});
\ No newline at end of file +!function(){function e(e,a,i){if(!n)throw new Error("textarea-caret-position#getCaretCoordinates should only be called in a browser");var r=i&&i.debug||!1;if(r){var d=document.querySelector("#input-textarea-caret-position-mirror-div");d&&d.parentNode.removeChild(d)}var s=document.createElement("div");s.id="input-textarea-caret-position-mirror-div",document.body.appendChild(s);var l=s.style,c=window.getComputedStyle?getComputedStyle(e):e.currentStyle;l.whiteSpace="pre-wrap","INPUT"!==e.nodeName&&(l.wordWrap="break-word"),l.position="absolute",r||(l.visibility="hidden"),t.forEach(function(e){l[e]=c[e]}),o?e.scrollHeight>parseInt(c.height)&&(l.overflowY="scroll"):l.overflow="hidden",s.textContent=e.value.substring(0,a),"INPUT"===e.nodeName&&(s.textContent=s.textContent.replace(/\s/g," "));var u=document.createElement("span");u.textContent=e.value.substring(a)||".",s.appendChild(u);var m={top:u.offsetTop+parseInt(c.borderTopWidth),left:u.offsetLeft+parseInt(c.borderLeftWidth)};return r?u.style.backgroundColor="#aaa":document.body.removeChild(s),m}var t=["direction","boxSizing","width","height","overflowX","overflowY","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderStyle","paddingTop","paddingRight","paddingBottom","paddingLeft","fontStyle","fontVariant","fontWeight","fontStretch","fontSize","fontSizeAdjust","lineHeight","fontFamily","textAlign","textTransform","textIndent","textDecoration","letterSpacing","wordSpacing","tabSize","MozTabSize"],n="undefined"!=typeof window,o=n&&null!=window.mozInnerScreenX;"undefined"!=typeof module&&"undefined"!=typeof module.exports?module.exports=e:n&&(window.getCaretCoordinates=e)}(),function(){function e(){if(!("KeyboardEvent"in window)||"key"in KeyboardEvent.prototype)return!1;var e={get:function(e){var t=n.keys[this.which||this.keyCode];return Array.isArray(t)&&(t=t[+this.shiftKey]),t}};return Object.defineProperty(KeyboardEvent.prototype,"key",e),e}var t,n={polyfill:e,keys:{3:"Cancel",6:"Help",8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",28:"Convert",29:"NonConvert",30:"Accept",31:"ModeChange",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",41:"Select",42:"Print",43:"Execute",44:"PrintScreen",45:"Insert",46:"Delete",48:["0",")"],49:["1","!"],50:["2","@"],51:["3","#"],52:["4","$"],53:["5","%"],54:["6","^"],55:["7","&"],56:["8","*"],57:["9","("],91:"OS",93:"ContextMenu",144:"NumLock",145:"ScrollLock",181:"VolumeMute",182:"VolumeDown",183:"VolumeUp",186:[";",":"],187:["=","+"],188:[",","<"],189:["-","_"],190:[".",">"],191:["/","?"],192:["`","~"],219:["[","{"],220:["\\","|"],221:["]","}"],222:["'",'"'],224:"Meta",225:"AltGraph",246:"Attn",247:"CrSel",248:"ExSel",249:"EraseEof",250:"Play",251:"ZoomOut"}};for(t=1;t<25;t++)n.keys[111+t]="F"+t;var o="";for(t=65;t<91;t++)o=String.fromCharCode(t),n.keys[t]=[o.toLowerCase(),o.toUpperCase()];n.polyfill()}(),Element.prototype.matches||(Element.prototype.matches=Element.prototype.matchesSelector||Element.prototype.mozMatchesSelector||Element.prototype.msMatchesSelector||Element.prototype.oMatchesSelector||Element.prototype.webkitMatchesSelector||function(e){for(var t=(this.document||this.ownerDocument).querySelectorAll(e),n=t.length;--n>=0&&t.item(n)!==this;);return n>-1});var KB={components:{},utils:{},html:{},http:{},listeners:{clicks:{},changes:{},keys:[],internals:{}}};KB.on=function(e,t){this.listeners.internals.hasOwnProperty(e)||(this.listeners.internals[e]=[]),this.listeners.internals[e].push(t)},KB.trigger=function(e,t){if(this.listeners.internals.hasOwnProperty(e))for(var n=0;n<this.listeners.internals[e].length;n++)this.listeners.internals[e][n](t)},KB.removeListener=function(e,t){if(this.listeners.internals.hasOwnProperty(e))for(var n=0;n<this.listeners.internals[e].length;n++)this.listeners.internals[e][n]===t&&this.listeners.internals[e].splice(n,1)},KB.onClick=function(e,t,n){this.listeners.clicks[e]={callback:t,noPreventDefault:n===!0}},KB.onChange=function(e,t){this.listeners.changes[e]=t},KB.onKey=function(e,t,n,o,a){this.listeners.keys.push({combination:e,callback:t,ignoreInputField:n||!1,ctrlKey:o||!1,metaKey:a||!1})},KB.listen=function(){function e(e){for(var t in o.listeners.clicks)o.listeners.clicks.hasOwnProperty(t)&&e.target.matches(t)&&(o.listeners.clicks[t].noPreventDefault||e.preventDefault(),o.listeners.clicks[t].callback(e))}function t(e){for(var t in o.listeners.changes)o.listeners.changes.hasOwnProperty(t)&&e.target.matches(t)&&o.listeners.changes[t](e.target)}function n(e){var t=KB.utils.getKey(e),n=KB.utils.isInputField(e);if(n&&["Escape","Enter"].indexOf(t)===-1||a.push(t),a.length>0){for(var i=!0,r=0;r<o.listeners.keys.length;r++){var d=o.listeners.keys[r],s=d.combination,l=s.split("+");if(KB.utils.arraysIdentical(a,l)&&e.ctrlKey===d.ctrlKey&&e.metaKey===d.metaKey){if(n&&!d.ignoreInputField)return void(a=[]);e.preventDefault(),e.stopPropagation(),a=[],d.callback(e);break}KB.utils.arraysStartsWith(a,l)&&a.length<l.length&&(i=!1)}i&&(a=[])}}var o=this,a=[];document.addEventListener("click",e,!1),document.addEventListener("change",t,!1),window.addEventListener("keydown",n,!1)},KB.component=function(e,t){this.components[e]=t},KB.getComponent=function(e,t,n){var o=this.components[e];return new o(t,n)},KB.render=function(){for(var e in this.components)for(var t=document.querySelectorAll(".js-"+e),n=0;n<t.length;n++)if(this.components.hasOwnProperty(e)){var o;t[n].dataset.params&&(o=JSON.parse(t[n].dataset.params));var a=KB.getComponent(e,t[n],o);a.render(),t[n].className=t[n].className+"-rendered"}},KB.interval=function(e,t){setInterval(t,1e3*e)},KB.dom=function(e){function t(e){var t="string"==typeof e?document.createElement(e):e;this.attr=function(e,n){return null!==n&&"undefined"!=typeof n?(t.setAttribute(e,n),this):t.getAttribute(e)},this.data=function(e,n){return 1===arguments.length?t.dataset[e]:(t.dataset[e]=n,this)},this.hide=function(){return t.style.display="none",this},this.show=function(){return t.style.display="block",this},this.toggle=function(){return"none"===t.style.display?this.show():this.hide(),this},this.style=function(e,n){return t.style[e]=n,this},this.on=function(e,n,o){return t.addEventListener(e,function(e){o||e.preventDefault(),n(e.target)}),this},this.click=function(e){return this.on("click",e)},this.mouseover=function(e){return this.on("mouseover",e)},this.change=function(e){return this.on("change",e)},this.add=function(e){return t.appendChild(e),this},this.replace=function(e){return t.parentNode.replaceChild(e,t),this},this.html=function(e){return t.innerHTML=e,this},this.text=function(e){return t.appendChild(document.createTextNode(e)),this},this.replaceText=function(e){return t.textContent=e,this},this.addClass=function(e){return t.classList.add(e),this},this.removeClass=function(e){return t.classList.remove(e),this},this.toggleClass=function(e){return t.classList.toggle(e),this},this.hasClass=function(e){return t.classList.contains(e)},this.disable=function(){return t.disabled=!0,this},this.enable=function(){return t.disabled=!1,this},this.remove=function(){return t.parentNode.removeChild(t),this},this.empty=function(){for(;t.firstChild;)t.removeChild(t.firstChild);return this},this.parent=function(e){for(;t&&t!==document;t=t.parentNode)if(t.matches(e))return t;return null},this.find=function(e){return t.querySelector(e)},this.for=function(e,n){for(var o=0;o<n.length;o++){var a=n[o];if("object"!=typeof a)t.appendChild(KB.dom(e).text(a).build());else{var i=KB.dom(e);for(var r in a)a.hasOwnProperty(r)&&r in this&&"function"==typeof this[r]?i[r](a[r]):i.attr(r,a[r]);t.appendChild(i.build())}}return this},this.build=function(){return t}}return new t(e)},KB.find=function(e){var t=document.querySelector(e);return t?KB.dom(t):null},KB.exists=function(e){return!!document.querySelector(e)},KB.focus=function(e){var t=document.querySelector(e);if(t)return t.focus()},KB.html.label=function(e,t){return KB.dom("label").attr("for",t).text(e).build()},KB.html.radio=function(e,t,n){return KB.dom("label").add(KB.dom("input").attr("type","radio").attr("name",t).attr("value",n).build()).text(e).build()},KB.html.radios=function(e){var t=KB.dom("div");for(var n in e)e.hasOwnProperty(n)&&t.add(KB.html.radio(n.label,n.name,n.value))},KB.http.request=function(e,t,n,o){function a(e){var t=e.getResponseHeader("X-Ajax-Redirect"),n=e.getResponseHeader("Location");if("self"===t)window.location.reload();else if(t&&t.indexOf("#")>-1)window.location=t.split("#")[0];else if(t)window.location=t;else if(n)window.location=n;else if("application/json"===e.getResponseHeader("Content-Type"))try{return JSON.parse(e.responseText)}catch(e){}return e.responseText}var i=function(){},r=function(){};this.execute=function(){var d=new XMLHttpRequest;d.open(e,t,!0),d.setRequestHeader("X-Requested-With","XMLHttpRequest");for(var s in n)n.hasOwnProperty(s)&&d.setRequestHeader(s,n[s]);return d.onerror=function(){r()},d.onreadystatechange=function(){if(d.readyState===XMLHttpRequest.DONE){var e=a(d);200===d.status?i(e):r(e)}},d.send(o),this},this.success=function(e){return i=e,this},this.error=function(e){return r=e,this}},KB.http.get=function(e){return new KB.http.request("GET",e).execute()},KB.http.postJson=function(e,t){var n={"Content-Type":"application/json",Accept:"application/json"};return new KB.http.request("POST",e,n,JSON.stringify(t)).execute()},KB.http.postForm=function(e,t){var n=new FormData(t);return new KB.http.request("POST",e,{},n).execute()},KB.http.uploadFile=function(e,t,n,o,a,i){var r=new FormData;r.append("files[]",t);var d=new XMLHttpRequest;d.upload.addEventListener("progress",n),d.upload.addEventListener("error",a),d.open("POST",e,!0),d.setRequestHeader("X-Requested-With","XMLHttpRequest"),d.onreadystatechange=function(){d.readyState===XMLHttpRequest.DONE&&(200===d.status?o():"undefined"!=typeof i&&i(JSON.parse(d.responseText)))},d.send(r)},function(){function e(e){e.target.matches("#modal-overlay")&&(e.stopPropagation(),e.preventDefault(),s())}function t(){KB.trigger("modal.close")}function n(){KB.trigger("modal.loading"),a()}function o(){return document.querySelector("#modal-content form:not(.js-modal-ignore-form)")}function a(){var e=o();if(e){var t=e.getAttribute("action");t&&KB.http.postForm(t,e).success(function(e){KB.trigger("modal.stop"),e?r(e):s()})}}function i(){var e=KB.find("#modal-content form");e&&e.on("submit",n,!1);var t=document.querySelector("#modal-content input[autofocus]");t&&t.focus(),KB.render(),_KB.datePicker(),_KB.autoComplete(),_KB.tagAutoComplete(),_KB.get("Task").onPopoverOpened()}function r(e){var t=KB.find("#modal-content");t&&(t.replace(KB.dom("div").attr("id","modal-content").html(e).build()),i())}function d(n,o,a){var r=KB.dom("a").attr("href","#").attr("id","modal-close-button").html('<i class="fa fa-times"></i>').click(t).build(),d=KB.dom("div").attr("id","modal-header").add(r).build(),s=KB.dom("div").attr("id","modal-content").html(n).build(),l=KB.dom("div").attr("id","modal-box").style("width",o).add(d).add(s).build(),c=KB.dom("div").attr("id","modal-overlay").add(l).build();a&&c.addEventListener("click",e,!1),document.body.appendChild(c),i()}function s(){c=!1;var e=KB.find("#modal-overlay");e&&e.remove()}function l(e){var t=KB.utils.getViewportSize();if(t.width<700)return"99%";switch(e){case"large":return t.width<1350?"98%":"1350px";case"medium":return t.width<1024?"70%":"1024px"}return t.width<800?"75%":"800px"}var c=!1;KB.on("modal.close",function(){s()}),KB.on("modal.submit",function(){a()}),KB.modal={open:function(e,t,n){_KB.get("Dropdown").close(),s(),"undefined"==typeof n&&(n=!0),KB.http.get(e).success(function(e){c=!0,d(e,l(t),n)})},close:function(){s()},isOpen:function(){return c},replace:function(e){KB.http.get(e).success(function(e){r(e)})},getForm:o,submitForm:a}}(),KB.utils.formatDuration=function(e){return e>=86400?Math.round(e/86400)+"d":e>=3600?Math.round(e/3600)+"h":e>=60?Math.round(e/60)+"m":e+"s"},KB.utils.getSelectionPosition=function(e){var t,n;return t=e.value.length<e.selectionStart?e.value.length:e.selectionStart,n=e.selectionStart===e.selectionEnd?t:e.selectionEnd,{selectionStart:t,selectionEnd:n}},KB.utils.arraysIdentical=function(e,t){var n=e.length;if(n!==t.length)return!1;for(;n--;)if(e[n]!==t[n])return!1;return!0},KB.utils.arraysStartsWith=function(e,t){for(var n=Math.min(e.length,t.length),o=0;o<n;o++)if(e[o]!==t[o])return!1;return!0},KB.utils.isInputField=function(e){var t=e.target;return!("INPUT"!==t.tagName&&"SELECT"!==t.tagName&&"TEXTAREA"!==t.tagName&&!t.isContentEditable)},KB.utils.getKey=function(e){var t={Esc:"Escape",Up:"ArrowUp",Down:"ArrowDown",Left:"ArrowLeft",Right:"ArrowRight"};for(var n in t)if(t.hasOwnProperty(n)&&n===e.key)return t[n];return e.key},KB.utils.getViewportSize=function(){return{width:Math.max(document.documentElement.clientWidth,window.innerWidth||0),height:Math.max(document.documentElement.clientHeight,window.innerHeight||0)}},KB.utils.isVisible=function(){var e="";return"undefined"!=typeof document.hidden?e="visibilityState":"undefined"!=typeof document.mozHidden?e="mozVisibilityState":"undefined"!=typeof document.msHidden?e="msVisibilityState":"undefined"!=typeof document.webkitHidden&&(e="webkitVisibilityState"),""===e||"visible"===document[e]},KB.onClick(".accordion-toggle",function(e){var t=KB.dom(e.target).parent(".accordion-section");t&&KB.dom(t).toggleClass("accordion-collapsed")}),function(){function e(e){var t=KB.dom(e.target).parent("a, .task-board-change-assignee");if(!t){var n=KB.dom(e.target).parent(".task-board");if(n){var o=KB.dom(n).data("taskUrl");o&&(window.location=o)}}}function t(e){var t=KB.dom(e.target).parent(".task-board-change-assignee"),n=KB.dom(t).data("url");n&&KB.modal.open(n,"medium",!1)}KB.onClick(".task-board *",e,!0),KB.onClick(".task-board-change-assignee *",t,!0)}(),KB.component("chart-project-avg-time-column",function(e,t){this.render=function(){var n=t.metrics,o=[t.label],a=[];for(var i in n)o.push(n[i].average),a.push(n[i].title);KB.dom(e).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:[o],type:"bar"},bar:{width:{ratio:.5}},axis:{x:{type:"category",categories:a},y:{tick:{format:KB.utils.formatDuration}}},legend:{show:!1}})}}),KB.component("chart-project-burndown",function(e,t){this.render=function(){for(var n=t.metrics,o=[[t.labelTotal]],a=[],i=d3.time.format("%Y-%m-%d"),r=d3.time.format(t.dateFormat),d=0;d<n.length;d++)for(var s=0;s<n[d].length;s++){var l=n[d][s];0===d?s>0&&o.push([l]):s>0?(o[s].push(l),"undefined"==typeof o[0][d]&&o[0].push(0),o[0][d]+=l):a.push(r(i.parse(l)))}KB.dom(e).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:o},axis:{x:{type:"category",categories:a}}})}}),KB.component("chart-project-cumulative-flow",function(e,t){this.render=function(){for(var n=t.metrics,o=[],a=[],i=[],r=d3.time.format("%Y-%m-%d"),d=d3.time.format(t.dateFormat),s=0;s<n.length;s++)for(var l=0;l<n[s].length;l++){var c=n[s][l];0===s?l>0&&(a.push(c),o.push([c])):l>0?o[l-1].push(c):i.push(d(r.parse(c)))}KB.dom(e).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:o.reverse(),type:"area-spline",groups:[a],order:null},axis:{x:{type:"category",categories:i}}})}}),KB.component("chart-project-lead-cycle-time",function(e,t){this.render=function(){var n=t.metrics,o=[t.labelCycle],a=[t.labelLead],i=[],r={};r[t.labelCycle]="area",r[t.labelLead]="area-spline";var d={};d[t.labelLead]="#afb42b",d[t.labelCycle]="#4e342e";for(var s=0;s<n.length;s++)o.push(parseInt(n[s].avg_cycle_time)),a.push(parseInt(n[s].avg_lead_time)),i.push(n[s].day);KB.dom(e).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:[a,o],types:r,colors:d},axis:{x:{type:"category",categories:i},y:{tick:{format:KB.utils.formatDuration}}}})}}),KB.component("chart-project-task-distribution",function(e,t){this.render=function(){for(var n=[],o=0;o<t.metrics.length;o++)n.push([t.metrics[o].column_title,t.metrics[o].nb_tasks]);KB.dom(e).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:n,type:"donut"}})}}),KB.component("chart-project-time-comparison",function(e,t){this.render=function(){var n=[t.labelSpent],o=[t.labelEstimated],a=[];for(var i in t.metrics)n.push(t.metrics[i].time_spent),o.push(t.metrics[i].time_estimated),a.push("open"===i?t.labelOpen:t.labelClosed);KB.dom(e).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:[n,o],type:"bar"},bar:{width:{ratio:.2}},axis:{x:{type:"category",categories:a}},legend:{show:!0}})}}),KB.component("chart-project-user-distribution",function(e,t){this.render=function(){for(var n=[],o=0;o<t.metrics.length;o++)n.push([t.metrics[o].user,t.metrics[o].nb_tasks]);KB.dom(e).add(KB.dom("div").attr("id","chart").build()),c3.generate({data:{columns:n,type:"donut"}})}}),KB.component("chart-task-time-column",function(e,t){this.render=function(){for(var n=t.metrics,o=[t.label],a=[],i=0;i<n.length;i++)o.push(n[i].time_spent),a.push(n[i].title);KB.dom(e).add(KB.dom("div").attr("id","chart-task-time-column").build()),c3.generate({bindto:"#chart-task-time-column",data:{columns:[o],type:"bar"},bar:{width:{ratio:.5}},axis:{x:{type:"category",categories:a},y:{tick:{format:KB.utils.formatDuration}}},legend:{show:!1}})}}),KB.on("dom.ready",function(){function e(){if(0===window.location.hash.indexOf("#comment-")){var e=KB.find(window.location.hash);if(e){var t=document.querySelectorAll(".comment");t.forEach(function(e){KB.dom(e).removeClass("comment-highlighted")}),e.addClass("comment-highlighted")}}}window.addEventListener("hashchange",e),e()}),KB.component("confirm-buttons",function(e,t){function n(){r=!0,KB.find("#modal-confirm-button").replace(i()),KB.http.get(t.url)}function o(){KB.trigger("modal.close")}function a(){r=!1,KB.find("#modal-confirm-button").replace(i())}function i(){var e=KB.dom("button").click(n).attr("id","modal-confirm-button").attr("type","button").attr("class","btn btn-red");return r&&e.disable().add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).text(" "),t.tabindex&&e.attr("tabindex",t.tabindex),e.text(t.submitLabel).build()}var r=!1;this.render=function(){KB.on("modal.stop",a),KB.on("modal.close",function(){KB.removeListener("modal.stop",a)});var n=KB.dom("div").attr("class","form-actions").add(i()).text(" "+t.orLabel+" ").add(KB.dom("a").attr("href","#").click(o).text(t.cancelLabel).build()).build();e.appendChild(n)}}),KB.component("external-task-view",function(e,t){this.render=function(){$.ajax({cache:!1,url:t.url,success:function(t){KB.dom(e).html('<div id="external-task-view">'+t+"</div>")}})}}),KB.component("file-upload",function(e,t){function n(e){if(e.lengthComputable){var t=e.loaded/e.total,n=Math.floor(100*t);KB.find("#file-progress-"+y).attr("value",t),KB.find("#file-percentage-"+y).replaceText("("+n+"%)")}}function o(){var e=KB.dom("div").addClass("file-error").text(t.labelUploadError).build();KB.find("#file-item-"+y).add(e)}function a(e){var t=KB.dom("div").addClass("file-error").text(e.message).build();KB.find("#file-item-"+y).add(t),KB.trigger("modal.stop")}function i(){if(y++,y<w.length)KB.http.uploadFile(t.url,w[y],n,i,o,a);else{KB.trigger("modal.stop"),KB.trigger("modal.hide");var e=KB.dom("div").addClass("alert").addClass("alert-success").text(t.labelSuccess).build(),d=KB.dom("button").attr("type","button").addClass("btn").addClass("btn-blue").click(r).text(t.labelCloseSuccess).build();KB.dom(B).replace(KB.dom("div").add(e).add(d).build())}}function r(){window.location.reload()}function d(){y=0,m()}function s(){w=K.files,p()}function l(){w=[],y=0,K.click()}function c(e){e.stopPropagation(),e.preventDefault()}function u(e){e.stopPropagation(),e.preventDefault(),w=e.dataTransfer.files,p()}function m(){w.length>0&&KB.http.uploadFile(t.url,w[y],n,i,o,a)}function p(){w.length>0?(KB.trigger("modal.enable"),KB.dom(B).empty().add(b())):(KB.trigger("modal.disable"),KB.dom(B).empty().add(h()))}function f(){return KB.dom("input").attr("id","file-input-element").attr("type","file").attr("name","files[]").attr("multiple",!0).on("change",s).hide().build()}function h(){var e=KB.dom("a").attr("href","#").text(t.labelChooseFiles).click(l).build();return KB.dom("div").attr("id","file-dropzone-inner").text(t.labelDropzone+" "+t.labelOr+" ").add(e).build()}function g(){var e=KB.dom("div").attr("id","file-dropzone").add(h()).build();return e.ondragover=c,e.ondrop=u,e.ondragover=c,e}function v(e){var n=!1,o=KB.dom("progress").attr("id","file-progress-"+e).attr("value",0).build(),a=KB.dom("span").attr("id","file-percentage-"+e).text("(0%)").build(),i=KB.dom("li").attr("id","file-item-"+e).add(o).text(" "+w[e].name+" ").add(a);return w[e].size>t.maxSize&&(i.add(KB.dom("div").addClass("file-error").text(t.labelOversize).build()),n=!0),n&&KB.trigger("modal.disable"),i.build()}function b(){for(var e=KB.dom("ul").attr("id","file-list").build(),t=0;t<w.length;t++)e.appendChild(v(t));return e}var K=null,B=null,w=[],y=0;this.render=function(){KB.on("modal.submit",d),KB.on("modal.close",function(){KB.removeListener("modal.submit",d)}),K=f(),B=g(),e.appendChild(K),e.appendChild(B)}}),KB.onClick(".js-form-export",function(e){var t=document.querySelector("#modal-content form"),n=t.querySelector("#form-from"),o=t.querySelector("#form-to");""!==n.value&&""!==o.value&&t.submit()}),KB.component("image-slideshow",function(e,t){function n(e){switch(KB.utils.getKey(e)){case"Escape":s();break;case"ArrowRight":i();break;case"ArrowLeft":r()}}function o(e){e.matches(".slideshow-next-icon")?i():e.matches(".slideshow-previous-icon")?r():e.matches(".slideshow-download-icon")?window.location.href=e.href:s()}function a(e){var t=KB.dom(e).data("imageId"),n=l(t);d(n)}function i(){s();for(var e=0;e<t.images.length;e++)if(t.images[e].id===m.id){var n=e+1;n>=t.images.length&&(n=0),m=t.images[n];break}d()}function r(){s();for(var e=0;e<t.images.length;e++)if(t.images[e].id===m.id){var n=e-1;n<0&&(n=t.images.length-1),m=t.images[n];break}d()}function d(){var e=KB.dom("div").attr("class","fa fa-window-close slideshow-icon slideshow-close-icon").build(),t=KB.dom("a").attr("class","fa fa-download slideshow-icon slideshow-download-icon").attr("href",c(m,"download")).build(),a=KB.dom("div").attr("class","fa fa-chevron-circle-left slideshow-icon slideshow-previous-icon").build(),i=KB.dom("div").attr("class","fa fa-chevron-circle-right slideshow-icon slideshow-next-icon").build(),r=KB.dom("img").attr("src",c(m,"image")).attr("alt",m.name).attr("title",m.name).style("maxHeight",window.innerHeight-50+"px").build(),d=KB.dom("figcaption").text(m.name).build(),s=KB.dom("figure").add(r).add(d).build(),l=KB.dom("div").addClass("image-slideshow-overlay").add(e).add(t).add(a).add(i).add(s).click(o).build();document.body.appendChild(l),document.addEventListener("keydown",n,!1)}function s(){var e=KB.find(".image-slideshow-overlay");null!==e&&(document.removeEventListener("keydown",n,!1),e.remove())}function l(e){for(var n=0;n<t.images.length;n++)if(t.images[n].id===e)return t.images[n];return null}function c(e,n){var o=new RegExp(t.regex,"g");return t.url[n].replace(o,e.id)}function u(e){return KB.dom("img").attr("src",c(e,"thumbnail")).attr("alt",e.name).attr("title",e.name).data("imageId",e.id).click(a).build()}var m;this.render=function(){m=t.image,e.appendChild(u(m))}}),KB.keyboardShortcuts=function(){function e(e){if(!KB.modal.isOpen()){var t=KB.find(e);null!==t&&(window.location=t.attr("href"))}}function t(){if(KB.modal.isOpen())KB.modal.submitForm();else{var e=$("form");1==e.length?e.submit():e.length>1&&("INPUT"!==document.activeElement.tagName&&"TEXTAREA"!==document.activeElement.tagName||$(document.activeElement).parents("form").submit())}}KB.onKey("?",function(){KB.modal.isOpen()||KB.modal.open(KB.find("body").data("keyboardShortcutUrl"))}),KB.onKey("Escape",function(){KB.exists("#suggest-menu")||(KB.trigger("modal.close"),_KB.get("Dropdown").close())}),KB.onKey("Enter",t,!0,!0),KB.onKey("Enter",t,!0,!1,!0),KB.onKey("b",function(){KB.modal.isOpen()||KB.trigger("board.selector.open")}),KB.exists("#board")&&(KB.onKey("c",function(){KB.modal.isOpen()||_KB.get("BoardHorizontalScrolling").toggle()}),KB.onKey("s",function(){KB.modal.isOpen()||_KB.get("BoardCollapsedMode").toggle()}),KB.onKey("n",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#board").data("taskCreationUrl"),"large",!1)})),KB.exists("#task-view")&&(KB.onKey("e",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("editUrl"),"large",!1)}),KB.onKey("c",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("commentUrl"),"medium",!1)}),KB.onKey("s",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("subtaskUrl"),"medium",!1)}),KB.onKey("l",function(){KB.modal.isOpen()||KB.modal.open(KB.find("#task-view").data("internalLinkUrl"),"medium",!1)})),KB.onKey("f",function(){KB.modal.isOpen()||KB.focus("#form-search")}),KB.onKey("r",function(){if(!KB.modal.isOpen()){var e=$(".filter-reset").data("filter"),t=$("#form-search");t.val(e),$("form.search").submit()}}),KB.onKey("v+o",function(){e("a.view-overview")}),KB.onKey("v+b",function(){e("a.view-board")}),KB.onKey("v+l",function(){e("a.view-listing")})},function(){function e(e){return"I"===e.target.tagName?e.target.parentNode.getAttribute("href"):e.target.getAttribute("href")}KB.onClick(".js-modal-large",function(t){KB.modal.open(e(t),"large",!1)}),KB.onClick(".js-modal-medium",function(t){KB.modal.isOpen()?KB.modal.replace(e(t)):KB.modal.open(e(t),"medium",!1)}),KB.onClick(".js-modal-small",function(t){KB.modal.open(e(t),"small",!1)}),KB.onClick(".js-modal-confirm",function(t){KB.modal.open(e(t),"small")}),KB.onClick(".js-modal-close",function(){KB.modal.close()}),KB.onClick(".js-modal-replace",function(t){var n=e(t);KB.modal.isOpen()?KB.modal.replace(n):window.location.href=n})}(),KB.onChange(".js-project-creation-select-options",function(e){var t=e.value;"0"===t?KB.find(".js-project-creation-options").hide():KB.find(".js-project-creation-options").show()}),KB.component("project-select-role",function(e,t){function n(e){d=!0,t.role=e.value,a(),o()}function o(){KB.http.postJson(t.url,{id:t.id,role:t.role}).success(function(){d=!1,s=!0,a()}).error(function(){d=!1,s=!1,l=!0,a()})}function a(){KB.dom(r).remove(),r=i(),e.appendChild(r)}function i(){var e=[],o=KB.dom("div");for(var a in t.roles)if(t.roles.hasOwnProperty(a)){var i={value:a,text:t.roles[a]};t.role===a&&(i.selected="selected"),e.push(i)}return o.add(KB.dom("select").change(n).for("option",e).build()),d?(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-spinner fa-pulse fa-fw").build())):s?(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-check fa-fw icon-fade-out icon-success").build())):l&&(o.text(" "),o.add(KB.dom("i").attr("class","fa fa-check fa-fw icon-fade-out icon-error").build())),o.build()}var r,d=!1,s=!1,l=!1;this.render=function(){r=i(),e.appendChild(r)}}),KB.component("screenshot",function(e){function t(e){d(e.target.result)}function n(e){if(e.clipboardData&&e.clipboardData.items){var n=e.clipboardData.items;if(n)for(var o=0;o<n.length;o++)if(n[o].type.indexOf("image")!==-1){var a=n[o].getAsFile(),i=new FileReader;i.onload=t,i.readAsDataURL(a)}}else setTimeout(r,100)}function o(){a(),window.Clipboard||(s=document.createElement("div"),s.id="screenshot-pastezone",s.contentEditable=!0,s.style.opacity=0,s.style.position="fixed",s.style.top=0,s.style.right=0,s.style.width=0,document.body.insertBefore(s,document.body.firstChild),s.focus(),document.addEventListener("click",i),document.getElementById("screenshot-zone").addEventListener("click",i)),window.addEventListener("paste",n,!1)}function a(){KB.exists("#screenshot-pastezone")&&KB.find("#screenshot-pastezone").remove(),document.removeEventListener("click",i),s=null}function i(){null!==s&&s.focus()}function r(){var e=s.childNodes[0];e&&"IMG"===e.tagName&&d(e.src),s.innerHTML=""}function d(e){var t=new Image;t.src=e,t.onload=function(){var t=e.split("base64,");l.value=t[1]};var n=document.getElementById("screenshot-zone");n.innerHTML="",n.className="screenshot-pasted",n.appendChild(t),a(),o()}var s=null,l=null;KB.on("modal.close",function(){a()}),this.render=function(){l=KB.dom("input").attr("type","hidden").attr("name","screenshot").build(),e.appendChild(l),o()}}),KB.component("select-dropdown-autocomplete",function(e,t){function n(){KB.dom(k).show(),KB.dom(x).hide()}function o(){KB.dom(k).hide(),KB.dom(x).show()}function a(){var e=KB.find("#select-dropdown-menu");if(e){var t=w.getBoundingClientRect();e.style("top",document.body.scrollTop+t.bottom+"px")}}function i(e){switch(KB.utils.getKey(e)){case"Escape":y.value="",b();break;case"ArrowUp":e.preventDefault(),e.stopImmediatePropagation(),p();break;case"ArrowDown":e.preventDefault(),e.stopImmediatePropagation(),f();break;case"Enter":e.preventDefault(),e.stopImmediatePropagation(),u()}}function r(){b(),K()}function d(e){KB.dom(e).hasClass("select-dropdown-menu-item")&&(KB.find(".select-dropdown-menu-item.active").removeClass("active"),KB.dom(e).addClass("active"))}function s(){u()}function l(t){e.contains(t.target)||(y.value="",b())}function c(){var e=KB.find("#select-dropdown-menu");null===e?K():b()}function u(){var e=KB.find(".select-dropdown-menu-item.active"),o=e.data("value");C.value=o,y.value=t.items[o],b(),t.redirect?window.location=t.redirect.url.replace(new RegExp(t.redirect.regex,"g"),o):t.replace&&(n(),KB.modal.replace(t.replace.url.replace(new RegExp(t.replace.regex,"g"),o)))}function m(){for(var e=document.querySelectorAll(".select-dropdown-menu-item"),t=0;t<e.length;t++)if(KB.dom(e[t]).hasClass("active")){KB.dom(e[t]).removeClass("active");break}return{items:e,index:t}}function p(){var e=m();e.index>0&&(e.index=e.index-1),KB.dom(e.items[e.index]).addClass("active")}function f(){var e=m();e.index<e.items.length-1&&e.index++,KB.dom(e.items[e.index]).addClass("active")}function h(e){var n=[];for(var o in e)e.hasOwnProperty(o)&&n.push({class:"select-dropdown-menu-item",text:e[o],"data-label":e[o],"data-value":o});return t.sortByKeys?n.sort(function(e,t){var n=e["data-value"].toLowerCase(),o=t["data-value"].toLowerCase();return n<o?-1:n>o?1:0}):n.sort(function(e,t){var n=e["data-label"].toLowerCase(),o=t["data-label"].toLowerCase();return n<o?-1:n>o?1:0}),n}function g(e,n){for(var o=[],a=!1,i=0;i<n.length;i++)if(0===e.length||n[i]["data-label"].toLowerCase().indexOf(e.toLowerCase())>-1){var r=n[i];"undefined"!=typeof t.defaultValue&&String(t.defaultValue)===r["data-value"]&&(r.class+=" active",a=!0),o.push(r)}return!a&&o.length>0&&(o[0].class+=" active"),o}function v(){var e=g(y.value,h(t.items)),n=w.getBoundingClientRect();return 0===e.length?null:KB.dom("ul").attr("id","select-dropdown-menu").style("top",document.body.scrollTop+n.bottom+"px").style("left",n.left+"px").style("width",n.width+"px").style("maxHeight",window.innerHeight-n.bottom-20+"px").mouseover(d).click(s).for("li",e).build()}function b(){var e=KB.find("#select-dropdown-menu");null!==e&&e.remove(),document.removeEventListener("keydown",i,!1),document.removeEventListener("click",l,!1)}function K(){var e=v();null!==e&&document.body.appendChild(e),document.addEventListener("keydown",i,!1),document.addEventListener("click",l,!1)}function B(){return t.defaultValue&&t.defaultValue in t.items?t.items[t.defaultValue]:t.placeholder?t.placeholder:""}var w,y,C,x,k;this.render=function(){KB.on("select.dropdown.loading.start",n),KB.on("select.dropdown.loading.stop",o),KB.on("modal.close",function(){KB.removeListener("select.dropdown.loading.start",n),KB.removeListener("select.dropdown.loading.stop",o)}),x=KB.dom("i").attr("class","fa fa-chevron-down select-dropdown-chevron").click(c).build(),k=KB.dom("span").hide().addClass("select-loading-icon").add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).build(),C=KB.dom("input").attr("type","hidden").attr("name",t.name).attr("value",t.defaultValue||"").build(), +y=KB.dom("input").attr("type","text").attr("placeholder",B()).addClass("select-dropdown-input").style("width",e.offsetWidth-30+"px").on("focus",c).on("input",r,!0).build(),w=KB.dom("div").addClass("select-dropdown-input-container").add(C).add(y).add(x).add(k).build(),e.appendChild(w),t.onFocus&&t.onFocus.forEach(function(e){KB.on(e,function(){y.focus()})}),window.addEventListener("scroll",a,!1)}}),KB.interval(60,function(){var e=KB.find("body").data("statusUrl"),t=KB.find("body").data("loginUrl");null===KB.find(".form-login")&&KB.http.get(e).error(function(){window.location=t})}),KB.component("submit-buttons",function(e,t){function n(){u=!0,c(),KB.trigger("modal.submit")}function o(){KB.trigger("modal.close")}function a(){u=!1,c()}function i(){u=!1,m=!0,c()}function r(){u=!1,m=!1,c()}function d(){KB.dom(f).hide()}function s(e){p=e.submitLabel,c()}function l(){var e=KB.dom("button").attr("type","submit").attr("class","btn btn-"+(t.color||"blue"));return KB.modal.isOpen()&&e.click(n),t.tabindex&&e.attr("tabindex",t.tabindex),u&&e.disable().add(KB.dom("i").attr("class","fa fa-spinner fa-pulse").build()).text(" "),m&&e.disable(),e.text(p).build()}function c(){var e=l();KB.dom(h).replace(e),h=e}var u=!1,m=t.disabled||!1,p=t.submitLabel,f=null,h=null;this.render=function(){KB.on("modal.stop",a),KB.on("modal.disable",i),KB.on("modal.enable",r),KB.on("modal.hide",d),KB.on("modal.submit.label",s),KB.on("modal.close",function(){KB.removeListener("modal.stop",a),KB.removeListener("modal.disable",i),KB.removeListener("modal.enable",r),KB.removeListener("modal.hide",d),KB.removeListener("modal.submit.label",s)}),h=l();var n=KB.dom("div").attr("class","form-actions").add(h);KB.modal.isOpen()&&n.text(" "+t.orLabel+" ").add(KB.dom("a").attr("href","#").click(o).text(t.cancelLabel).build()),f=n.build(),e.appendChild(f)}}),KB.on("dom.ready",function(){function e(e,t){var n=$(".subtasks-table").data("save-position-url");$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({subtask_id:e,position:t})})}$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".subtasks-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(e,t){return t.children().each(function(){$(this).width($(this).width())}),t},stop:function(t,n){var o=n.item;o.removeClass("draggable-item-selected"),e(o.data("subtask-id"),o.index()+1)},start:function(e,t){t.item.addClass("draggable-item-selected")}}).disableSelection()}),KB.on("dom.ready",function(){$(document).on("click",".js-subtask-toggle-status",function(e){var t=$(this),n=t.attr("href");e.preventDefault(),$.ajax({cache:!1,url:n,success:function(e){n.indexOf("fragment=table")!=-1?$(".subtasks-table").replaceWith(e):n.indexOf("fragment=rows")!=-1?$(t).closest(".task-list-subtasks").replaceWith(e):$(t).closest(".subtask-title").replaceWith(e)}})}),$(document).on("click",".js-subtask-toggle-timer",function(e){var t=$(this);e.preventDefault(),$.ajax({cache:!1,url:t.attr("href"),success:function(e){$(t).closest(".subtask-time-tracking").replaceWith(e)}})})}),KB.component("suggest-menu",function(e,t){function n(e){switch(KB.utils.getKey(e)){case"Escape":u();break;case"ArrowUp":e.preventDefault(),e.stopImmediatePropagation(),l();break;case"ArrowDown":e.preventDefault(),e.stopImmediatePropagation(),c();break;case"Enter":e.preventDefault(),e.stopImmediatePropagation(),i()}}function o(){i()}function a(e){KB.dom(e).hasClass("suggest-menu-item")&&(KB.find(".suggest-menu-item.active").removeClass("active"),KB.dom(e).addClass("active"))}function i(){e.focus();var t=KB.find(".suggest-menu-item.active"),n=t.data("value"),o=t.data("trigger"),a=e.value,i=r(e),d=o+n+" ",s=KB.utils.getSelectionPosition(e),l=a.substring(0,s.selectionStart-i.length),c=a.substring(s.selectionEnd),m=l.length+d.length;e.value=l+d+c,e.setSelectionRange(m,m),u()}function r(e){var t=e.value.substring(0,e.selectionEnd).split("\n"),n=t[t.length-1],o=n.split(" ");return o[o.length-1]}function d(){for(var e=["#modal-content form","#modal-content","body"],t=0;t<e.length;t++){var n=document.querySelector(e[t]);if(null!==n)return n}return null}function s(){for(var e=document.querySelectorAll(".suggest-menu-item"),t=0;t<e.length;t++)if(KB.dom(e[t]).hasClass("active")){KB.dom(e[t]).removeClass("active");break}return{items:e,index:t}}function l(){var e=s();e.index>0&&(e.index=e.index-1),KB.dom(e.items[e.index]).addClass("active")}function c(){var e=s();e.index<e.items.length-1&&e.index++,KB.dom(e.items[e.index]).addClass("active")}function u(){var e=KB.find("#suggest-menu");null!==e&&e.remove(),document.removeEventListener("keydown",n,!1)}function m(e){var n=r(e),o=p(n,t.triggers);u(),null!==o&&f(o,n.substring(o.length),t.triggers[o])}function p(e,t){for(var n in t)if(t.hasOwnProperty(n)&&0===e.indexOf(n))return n;return null}function f(e,t,n){if("string"==typeof n){var o=new RegExp("SEARCH_TERM","g"),a=n.replace(o,t);KB.http.get(a).success(function(n){h(e,t,n)})}else h(e,t,n)}function h(e,t,n){n=g(t,n),n.length>0&&b(v(e,n))}function g(e,t){var n=[];if(0===e.length)return t;for(var o=0;o<t.length;o++)0===t[o].value.toLowerCase().indexOf(e.toLowerCase())&&n.push(t[o]);return n}function v(e,t){for(var n=[],o=0;o<t.length;o++){var a="suggest-menu-item";0===o&&(a+=" active"),n.push({class:a,html:t[o].html,"data-value":t[o].value,"data-trigger":e})}return n}function b(t){var i=d(),r=getCaretCoordinates(e,e.selectionEnd),s=r.left+e.offsetLeft-e.scrollLeft,l=r.top+e.offsetTop-e.scrollTop+16;document.addEventListener("keydown",n,!1);var c=KB.dom("ul").attr("id","suggest-menu").click(o).mouseover(a).style("left",s+"px").style("top",l+"px").for("li",t).build();i.appendChild(c)}this.render=function(){e.addEventListener("input",function(){m(this)})}}),KB.component("task-move-position",function(e,t){function n(e){var t=KB.dom(document).find("#"+e);return t?parseInt(t.options[t.selectedIndex].value):null}function o(){var e=n("form-swimlanes");return null===e?t.board[0].id:e}function a(){var e=n("form-columns");return null===e?t.board[0].columns[0].id:e}function i(){var e=n("form-position");return null===e?1:e}function r(){var e=KB.find("input[name=positionChoice]:checked");return e?e.value:"before"}function d(){var e=KB.dom(document).find("#form-columns");KB.dom(e).replace(m());var t=KB.dom(document).find("#form-tasks");KB.dom(t).replace(p())}function s(){var e=KB.dom(document).find("#form-tasks");KB.dom(e).replace(p())}function l(e){KB.trigger("modal.stop"),KB.find("#message-container").replace(KB.dom("div").attr("id","message-container").attr("class","alert alert-error").text(e).build())}function c(){var e=i(),n=r();"after"===n&&e++,KB.find("#message-container").replace(KB.dom("div").attr("id","message-container").build()),KB.http.postJson(t.saveUrl,{column_id:a(),swimlane_id:o(),position:e}).error(function(e){e&&l(e.message)})}function u(){var e=[];return t.board.forEach(function(t){e.push({value:t.id,text:t.name})}),KB.dom("select").attr("id","form-swimlanes").change(d).for("option",e).build()}function m(){var e=[],n=o();return t.board.forEach(function(t){n===t.id&&t.columns.forEach(function(t){e.push({value:t.id,text:t.title})})}),KB.dom("select").attr("id","form-columns").change(s).for("option",e).build()}function p(){var e=[],n=o(),i=a(),r=KB.dom("div").attr("id","form-tasks");return t.board.forEach(function(t){n===t.id&&t.columns.forEach(function(t){i===t.id&&t.tasks.forEach(function(t){e.push({value:t.position,text:"#"+t.id+" - "+t.title})})})}),e.length>0&&r.add(KB.html.label(t.positionLabel,"form-position")).add(KB.dom("select").attr("id","form-position").for("option",e).build()).add(KB.html.radio(t.beforeLabel,"positionChoice","before")).add(KB.html.radio(t.afterLabel,"positionChoice","after")),r.build()}this.render=function(){KB.on("modal.submit",c),KB.on("modal.close",function(){KB.removeListener("modal.submit",c)});var n=KB.dom("div").add(KB.dom("div").attr("id","message-container").build()).add(KB.html.label(t.swimlaneLabel,"form-swimlanes")).add(u()).add(KB.html.label(t.columnLabel,"form-columns")).add(m()).add(p()).build();e.appendChild(n)}}),KB.component("text-editor",function(e,t){function n(){var e=KB.dom("div").attr("class","text-editor-toolbar").for("a",[{href:"#",html:'<i class="fa fa-pencil-square-o fa-fw"></i> '+t.labelWrite,click:function(){a()}}]).build();return h=KB.dom("div").attr("class","text-editor-preview-area markdown").build(),KB.dom("div").attr("class","text-editor-view-mode").add(e).add(h).hide().build()}function o(){var e=KB.dom("div").attr("class","text-editor-toolbar").for("a",[{href:"#",html:'<i class="fa fa-eye fa-fw"></i> '+t.labelPreview,click:function(){a()}},{href:"#",html:'<i class="fa fa-bold fa-fw"></i>',click:function(){d("**")}},{href:"#",html:'<i class="fa fa-italic fa-fw"></i>',click:function(){d("_")}},{href:"#",html:'<i class="fa fa-strikethrough fa-fw"></i>',click:function(){d("~~")}},{href:"#",html:'<i class="fa fa-quote-right fa-fw"></i>',click:function(){l("> ")}},{href:"#",html:'<i class="fa fa-list-ul fa-fw"></i>',click:function(){l("* ")}},{href:"#",html:'<i class="fa fa-code fa-fw"></i>',click:function(){s("```")}}]).build(),n=KB.dom("textarea");return n.attr("name",t.name),t.tabindex&&n.attr("tabindex",t.tabindex),t.required&&n.attr("required","required"),n.text(t.text),t.placeholder&&n.attr("placeholder",t.placeholder),m=n.build(),t.suggestOptions&&KB.getComponent("suggest-menu",m,t.suggestOptions).render(),KB.dom("div").attr("class","text-editor-write-mode").add(e).add(m).build()}function a(){KB.dom(h).html(marked(m.value,{sanitize:!0})),KB.dom(p).toggle(),KB.dom(f).toggle()}function i(){return m.value.substring(m.selectionStart,m.selectionEnd)}function r(e,t,n,o){return e.substring(0,t)+o+e.substring(n)}function d(e){var t=i();c(e+t+e),u(e)}function s(e){var t=i();c("\n"+e+"\n"+t+"\n"+e),u(e,2)}function l(e){var t=i();if(t.indexOf("\n")===-1)c("\n"+e+t);else{for(var n=t.split("\n"),o=0;o<n.length;o++)n[o].indexOf(e)===-1&&(n[o]=e+n[o]);c(n.join("\n"))}u(e,1)}function c(e){m.focus();var t=!1,n=KB.utils.getSelectionPosition(m);if(g=n.selectionStart,v=n.selectionEnd,document.queryCommandSupported("insertText")&&(t=document.execCommand("insertText",!1,e)),!t){try{document.execCommand("ms-beginUndoUnit")}catch(e){}m.value=r(m.value,g,v,e);try{document.execCommand("ms-endUndoUnit")}catch(e){}}}function u(e,t){t=t||0;var n=v+e.length+t;m.setSelectionRange(n,n)}var m,p,f,h,g,v;this.render=function(){f=o(),p=n(),e.appendChild(KB.dom("div").attr("class","text-editor").add(p).add(f).build()),t.autofocus&&m.focus()}}),document.addEventListener("DOMContentLoaded",function(){KB.render(),KB.listen(),KB.keyboardShortcuts(),KB.trigger("dom.ready")});var Kanboard={};Kanboard.App=function(){this.controllers={}},Kanboard.App.prototype.get=function(e){return this.controllers[e]},Kanboard.App.prototype.execute=function(){for(var e in Kanboard)if("App"!==e){var t=new Kanboard[e](this);this.controllers[e]=t,"function"==typeof t.execute&&t.execute(),"function"==typeof t.listen&&t.listen(),"function"==typeof t.focus&&t.focus()}this.focus(),this.datePicker(),this.autoComplete(),this.tagAutoComplete()},Kanboard.App.prototype.focus=function(){$(document).on("focus",".auto-select",function(){$(this).select()}),$(document).on("mouseup",".auto-select",function(e){e.preventDefault()})},Kanboard.App.prototype.datePicker=function(){var e=$("body"),t=e.data("js-date-format"),n=e.data("js-time-format"),o=e.data("js-lang");$.datepicker.setDefaults($.datepicker.regional[o]),$.timepicker.setDefaults($.timepicker.regional[o]),$(".form-date").datepicker({showOtherMonths:!0,selectOtherMonths:!0,dateFormat:t,constrainInput:!1}),$(".form-datetime").datetimepicker({dateFormat:t,timeFormat:n,constrainInput:!1})},Kanboard.App.prototype.tagAutoComplete=function(){$(".tag-autocomplete").select2({tags:!0})},Kanboard.App.prototype.autoComplete=function(){$(".autocomplete").each(function(){var e=$(this),t=e.data("dst-field"),n=e.data("dst-extra-field");""===$("#form-"+t).val()&&e.parent().find("button[type=submit]").attr("disabled","disabled"),e.autocomplete({source:e.data("search-url"),minLength:1,select:function(o,a){$("input[name="+t+"]").val(a.item.id),n&&$("input[name="+n+"]").val(a.item[n]),e.parent().find("button[type=submit]").removeAttr("disabled")}})})},Kanboard.App.prototype.hasId=function(e){return!!document.getElementById(e)},Kanboard.App.prototype.showLoadingIcon=function(){$("body").append('<span id="app-loading-icon"> <i class="fa fa-spinner fa-spin"></i></span>')},Kanboard.App.prototype.hideLoadingIcon=function(){$("#app-loading-icon").remove()},Kanboard.BoardCollapsedMode=function(e){this.app=e},Kanboard.BoardCollapsedMode.prototype.toggle=function(){var e=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:$('.filter-display-mode:not([style="display: none;"]) a').attr("href"),success:function(t){$(".filter-display-mode").toggle(),e.app.get("BoardDragAndDrop").refresh(t)}})},Kanboard.BoardColumnView=function(e){this.app=e},Kanboard.BoardColumnView.prototype.execute=function(){this.app.hasId("board")&&this.render()},Kanboard.BoardColumnView.prototype.listen=function(){var e=this;$(document).on("click",".board-toggle-column-view",function(){e.toggle($(this).data("column-id"))})},Kanboard.BoardColumnView.prototype.onBoardRendered=function(){this.render()},Kanboard.BoardColumnView.prototype.render=function(){var e=this;$(".board-column-header").each(function(){var t=$(this).data("column-id");localStorage.getItem("hidden_column_"+t)&&e.hideColumn(t)})},Kanboard.BoardColumnView.prototype.toggle=function(e){localStorage.getItem("hidden_column_"+e)?this.showColumn(e):this.hideColumn(e),this.app.get("BoardDragAndDrop").dragAndDrop()},Kanboard.BoardColumnView.prototype.hideColumn=function(e){$(".board-column-"+e+" .board-column-expanded").hide(),$(".board-column-"+e+" .board-column-collapsed").show(),$(".board-column-header-"+e+" .board-column-expanded").hide(),$(".board-column-header-"+e+" .board-column-collapsed").show(),$(".board-column-header-"+e).each(function(){$(this).removeClass("board-column-compact"),$(this).addClass("board-column-header-collapsed")}),$(".board-column-"+e).each(function(){$(this).addClass("board-column-task-collapsed")}),$(".board-column-"+e+" .board-rotation").each(function(){$(this).css("width",$(".board-column-"+e).height())}),localStorage.setItem("hidden_column_"+e,1)},Kanboard.BoardColumnView.prototype.showColumn=function(e){$(".board-column-"+e+" .board-column-expanded").show(),$(".board-column-"+e+" .board-column-collapsed").hide(),$(".board-column-header-"+e+" .board-column-expanded").show(),$(".board-column-header-"+e+" .board-column-collapsed").hide(),$(".board-column-header-"+e).removeClass("board-column-header-collapsed"),$(".board-column-"+e).removeClass("board-column-task-collapsed"),0==localStorage.getItem("horizontal_scroll")&&$(".board-column-header-"+e).addClass("board-column-compact"),localStorage.removeItem("hidden_column_"+e)},Kanboard.BoardHorizontalScrolling=function(e){this.app=e},Kanboard.BoardHorizontalScrolling.prototype.execute=function(){this.app.hasId("board")&&this.render()},Kanboard.BoardHorizontalScrolling.prototype.listen=function(){var e=this;$(document).on("click",".filter-toggle-scrolling",function(t){t.preventDefault(),e.toggle()})},Kanboard.BoardHorizontalScrolling.prototype.onBoardRendered=function(){this.render()},Kanboard.BoardHorizontalScrolling.prototype.toggle=function(){var e=localStorage.getItem("horizontal_scroll")||1;localStorage.setItem("horizontal_scroll",0==e?1:0),this.render()},Kanboard.BoardHorizontalScrolling.prototype.render=function(){0==localStorage.getItem("horizontal_scroll")?($(".filter-wide").show(),$(".filter-compact").hide(),$("#board-container").addClass("board-container-compact"),$("#board th:not(.board-column-header-collapsed)").addClass("board-column-compact")):($(".filter-wide").hide(),$(".filter-compact").show(),$("#board-container").removeClass("board-container-compact"),$("#board th").removeClass("board-column-compact"))},Kanboard.BoardPolling=function(e){this.app=e},Kanboard.BoardPolling.prototype.execute=function(){if(this.app.hasId("board")){var e=parseInt($("#board").attr("data-check-interval"));e>0&&window.setInterval(this.check.bind(this),1e3*e)}},Kanboard.BoardPolling.prototype.check=function(){if(KB.utils.isVisible()&&!this.app.get("BoardDragAndDrop").savingInProgress){var e=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:$("#board").data("check-url"),statusCode:{200:function(t){e.app.get("BoardDragAndDrop").refresh(t)},304:function(){e.app.hideLoadingIcon()}}})}},Kanboard.Column=function(e){this.app=e},Kanboard.Column.prototype.listen=function(){this.dragAndDrop()},Kanboard.Column.prototype.dragAndDrop=function(){var e=this;$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".columns-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(e,t){return t.children().each(function(){$(this).width($(this).width())}),t},stop:function(t,n){var o=n.item;o.removeClass("draggable-item-selected"),e.savePosition(o.data("column-id"),o.index()+1)},start:function(e,t){t.item.addClass("draggable-item-selected")}}).disableSelection()},Kanboard.Column.prototype.savePosition=function(e,t){var n=$(".columns-table").data("save-position-url"),o=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({column_id:e,position:t}),complete:function(){o.app.hideLoadingIcon()}})},Kanboard.Dropdown=function(e){this.app=e},Kanboard.Dropdown.prototype.listen=function(){var e=this;$(document).on("click",function(){e.close()}),$(document).on("click",".dropdown-menu",function(t){t.preventDefault(),t.stopImmediatePropagation(),e.close();var n=$(this).next("ul"),o=$(this).offset();$("body").append(jQuery("<div>",{id:"dropdown"})),n.clone().appendTo("#dropdown");var a=$("#dropdown ul");a.addClass("dropdown-submenu-open");var i=a.outerHeight(),r=a.outerWidth();o.top+i-$(window).scrollTop()<$(window).height()||$(window).scrollTop()+o.top<i?a.css("top",o.top+$(this).height()):a.css("top",o.top-i-5),o.left+r>$(window).width()?a.css("left",o.left-r+$(this).outerWidth()):a.css("left",o.left)}),$(document).on("click",".dropdown-submenu-open li",function(e){$(e.target).is("li")&&$(this).find("a:visible")[0].click()})},Kanboard.Dropdown.prototype.close=function(){$("#dropdown").remove()},Kanboard.Search=function(e){this.app=e},Kanboard.Search.prototype.focus=function(){$(document).on("focus","#form-search",function(){var e=$("#form-search");if(e[0].setSelectionRange){var t=2*e.val().length;e[0].setSelectionRange(t,t)}})},Kanboard.Search.prototype.listen=function(){$(document).on("click",".filter-helper",function(e){e.preventDefault();var t=$(this).data("filter"),n=$(this).data("append-filter"),o=$(this).data("unique-filter"),a=$("#form-search");if(o){var i=o.substr(0,o.indexOf(":"));t=a.val().replace(new RegExp("("+i+":[#a-z0-9]+)","g"),""),t=t.replace(new RegExp("("+i+':"(.+)")',"g"),""),t=t.trim(),t+=" "+o}else n&&(t=a.val()+" "+n);a.val(t),$("form.search").submit()})},Kanboard.Swimlane=function(e){this.app=e},Kanboard.Swimlane.prototype.execute=function(){$(".swimlanes-table").length&&this.dragAndDrop()},Kanboard.Swimlane.prototype.listen=function(){var e=this;$(document).on("click",".board-swimlane-toggle",function(t){t.preventDefault();var n=$(this).data("swimlane-id");e.isCollapsed(n)?e.expand(n):e.collapse(n)})},Kanboard.Swimlane.prototype.onBoardRendered=function(){for(var e=this.getAllCollapsed(),t=0;t<e.length;t++)this.collapse(e[t])},Kanboard.Swimlane.prototype.getStorageKey=function(){return"hidden_swimlanes_"+$("#board").data("project-id")},Kanboard.Swimlane.prototype.expand=function(e){var t=this.getAllCollapsed(),n=t.indexOf(e);n>-1&&t.splice(n,1),localStorage.setItem(this.getStorageKey(),JSON.stringify(t)),$(".board-swimlane-columns-"+e).css("display","table-row"),$(".board-swimlane-tasks-"+e).css("display","table-row"),$(".hide-icon-swimlane-"+e).css("display","inline"),$(".show-icon-swimlane-"+e).css("display","none")},Kanboard.Swimlane.prototype.collapse=function(e){var t=this.getAllCollapsed();t.indexOf(e)<0&&(t.push(e),localStorage.setItem(this.getStorageKey(),JSON.stringify(t))),$(".board-swimlane-columns-"+e+":not(:first-child)").css("display","none"),$(".board-swimlane-tasks-"+e).css("display","none"),$(".hide-icon-swimlane-"+e).css("display","none"),$(".show-icon-swimlane-"+e).css("display","inline")},Kanboard.Swimlane.prototype.isCollapsed=function(e){return this.getAllCollapsed().indexOf(e)>-1},Kanboard.Swimlane.prototype.getAllCollapsed=function(){return JSON.parse(localStorage.getItem(this.getStorageKey()))||[]},Kanboard.Swimlane.prototype.dragAndDrop=function(){var e=this;$(".draggable-row-handle").mouseenter(function(){$(this).parent().parent().addClass("draggable-item-hover")}).mouseleave(function(){$(this).parent().parent().removeClass("draggable-item-hover")}),$(".swimlanes-table tbody").sortable({forcePlaceholderSize:!0,handle:"td:first i",helper:function(e,t){return t.children().each(function(){$(this).width($(this).width())}),t},stop:function(t,n){var o=n.item;o.removeClass("draggable-item-selected"),e.savePosition(o.data("swimlane-id"),o.index()+1)},start:function(e,t){t.item.addClass("draggable-item-selected")}}).disableSelection()},Kanboard.Swimlane.prototype.savePosition=function(e,t){var n=$(".swimlanes-table").data("save-position-url"),o=this;this.app.showLoadingIcon(),$.ajax({cache:!1,url:n,contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({swimlane_id:e,position:t}),complete:function(){o.app.hideLoadingIcon()}})},Kanboard.Task=function(e){this.app=e},Kanboard.Task.prototype.onPopoverOpened=function(){var e=this;e.renderColorPicker(),$(document).on("click",".assign-me",function(e){var t=$(this).data("current-id"),n="#"+$(this).data("target-id");e.preventDefault(),$(n+" option[value="+t+"]").length&&$(n).val(t)})},Kanboard.Task.prototype.renderColorPicker=function(){function e(e){return $('<div class="color-picker-option"><div class="color-picker-square color-'+e.id+'"></div><div class="color-picker-label">'+e.text+"</div></div>")}$(".color-picker").select2({minimumResultsForSearch:1/0,templateResult:e,templateSelection:e})},Kanboard.Tooltip=function(e){this.app=e},Kanboard.Tooltip.prototype.onBoardRendered=function(){this.execute()},Kanboard.Tooltip.prototype.execute=function(){$(".tooltip").tooltip({track:!1,show:!1,hide:!1,position:{my:"left-20 top",at:"center bottom+9",using:function(e,t){$(this).css(e);var n=t.target.left+t.target.width/2-t.element.left-20;$("<div>").addClass("tooltip-arrow").addClass(t.vertical).addClass(n<1?"align-left":"align-right").appendTo(this)}},content:function(){var e=this,t=$(this).attr("data-href");return t?($.get(t,function(t){var n=$(".ui-tooltip:visible");$(".ui-tooltip-content:visible").html(t),n.css({top:"",left:""}),n.children(".tooltip-arrow").remove();var o=$(e).tooltip("option","position");o.of=$(e),n.position(o)}),'<i class="fa fa-spinner fa-spin"></i>'):'<div class="markdown">'+$(this).attr("title")+"</div>"}}).on("mouseenter",function(){var e=this;$(this).tooltip("open"),$(".ui-tooltip").on("mouseleave",function(){$(e).tooltip("close")})}).on("mouseleave focusout",function(e){e.stopImmediatePropagation();var t=this;setTimeout(function(){$(".ui-tooltip:hover").length||$(t).tooltip("close")},100)})},Kanboard.BoardDragAndDrop=function(e){this.app=e,this.savingInProgress=!1},Kanboard.BoardDragAndDrop.prototype.execute=function(){this.app.hasId("board")&&(this.executeListeners(),this.dragAndDrop())},Kanboard.BoardDragAndDrop.prototype.dragAndDrop=function(){var e=this,t=$(".board-task-list"),n={forcePlaceholderSize:!0,tolerance:"pointer",connectWith:".sortable-column",placeholder:"draggable-placeholder",items:".draggable-item",stop:function(t,n){var o=n.item,a=o.attr("data-task-id"),i=o.attr("data-position"),r=o.attr("data-column-id"),d=o.attr("data-swimlane-id"),s=o.parent().attr("data-column-id"),l=o.parent().attr("data-swimlane-id"),c=o.index()+1;o.removeClass("draggable-item-selected"),s==r&&l==d&&c==i||(e.changeTaskState(a),e.save(a,r,s,c,l))},start:function(e,t){t.item.addClass("draggable-item-selected"),t.placeholder.height(t.item.height())}};isMobile.any&&($(".task-board-sort-handle").css("display","inline"),n.handle=".task-board-sort-handle"),t.each(function(){$(this).css("min-height",$(this).parent().height())}),t.sortable(n)},Kanboard.BoardDragAndDrop.prototype.changeTaskState=function(e){var t=$("div[data-task-id="+e+"]");t.addClass("task-board-saving-state"),t.find(".task-board-saving-icon").show()},Kanboard.BoardDragAndDrop.prototype.save=function(e,t,n,o,a){var i=this;i.app.showLoadingIcon(),i.savingInProgress=!0,$.ajax({cache:!1,url:$("#board").data("save-url"),contentType:"application/json",type:"POST",processData:!1,data:JSON.stringify({task_id:e,src_column_id:t,dst_column_id:n,swimlane_id:a,position:o}),success:function(e){i.refresh(e),i.savingInProgress=!1},error:function(){i.app.hideLoadingIcon(),i.savingInProgress=!1},statusCode:{403:function(e){window.alert(e.responseJSON.message),document.location.reload(!0)}}})},Kanboard.BoardDragAndDrop.prototype.refresh=function(e){$("#board-container").replaceWith(e),this.app.hideLoadingIcon(),this.executeListeners(),this.dragAndDrop()},Kanboard.BoardDragAndDrop.prototype.executeListeners=function(){for(var e in this.app.controllers){var t=this.app.get(e);"function"==typeof t.onBoardRendered&&t.onBoardRendered()}};var _KB=null;jQuery(document).ready(function(){_KB=new Kanboard.App,_KB.execute()});
\ No newline at end of file diff --git a/assets/js/components/keyboard-shortcuts.js b/assets/js/components/keyboard-shortcuts.js index 1eec4bbe..02d62119 100644 --- a/assets/js/components/keyboard-shortcuts.js +++ b/assets/js/components/keyboard-shortcuts.js @@ -120,8 +120,4 @@ KB.keyboardShortcuts = function () { KB.onKey('v+l', function () { goToLink('a.view-listing'); }); - - KB.onKey('v+g', function () { - goToLink('a.view-gantt'); - }); }; diff --git a/assets/js/src/Gantt.js b/assets/js/src/Gantt.js deleted file mode 100644 index cd6cac00..00000000 --- a/assets/js/src/Gantt.js +++ /dev/null @@ -1,489 +0,0 @@ -// Based on jQuery.ganttView v.0.8.8 Copyright (c) 2010 JC Grubbs - jc.grubbs@devmynd.com - MIT License -Kanboard.Gantt = function(app) { - this.app = app; - this.data = []; - - this.options = { - container: "#gantt-chart", - showWeekends: true, - allowMoves: true, - allowResizes: true, - cellWidth: 21, - cellHeight: 31, - slideWidth: 1000, - vHeaderWidth: 200 - }; -}; - -Kanboard.Gantt.prototype.execute = function() { - if (this.app.hasId("gantt-chart")) { - this.show(); - } -}; - -// Save record after a resize or move -Kanboard.Gantt.prototype.saveRecord = function(record) { - this.app.showLoadingIcon(); - - $.ajax({ - cache: false, - url: $(this.options.container).data("save-url"), - contentType: "application/json", - type: "POST", - processData: false, - data: JSON.stringify(record), - complete: this.app.hideLoadingIcon.bind(this) - }); -}; - -// Build the Gantt chart -Kanboard.Gantt.prototype.show = function() { - this.data = this.prepareData($(this.options.container).data('records')); - - var minDays = Math.floor((this.options.slideWidth / this.options.cellWidth) + 5); - var range = this.getDateRange(minDays); - var startDate = range[0]; - var endDate = range[1]; - var container = $(this.options.container); - var chart = jQuery("<div>", { "class": "ganttview" }); - - chart.append(this.renderVerticalHeader()); - chart.append(this.renderSlider(startDate, endDate)); - container.append(chart); - - jQuery("div.ganttview-grid-row div.ganttview-grid-row-cell:last-child", container).addClass("last"); - jQuery("div.ganttview-hzheader-days div.ganttview-hzheader-day:last-child", container).addClass("last"); - jQuery("div.ganttview-hzheader-months div.ganttview-hzheader-month:last-child", container).addClass("last"); - - if (! $(this.options.container).data('readonly')) { - this.listenForBlockResize(startDate); - this.listenForBlockMove(startDate); - } - else { - this.options.allowResizes = false; - this.options.allowMoves = false; - } -}; - -// Render record list on the left -Kanboard.Gantt.prototype.renderVerticalHeader = function() { - var headerDiv = jQuery("<div>", { "class": "ganttview-vtheader" }); - var itemDiv = jQuery("<div>", { "class": "ganttview-vtheader-item" }); - var seriesDiv = jQuery("<div>", { "class": "ganttview-vtheader-series" }); - - for (var i = 0; i < this.data.length; i++) { - var content = jQuery("<span>") - .append(jQuery("<i>", {"class": "fa fa-info-circle tooltip", "title": this.getVerticalHeaderTooltip(this.data[i])})) - .append(" "); - - if (this.data[i].type == "task") { - content.append(jQuery("<a>", {"href": this.data[i].link, "title": this.data[i].title}).text(this.data[i].title)); - } - else { - content - .append(jQuery("<a>", {"href": this.data[i].board_link, "title": $(this.options.container).data("label-board-link")}).append('<i class="fa fa-th"></i>')) - .append(" ") - .append(jQuery("<a>", {"href": this.data[i].gantt_link, "title": $(this.options.container).data("label-gantt-link")}).append('<i class="fa fa-sliders"></i>')) - .append(" ") - .append(jQuery("<a>", {"href": this.data[i].link}).text(this.data[i].title)); - } - - seriesDiv.append(jQuery("<div>", {"class": "ganttview-vtheader-series-name"}).append(content)); - } - - itemDiv.append(seriesDiv); - headerDiv.append(itemDiv); - - return headerDiv; -}; - -// Render right part of the chart (top header + grid + bars) -Kanboard.Gantt.prototype.renderSlider = function(startDate, endDate) { - var slideDiv = jQuery("<div>", {"class": "ganttview-slide-container"}); - var dates = this.getDates(startDate, endDate); - - slideDiv.append(this.renderHorizontalHeader(dates)); - slideDiv.append(this.renderGrid(dates)); - slideDiv.append(this.addBlockContainers()); - this.addBlocks(slideDiv, startDate); - - return slideDiv; -}; - -// Render top header (days) -Kanboard.Gantt.prototype.renderHorizontalHeader = function(dates) { - var headerDiv = jQuery("<div>", { "class": "ganttview-hzheader" }); - var monthsDiv = jQuery("<div>", { "class": "ganttview-hzheader-months" }); - var daysDiv = jQuery("<div>", { "class": "ganttview-hzheader-days" }); - var totalW = 0; - - for (var y in dates) { - for (var m in dates[y]) { - var w = dates[y][m].length * this.options.cellWidth; - totalW = totalW + w; - - monthsDiv.append(jQuery("<div>", { - "class": "ganttview-hzheader-month", - "css": { "width": (w - 1) + "px" } - }).append($.datepicker.regional[$("body").data('js-lang')].monthNames[m] + " " + y)); - - for (var d in dates[y][m]) { - daysDiv.append(jQuery("<div>", { "class": "ganttview-hzheader-day" }).append(dates[y][m][d].getDate())); - } - } - } - - monthsDiv.css("width", totalW + "px"); - daysDiv.css("width", totalW + "px"); - headerDiv.append(monthsDiv).append(daysDiv); - - return headerDiv; -}; - -// Render grid -Kanboard.Gantt.prototype.renderGrid = function(dates) { - var gridDiv = jQuery("<div>", { "class": "ganttview-grid" }); - var rowDiv = jQuery("<div>", { "class": "ganttview-grid-row" }); - - for (var y in dates) { - for (var m in dates[y]) { - for (var d in dates[y][m]) { - var cellDiv = jQuery("<div>", { "class": "ganttview-grid-row-cell" }); - if (this.options.showWeekends && this.isWeekend(dates[y][m][d])) { - cellDiv.addClass("ganttview-weekend"); - } - rowDiv.append(cellDiv); - } - } - } - var w = jQuery("div.ganttview-grid-row-cell", rowDiv).length * this.options.cellWidth; - rowDiv.css("width", w + "px"); - gridDiv.css("width", w + "px"); - - for (var i = 0; i < this.data.length; i++) { - gridDiv.append(rowDiv.clone()); - } - - return gridDiv; -}; - -// Render bar containers -Kanboard.Gantt.prototype.addBlockContainers = function() { - var blocksDiv = jQuery("<div>", { "class": "ganttview-blocks" }); - - for (var i = 0; i < this.data.length; i++) { - blocksDiv.append(jQuery("<div>", { "class": "ganttview-block-container" })); - } - - return blocksDiv; -}; - -// Render bars -Kanboard.Gantt.prototype.addBlocks = function(slider, start) { - var rows = jQuery("div.ganttview-blocks div.ganttview-block-container", slider); - var rowIdx = 0; - - for (var i = 0; i < this.data.length; i++) { - var series = this.data[i]; - var size = this.daysBetween(series.start, series.end) + 1; - var offset = this.daysBetween(start, series.start); - var text = jQuery("<div>", {"class": "ganttview-block-text"}); - - var block = jQuery("<div>", { - "class": "ganttview-block tooltip" + (this.options.allowMoves ? " ganttview-block-movable" : ""), - "title": this.getBarTooltip(series), - "css": { - "width": ((size * this.options.cellWidth) - 9) + "px", - "margin-left": (offset * this.options.cellWidth) + "px" - } - }).append(text); - - if (size >= 2) { - text.append(series.progress); - } - - block.data("record", series); - this.setBarColor(block, series); - - jQuery(rows[rowIdx]).append(block); - rowIdx = rowIdx + 1; - } -}; - -// Get tooltip for vertical header -Kanboard.Gantt.prototype.getVerticalHeaderTooltip = function(record) { - var tooltip = ""; - - if (record.type == "task") { - tooltip = jQuery("<span>") - .append(jQuery("<strong>").text(record.column_title)) - .append(document.createTextNode(' (' + record.progress + ')')) - .append(jQuery("<br>")) - .append(document.createTextNode(record.title)).prop('outerHTML'); - } - else { - var types = ["project-manager", "project-member"]; - - for (var index in types) { - var type = types[index]; - if (! jQuery.isEmptyObject(record.users[type])) { - var list = jQuery("<ul>"); - - for (var user_id in record.users[type]) { - if (user_id) { - list.append(jQuery("<li>").text(record.users[type][user_id])); - } - } - - tooltip += "<p><strong>" + $(this.options.container).data("label-" + type) + "</strong></p>" + list.prop('outerHTML'); - } - } - } - - return tooltip; -}; - -// Get tooltip for bars -Kanboard.Gantt.prototype.getBarTooltip = function(record) { - var tooltip = ""; - - if (record.not_defined) { - tooltip = $(this.options.container).data("label-not-defined"); - } - else { - if (record.type == "task") { - var assigneeLabel = $(this.options.container).data("label-assignee"); - tooltip += jQuery("<strong>").text(record.progress).prop('outerHTML'); - tooltip += "<br>"; - tooltip += jQuery('<span>').append(document.createTextNode(assigneeLabel + " " + (record.assignee ? record.assignee : ''))).prop('outerHTML'); - tooltip += "<br>"; - } - - tooltip += $(this.options.container).data("label-start-date") + " " + $.datepicker.formatDate('yy-mm-dd', record.start) + "<br/>"; - tooltip += $(this.options.container).data("label-end-date") + " " + $.datepicker.formatDate('yy-mm-dd', record.end); - } - - return tooltip; -}; - -// Set bar color -Kanboard.Gantt.prototype.setBarColor = function(block, record) { - if (record.not_defined) { - block.addClass("ganttview-block-not-defined"); - } - else { - block.css("background-color", record.color.background); - block.css("border-color", record.color.border); - - if (record.progress != "0%") { - block.append(jQuery("<div>", { - "css": { - "z-index": 0, - "position": "absolute", - "top": 0, - "bottom": 0, - "background-color": record.color.border, - "width": record.progress, - "opacity": 0.4 - } - })); - } - } -}; - -// Setup jquery-ui resizable -Kanboard.Gantt.prototype.listenForBlockResize = function(startDate) { - var self = this; - - jQuery("div.ganttview-block", this.options.container).resizable({ - grid: this.options.cellWidth, - handles: "e,w", - delay: 300, - stop: function() { - var block = jQuery(this); - self.updateDataAndPosition(block, startDate); - self.saveRecord(block.data("record")); - } - }); -}; - -// Setup jquery-ui drag and drop -Kanboard.Gantt.prototype.listenForBlockMove = function(startDate) { - var self = this; - - jQuery("div.ganttview-block", this.options.container).draggable({ - axis: "x", - delay: 300, - grid: [this.options.cellWidth, this.options.cellWidth], - stop: function() { - var block = jQuery(this); - self.updateDataAndPosition(block, startDate); - self.saveRecord(block.data("record")); - } - }); -}; - -// Update the record data and the position on the chart -Kanboard.Gantt.prototype.updateDataAndPosition = function(block, startDate) { - var container = jQuery("div.ganttview-slide-container", this.options.container); - var scroll = container.scrollLeft(); - var offset = block.offset().left - container.offset().left - 1 + scroll; - var record = block.data("record"); - - // Restore color for defined block - record.not_defined = false; - this.setBarColor(block, record); - - // Set new start date - var daysFromStart = Math.round(offset / this.options.cellWidth); - var newStart = this.addDays(this.cloneDate(startDate), daysFromStart); - record.start = newStart; - - // Set new end date - var width = block.outerWidth(); - var numberOfDays = Math.round(width / this.options.cellWidth) - 1; - record.end = this.addDays(this.cloneDate(newStart), numberOfDays); - - if (record.type === "task" && numberOfDays > 0) { - jQuery("div.ganttview-block-text", block).text(record.progress); - } - - // Update tooltip - block.attr("title", this.getBarTooltip(record)); - - block.data("record", record); - - // Remove top and left properties to avoid incorrect block positioning, - // set position to relative to keep blocks relative to scrollbar when scrolling - block - .css("top", "") - .css("left", "") - .css("position", "relative") - .css("margin-left", offset + "px"); -}; - -// Creates a 3 dimensional array [year][month][day] of every day -// between the given start and end dates -Kanboard.Gantt.prototype.getDates = function(start, end) { - var dates = []; - dates[start.getFullYear()] = []; - dates[start.getFullYear()][start.getMonth()] = [start]; - var last = start; - - while (this.compareDate(last, end) == -1) { - var next = this.addDays(this.cloneDate(last), 1); - - if (! dates[next.getFullYear()]) { - dates[next.getFullYear()] = []; - } - - if (! dates[next.getFullYear()][next.getMonth()]) { - dates[next.getFullYear()][next.getMonth()] = []; - } - - dates[next.getFullYear()][next.getMonth()].push(next); - last = next; - } - - return dates; -}; - -// Convert data to Date object -Kanboard.Gantt.prototype.prepareData = function(data) { - for (var i = 0; i < data.length; i++) { - var start = new Date(data[i].start[0], data[i].start[1] - 1, data[i].start[2], 0, 0, 0, 0); - data[i].start = start; - - var end = new Date(data[i].end[0], data[i].end[1] - 1, data[i].end[2], 0, 0, 0, 0); - data[i].end = end; - } - - return data; -}; - -// Get the start and end date from the data provided -Kanboard.Gantt.prototype.getDateRange = function(minDays) { - var minStart = new Date(); - var maxEnd = new Date(); - - for (var i = 0; i < this.data.length; i++) { - var start = new Date(); - start.setTime(Date.parse(this.data[i].start)); - - var end = new Date(); - end.setTime(Date.parse(this.data[i].end)); - - if (i == 0) { - minStart = start; - maxEnd = end; - } - - if (this.compareDate(minStart, start) == 1) { - minStart = start; - } - - if (this.compareDate(maxEnd, end) == -1) { - maxEnd = end; - } - } - - // Insure that the width of the chart is at least the slide width to avoid empty - // whitespace to the right of the grid - if (this.daysBetween(minStart, maxEnd) < minDays) { - maxEnd = this.addDays(this.cloneDate(minStart), minDays); - } - - // Always start one day before the minStart - minStart.setDate(minStart.getDate() - 1); - - return [minStart, maxEnd]; -}; - -// Returns the number of day between 2 dates -Kanboard.Gantt.prototype.daysBetween = function(start, end) { - if (! start || ! end) { - return 0; - } - - var count = 0, date = this.cloneDate(start); - - while (this.compareDate(date, end) == -1) { - count = count + 1; - this.addDays(date, 1); - } - - return count; -}; - -// Return true if it's the weekend -Kanboard.Gantt.prototype.isWeekend = function(date) { - return date.getDay() % 6 == 0; -}; - -// Clone Date object -Kanboard.Gantt.prototype.cloneDate = function(date) { - return new Date(date.getTime()); -}; - -// Add days to a Date object -Kanboard.Gantt.prototype.addDays = function(date, value) { - date.setDate(date.getDate() + value * 1); - return date; -}; - -/** - * Compares the first date to the second date and returns an number indication of their relative values. - * - * -1 = date1 is lessthan date2 - * 0 = values are equal - * 1 = date1 is greaterthan date2. - */ -Kanboard.Gantt.prototype.compareDate = function(date1, date2) { - if (isNaN(date1) || isNaN(date2)) { - throw new Error(date1 + " - " + date2); - } else if (date1 instanceof Date && date2 instanceof Date) { - return (date1 < date2) ? -1 : (date1 > date2) ? 1 : 0; - } else { - throw new TypeError(date1 + " - " + date2); - } -}; diff --git a/assets/sass/_gantt_chart.sass b/assets/sass/_gantt_chart.sass deleted file mode 100644 index eb6124d8..00000000 --- a/assets/sass/_gantt_chart.sass +++ /dev/null @@ -1,87 +0,0 @@ -@import variables - -div - &.ganttview-hzheader-month, &.ganttview-hzheader-day, &.ganttview-vtheader, &.ganttview-vtheader-item-name, &.ganttview-vtheader-series, &.ganttview-grid, &.ganttview-grid-row-cell - float: left - &.ganttview-hzheader-month, &.ganttview-hzheader-day - text-align: center - &.ganttview-grid-row-cell.last, &.ganttview-hzheader-day.last, &.ganttview-hzheader-month.last - border-right: none - &.ganttview - border: 1px solid #999 - &.ganttview-hzheader-month - width: 60px - height: 20px - border-right: 1px solid #d0d0d0 - line-height: 20px - overflow: hidden - &.ganttview-hzheader-day - width: 20px - height: 20px - border-right: 1px solid #f0f0f0 - border-top: 1px solid #d0d0d0 - line-height: 20px - color: color('medium') - &.ganttview-vtheader - margin-top: 41px - width: 400px - overflow: hidden - background-color: #fff - &.ganttview-vtheader-item - color: color('medium') - &.ganttview-vtheader-series-name - width: 400px - height: 31px - line-height: 31px - padding-left: 3px - border-top: 1px solid #d0d0d0 - text-overflow: ellipsis - overflow: hidden - white-space: nowrap - a - color: color('medium') - text-decoration: none - &:hover - color: color('primary') - text-decoration: underline - i - color: color('dark') - &:hover i - color: color('medium') - &.ganttview-slide-container - overflow: auto - border-left: 1px solid #999 - &.ganttview-grid-row-cell - width: 20px - height: 31px - border-right: 1px solid #f0f0f0 - border-top: 1px solid #f0f0f0 - &.ganttview-weekend - background-color: #fafafa - &.ganttview-blocks - margin-top: 40px - &.ganttview-block-container - height: 28px - padding-top: 4px - &.ganttview-block - position: relative - height: 25px - background-color: #E5ECF9 - border: 1px solid #c0c0c0 - border-radius: 3px - -.ganttview-block-movable - cursor: move - -div - &.ganttview-block-not-defined - border-color: #000 - background-color: #000 - &.ganttview-block-text - position: absolute - height: 12px - font-size: size('tiny') - color: color('light') - padding: 2px 3px - &.ganttview-block div.ui-resizable-handle.ui-resizable-s - bottom: -0 diff --git a/assets/sass/app.sass b/assets/sass/app.sass index cb554430..7a58ac77 100644 --- a/assets/sass/app.sass +++ b/assets/sass/app.sass @@ -50,6 +50,5 @@ @import documentation @import panel @import activity_stream -@import gantt_chart @import user_mentions @import image_slideshow |