diff --git a/module/project/css/tree.css b/module/project/css/tree.css
index ffa0a9a4f5..e2aea0210e 100644
--- a/module/project/css/tree.css
+++ b/module/project/css/tree.css
@@ -1,21 +1,25 @@
.no-padding {padding: 0!important;}
+
#projectTree {margin-bottom: 0}
#projectTree > .tree-action-item {display: none!important}
#projectTree li > .tree-item-wrapper > .tree-toggle {display: block}
-#projectTree li > .tree-item-wrapper:hover {display: block; background-color: #edf3fe; cursor: pointer; margin-left: -20px; padding-left: 20px;}
+#projectTree li > .tree-item-wrapper:hover {background-color: #edf3fe; cursor: pointer; margin-left: -20px; padding-left: 20px;}
#projectTree li {line-height: 30px; padding-top: 0; padding-bottom: 0}
-#projectTree > li > .tree-item-wrapper {display: block; background-color: #edf3fe; margin-left: -20px; padding-left: 20px; border-bottom: 1px solid #ddd; cursor: pointer}
-#projectTree > li > .tree-item-wrapper:hover {background-color: #eee}
#projectTree > li.open > .tree-item-wrapper {border-bottom: none}
-#projectTree > li.open + li > .tree-item-wrapper {border-top: 1px solid #ddd}
-#projectTree.tree li>.list-toggle:before {content: '\e6bb'}
-#projectTree.tree li.open>.list-toggle:before {content: '\e6b8';}
+#projectTree.tree li.has-list.open > ul:after {top: -10px; bottom: 17px}
+#projectTree.tree ul > li.has-list:after {top: 14px}
+#projectTree.tree ul > li:after {top: 13px}
#projectTree.tree li>.list-toggle {top: 2px}
-#projectTree .item-type-story > ul > li {padding-left: 10px;}
#projectTree.tree li:before {display: none}
-#projectTree .table-bordered tr > td:first-child, #projectTree .table-bordered tr > th:first-child {border-left: 1px solid #ddd; padding-left: 0; padding-right: 0}
-#projectTree .item-type-tasks .tree-item-wrapper:hover {background-color: #fff}
+#projectTree .item-type-story > ul > li {padding-left: 10px;}
+#projectTree .item-type-tasks > .tree-item-wrapper:hover {background-color: #f5f5f5}
+#projectTree .task-pri {position: relative; top: -1px}
+#projectTree .task-assignto {display: inline-block; margin-left: 10px; color: #808080}
+#projectTree .task-info {float: right; display: none}
+#projectTree .task-info > div {display: inline-block; margin: 0 5px;}
+#projectTree .task-info > div.buttons {position: relative; top: 2px}
+#projectTree .item-type-task:hover .task-info {display: block}
.tree-view-btn {min-width: 36px;}
.main > .panel > .panel-heading > .panel-actions {margin-top: -8px; margin-right: -12px;}
diff --git a/module/project/model.php b/module/project/model.php
index 8115dcb6ec..75ddd7f3f5 100644
--- a/module/project/model.php
+++ b/module/project/model.php
@@ -2007,10 +2007,10 @@ class projectModel extends model
$storyTasks = isset($taskGroups[$node->id][$story->id]) ? $taskGroups[$node->id][$story->id] : array();
if(!empty($storyTasks))
{
- $taskItems = $this->formatTasksForTree($storyTasks, $story);
+ $taskItems = $this->formatTasksForTree($storyTasks, $story);
$storyItem->tasksCount = count($taskItems);
$storyItem->children = array();
- $storyItem->children[] = array('id' => 'tasks' . $story->id, 'tasks' => $taskItems, 'type' => 'tasks', 'actions' => false);
+ $storyItem->children = $taskItems;
}
$node->children[] = $storyItem;
@@ -2022,8 +2022,9 @@ class projectModel extends model
$tasks = isset($taskGroups[$node->id][0]) ? $taskGroups[$node->id][0] : array();
if(!empty($tasks))
{
- $taskItems = $this->formatTasksForTree($tasks);
- $node->children[] = array('id' => 'tasks', 'tasks' => $taskItems, 'type' => 'tasks', 'actions' => false);
+ $taskItems = $this->formatTasksForTree($tasks);
+ $node->tasksCount = count($taskItems);
+ $node->children = $taskItems;
}
}
@@ -2082,6 +2083,7 @@ class projectModel extends model
$buttons .= common::buildIconButton('task', 'close', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
$buttons .= common::buildIconButton('task', 'edit', "taskID=$task->id", '', 'list');
$taskItem->buttons = $buttons;
+ $taskItem->actions = false;
$taskItems[] = $taskItem;
}
diff --git a/module/project/view/tree.html.php b/module/project/view/tree.html.php
index 393fccf83f..a31fef3038 100644
--- a/module/project/view/tree.html.php
+++ b/module/project/view/tree.html.php
@@ -27,8 +27,8 @@ include './taskheader.html.php';
-
@@ -56,6 +56,7 @@ $(function()
var hoursFormat = 'project->hours ?>';
var viewLevel = '' || 'custom';
var data = $.parseJSON('');
+ console.log('DATA', data);
var $tree = $('#projectTree');
var statusMap = $.parseJSON('task->statusList);?>');
var selectCustomLevel = function() {$('.tree-view-btn.active').removeClass('active').filter('[data-type="custom"]').addClass('active');};
@@ -70,7 +71,7 @@ $(function()
{
title: 'project->batchWBS ?>',
template: '',
- templateInList: ' project->batchWBS ?>',
+ templateInList: false,
linkTemplate: ''
},
},
@@ -84,10 +85,10 @@ $(function()
},
itemCreator: function($li, item)
{
- $li.closest('li').addClass('item-type-' + item.type);
+ $li.toggleClass('tree-toggle', item.type !== 'task').closest('li').addClass('item-type-' + item.type);
if(item.type === 'product')
{
- $li.append($(' ' + item.title + '')).addClass('tree-toggle');
+ $li.append($(' ' + item.title + ''));
}
else if(item.type === 'story')
{
@@ -99,23 +100,29 @@ $(function()
}
else if(item.type === 'task')
{
- $li.append('' + item.pri + ' ').append($('').attr({href: item.url}).text('#' + item.id + ' ' + item.title).css('color', item.color));
+ $li.append('' + (item.pri || '') + ' ').append($('').attr({href: item.url}).text('#' + item.id + ' ' + item.title).css('color', item.color));
+ if(item.assignedTo) $li.append($('').html(item.assignedTo ? (' ' + item.assignedTo) : ''));
+ var $info = $('');
+ $info.append($('').addClass('task-' + item.status).text(statusMap[item.status]));
+ $info.append($('').text(hoursFormat.replace('%s', item.estimate).replace('%s', item.consumed).replace('%s', item.left)));
+ $info.append($('').html(item.buttons));
+ $li.append($info);
}
else if(item.type === 'tasks')
{
if(item.tasks && item.tasks.length)
{
- var $table = $('');
+ var $table = $('');
var $tbody = $table.find('tbody');
$.each(item.tasks, function(idx, task)
{
var $tr = $('
');
- $tr.append($(' | ').append('' + (task.pri || '') + ''));
$tr.append($(' | ').addClass('text-left').append($('').attr({href: task.url}).text('#' + task.id + ' ' + task.title).css('color', task.color)));
- $tr.append($(' | ').html(task.assignedTo ? (' ' + task.assignedTo) : ''));
- $tr.append($(' | ').addClass(task.storyChanged ? 'warning' : task.status).text(statusMap[task.status]));
- $tr.append($(' | ').text(hoursFormat.replace('%s', task.estimate).replace('%s', task.consumed).replace('%s', task.left)));
- $tr.append($(' | ').html(task.buttons));
+ $tr.append($('').append('' + (task.pri || '') + ''));
+ $tr.append($('').html(task.assignedTo ? (' ' + task.assignedTo) : ''));
+ $tr.append($('').addClass(task.status).text(statusMap[task.status]));
+ $tr.append($('').text(hoursFormat.replace('%s', task.estimate).replace('%s', task.consumed).replace('%s', task.left)));
+ $tr.append($('').html(task.buttons));
$tbody.append($tr);
});
$li.append($table);
@@ -123,12 +130,12 @@ $(function()
}
else if(item.type === 'unlinkStory')
{
- $li.append($(' ' + item.title + '')).addClass('tree-toggle');
+ $li.append($(' ' + item.title + ''));
if(item.tasksCount) $li.append(' ' + item.tasksCount + '');
}
else
{
- $li.addClass('tree-toggle').append($(' ' + (item.title || item.name) + ''));
+ $li.append($(' ' + (item.title || item.name) + ''));
}
}
});
@@ -145,7 +152,7 @@ $(function()
if(level === 'task')
{
tree.collapse();
- tree.show($('.item-type-tasks').parent().parent());
+ tree.show($('.item-type-tasks, .item-type-task').parent().parent());
}
if(level === 'product') tree.collapse();
else if(level === 'module')
diff --git a/www/theme/default/style.css b/www/theme/default/style.css
index 2c86615fa3..9af807de10 100644
--- a/www/theme/default/style.css
+++ b/www/theme/default/style.css
@@ -204,27 +204,27 @@ fieldset.actionbox ol {padding-top: 8px\0/;}
.stars-list {color: #E48600}
/* status in table */
-td.done, td[class$="-done"],
-td.pass, td[class$="-pass"],
-td.resolved, td[class$="-resolved"],
-td.normal, td[class$="-normal"],
-td.status-active, td[class$="-active"] {color:#229f24;}
-td.wait, td[class$="-wait"] {color:#808080;}
-td.pause, td[class$="-pause"],
-td.suspended, td[class$="-suspended"] {color:#E48600;}
-td.delay, td[class$="-delay"] {color:#e84e0f;}
-td.closed, td[class$="-closed"],
-td.cancel, td[class$="-cancel"] {color:#888;}
-td.doing, td[class$="-doing"],
-td.changed, td[class$="-changed"],
-td.investigate, td[class$="-investigate"] {color:#d2322d;}
-td.delayed, td[class$="-delayed"] {background:#e84e0f!important; color:white;}
-td.blocked, td[class$="-blocked"] {background:yellow!important;}
-td.fail, td[class$="-fail"] {color:#d2322d}
-td.draft, td[class$="-draft"] {color:#8957a1}
-.bug-active, td.bug-active {color: #8957a1}
-.testcase-normal, td.testcase-normal,
-.story-active, td.story-active {color: #333}
+td.done, [class$="-done"],
+td.pass, [class$="-pass"],
+td.resolved, [class$="-resolved"],
+td.normal, [class$="-normal"],
+td.status-active, [class$="-active"] {color:#229f24;}
+td.wait, [class$="-wait"] {color:#808080;}
+td.pause, [class$="-pause"],
+td.suspended, [class$="-suspended"] {color:#E48600;}
+td.delay, [class$="-delay"] {color:#e84e0f;}
+td.closed, [class$="-closed"],
+td.cancel, [class$="-cancel"] {color:#888;}
+td.doing, [class$="-doing"],
+td.changed, [class$="-changed"],
+td.investigate, [class$="-investigate"] {color:#d2322d;}
+td.delayed, [class$="-delayed"] {background:#e84e0f!important; color:white;}
+td.blocked, [class$="-blocked"] {background:yellow!important;}
+td.fail, [class$="-fail"] {color:#d2322d}
+td.draft, [class$="-draft"] {color:#8957a1}
+.bug-active {color: #8957a1}
+.testcase-normal,
+.story-active {color: #333}
/* tabs */
.nav-tabs > li > a {padding: 5px 10px; color: #333; line-height: 20px; max-height: 32px}