summaryrefslogtreecommitdiffstats
path: root/extensions
diff options
context:
space:
mode:
authorDavid Lawrence <dkl@mozilla.com>2016-05-20 19:17:18 +0200
committerDavid Lawrence <dkl@mozilla.com>2016-05-20 19:17:18 +0200
commit73fffe57d7604cd711a26130514aceeac12facb8 (patch)
tree1051c3e92c3b2bfca4381149d2a02d6e4daec5e2 /extensions
parent35b33fe133ff1284de0f33b2da4f132d3e7c8287 (diff)
downloadbugzilla-73fffe57d7604cd711a26130514aceeac12facb8.tar.gz
bugzilla-73fffe57d7604cd711a26130514aceeac12facb8.tar.xz
Bug 1149384 - implement time tracking interface
Diffstat (limited to 'extensions')
-rw-r--r--extensions/BugModal/lib/ActivityStream.pm2
-rw-r--r--extensions/BugModal/template/en/default/bug_modal/activity_stream.html.tmpl2
-rw-r--r--extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl84
-rw-r--r--extensions/BugModal/template/en/default/bug_modal/header.html.tmpl7
-rw-r--r--extensions/BugModal/web/bug_modal.css6
-rw-r--r--extensions/BugModal/web/bug_modal.js13
6 files changed, 111 insertions, 3 deletions
diff --git a/extensions/BugModal/lib/ActivityStream.pm b/extensions/BugModal/lib/ActivityStream.pm
index 0bd88e623..86fa6bb3b 100644
--- a/extensions/BugModal/lib/ActivityStream.pm
+++ b/extensions/BugModal/lib/ActivityStream.pm
@@ -167,7 +167,7 @@ sub _add_comments_to_stream {
next if $comment->type == CMT_HAS_DUPE;
my $author_id = $comment->author->id;
next if $comment->is_private && !($user->is_insider || $user->id == $author_id);
- next if $comment->body eq '' && ($comment->work_time - 0) != 0 && !$user->is_timetracker;
+ next if $comment->body eq '' && ($comment->work_time - 0) != 0 && $user->is_timetracker;
# treeherder is so spammy we hide its comments by default
if ($author_id == $treeherder_id) {
diff --git a/extensions/BugModal/template/en/default/bug_modal/activity_stream.html.tmpl b/extensions/BugModal/template/en/default/bug_modal/activity_stream.html.tmpl
index 0fe644584..9efd601e9 100644
--- a/extensions/BugModal/template/en/default/bug_modal/activity_stream.html.tmpl
+++ b/extensions/BugModal/template/en/default/bug_modal/activity_stream.html.tmpl
@@ -48,7 +48,7 @@
PROCESS activity_header activities=change_set.activity id=change_set.id;
END;
- IF change_set.comment;
+ IF change_set.comment != "";
PROCESS comment_body comment=change_set.comment;
END;
FOREACH activity IN change_set.activity;
diff --git a/extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl b/extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl
index 06b6c801d..9ed5f28b7 100644
--- a/extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl
+++ b/extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl
@@ -1054,6 +1054,90 @@
[% END %]
[% END %]
+[%# === timetracking === %]
+[% IF user.is_timetracker %]
+ [%
+ PROCESS bug/time.html.tmpl;
+ sub = [];
+ IF bug.estimated_time > 0;
+ estimated_time = PROCESS formattimeunit time_unit = bug.estimated_time;
+ sub.push("Estimated: $estimated_time");
+ END;
+ IF bug.remaining_time > 0;
+ remaining_time = PROCESS formattimeunit time_unit = bug.remaining_time;
+ sub.push("Remaining: $remaining_time");
+ END;
+ IF bug.deadline;
+ sub.push("Deadline: " _ bug.deadline);
+ END;
+ %]
+ [% WRAPPER bug_modal/module.html.tmpl
+ title = "Time Tracking"
+ collapsed = 1
+ no_collapse_persist = 1
+ subtitle = sub
+ %]
+ [% WRAPPER fields_lhs %]
+ [% estimated_time = PROCESS formattimeunit time_unit = bug.estimated_time %]
+ [% INCLUDE bug_modal/field.html.tmpl
+ field = bug_fields.estimated_time
+ field_type = constants.FIELD_TYPE_FREETEXT
+ value = estimated_time
+ hide_on_view = 0
+ short_width = 1
+ %]
+ [% current_estimate = PROCESS formattimeunit time_unit = (bug.actual_time + bug.remaining_time) %]
+ [% INCLUDE bug_modal/field.html.tmpl
+ label = "Current Est"
+ value = current_estimate
+ view_only = 1
+ %]
+ [% hours_worked = PROCESS formattimeunit time_unit = bug.actual_time %]
+ [% WRAPPER bug_modal/field.html.tmpl
+ field_type = constants.FIELD_TYPE_FREETEXT
+ label = "Hours Worked"
+ name = "work_time"
+ value = '0.0'
+ short_width = 1
+ %]
+ [% PROCESS formattimeunit time_unity = bug.actual_time %]
+ [% END %]
+ [% hours_left = PROCESS formattimeunit time_unit = bug.remaining_time %]
+ [% INCLUDE bug_modal/field.html.tmpl
+ field = bug_fields.remaining_time
+ field_type = constants.FIELD_TYPE_FREETEXT
+ value = hours_left
+ short_width = 1
+ %]
+ [% END %]
+
+ [% WRAPPER fields_rhs %]
+ [% percentage_complete = PROCESS calculatepercentage act = bug.actual_time rem = bug.remaining_time %]
+ [% INCLUDE bug_modal/field.html.tmpl
+ label = "% Complete"
+ value = percentage_complete
+ view_only = 1
+ %]
+ [% time_gain = PROCESS formattimeunit time_unit = bug.estimated_time - (bug.actual_time + bug.remaining_time) %]
+ [% INCLUDE bug_modal/field.html.tmpl
+ label = "Gain"
+ value = time_gain
+ view_only = 1
+ %]
+ [% INCLUDE bug_modal/field.html.tmpl
+ field = bug_fields.deadline
+ field_type = constants.FIELD_TYPE_DATE
+ value = bug.deadline
+ %]
+ <div>
+ <a href="summarize_time.cgi?id=[% bug.bug_id FILTER none %]&amp;do_depends=1">
+ Summarize time (including time for [% terms.bugs %]
+ blocking this [% terms.bug %])</a>
+ </div>
+ [% END %]
+ [% END %]
+[% END %]
+
[%# === extensions which are modules === %]
[% Hook.process('module') %]
diff --git a/extensions/BugModal/template/en/default/bug_modal/header.html.tmpl b/extensions/BugModal/template/en/default/bug_modal/header.html.tmpl
index 48064f06c..e32f4c546 100644
--- a/extensions/BugModal/template/en/default/bug_modal/header.html.tmpl
+++ b/extensions/BugModal/template/en/default/bug_modal/header.html.tmpl
@@ -66,7 +66,7 @@
"extensions/BugModal/web/bug_modal.css",
"skins/custom/bug_groups.css",
"js/jquery/plugins/datetimepicker/datetimepicker.css",
- "js/jquery/plugins/contextMenu/contextMenu.css",
+ "js/jquery/plugins/contextMenu/contextMenu.css"
);
IF user.in_group('canconfirm');
@@ -99,6 +99,7 @@
id: [% user.id FILTER none %],
login: '[% user.login FILTER js %]',
is_insider: [% user.is_insider ? "true" : "false" %],
+ is_timetracker: [% user.is_timetracker ? "true" : "false" %],
can_tag: [% user.can_tag_comments ? "true" : "false" %],
settings: {
quote_replies: '[% user.settings.quote_replies.value FILTER js %]',
@@ -112,6 +113,10 @@
BUGZILLA.constant.min_comment_tag_length = [% constants.MIN_COMMENT_TAG_LENGTH FILTER none %];
BUGZILLA.constant.max_comment_tag_length = [% constants.MAX_COMMENT_TAG_LENGTH FILTER none %];
[% END %]
+
+ [% IF user.is_timetracker %]
+ BUGZILLA.remaining_time = [% bug.remaining_time FILTER js %]; // holds the original value
+ [% END %]
[% END %]
[% Hook.process("end") %]
diff --git a/extensions/BugModal/web/bug_modal.css b/extensions/BugModal/web/bug_modal.css
index 0a589b050..88ffadc9e 100644
--- a/extensions/BugModal/web/bug_modal.css
+++ b/extensions/BugModal/web/bug_modal.css
@@ -109,6 +109,9 @@ a.activity-ref {
background: #eee;
padding: 2px 5px;
cursor: pointer;
+ -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
+ box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
}
.module-header:hover {
@@ -158,6 +161,9 @@ a.activity-ref {
.module-content {
padding: 2px 5px;
background: #fff;
+ -webkit-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
+ -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
+ box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
}
.module .field {
diff --git a/extensions/BugModal/web/bug_modal.js b/extensions/BugModal/web/bug_modal.js
index 6c10c6fb0..6c72eb249 100644
--- a/extensions/BugModal/web/bug_modal.js
+++ b/extensions/BugModal/web/bug_modal.js
@@ -949,6 +949,19 @@ $(function() {
$('#' + id).datetimepicker('show');
});
+ // timetracking
+ $('#work_time').change(function() {
+ // subtracts time spent from remaining time
+ // prevent negative values if work_time > fRemainingTime
+ var new_time = Math.max(BUGZILLA.remaining_time - $('#work_time').val(), 0.0);
+ // get upto 2 decimal places
+ $('#remaining_time').val(Math.round((new_time * 100)/100).toFixed(1));
+ });
+ $('#remaining_time').change(function() {
+ // if the remaining time is changed manually, update BUGZILLA.remaining_time
+ BUGZILLA.remaining_time = $('#remaining_time').val();
+ });
+
// new bug button
$.contextMenu({
selector: '#new-bug-btn',