summaryrefslogtreecommitdiffstats
path: root/template
diff options
context:
space:
mode:
authortravis%sedsystems.ca <>2005-03-01 02:52:55 +0100
committertravis%sedsystems.ca <>2005-03-01 02:52:55 +0100
commit8b0a6508c4daa8a56d17192a9c3a1d9b53790e15 (patch)
treee128879b9139eeffe73be53e1ffd62563c835a2c /template
parentca2f67d88996b8a2b49264e94659f7acf3e1bc68 (diff)
downloadbugzilla-8b0a6508c4daa8a56d17192a9c3a1d9b53790e15.tar.gz
bugzilla-8b0a6508c4daa8a56d17192a9c3a1d9b53790e15.tar.xz
Bug 250410 : Time tracking summaries
Patch by Christian Reis <kiko@async.com.br> r=jpeshkin a=justdave
Diffstat (limited to 'template')
-rw-r--r--template/en/default/bug/edit.html.tmpl7
-rw-r--r--template/en/default/bug/summarize-time.html.tmpl329
-rw-r--r--template/en/default/filterexceptions.pl8
-rw-r--r--template/en/default/list/list.html.tmpl9
4 files changed, 352 insertions, 1 deletions
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
index 58336b588..86fb4c6b6 100644
--- a/template/en/default/bug/edit.html.tmpl
+++ b/template/en/default/bug/edit.html.tmpl
@@ -419,6 +419,13 @@
size="10" maxlength="10">
</td>
</tr>
+ <tr>
+ <td colspan="6" align="right">
+ <a href="summarize_time.cgi?id=[% bug.bug_id %]&do_depends=1">
+ Summarize time (including time for [% terms.bugs %]
+ blocking this [% terms.bug %])</a>
+ </td>
+ </tr>
</table>
[% END %]
diff --git a/template/en/default/bug/summarize-time.html.tmpl b/template/en/default/bug/summarize-time.html.tmpl
new file mode 100644
index 000000000..0bcaeaeb6
--- /dev/null
+++ b/template/en/default/bug/summarize-time.html.tmpl
@@ -0,0 +1,329 @@
+[%# 1.0@bugzilla.org %]
+[%# The contents of this file are subject to the Mozilla Public
+ # License Version 1.1 (the "License"); you may not use this file
+ # except in compliance with the License. You may obtain a copy of
+ # the License at http://www.mozilla.org/MPL/
+ #
+ # Software distributed under the License is distributed on an "AS
+ # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+ # implied. See the License for the specific language governing
+ # rights and limitations under the License.
+ #
+ # The Original Code is the Bugzilla Bug Tracking System.
+ #
+ # Contributor(s): Christian Reis <kiko@async.com.br>
+ #%]
+
+[% USE date %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = "Time Summary " %]
+[% IF do_depends %]
+ [% title = title _ "for " %]
+ [% h1 = title _ GetBugLink(ids.0, "$terms.Bug $ids.0") %]
+ [% title = title _ "$terms.Bug $ids.0: " %]
+ [% h1 = (h1 _ " (and $terms.bugs blocking it)") IF do_depends %]
+[% ELSE %]
+ [% title = title _ "($ids.size $terms.bugs selected)" %]
+ [% h1 = title %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ h1 = h1
+ style_urls = ["skins/standard/summarize-time.css"]
+ %]
+
+<p>
+
+[% IF ids.size == 0 %]
+
+ No [% terms.bugs %] specified or visible.
+
+[% ELSE %]
+
+ [% INCLUDE query_form %]
+
+ [% IF do_report %]
+
+ [% global.grand_total = 0 %]
+
+ <p>
+ [% FOREACH workdata = part_list %]
+ [% part = parts.shift %]
+ <div align="right">
+ <h4 style="padding-right: 2em; margin: 0;">
+ [% IF part.0 or part.1 %]
+ [% part.0 OR "Up" FILTER html %] to [% part.1 OR "now" FILTER html %]
+ [% ELSE %]
+ Full summary (no period specified)
+ [% END %]
+ </h4>
+ </div>
+ [% IF group_by == "number" %]
+ [% INCLUDE number_report %]
+ [% ELSE %]
+ [% INCLUDE owner_report %]
+ [% END %]
+ <p>
+ [% END %]
+
+ [% IF monthly %]
+ <h4 style="margin: 0">Total of [% global.grand_total FILTER format("%.2f") %] hours worked</h4>
+ <hr noshade size="1">
+ [% END %]
+
+ [% IF null.keys.size > 0 %]
+ [% INCLUDE inactive_report %]
+ <p>
+ <h4 style="margin: 0">Total of [% null.keys.size %]
+ inactive [% terms.bugs %]</h4>
+ [% END %]
+
+ [% END %]
+
+[% END %]
+<p>
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%#
+ #
+ # Developer reporting
+ #
+ #%]
+
+[% BLOCK owner_report %]
+ [% global.total = 0 global.bug_count = {} global.owner_count = {}%]
+ <table cellpadding="4" cellspacing="0" width="90%" class="realitems owner">
+ [% FOREACH owner = workdata.keys.sort %]
+ [% INCLUDE do_one_owner owner=owner ownerdata=workdata.$owner
+ detailed=detailed %]
+ [% END %]
+
+ [% additional = "$global.owner_count.size developers @
+ $global.bug_count.size $terms.bugs" %]
+ [% INCLUDE section_total colspan=3 additional=additional %]
+ </table>
+[% END %]
+
+[% BLOCK do_one_owner %]
+ [% global.owner_count.$owner = 1 %]
+ <tr><td colspan="5" class="owner_header">
+ <b>[% owner FILTER html %]</b>
+ </td></tr>
+ [% col = 0 subtotal = 0%]
+ [% FOREACH bugdata=ownerdata.nsort("bug_id") %]
+ [% bug_id = bugdata.bug_id %]
+ [% global.bug_count.$bug_id = 1 %]
+ [% IF detailed %]
+ [%# XXX oy what a hack %]
+ [% timerow = '<td width="100" align="right" valign="top">' _ bugdata.total_time _ '</td>' %]
+ [% INCLUDE bug_header cid=col id=bug_id bug_status=bugdata.bug_status
+ short_desc=bugdata.short_desc extra=timerow %]
+ [% col = col + 1 %]
+ [% END %]
+ [% subtotal = subtotal + bugdata.total_time %]
+ [% END %]
+ <tr>
+ <td colspan="3">&nbsp;</td>
+ <td align="right">
+ <b>Total</b>:
+ </td>
+ <td align="right" class="subtotal" width="100">
+ <b>[% subtotal FILTER format("%.2f") %]</b></td>
+ [% global.total = global.total + subtotal %]
+ </tr>
+[% END %]
+
+[%#
+ #
+ # Bug Number reporting
+ #
+ #%]
+
+[% BLOCK number_report %]
+ [% global.total = 0 global.owner_count = {} global.bug_count = {} %]
+
+ <table cellpadding="4" cellspacing="0" width="90%" class="realitems number">
+ [% keys = sort_bug_keys(workdata.keys) %]
+ [% FOREACH bug = keys %]
+ [% INCLUDE do_one_bug bug=bug bugdata=workdata.$bug
+ detailed=detailed %]
+ [% END %]
+
+ [% additional = "$global.bug_count.size $terms.bugs &amp;
+ $global.owner_count.size developers" %]
+ [% INCLUDE section_total additional=additional colspan=2 %]
+ </table>
+[% END %]
+
+[% BLOCK do_one_bug %]
+ [% subtotal = 0.00 cid = 0 %]
+
+ [%# hack apart the ID and summary. Sad. %]
+ [% items = bug.split(";") %]
+ [% id = items.shift %]
+ [% status = items.shift %]
+ [% global.bug_count.$id = 1 %]
+ [% INCLUDE bug_header id=id bug_status=status short_desc=items.join(";") %]
+
+ [% FOREACH owner = bugdata.sort("login_name") %]
+ [% work_time = owner.total_time %]
+ [% subtotal = subtotal + work_time %]
+ [% login_name = owner.login_name %]
+ [% global.owner_count.$login_name = 1 %]
+ [% IF detailed %]
+ [% cid = cid + 1 %]
+ <tr class="owner_header[% 2 FILTER none IF cid % 2 %]">
+ <td>&nbsp;</td>
+ <td colspan="2"><b>[% login_name FILTER html %]</b></td>
+ <td align="right">
+ [% work_time FILTER format("%.2f") %]</td>
+ </tr>
+ [% END %]
+ [% END %]
+ <tr>
+ <td colspan="2">&nbsp;</td>
+ <td align="right">
+ <b>Total</b>:
+ </td>
+ <td align="right" class="subtotal" width="100">
+ <b>[% subtotal FILTER format("%.2f") %]</b>
+ </td></tr>
+ [% global.total = global.total + subtotal %]
+[% END %]
+
+[% BLOCK bug_header %]
+ <tr class="bug_header[% '2' IF cid % 2 %]">
+ <td width="10" valign="top">
+ [% INCLUDE buglink id=id %]</td>
+ <td width="10"><b>[% bug_status FILTER html %]</b></td>
+ <td colspan="2">[% short_desc FILTER html %]</td>
+ [% extra FILTER none %]
+ </tr>
+[% END %]
+
+
+[% BLOCK inactive_report %]
+ <h3>Inactive [% terms.bugs %]</h3>
+ <table cellpadding="4" cellspacing="0" width="90%" class="zeroitems">
+ [% cid = 0 %]
+ [% FOREACH bug_id = null.keys.nsort %]
+ [% INCLUDE bug_header id=bug_id bug_status=null.$bug_id.1
+ short_desc=null.$bug_id.0 cid=cid %]
+ [% cid = cid + 1 %]
+ [% END %]
+ </table>
+[% END %]
+
+
+[% BLOCK section_total %]
+ [% IF global.total > 0 %]
+ <tr class="section_total">
+ <td align="left" width="10">
+ <b>Totals</b></td>
+ <td colspan="[% colspan FILTER none %]" align="right"><b>[% additional FILTER none %]</b></td>
+ <td align="right">&nbsp;&nbsp;
+ <b>[% global.total FILTER format("%.2f") %]</b>
+ </td></tr>
+ [% ELSE %]
+ <tr><td>
+ No time allocated during the specified period.
+ </td></tr>
+ [% END %]
+ [% global.grand_total = global.grand_total + global.total %]
+[% END %]
+
+[%#
+ #
+ # The query form
+ #
+ #%]
+
+[% BLOCK query_form %]
+<hr noshade size=1>
+<form method="post" name="summary" style="display: inline" action="">
+<input type="hidden" name="do_depends" value="[% do_depends FILTER html %]">
+<input type="hidden" name="id" value="[% ids.join(",") FILTER html %]">
+<input type="hidden" name="do_report" value="1">
+
+[% IF warn_swap_dates %]
+ <h4 style="border: 1px solid red; margin: 1em; padding: 0.5em">The
+ end date specified occurs before the start date, which doesn't
+ make sense; the dates below have therefore been swapped.</h4>
+[% END %]
+
+<table>
+<tr>
+<td align="right">
+ <b>Period <label accesskey="s"
+ for="start_date"><u>s</u>tarting</label></b>:
+</td><td colspan="3">
+ <input type="text" id="start_date" name="start_date" size="11"
+ align="right" value="[% start_date FILTER html %]" maxlength="10">
+ &nbsp;
+ <b>and <label accesskey="e" for="end_date"><u>e</u>nding</label></b>:
+ <input type="text" name="end_date" size="11" id="end_date"
+ align="right" value ="[% end_date FILTER html %]" maxlength="10">
+</td><td align="right">
+ <input type="submit" value="Summarize">
+</td></tr>
+<tr>
+<td>&nbsp;</td><td colspan="4">
+ <small>(Dates are optional, and in YYYY-MM-DD format)</small>
+</td>
+<tr><td align="right">
+ <b>Group by</b>:
+</td><td colspan="2">
+ <input type="radio" name="group_by" id="number" value="number" [%
+ 'checked="checked"' IF group_by == "number"
+ %]><label
+ for="number" accesskey="n">[% terms.Bug %] <u>N</u>umber</label>
+ <input type="radio" name="group_by" id="owner" value="owner" [%
+ 'checked="checked"' IF group_by == "owner"
+ %]><label
+ for="owner" accesskey="d"><u>D</u>eveloper</label>
+</td><td colspan="2">
+ <b>Format</b>: <select name="ctype">
+ <option value="html">HTML Report</option>
+ </select>
+</td></tr><tr>
+<td>&nbsp;</td><td colspan="4">
+ <label for="monthly" accesskey="m">
+ <input type="checkbox" name="monthly" [% 'checked="checked"' IF
+ monthly %] id="monthly">
+ Split by <u>m</u>onth</label>
+ [%# XXX: allow splitting by other intervals %]
+ &nbsp;
+ <label for="detailed" accesskey="t">
+ <input type="checkbox" name="detailed" [% 'checked="checked"' IF
+ detailed %] id="detailed">
+ De<u>t</u>ailed summaries</label>
+ &nbsp;
+ <label for="inactive" accesskey="i">
+ <input type="checkbox" name="inactive" [% 'checked="checked"' IF
+ inactive %] id="inactive">
+ Also show <u>i</u>nactive [% terms.bugs %]</label>
+</td>
+</tr></table>
+
+</form>
+<script type="application/x-javascript">
+<!--
+ document.forms['summary'].start_date.focus()
+//--></script>
+<hr noshade size=1>
+[% END %]
+
+[%#
+ #
+ # Utility
+ #
+ #%]
+
+[% BLOCK buglink %]
+ <a href="show_bug.cgi?id=[% id FILTER html %]"><b>[% terms.Bug %]&nbsp;[% id FILTER html %]</b></a>
+[% END %]
+
diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl
index 9fc4232b0..94a4168e2 100644
--- a/template/en/default/filterexceptions.pl
+++ b/template/en/default/filterexceptions.pl
@@ -370,6 +370,14 @@
'field',
],
+'bug/summarize-time.html.tmpl' => [
+ 'global.grand_total FILTER format("%.2f")',
+ 'subtotal FILTER format("%.2f")',
+ 'work_time FILTER format("%.2f")',
+ 'global.total FILTER format("%.2f")',
+],
+
+
'bug/time.html.tmpl' => [
'time_unit FILTER format(\'%.1f\')',
'time_unit FILTER format(\'%.2f\')',
diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl
index 602475d0d..919c9b21c 100644
--- a/template/en/default/list/list.html.tmpl
+++ b/template/en/default/list/list.html.tmpl
@@ -133,8 +133,15 @@
<input type="hidden" name="id" value="[% id FILTER html %]">
[% END %]
<input type="hidden" name="format" value="multiple">
- <input type="submit" value="Long Format">
+ <input type="submit" value="&nbsp;&nbsp;Long Format&nbsp;">
</form>
+
+ [% IF UserInGroup(Param('timetrackinggroup')) %]
+ <form method="post" action="summarize_time.cgi">
+ <input type="hidden" name="id" value="[% buglist_joined FILTER html %]">
+ <input type="submit" value="Time Summary">
+ </form>
+ [% END %]
</td>
<td>&nbsp;</td>