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) {
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;
[% 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 %]&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') %]
"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');
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 %]',
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") %]
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 {
.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 {
$('#' + 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',