blob: d3abc9b211c10b0d669353ea9ac3ad2502a88660 [file] [log] [blame]
[%# 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>&nbsp;</th>
[% END %]
<th colspan="[% splitheader ? 2 : 1 %]" class="first-child">
<a href="buglist.cgi?
[% urlquerypart FILTER html %]&amp;order=
[% PROCESS new_order id='bug_id' %]
[%-#%]&amp;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>&nbsp;</th>
[% END %]
<th>&nbsp;</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 %]&amp;order=
[% PROCESS new_order %]
[%-#%]&amp;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">&#x25BC;</span>
[% ELSIF order.search("^$id(,\\s*|\$)") %]
<span class="bz_sort_order_primary">&#x25B2;</span>
[% ELSIF order.search("\\b$id DESC") %]
<span class="bz_sort_order_secondary">&#x25BC;</span>
[% ELSIF order.search("\\b$id(,\\s*|\$)") %]
<span class="bz_sort_order_secondary">&#x25B2;</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">&nbsp;</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 %]