| [%# This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this |
| # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| # |
| # This Source Code Form is "Incompatible With Secondary Licenses", as |
| # defined by the Mozilla Public License, v. 2.0. |
| #%] |
| |
| [% title = "Time Summary " %] |
| [% IF do_depends %] |
| [% title = title _ "for " %] |
| [% header = "$terms.Bug $ids.0" FILTER bug_link(ids.0) FILTER none %] |
| [% header = title _ header _ " (and $terms.bugs blocking it)" %] |
| [% title = title _ "$terms.Bug $ids.0" %] |
| [% ELSE %] |
| [% title = title _ "($ids.size $terms.bugs selected)" %] |
| [% header = title %] |
| [% END %] |
| |
| [% PROCESS global/header.html.tmpl |
| title = title |
| header = header |
| style_urls = ['skins/standard/buglist.css'] |
| doc_section = "using/editing.html#time-tracking" |
| yui = ['calendar'] |
| javascript_urls = [ "js/util.js", "js/field.js" ] |
| %] |
| |
| [% INCLUDE query_form %] |
| |
| [% IF do_report %] |
| |
| [% global.grand_total = 0 global.estimated = 0 global.remaining = 0 %] |
| |
| [% FOREACH workdata = part_list %] |
| [%# parts contains date ranges (from, to). %] |
| [% part = parts.shift %] |
| <h4> |
| [% 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> |
| [% IF group_by == "number" %] |
| [% INCLUDE number_report %] |
| [% ELSE %] |
| [% INCLUDE owner_report %] |
| [% END %] |
| [% END %] |
| |
| [% IF detailed %] |
| <h4> |
| Total of [% global.remaining FILTER format("%.2f") %]h remains from |
| original estimate of [% global.estimated FILTER format("%.2f") %]h |
| [% IF global.deadline %] |
| (deadline [% global.deadline FILTER html %]) |
| [% END %] |
| </h4> |
| [% END %] |
| |
| [% IF monthly %] |
| <h4>Total of [% global.grand_total FILTER format("%.2f") %] hours worked</h4> |
| <hr> |
| [% END %] |
| |
| [% IF null.size > 0 %] |
| [% INCLUDE inactive_report %] |
| <h4>Total of [% null.size %] inactive [% terms.bugs %]</h4> |
| [% END %] |
| |
| [% END %] |
| |
| [% PROCESS global/footer.html.tmpl %] |
| |
| [%# |
| # |
| # Developer reporting |
| # |
| #%] |
| |
| [% BLOCK owner_report %] |
| [% global.total = 0 global.bug_count = {} global.owner_count = {} %] |
| <table 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 %] |
| [% INCLUDE calc_bug_total id=bug_id %] |
| [% global.bug_count.$bug_id = 1 %] |
| [% IF detailed %] |
| [% INCLUDE bug_header cid=col id=bug_id bugdata=bugdata extra=1 %] |
| [% col = col + 1 %] |
| [% END %] |
| [% subtotal = subtotal + bugdata.total_time %] |
| [% END %] |
| <tr> |
| <th colspan="4" class="right">Total:</th> |
| <td class="subtotal">[% subtotal FILTER format("%.2f") %]</td> |
| </tr> |
| [% global.total = global.total + subtotal %] |
| [% END %] |
| |
| [%# |
| # |
| # Bug Number reporting |
| # |
| #%] |
| |
| [% BLOCK number_report %] |
| [% global.total = 0 global.owner_count = {} global.bug_count = {} %] |
| |
| <table class="realitems number"> |
| [% FOREACH bug = workdata.keys.nsort %] |
| [% INCLUDE do_one_bug id=bug bugdata=workdata.$bug |
| detailed=detailed %] |
| [% END %] |
| |
| [% additional = "$global.bug_count.size $terms.bugs & |
| $global.owner_count.size developers" %] |
| [% INCLUDE section_total additional=additional colspan=2 %] |
| </table> |
| [% END %] |
| |
| [% BLOCK do_one_bug %] |
| [% subtotal = 0.00 cid = 0 %] |
| [% INCLUDE calc_bug_total id=id %] |
| [% global.bug_count.$id = 1 %] |
| [% INCLUDE bug_header id=id %] |
| |
| [% 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> </td> |
| <td colspan="2"><b>[% login_name FILTER html %]</b></td> |
| <td class="right"> |
| [% work_time FILTER format("%.2f") %]</td> |
| </tr> |
| [% END %] |
| [% END %] |
| <tr> |
| <th colspan="3" class="right">Total:</th> |
| <td class="subtotal">[% subtotal FILTER format("%.2f") %]</td> |
| </tr> |
| [% global.total = global.total + subtotal %] |
| [% END %] |
| |
| [% BLOCK bug_header %] |
| <tr class="bug_header[% '2' IF cid % 2 %]"> |
| <th class="bug_id">[% "$terms.Bug $id" FILTER bug_link(id) FILTER none %]</th> |
| <th class="bug_status"> |
| [% display_value("bug_status", bugs.$id.bug_status) FILTER html %] |
| </th> |
| <td colspan="2">[% bugs.$id.short_desc FILTER html %]</td> |
| [% IF extra %] |
| <td class="right">[% bugdata.total_time FILTER html %]</td> |
| [% END %] |
| </tr> |
| [% IF detailed %] |
| <tr class="bug_header[% '2' IF cid % 2 %]"> |
| <td> </td> |
| <td colspan="3"> |
| <span class="time_info"> |
| Estimated: [% bugs.$id.estimated_time FILTER format("%.2f") %]h |
| </span> |
| <span class="time_info"> |
| Remaining: [% bugs.$id.remaining_time FILTER format("%.2f") %]h |
| </span> |
| <span class="time_info"> |
| Deadline: [% bugs.$id.deadline || "<b>Not set</b>" %] |
| </span> |
| </td> |
| [% IF extra %] |
| <td> </td> |
| [% END %] |
| </tr> |
| [% END %] |
| [% END %] |
| |
| [% BLOCK calc_bug_total %] |
| [% IF !global.bug_count.$id %] |
| [% global.estimated = global.estimated + bugs.$id.estimated_time %] |
| [% global.remaining = global.remaining + bugs.$id.remaining_time %] |
| [% IF !global.deadline || bugs.$id.deadline && |
| global.deadline.replace("-", "") < bugs.$id.deadline.replace("-", "") %] |
| [% SET global.deadline = bugs.$id.deadline %] |
| [% END %] |
| [% END %] |
| [% END %] |
| |
| [% BLOCK inactive_report %] |
| <h3>Inactive [% terms.bugs %]</h3> |
| <table class="zeroitems"> |
| [% cid = 0 %] |
| [% FOREACH bug_id = null.nsort %] |
| [% INCLUDE bug_header id=bug_id cid=cid %] |
| [% cid = cid + 1 %] |
| [% END %] |
| </table> |
| [% END %] |
| |
| |
| [% BLOCK section_total %] |
| [% IF global.total > 0 %] |
| <tr class="section_total"> |
| <td><b>Totals</b></td> |
| <th colspan="[% colspan FILTER html %]" class="right">[% additional FILTER html %]</th> |
| <th class="right">[% global.total FILTER format("%.2f") %]</th> |
| </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> |
| <form method="post" name="summary" action="summarize_time.cgi"> |
| <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 %] |
| <p class="warning_swapped_data"> |
| The end date specified occurs before the start date, which doesn't |
| make sense; the dates below have therefore been swapped. |
| </p> |
| [% END %] |
| |
| <table> |
| <tr> |
| <th> |
| <label accesskey="s" for="start_date">Period <u>s</u>tarting</label>: |
| </th> |
| <td> |
| <input id="start_date" name="start_date" size="10" autofocus |
| value="[% start_date FILTER html %]" maxlength="10" |
| onchange="updateCalendarFromField(this)"> |
| <button type="button" class="calendar_button" id="button_calendar_start_date" |
| onclick="showCalendar('start_date')"><span>Calendar</span> |
| </button> |
| <div id="con_calendar_start_date"></div> |
| <span class="label"> |
| and <label accesskey="e" for="end_date"><u>e</u>nding</label>: |
| </span> |
| <input type="text" name="end_date" size="10" id="end_date" |
| value ="[% end_date FILTER html %]" maxlength="10" |
| onchange="updateCalendarFromField(this)"> |
| <button type="button" class="calendar_button" id="button_calendar_end_date" |
| onclick="showCalendar('end_date')"><span>Calendar</span> |
| </button> |
| <div id="con_calendar_end_date"></div> |
| <br> |
| <span class="bz_info">(Dates are optional, and in YYYY-MM-DD format)</span> |
| </td> |
| <th><input type="submit" id="summarize" value="Summarize"></th> |
| </tr> |
| |
| <tr> |
| <th>Group by:</th> |
| <td> |
| <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> |
| <th> |
| <label for="ctype">Format</label>: |
| <select name="ctype" id="ctype"> |
| <option value="html">HTML Report</option> |
| </select> |
| </th> |
| </tr> |
| |
| <tr> |
| <th> </th> |
| <td colspan="2"> |
| <input type="checkbox" name="monthly" id="monthly" |
| [% 'checked="checked"' IF monthly %]> |
| <label for="monthly" accesskey="m">Split by <u>m</u>onth</label> |
| [%# XXX: allow splitting by other intervals %] |
| <input type="checkbox" name="detailed" id="detailed" |
| [% 'checked="checked"' IF detailed %]> |
| <label for="detailed" accesskey="t">De<u>t</u>ailed summaries</label> |
| <input type="checkbox" name="inactive" id="inactive" |
| [% 'checked="checked"' IF inactive %]> |
| <label for="inactive" accesskey="i">Also show <u>i</u>nactive |
| [%+ terms.bugs %]</label> |
| </td> |
| </tr> |
| </table> |
| |
| </form> |
| <script type="text/javascript"> |
| <!-- |
| [%+ PROCESS "global/calendar.js.tmpl" id = 'start_date' %] |
| [% PROCESS "global/calendar.js.tmpl" id = 'end_date' %] |
| //--> |
| </script> |
| <hr> |
| [% END %] |