From 73fffe57d7604cd711a26130514aceeac12facb8 Mon Sep 17 00:00:00 2001 From: David Lawrence Date: Fri, 20 May 2016 17:17:18 +0000 Subject: Bug 1149384 - implement time tracking interface --- extensions/BugModal/lib/ActivityStream.pm | 2 +- .../en/default/bug_modal/activity_stream.html.tmpl | 2 +- .../template/en/default/bug_modal/edit.html.tmpl | 84 ++++++++++++++++++++++ .../template/en/default/bug_modal/header.html.tmpl | 7 +- extensions/BugModal/web/bug_modal.css | 6 ++ extensions/BugModal/web/bug_modal.js | 13 ++++ 6 files changed, 111 insertions(+), 3 deletions(-) (limited to 'extensions') 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 + %] +
+ + Summarize time (including time for [% terms.bugs %] + blocking this [% terms.bug %]) +
+ [% 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', -- cgit v1.2.3-24-g4f1b