blob: 8babdf04ac5b8256f87b9e6ea4c63521b6b352f4 [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.
#%]
[% PROCESS global/header.html.tmpl
title = "Full Text $terms.Bug Listing"
h1 = ""
style_urls = ['skins/standard/buglist.css']
doc_section = "using/understanding.html"
%]
[% USE Bugzilla %]
[% PROCESS bug/time.html.tmpl %]
[% IF bugs.first %]
[% ids = [] %]
[% FOREACH bug = bugs %]
[% PROCESS bug_display %]
[% ids.push(bug.bug_id) UNLESS bug.error %]
[% END %]
[% IF ids.size > 1 %]
<div class="bz_query_buttons">
<form method="post" action="buglist.cgi">
<input type="hidden" name="bug_id" value="[% ids.join(",") FILTER html %]">
<input type="submit" id="short_format" value="Short Format">
</form>
</div>
[% END %]
[% ELSE %]
<p>
You'd have more luck if you gave me some [% terms.bug %] numbers.
</p>
[% END %]
[% PROCESS global/footer.html.tmpl %]
[%###########################################################################%]
[%# Block for an individual bug #%]
[%###########################################################################%]
[% BLOCK bug_display %]
<h1>
[% terms.Bug %]
<a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">[% bug.bug_id FILTER html %]</a>
[% IF bug.alias.size AND NOT bug.error %] (
[%- FOREACH alias IN bug.alias %]<a href="show_bug.cgi?id=[% alias FILTER uri %]">
[% alias FILTER html %]</a>[% UNLESS loop.last %], [% END %]
[%- END %])
[% END %]
</h1>
<table class="bugfields">
[% IF bug.error %]
<tr>
<td class="warning">
[% IF bug.error == "InvalidBugId" %]
'[%+ bug.bug_id FILTER html %]' is not a valid [% terms.bug %] number
nor a known [% terms.bug %] alias.
[% ELSIF bug.error == "NotPermitted" %]
You are not allowed to view this [% terms.bug %].
[% ELSIF bug.error == "NotFound" %]
This [% terms.bug %] cannot be found.
[% ELSE %]
[%+ bug.error FILTER html %]
[% END %]
</td>
</tr>
[% ELSE %]
[%# The rightcell block (also called by the row block) automatically shows
# the fields from rightcells %]
[% rightcells = ['reporter', 'assigned_to'] %]
[% IF Param('useqacontact') %]
[% rightcells.push('qa_contact') %]
[% END %]
[% rightcells.push('') %]
[% IF bug.cc.size %]
[% rightcells.push('cc') %]
[% END %]
[% IF bug.keywords %]
[% rightcells.push('keywords') %]
[% END %]
[%# Determine if the bug has a flag %]
[% FOREACH type = bug.flag_types %]
[% IF type.flags.size %]
[% rightcells.push('flags') %]
[% LAST %]
[% END %]
[% END %]
[% PROCESS row cell = "short_desc" fullrow = 1 %]
<tr>
<th>[% field_descs.product FILTER html %]:</th>
<td>
[% IF Param("useclassification") && bug.classification_id != 1 %]
[[% bug.classification FILTER html %]]&nbsp;
[% END %]
[% bug.product FILTER html %]
</td>
[% PROCESS rightcell %]
</tr>
[% PROCESS row cell = "component" %]
<tr>
<th>[% field_descs.bug_status FILTER html %]:</th>
<td>
[% display_value("bug_status", bug.bug_status) FILTER html %]
[%+ display_value("resolution", bug.resolution) FILTER html %]
</td>
[% PROCESS rightcell %]
</tr>
<tr>
<th>[% field_descs.bug_severity FILTER html %]:</th>
<td class="bz_[% bug.bug_severity FILTER css_class_quote -%]">
[% display_value("bug_severity", bug.bug_severity) FILTER html %]
</td>
[% PROCESS rightcell %]
</tr>
<tr>
<th>[% field_descs.priority FILTER html %]:</th>
<td class="bz_[% bug.priority FILTER css_class_quote -%]">
[% bug.priority FILTER html %]
</td>
[% PROCESS rightcell %]
</tr>
[% PROCESS row cell = "version" %]
[% PROCESS row cell = "target_milestone" IF Param('usetargetmilestone') %]
[% PROCESS row cell = "rep_platform" %]
[% PROCESS row cell = "op_sys" %]
[% IF bug.bug_file_loc %]
<tr>
<th>[% field_descs.bug_file_loc FILTER html %]:</th>
<td colspan="3">
[% IF is_safe_url(bug.bug_file_loc) %]
<a href="[% bug.bug_file_loc FILTER html %]" rel="noreferrer">
[% bug.bug_file_loc FILTER html %]</a>
[% ELSE %]
[% bug.bug_file_loc FILTER html %]
[% END %]
</td>
</tr>
[% END %]
[% IF bug.see_also.size %]
<tr>
<th>[% field_descs.see_also FILTER html %]:</th>
<td colspan="3">
[% FOREACH see_also = bug.see_also %]
<a href="[% see_also.name FILTER html %]">[% see_also.name FILTER html %]</a>
[% "<br>" IF not loop.last() %]
[% END %]
</td>
</tr>
[% END %]
[% IF Param("usestatuswhiteboard") %]
[% PROCESS row cell = "status_whiteboard" fullrow = 1 %]
[% END %]
[% field_counter = 0 %]
[% FOREACH field = Bugzilla.active_custom_fields %]
[% field_counter = field_counter + 1 %]
[%# Odd-numbered fields get an opening <tr> %]
[% '<tr>' IF field_counter % 2 %]
[% PROCESS bug/field.html.tmpl value=bug.${field.name} editable=0 %]
[%# Even-numbered fields get a closing <tr> %]
[% '</tr>' IF !(field_counter % 2) %]
[% IF extra_field_item %]
[% field_counter = field_counter + 1 %]
[% '<tr>' IF field_counter % 2 %]
<th>[% extra_field_item.header FILTER none %]</th>
<td>[% extra_field_item.data FILTER none %]</td>
[% '</tr>' IF !(field_counter % 2) %]
[% END %]
[% END %]
[%# And we have to finish the row if we ended on an odd number. %]
[% '<th></th><td></td></tr>' IF field_counter % 2 %]
[% IF (bug.dependson.size || bug.blocked.size) %]
[% PROCESS dependencies name = "dependson" %]
[% PROCESS dependencies name = "blocked" %]
[% END %]
[% IF user.is_timetracker %]
<tr>
<th>Time tracking:</th>
<td colspan="3">
<table class="timetracking">
<tr>
<th>[% field_descs.estimated_time FILTER html %]</th>
<th>[% field_descs.actual_time FILTER html %]</th>
<th>[% field_descs.work_time FILTER html %]</th>
<th>[% field_descs.remaining_time FILTER html %]</th>
<th>[% field_descs.percentage_complete FILTER html %]</th>
<th>Gain</th>
</tr>
<tr>
<td>
[% PROCESS formattimeunit time_unit = bug.estimated_time %]
</td>
<td>
[% PROCESS formattimeunit
time_unit=(bug.remaining_time + bug.actual_time) %]
</td>
<td>[% PROCESS formattimeunit time_unit = bug.actual_time %]</td>
<td>
[% PROCESS formattimeunit time_unit = bug.remaining_time %]
</td>
<td>
[% PROCESS calculatepercentage act = bug.actual_time
rem = bug.remaining_time %]
</td>
<td>
[% PROCESS formattimeunit
time_unit=bug.estimated_time -
(bug.actual_time + bug.remaining_time) %]
</td>
</tr>
</table>
</td>
</tr>
[% END %]
[% IF Param("timetrackinggroup") && bug.deadline %]
[% PROCESS row cell="deadline" %]
[% END %]
[% IF bug.attachments.size %]
<tr>
<th>Attachments:</th>
<td colspan="3">
[% IF bug.show_attachment_flags %]
<table>
<tr>
<th>Description</th>
<th>Flags</th>
</tr>
[% FOREACH attachment = bug.attachments %]
<tr>
<td>
<a href="attachment.cgi?id=[% attachment.id %]">
[% attachment.description FILTER html %]
</a>[% "<br>" IF not loop.last() %]
</td>
<td>
[% IF attachment.flags.size == 0 %]
<i>none</i>
[% ELSE %]
[% FOREACH flag = attachment.flags %]
[% flag.setter.nick FILTER html %]:
<span class="nowrap">[%+ flag.type.name FILTER html %][% flag.status %]</span>
[% IF flag.status == "?" && flag.requestee %]
([% flag.requestee.nick FILTER html %])
[% END %][% ", " IF not loop.last() %]
[% END %]
[% END %]
</td>
</tr>
[% END %]
</table>
[% ELSE %]
[% FOREACH attachment = bug.attachments %]
<a href="attachment.cgi?id=[% attachment.id %]">
[% attachment.description FILTER html %]
</a>[% "<br>" IF not loop.last() %]
[% END %]
[% END %]
</td>
</tr>
[% END %]
[% END %]
[% Hook.process("last_row", "bug/show-multiple.html.tmpl") %]
</table>
<br>
[% PROCESS bug/comments.html.tmpl
comments = bug.comments %]
[% END %]
[%###########################################################################%]
[%# Block for standard table rows #%]
[%###########################################################################%]
[% BLOCK row %]
<tr>
<th>[% field_descs.${cell} FILTER html %]:</th>
<td[% " colspan=3" IF fullrow %]>[% display_value(cell, bug.${cell}) FILTER html %]</td>
[% PROCESS rightcell IF !fullrow %]
</tr>
[% fullrow = 0 %]
[% END %]
[%############################################################################%]
[%# Block for dependencies #%]
[%############################################################################%]
[% BLOCK dependencies %]
<tr>
<th>[% terms.Bug %] [%+ field_descs.${name} FILTER html %]:</th>
<td>
[% FOREACH depbug = bug.${name} %]
[% depbug FILTER bug_link(depbug) FILTER none %][% ", " IF not loop.last() %]
[% END %]
</td>
[% PROCESS rightcell %]
</tr>
[% END %]
[%############################################################################%]
[%# Block for cells shown right of the table #%]
[%############################################################################%]
[% BLOCK rightcell %]
[% IF rightcells %]
[% name = rightcells.shift %]
[% IF name == "cc" %]
<th class="rightcell">[% field_descs.cc FILTER html %]:</th>
<td>
[% FOREACH c = bug.cc %]
[% c FILTER email FILTER html %][% ", " IF not loop.last() %]
[% END %]
[% ELSIF name == "reporter" || name == "assigned_to"
|| name == "qa_contact" %]
<th class="rightcell">[% field_descs.${name} FILTER html %]:</th>
<td>[% bug.${name}.identity FILTER email FILTER html %]</td>
[% ELSIF name == "flags" %]
<th class="rightcell">Flags:</th>
<td>
[% FOREACH type = bug.flag_types %]
[% FOREACH flag = type.flags %]
[% flag.setter.nick FILTER html %]:
<span class="nowrap">[%+ flag.type.name FILTER html %][% flag.status %]</span>
[%+ IF flag.status == "?" && flag.requestee %]
([% flag.requestee.nick FILTER html %])
[% END %]<br>
[% END %]
[% END %]
</td>
[% ELSIF name != "" %]
<th class="rightcell">[% field_descs.${name} FILTER html %]:</th>
<td>[% display_value(name, bug.${name}) FILTER html %]</td>
[% ELSE %]
<td>&nbsp;</td>
<td>&nbsp;</td>
[% END %]
[% END %]
[% END %]