| [%# 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. |
| #%] |
| |
| [%############################################################################%] |
| [%# Initialization #%] |
| [%############################################################################%] |
| |
| [%# Don't display the table or do any processing if there are no bugs |
| # to display %] |
| [% RETURN IF !bugs.size %] |
| |
| [%# Columns whose titles or values should be abbreviated to make the list |
| # more compact. For columns whose titles should be abbreviated, |
| # the shortened title is included. For columns whose values should be |
| # abbreviated, a maximum length is provided along with the ellipsis that |
| # should be added to an abbreviated value, if any. |
| # wrap is set if a column's contents should be allowed to be word-wrapped |
| # by the browser. |
| #%] |
| |
| [% field_descs.short_short_desc = field_descs.short_desc %] |
| [% field_descs.assigned_to_realname = field_descs.assigned_to %] |
| [% field_descs.reporter_realname = field_descs.reporter %] |
| [% field_descs.qa_contact_realname = field_descs.qa_contact %] |
| |
| [%# Setting maxlength => 0 means no limit. We set it for performance reasons. %] |
| [% abbrev = |
| { |
| "bug_severity" => { maxlength => 3 , title => "Sev" } , |
| "priority" => { maxlength => 7 , title => "Pri" } , |
| "rep_platform" => { maxlength => 3 , title => "HW" } , |
| "bug_status" => { maxlength => 4 } , |
| "assigned_to" => { maxlength => 30 , ellipsis => "..." } , |
| "assigned_to_realname" => { maxlength => 20 , ellipsis => "..." } , |
| "reporter" => { maxlength => 30 , ellipsis => "..." } , |
| "reporter_realname" => { maxlength => 20 , ellipsis => "..." } , |
| "qa_contact" => { maxlength => 30 , ellipsis => "..." , title => "QAContact" } , |
| "qa_contact_realname" => { maxlength => 20 , ellipsis => "..." , title => "QAContact" } , |
| "resolution" => { maxlength => 4 } , |
| "short_desc" => { maxlength => 0, wrap => 1 } , |
| "short_short_desc" => { maxlength => 60 , ellipsis => "..." , wrap => 1 } , |
| "status_whiteboard" => { maxlength => 0, title => "Whiteboard" , wrap => 1 } , |
| "keywords" => { maxlength => 0, wrap => 1 } , |
| "tags" => { maxlength => 0, title => "Tags", wrap => 1}, |
| "dependson" => { maxlength => 0, wrap => 1 } , |
| "blocked" => { maxlength => 0, wrap => 1 } , |
| "flagtypes.name" => { maxlength => 0, wrap => 1 } , |
| "component" => { maxlength => 8 , title => "Comp" } , |
| "product" => { maxlength => 8 } , |
| "version" => { maxlength => 5 , title => "Vers" } , |
| "op_sys" => { maxlength => 12 } , |
| "bug_file_loc" => { maxlength => 30 } , |
| "target_milestone" => { maxlength => 0, title => "TargetM" } , |
| "longdescs.count" => { maxlength => 0, title => "# Comments" }, |
| "percentage_complete" => { maxlength => 0, format_value => "%d %%" } , |
| } |
| %] |
| |
| [% PROCESS bug/time.html.tmpl %] |
| |
| [% Hook.process("before_table") %] |
| |
| [%############################################################################%] |
| [%# Table Header #%] |
| [%############################################################################%] |
| |
| [% tableheader = BLOCK %] |
| <table class="bz_buglist"> |
| <tr class="bz_buglist_header bz_first_buglist_header"> |
| [% IF dotweak %] |
| <th> </th> |
| [% END %] |
| <th colspan="[% splitheader ? 2 : 1 %]" class="first-child"> |
| <a href="buglist.cgi? |
| [% urlquerypart FILTER html %]&order= |
| [% PROCESS new_order id='bug_id' %] |
| [%-#%]&query_based_on= |
| [% defaultsavename OR searchname FILTER uri %]">ID |
| [% PROCESS order_arrow id='bug_id' ~%] |
| </a> |
| </th> |
| |
| [% IF splitheader %] |
| |
| [% FOREACH id = displaycolumns %] |
| [% NEXT UNLESS loop.count() % 2 == 0 %] |
| [% column = columns.$id %] |
| [% PROCESS columnheader %] |
| [% END %] |
| |
| </tr><tr class="bz_buglist_header"> |
| [% IF dotweak %] |
| <th> </th> |
| [% END %] |
| <th> </th> |
| |
| [% FOREACH id = displaycolumns %] |
| [% NEXT IF loop.count() % 2 == 0 %] |
| [% column = columns.$id %] |
| [% PROCESS columnheader %] |
| [% END %] |
| |
| [% ELSE %] |
| |
| [% FOREACH id = displaycolumns %] |
| [% column = columns.$id %] |
| [% PROCESS columnheader %] |
| [% END %] |
| |
| [% END %] |
| |
| </tr> |
| [% END %] |
| |
| [% BLOCK columnheader %] |
| <th colspan="[% splitheader ? 2 : 1 %]"> |
| <a href="buglist.cgi?[% urlquerypart FILTER html %]&order= |
| [% PROCESS new_order %] |
| [%-#%]&query_based_on= |
| [% defaultsavename OR searchname FILTER uri %]"> |
| [%- abbrev.$id.title || field_descs.$id || column.title FILTER html -%] |
| [% PROCESS order_arrow ~%] |
| </a> |
| </th> |
| [% END %] |
| |
| [% BLOCK new_order %] |
| [% desc = '' %] |
| [% IF (om = order.match("\\b$id( DESC)?")) %] |
| [% desc = ' DESC' IF NOT om.0 %] |
| [% END %] |
| [% id _ desc FILTER uri %] |
| [% IF id != 'bug_id' AND order %] |
| [% ',' _ order.remove("\\b$id( DESC)?(,\\s*|\$)") FILTER uri %] |
| [% END %] |
| [% END %] |
| |
| [% BLOCK order_arrow %] |
| [% IF order.search("^$id DESC") %] |
| <span class="bz_sort_order_primary">▼</span> |
| [% ELSIF order.search("^$id(,\\s*|\$)") %] |
| <span class="bz_sort_order_primary">▲</span> |
| [% ELSIF order.search("\\b$id DESC") %] |
| <span class="bz_sort_order_secondary">▼</span> |
| [% ELSIF order.search("\\b$id(,\\s*|\$)") %] |
| <span class="bz_sort_order_secondary">▲</span> |
| [% END %] |
| [% END %] |
| |
| [%############################################################################%] |
| [%# Bug Table #%] |
| [%############################################################################%] |
| |
| [% tableheader %] |
| |
| [% FOREACH bug = bugs %] |
| [% count = loop.count() %] |
| |
| <tr id="b[% bug.bug_id %]" class="bz_bugitem |
| bz_[% bug.bug_severity FILTER css_class_quote -%] |
| bz_[% bug.priority FILTER css_class_quote -%] |
| bz_[% bug.bug_status FILTER css_class_quote -%] |
| [%+ "bz_$bug.resolution" FILTER css_class_quote IF bug.resolution -%] |
| [%+ "bz_secure" IF bug.secure_mode -%] |
| [%+ "bz_secure_mode_$bug.secure_mode" FILTER css_class_quote IF bug.secure_mode -%] |
| [%+ count % 2 == 1 ? "bz_row_odd" : "bz_row_even" -%] |
| "> |
| |
| [% IF dotweak %] |
| <td class="bz_checkbox_column"> |
| <input type="checkbox" name="id_[% bug.bug_id %]"> |
| </td> |
| [% END %] |
| <td class="first-child bz_id_column"> |
| <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a> |
| <span class="bz_default_hidden">[%+ '[SEC]' IF bug.secure_mode %]</span> |
| </td> |
| |
| [% FOREACH column = displaycolumns %] |
| [% col_abbrev = abbrev.$column %] |
| <td class="bz_[% column FILTER css_class_quote %]_column |
| [%~ ' nowrap' UNLESS col_abbrev.wrap |
| OR bug_fields.$column.type == constants.FIELD_TYPE_FREETEXT |
| OR bug_fields.$column.type == constants.FIELD_TYPE_TEXTAREA %]"> |
| [% IF col_abbrev.maxlength %] |
| <span title="[%- display_value(column, bug.$column) FILTER html %]"> |
| [% END %] |
| [% IF col_abbrev.format_value %] |
| [%- bug.$column FILTER format(col_abbrev.format_value) FILTER html -%] |
| [% ELSIF column == 'actual_time' || |
| column == 'remaining_time' || |
| column == 'estimated_time' %] |
| [% PROCESS formattimeunit time_unit=bug.$column %] |
| [%# Display the login name of the user if their real name is empty. %] |
| [% ELSIF column.search('_realname$') && bug.$column == '' %] |
| [% SET login_column = column.remove('_realname$') %] |
| [% bug.${login_column}.truncate(col_abbrev.maxlength, |
| col_abbrev.ellipsis) FILTER html %] |
| [% ELSIF column == 'short_desc' || column == "short_short_desc" %] |
| <a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]"> |
| [%- bug.$column.truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%] |
| </a> |
| [% ELSIF bug_fields.$column.type == constants.FIELD_TYPE_BUG_ID %] |
| <a href="show_bug.cgi?id=[% bug.$column FILTER html %]"> |
| [%- bug.$column.truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%] |
| </a> |
| [% ELSIF bug_fields.$column.type == constants.FIELD_TYPE_TEXTAREA %] |
| [%- bug.$column.truncate(256, '...') FILTER html -%] |
| [% ELSIF column == 'bug_file_loc' && is_safe_url(bug.bug_file_loc) %] |
| <a href="[% bug.bug_file_loc FILTER html %]" target="_blank" |
| rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]"> |
| [%- display_value(column, bug.$column).truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%] |
| </a> |
| [% ELSE %] |
| [%- display_value(column, bug.$column).truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%] |
| [% END %] |
| [% IF col_abbrev.maxlength %] |
| </span> |
| [% END %] |
| </td> |
| [% END %] |
| |
| </tr> |
| [% END %] |
| |
| [% IF time_info.time_present %] |
| [% PROCESS time_summary_line %] |
| [% END %] |
| |
| </table> |
| |
| [% BLOCK time_summary_line %] |
| <tr class="bz_time_summary_line"> |
| [% columns_to_span = 1 %] [%# bugID %] |
| [% IF dotweak %] |
| [% columns_to_span = columns_to_span + 1 %] |
| [% END %] |
| [% FOREACH column = displaycolumns %] |
| [% IF column == 'actual_time' || |
| column == 'remaining_time' || |
| column == 'estimated_time' || |
| column == 'percentage_complete' %] |
| [% IF columns_to_span > 0 %] |
| <td class="bz_total bz_total_label" colspan=" |
| [%- columns_to_span FILTER html %]"><b>Totals</b></td> |
| [% columns_to_span = 0 %] |
| [% END %] |
| [% IF column == 'percentage_complete' %] |
| <td class="bz_total">[% time_info.percentage_complete |
| FILTER format(abbrev.$column.format_value) FILTER html %]</td> |
| [% ELSE %] |
| <td class="bz_total"> |
| [%- PROCESS formattimeunit time_unit=time_info.$column %]</td> |
| [% END %] |
| [% ELSIF columns_to_span == 0 %] [%# A column following the first total %] |
| <td class="bz_total"> </td> |
| [% ELSE %] [%# We haven't gotten to a time column yet, keep computing span %] |
| [% columns_to_span = columns_to_span + 1 %] |
| [% END %] |
| [% END %] |
| </tr> |
| [% END %] |