Move tasks Gantt chart
This commit is contained in:
@@ -56,23 +56,21 @@ class Gantt extends Base
|
|||||||
*/
|
*/
|
||||||
public function project()
|
public function project()
|
||||||
{
|
{
|
||||||
$project = $this->getProject();
|
$params = $this->getProjectFilters('gantt', 'project');
|
||||||
|
$filter = $this->taskFilter->search($params['filters']['search'])->filterByProject($params['project']['id']);
|
||||||
$sorting = $this->request->getStringParam('sorting', 'board');
|
$sorting = $this->request->getStringParam('sorting', 'board');
|
||||||
$filter = $this->taskFilter->gantt()->filterByProject($project['id']);
|
|
||||||
|
|
||||||
if ($sorting === 'date') {
|
if ($sorting === 'date') {
|
||||||
$filter->query->asc(TaskModel::TABLE.'.date_started')->asc(TaskModel::TABLE.'.date_creation');
|
$filter->getQuery()->asc(TaskModel::TABLE.'.date_started')->asc(TaskModel::TABLE.'.date_creation');
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$filter->query->asc('column_position')->asc(TaskModel::TABLE.'.position');
|
$filter->getQuery()->asc('column_position')->asc(TaskModel::TABLE.'.position');
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->response->html($this->template->layout('gantt/project', array(
|
$this->response->html($this->template->layout('gantt/project', $params + array(
|
||||||
|
'users_list' => $this->projectPermission->getMemberList($params['project']['id'], false),
|
||||||
'sorting' => $sorting,
|
'sorting' => $sorting,
|
||||||
'tasks' => $filter->toGanttBars(),
|
'tasks' => $filter->toGanttBars(),
|
||||||
'project' => $project,
|
|
||||||
'title' => t('Gantt chart for %s', $project['name']),
|
|
||||||
'board_selector' => $this->projectPermission->getAllowedProjects($this->userSession->getId()),
|
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -86,38 +86,6 @@ class TaskFilter extends Base
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Prepare filter for Gantt chart
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @return TaskFilter
|
|
||||||
*/
|
|
||||||
public function gantt()
|
|
||||||
{
|
|
||||||
$this->query = $this->db->table(Task::TABLE);
|
|
||||||
$this->query->join(Board::TABLE, 'id', 'column_id', Task::TABLE);
|
|
||||||
$this->query->join(User::TABLE, 'id', 'owner_id', Task::TABLE);
|
|
||||||
|
|
||||||
$this->query->columns(
|
|
||||||
Task::TABLE.'.id',
|
|
||||||
Task::TABLE.'.title',
|
|
||||||
Task::TABLE.'.project_id',
|
|
||||||
Task::TABLE.'.column_id',
|
|
||||||
Task::TABLE.'.color_id',
|
|
||||||
Task::TABLE.'.date_started',
|
|
||||||
Task::TABLE.'.date_due',
|
|
||||||
Task::TABLE.'.date_creation',
|
|
||||||
Task::TABLE.'.is_active',
|
|
||||||
Task::TABLE.'.position',
|
|
||||||
Board::TABLE.'.position AS column_position',
|
|
||||||
Board::TABLE.'.title AS column_title',
|
|
||||||
User::TABLE.'.name AS assignee_name',
|
|
||||||
User::TABLE.'.username AS assignee_username'
|
|
||||||
);
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new query
|
* Create a new query
|
||||||
*
|
*
|
||||||
@@ -739,7 +707,7 @@ class TaskFilter extends Base
|
|||||||
(int) date('n', $end),
|
(int) date('n', $end),
|
||||||
(int) date('j', $end),
|
(int) date('j', $end),
|
||||||
),
|
),
|
||||||
'column_title' => $task['column_title'],
|
'column_title' => $task['column_name'],
|
||||||
'assignee' => $task['assignee_name'] ?: $task['assignee_username'],
|
'assignee' => $task['assignee_name'] ?: $task['assignee_username'],
|
||||||
'progress' => $this->task->getProgress($task, $columns[$task['project_id']]).'%',
|
'progress' => $this->task->getProgress($task, $columns[$task['project_id']]).'%',
|
||||||
'link' => $this->helper->url->href('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])),
|
'link' => $this->helper->url->href('task', 'show', array('project_id' => $task['project_id'], 'task_id' => $task['id'])),
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<div class="dropdown filters">
|
<div class="dropdown filters">
|
||||||
<i class="fa fa-caret-down"></i> <a href="#" class="dropdown-menu"><?= t('Filters') ?></a>
|
<i class="fa fa-caret-down"></i> <a href="#" class="dropdown-menu"><?= t('Filters') ?></a>
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="#" class="filter-helper" data-filter="<?= isset($reset) ? $reset : '' ?>"><?= t('Reset filters') ?></a></li>
|
<li><a href="#" class="filter-helper" data-filter="<?= isset($reset) ? $reset : '' ?>" title="<?= t('Keyboard shortcut: "%s"', 'r') ?>"><?= t('Reset filters') ?></a></li>
|
||||||
<li><a href="#" class="filter-helper" data-filter="status:open assignee:me"><?= t('My tasks') ?></a></li>
|
<li><a href="#" class="filter-helper" data-filter="status:open assignee:me"><?= t('My tasks') ?></a></li>
|
||||||
<li><a href="#" class="filter-helper" data-filter="status:open assignee:me due:tomorrow"><?= t('My tasks due tomorrow') ?></a></li>
|
<li><a href="#" class="filter-helper" data-filter="status:open assignee:me due:tomorrow"><?= t('My tasks due tomorrow') ?></a></li>
|
||||||
<li><a href="#" class="filter-helper" data-filter="status:open due:today"><?= t('Tasks due today') ?></a></li>
|
<li><a href="#" class="filter-helper" data-filter="status:open due:today"><?= t('Tasks due today') ?></a></li>
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
|
|
||||||
<?php if ($task['is_milestone'] == 1): ?>
|
<?php if ($task['is_milestone'] == 1): ?>
|
||||||
<span title="<?= t('Milestone') ?>">
|
<span title="<?= t('Milestone') ?>">
|
||||||
<i class="fa fa-flag"></i>
|
<i class="fa fa-flag flag-milestone"></i>
|
||||||
</span>
|
</span>
|
||||||
<?php endif ?>
|
<?php endif ?>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
<li><?= t('Switch to the board view') ?> = <strong>v b</strong></li>
|
<li><?= t('Switch to the board view') ?> = <strong>v b</strong></li>
|
||||||
<li><?= t('Switch to the calendar view') ?> = <strong>v c</strong></li>
|
<li><?= t('Switch to the calendar view') ?> = <strong>v c</strong></li>
|
||||||
<li><?= t('Switch to the list view') ?> = <strong>v l</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>
|
</ul>
|
||||||
<h3><?= t('Board view') ?></h3>
|
<h3><?= t('Board view') ?></h3>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -68,6 +69,7 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li><?= t('Open board switcher') ?> = <strong>b</strong></li>
|
<li><?= t('Open board switcher') ?> = <strong>b</strong></li>
|
||||||
<li><?= t('Go to the search/filter box') ?> = <strong>f</strong></li>
|
<li><?= t('Go to the search/filter box') ?> = <strong>f</strong></li>
|
||||||
|
<li><?= t('Reset the search/filter box') ?> = <strong>r</strong></li>
|
||||||
<li><?= t('Close dialog box') ?> = <strong>ESC</strong></li>
|
<li><?= t('Close dialog box') ?> = <strong>ESC</strong></li>
|
||||||
<li><?= t('Submit a form') ?> = <strong>CTRL+ENTER</strong> <?= t('or') ?> <strong>⌘+ENTER</strong></li>
|
<li><?= t('Submit a form') ?> = <strong>CTRL+ENTER</strong> <?= t('or') ?> <strong>⌘+ENTER</strong></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -1,22 +1,12 @@
|
|||||||
<section id="main">
|
<section id="main">
|
||||||
<div class="page-header">
|
<?= $this->render('project/filters', array(
|
||||||
|
'project' => $project,
|
||||||
|
'filters' => $filters,
|
||||||
|
'users_list' => $users_list,
|
||||||
|
)) ?>
|
||||||
|
|
||||||
|
<div class="menu-inline">
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
|
||||||
<span class="dropdown">
|
|
||||||
<span>
|
|
||||||
<i class="fa fa-caret-down"></i> <a href="#" class="dropdown-menu"><?= t('Actions') ?></a>
|
|
||||||
<ul>
|
|
||||||
<?= $this->render('project/dropdown', array('project' => $project)) ?>
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
</span>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<i class="fa fa-th fa-fw"></i>
|
|
||||||
<?= $this->url->link(t('Back to the board'), 'board', 'show', array('project_id' => $project['id'])) ?>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<ul class="views toolbar">
|
|
||||||
<li <?= $sorting === 'board' ? 'class="active"' : '' ?>>
|
<li <?= $sorting === 'board' ? 'class="active"' : '' ?>>
|
||||||
<i class="fa fa-sort-numeric-asc fa-fw"></i>
|
<i class="fa fa-sort-numeric-asc fa-fw"></i>
|
||||||
<?= $this->url->link(t('Sort by position'), 'gantt', 'project', array('project_id' => $project['id'], 'sorting' => 'board')) ?>
|
<?= $this->url->link(t('Sort by position'), 'gantt', 'project', array('project_id' => $project['id'], 'sorting' => 'board')) ?>
|
||||||
|
|||||||
@@ -14,10 +14,6 @@
|
|||||||
<i class="fa fa-line-chart fa-fw"></i>
|
<i class="fa fa-line-chart fa-fw"></i>
|
||||||
<?= $this->url->link(t('Analytics'), 'analytic', 'tasks', array('project_id' => $project['id'])) ?>
|
<?= $this->url->link(t('Analytics'), 'analytic', 'tasks', array('project_id' => $project['id'])) ?>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
|
||||||
<i class="fa fa-sliders fa-fw"></i>
|
|
||||||
<?= $this->url->link(t('Gantt chart'), 'gantt', 'project', array('project_id' => $project['id'])) ?>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<i class="fa fa-pie-chart fa-fw"></i>
|
<i class="fa fa-pie-chart fa-fw"></i>
|
||||||
<?= $this->url->link(t('Budget'), 'budget', 'index', array('project_id' => $project['id'])) ?>
|
<?= $this->url->link(t('Budget'), 'budget', 'index', array('project_id' => $project['id'])) ?>
|
||||||
|
|||||||
@@ -38,6 +38,12 @@
|
|||||||
<i class="fa fa-list fa-fw"></i>
|
<i class="fa fa-list fa-fw"></i>
|
||||||
<?= $this->url->link(t('List'), 'listing', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-listing', t('Keyboard shortcut: "%s"', 'v l')) ?>
|
<?= $this->url->link(t('List'), 'listing', 'show', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-listing', t('Keyboard shortcut: "%s"', 'v l')) ?>
|
||||||
</li>
|
</li>
|
||||||
|
<?php if ($this->user->isProjectManagementAllowed($project['id'])): ?>
|
||||||
|
<li <?= $filters['controller'] === 'gantt' ? 'class="active"' : '' ?>>
|
||||||
|
<i class="fa fa-sliders fa-fw"></i>
|
||||||
|
<?= $this->url->link(t('Gantt'), 'gantt', 'project', array('project_id' => $project['id'], 'search' => $filters['search']), false, 'view-gantt', t('Keyboard shortcut: "%s"', 'v g')) ?>
|
||||||
|
</li>
|
||||||
|
<?php endif ?>
|
||||||
</ul>
|
</ul>
|
||||||
<form method="get" action="<?= $this->url->dir() ?>" class="search">
|
<form method="get" action="<?= $this->url->dir() ?>" class="search">
|
||||||
<?= $this->form->hidden('controller', $filters) ?>
|
<?= $this->form->hidden('controller', $filters) ?>
|
||||||
|
|||||||
@@ -113,18 +113,15 @@ if (ENABLE_URL_REWRITE) {
|
|||||||
// Board routes
|
// Board routes
|
||||||
$container['router']->addRoute('board/:project_id', 'board', 'show', array('project_id'));
|
$container['router']->addRoute('board/:project_id', 'board', 'show', array('project_id'));
|
||||||
$container['router']->addRoute('b/:project_id', 'board', 'show', array('project_id'));
|
$container['router']->addRoute('b/:project_id', 'board', 'show', array('project_id'));
|
||||||
$container['router']->addRoute('board/:project_id/filter/:search', 'board', 'show', array('project_id', 'search'));
|
|
||||||
$container['router']->addRoute('public/board/:token', 'board', 'readonly', array('token'));
|
$container['router']->addRoute('public/board/:token', 'board', 'readonly', array('token'));
|
||||||
|
|
||||||
// Calendar routes
|
// Calendar routes
|
||||||
$container['router']->addRoute('calendar/:project_id', 'calendar', 'show', array('project_id'));
|
$container['router']->addRoute('calendar/:project_id', 'calendar', 'show', array('project_id'));
|
||||||
$container['router']->addRoute('c/:project_id', 'calendar', 'show', array('project_id'));
|
$container['router']->addRoute('c/:project_id', 'calendar', 'show', array('project_id'));
|
||||||
$container['router']->addRoute('calendar/:project_id/:search', 'calendar', 'show', array('project_id', 'search'));
|
|
||||||
|
|
||||||
// Listing routes
|
// Listing routes
|
||||||
$container['router']->addRoute('list/:project_id', 'listing', 'show', array('project_id'));
|
$container['router']->addRoute('list/:project_id', 'listing', 'show', array('project_id'));
|
||||||
$container['router']->addRoute('l/:project_id', 'listing', 'show', array('project_id'));
|
$container['router']->addRoute('l/:project_id', 'listing', 'show', array('project_id'));
|
||||||
$container['router']->addRoute('list/:project_id/:search', 'listing', 'show', array('project_id', 'search'));
|
|
||||||
|
|
||||||
// Gantt routes
|
// Gantt routes
|
||||||
$container['router']->addRoute('gantt/:project_id', 'gantt', 'project', array('project_id'));
|
$container['router']->addRoute('gantt/:project_id', 'gantt', 'project', array('project_id'));
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -17,6 +17,7 @@
|
|||||||
display: inline;
|
display: inline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.menu-inline li.active a,
|
||||||
.views li.active a {
|
.views li.active a {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #000;
|
color: #000;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ div.ganttview-hzheader-month {
|
|||||||
height: 20px;
|
height: 20px;
|
||||||
border-right: 1px solid #d0d0d0;
|
border-right: 1px solid #d0d0d0;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.ganttview-hzheader-day {
|
div.ganttview-hzheader-day {
|
||||||
|
|||||||
@@ -92,12 +92,17 @@ nav .active a {
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.menu-inline li,
|
||||||
.page-header li {
|
.page-header li {
|
||||||
display: inline;
|
display: inline;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
font-size: 0.95em;
|
font-size: 0.95em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.menu-inline {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 640px) {
|
@media only screen and (max-width: 640px) {
|
||||||
|
|
||||||
.page-header-mobile li {
|
.page-header-mobile li {
|
||||||
|
|||||||
@@ -301,3 +301,8 @@ span.task-board-date-overdue {
|
|||||||
.task-show-start-link:focus {
|
.task-show-start-link:focus {
|
||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.flag-milestone {
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -32,6 +32,8 @@ Search.prototype.listen = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Search.prototype.keyboardShortcuts = function() {
|
Search.prototype.keyboardShortcuts = function() {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
// Switch view mode for projects: go to the board
|
// Switch view mode for projects: go to the board
|
||||||
Mousetrap.bind("v b", function(e) {
|
Mousetrap.bind("v b", function(e) {
|
||||||
var link = $(".view-board");
|
var link = $(".view-board");
|
||||||
@@ -59,6 +61,15 @@ Search.prototype.keyboardShortcuts = function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Switch view mode for projects: go to the gantt chart
|
||||||
|
Mousetrap.bind("v g", function(e) {
|
||||||
|
var link = $(".view-gantt");
|
||||||
|
|
||||||
|
if (link.length) {
|
||||||
|
window.location = link.attr('href');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Focus to the search field
|
// Focus to the search field
|
||||||
Mousetrap.bind("f", function(e) {
|
Mousetrap.bind("f", function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
@@ -68,5 +79,18 @@ Search.prototype.keyboardShortcuts = function() {
|
|||||||
input.focus();
|
input.focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Reset to the search field
|
||||||
|
Mousetrap.bind("r", function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
$("#form-search").val("status:open");
|
||||||
|
|
||||||
|
if ($('#board').length) {
|
||||||
|
self.app.board.reloadFilters("status:open");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("form.search").submit();
|
||||||
|
}
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user