summaryrefslogtreecommitdiffstats
path: root/template/en/default/bug
diff options
context:
space:
mode:
Diffstat (limited to 'template/en/default/bug')
-rw-r--r--template/en/default/bug/activity/show.html.tmpl49
-rw-r--r--template/en/default/bug/activity/table.html.tmpl113
-rw-r--r--template/en/default/bug/choose.html.tmpl35
-rw-r--r--template/en/default/bug/comments.html.tmpl235
-rw-r--r--template/en/default/bug/create/comment-guided.txt.tmpl54
-rw-r--r--template/en/default/bug/create/comment.txt.tmpl32
-rw-r--r--template/en/default/bug/create/confirm-create-dupe.html.tmpl57
-rw-r--r--template/en/default/bug/create/create-guided.html.tmpl523
-rw-r--r--template/en/default/bug/create/create.html.tmpl705
-rw-r--r--template/en/default/bug/create/created.html.tmpl61
-rw-r--r--template/en/default/bug/create/make-template.html.tmpl46
-rw-r--r--template/en/default/bug/create/user-message.html.tmpl36
-rw-r--r--template/en/default/bug/dependency-graph.html.tmpl106
-rw-r--r--template/en/default/bug/dependency-tree.html.tmpl266
-rw-r--r--template/en/default/bug/edit.html.tmpl1161
-rw-r--r--template/en/default/bug/field-events.js.tmpl40
-rw-r--r--template/en/default/bug/field.html.tmpl215
-rw-r--r--template/en/default/bug/format_comment.txt.tmpl68
-rw-r--r--template/en/default/bug/knob.html.tmpl100
-rw-r--r--template/en/default/bug/navigate.html.tmpl87
-rw-r--r--template/en/default/bug/process/bugmail.html.tmpl60
-rw-r--r--template/en/default/bug/process/confirm-duplicate.html.tmpl75
-rw-r--r--template/en/default/bug/process/header.html.tmpl46
-rw-r--r--template/en/default/bug/process/midair.html.tmpl109
-rw-r--r--template/en/default/bug/process/results.html.tmpl58
-rw-r--r--template/en/default/bug/process/verify-new-product.html.tmpl205
-rw-r--r--template/en/default/bug/show-header.html.tmpl50
-rw-r--r--template/en/default/bug/show-multiple.html.tmpl366
-rw-r--r--template/en/default/bug/show.html.tmpl53
-rw-r--r--template/en/default/bug/show.xml.tmpl157
-rw-r--r--template/en/default/bug/summarize-time.html.tmpl335
-rw-r--r--template/en/default/bug/time.html.tmpl47
-rw-r--r--template/en/default/bug/votes/delete-all.html.tmpl51
-rw-r--r--template/en/default/bug/votes/list-for-bug.html.tmpl60
-rw-r--r--template/en/default/bug/votes/list-for-user.html.tmpl185
35 files changed, 5846 insertions, 0 deletions
diff --git a/template/en/default/bug/activity/show.html.tmpl b/template/en/default/bug/activity/show.html.tmpl
new file mode 100644
index 0000000..67ac689
--- /dev/null
+++ b/template/en/default/bug/activity/show.html.tmpl
@@ -0,0 +1,49 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # bug: object. The bug whose activity is being displayed.
+ # operations: array of hashes, see activity/table.html.tmpl.
+ #
+ # This template also needs to be called with the interface to the
+ # activity/table.html.tmpl template fulfilled.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% filtered_desc = bug.short_desc FILTER html %]
+[% PROCESS global/header.html.tmpl
+ title = "Changes made to $terms.bug $bug.bug_id"
+ header = "Activity log for $terms.bug $bug.bug_id: $filtered_desc"
+ %]
+
+<p>
+ [% "Back to $terms.bug $bug.bug_id" FILTER bug_link(bug) FILTER none %]
+</p>
+
+[% PROCESS bug/activity/table.html.tmpl %]
+
+[% IF operations.size > 0 %]
+ <p>
+ [% "Back to $terms.bug $bug.bug_id" FILTER bug_link(bug) FILTER none %]
+ </p>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/activity/table.html.tmpl b/template/en/default/bug/activity/table.html.tmpl
new file mode 100644
index 0000000..2492534
--- /dev/null
+++ b/template/en/default/bug/activity/table.html.tmpl
@@ -0,0 +1,113 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # David D. Kilzer <ddkilzer@kilzer.net>
+ # Reed Loden <reed@reedloden.com>
+ #%]
+
+[%# INTERFACE:
+ # operations: array of hashes. May be empty. Each has has three members:
+ # who: string. who performed the operation
+ # when: string. when they performed it
+ # changes: hash. Details of what they changed. This hash has three
+ # compulsory and one optional member:
+ # field: string. The name of the field
+ # removed: string. What was removed from the field
+ # added: string. What was added to the field
+ # attach_id: integer. If the change was adding an attachment, its id.
+ # incomplete_data: boolean. True if some of the data is incomplete (because
+ # it was affected by an old Bugzilla bug.)
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS bug/time.html.tmpl %]
+
+[% IF incomplete_data %]
+ <p>
+ There used to be an issue in <a href="http://www.bugzilla.org/">Bugzilla</a>
+ which caused activity data to be lost if there were a large number of cc's
+ or dependencies. That has been fixed, but some data was already lost in
+ your activity table that could not be regenerated. The changes that the
+ script could not reliably determine are prefixed by '?'.
+ </p>
+[% END %]
+
+[% IF operations.size > 0 %]
+ <table border cellpadding="4">
+ <tr>
+ <th>Who</th>
+ <th>When</th>
+ <th>What</th>
+ <th>Removed</th>
+ <th>Added</th>
+ </tr>
+
+ [% FOREACH operation = operations %]
+ <tr>
+ <td rowspan="[% operation.changes.size %]" valign="top">
+ [% operation.who FILTER email FILTER html %]
+ </td>
+ <td rowspan="[% operation.changes.size %]" valign="top">
+ [% operation.when FILTER time %]
+ </td>
+ [% FOREACH change = operation.changes %]
+ [% "</tr><tr>" IF loop.index > 0 %]
+ <td>
+ [% IF change.attachid %]
+ <a href="attachment.cgi?id=[% change.attachid %]">
+ Attachment #[% change.attachid %]</a>
+ [% END %]
+ [%+ field_descs.${change.fieldname} FILTER html %]
+ </td>
+ [% PROCESS change_column change_type = change.removed %]
+ [% PROCESS change_column change_type = change.added %]
+ [% END %]
+ </tr>
+ [% END %]
+ </table>
+[% ELSE %]
+ <p>
+ No changes have been made to this [% terms.bug %] yet.
+ </p>
+[% END %]
+
+[% BLOCK change_column %]
+ <td>
+ [% IF change_type.defined %]
+ [% IF change.fieldname == 'estimated_time' ||
+ change.fieldname == 'remaining_time' ||
+ change.fieldname == 'work_time' %]
+ [% PROCESS formattimeunit time_unit=change_type %]
+ [% ELSIF change.fieldname == 'blocked' ||
+ change.fieldname == 'dependson' %]
+ [% change_type FILTER bug_list_link FILTER none %]
+ [% ELSIF change.fieldname == 'assigned_to' ||
+ change.fieldname == 'reporter' ||
+ change.fieldname == 'qa_contact' ||
+ change.fieldname == 'cc' ||
+ change.fieldname == 'flagtypes.name' %]
+ [% display_value(change.fieldname, change_type) FILTER email FILTER html %]
+ [% ELSE %]
+ [% display_value(change.fieldname, change_type) FILTER html %]
+ [% END %]
+ [% ELSE %]
+ &nbsp;
+ [% END %]
+ </td>
+[% END %]
diff --git a/template/en/default/bug/choose.html.tmpl b/template/en/default/bug/choose.html.tmpl
new file mode 100644
index 0000000..9009d38
--- /dev/null
+++ b/template/en/default/bug/choose.html.tmpl
@@ -0,0 +1,35 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Search by $terms.bug number"
+ %]
+
+<form method="get" action="show_bug.cgi">
+ <p>
+ You may find a single [% terms.bug %] by entering its [% terms.bug %] id here:
+ <input name="id" size="6">
+ <input type="submit" id="show" value="Show Me This [% terms.Bug %]">
+ </p>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/comments.html.tmpl b/template/en/default/bug/comments.html.tmpl
new file mode 100644
index 0000000..41b91d7
--- /dev/null
+++ b/template/en/default/bug/comments.html.tmpl
@@ -0,0 +1,235 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Shane H. W. Travis <travis@sedsystems.ca>
+ #%]
+
+[% PROCESS bug/time.html.tmpl %]
+
+ <script type="text/javascript">
+ <!--
+ function updateCommentPrivacy(checkbox, id) {
+ var comment_elem = document.getElementById('comment_text_'+id).parentNode;
+ if (checkbox.checked) {
+ if (!comment_elem.className.match('bz_private')) {
+ comment_elem.className = comment_elem.className.concat(' bz_private');
+ }
+ }
+ else {
+ comment_elem.className =
+ comment_elem.className.replace(/(\s*|^)bz_private(\s*|$)/, '$2');
+ }
+ }
+
+ /* The functions below expand and collapse comments */
+
+ function toggle_comment_display(link, comment_id) {
+ var comment = document.getElementById('comment_text_' + comment_id);
+ var re = new RegExp(/\bcollapsed\b/);
+ if (comment.className.match(re))
+ expand_comment(link, comment);
+ else
+ collapse_comment(link, comment);
+ }
+
+ function toggle_all_comments(action) {
+ var num_comments = [% comments.size FILTER html %];
+
+ // If for some given ID the comment doesn't exist, this doesn't mean
+ // there are no more comments, but that the comment is private and
+ // the user is not allowed to view it.
+
+ for (var id = 0; id < num_comments; id++) {
+ var comment = document.getElementById('comment_text_' + id);
+ if (!comment)
+ continue;
+
+ var link = document.getElementById('comment_link_' + id);
+ if (action == 'collapse')
+ collapse_comment(link, comment);
+ else
+ expand_comment(link, comment);
+ }
+ }
+
+ function collapse_comment(link, comment) {
+ link.innerHTML = "[+]";
+ link.title = "Expand the comment.";
+ YAHOO.util.Dom.addClass(comment, 'collapsed');
+ }
+
+ function expand_comment(link, comment) {
+ link.innerHTML = "[-]";
+ link.title = "Collapse the comment";
+ YAHOO.util.Dom.removeClass(comment, 'collapsed');
+ }
+
+ /* This way, we are sure that browsers which do not support JS
+ * won't display this link */
+
+ function addCollapseLink(count) {
+ document.write(' <a href="#" class="bz_collapse_comment"' +
+ ' id="comment_link_' + count +
+ '" onclick="toggle_comment_display(this, ' + count +
+ '); return false;" title="Collapse the comment.">[-]<\/a> ');
+ }
+ //-->
+ </script>
+
+
+[% DEFAULT start_at = 0 mode = "show" %]
+[% sort_order = user.settings.comment_sort_order.value %]
+
+[%# NOTE: (start_at > 0) means we came here from a midair collision,
+ # in which case we don't care what the user's preference is.
+ %]
+[% IF (start_at > 0) %]
+ [% sort_order = "oldest_to_newest" %]
+[% END %]
+
+
+[%# Set up the variables as needed, depending on the sort order %]
+[% IF sort_order == "oldest_to_newest" %]
+ [% count = 0 %]
+ [% description = 0 %]
+ [% increment = 1 %]
+[% ELSE %]
+ [% increment = -1 %]
+ [% IF sort_order == "newest_to_oldest" %]
+ [% count = comments.size - 1 %]
+ [% description = 0 %]
+ [% ELSIF sort_order == "newest_to_oldest_desc_first" %]
+ [% count = comments.size %]
+ [% description = comments.size %]
+ [% END %]
+[% END %]
+
+<!-- This auto-sizes the comments and positions the collapse/expand links
+ to the right. -->
+<table class="bz_comment_table" cellpadding="0" cellspacing="0"><tr>
+<td>
+
+[% FOREACH comment = comments %]
+ [% IF count >= start_at %]
+ [% PROCESS a_comment %]
+ [% END %]
+
+ [% count = count + increment %]
+[% END %]
+
+[%# Note: this template is used in multiple places; if you use this hook,
+ # make sure you are aware of this fact.
+ #%]
+[% Hook.process("aftercomments") %]
+
+</td>
+<td>
+ [% IF mode == "edit" %]
+ <ul class="bz_collapse_expand_comments">
+ <li><a href="#" onclick="toggle_all_comments('collapse');
+ return false;">Collapse All Comments</a></li>
+ <li><a href="#" onclick="toggle_all_comments('expand');
+ return false;">Expand All Comments</a></li>
+ </ul>
+ [% END %]
+</td>
+</tr></table>
+
+[%############################################################################%]
+[%# Block for individual comments #%]
+[%############################################################################%]
+
+[% BLOCK a_comment %]
+ [% RETURN IF comment.is_private AND ! user.is_insider %]
+
+ <div class="bz_comment[% " bz_private" IF comment.is_private %]
+ [% " bz_comment_hilite" IF marks.$count %]
+ [% " bz_first_comment" IF count == description %]">
+ [% IF count == description %]
+ [% class_name = "bz_first_comment_head" %]
+ [% comment_label = "Description" %]
+ [% ELSE %]
+ [% class_name = "bz_comment_head" %]
+ [% comment_label = "Comment " _ count %]
+ [% END %]
+
+ <div class="[% class_name FILTER html %]">
+
+ [% IF mode == "edit" %]
+ <span class="bz_comment_actions">
+ <script type="text/javascript"><!--
+ addReplyLink([% count %], [% comment.id %]);
+ addCollapseLink([% count %]); // -->
+ </script>
+ </span>
+ [% END %]
+
+ [% IF mode == "edit" && user.is_insider %]
+ <div class="bz_private_checkbox">
+ <input type="hidden" value="1"
+ name="defined_isprivate_[% comment.id %]">
+ <input type="checkbox"
+ name="isprivate_[% comment.id %]" value="1"
+ id="isprivate_[% comment.id %]"
+ onClick="updateCommentPrivacy(this, [% count %])"
+ [% " checked=\"checked\"" IF comment.is_private %]>
+ <label for="isprivate_[% comment.id %]">Private</label>
+ </div>
+ [% END %]
+
+ <span class="bz_comment_number">
+ <a name="c[% count %]"
+ href="show_bug.cgi?id=[% bug.bug_id %]#c[% count %]">
+ [%- comment_label FILTER html %]</a>
+ </span>
+
+ <span class="bz_comment_user">
+ [% INCLUDE global/user.html.tmpl who = comment.author %]
+ </span>
+
+ <span class="bz_comment_user_images">
+ [% FOREACH group = comment.author.direct_group_membership %]
+ [% NEXT UNLESS group.icon_url %]
+ <img src="[% group.icon_url FILTER html %]"
+ alt="[% group.name FILTER html %]"
+ title="[% group.name FILTER html %] - [% group.description FILTER html %]">
+ [% END %]
+ </span>
+
+ <span class="bz_comment_time">
+ [%+ comment.creation_ts FILTER time %]
+ </span>
+ </div>
+
+ [% IF user.is_timetracker &&
+ (comment.work_time > 0 || comment.work_time < 0) %]
+ <br>
+ Additional hours worked:
+ [% PROCESS formattimeunit time_unit=comment.work_time %]
+ [% END %]
+
+[%# Don't indent the <pre> block, since then the spaces are displayed in the
+ # generated HTML
+ #%]
+<pre class="bz_comment_text"
+ [% ' id="comment_text_' _ count _ '"' IF mode == "edit" %]>
+ [%- comment.body_full({ wrap => 1 }) FILTER quoteUrls(bug, comment) -%]
+</pre>
+ </div>
+[% END %]
diff --git a/template/en/default/bug/create/comment-guided.txt.tmpl b/template/en/default/bug/create/comment-guided.txt.tmpl
new file mode 100644
index 0000000..df04d8f
--- /dev/null
+++ b/template/en/default/bug/create/comment-guided.txt.tmpl
@@ -0,0 +1,54 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+[%# INTERFACE:
+ # This template has no interface.
+ #
+ # Form variables from a bug submission (i.e. the fields on a template from
+ # enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
+ # pull out various custom fields and format an initial Description entry
+ # from them.
+ #%]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+User-Agent: [%+ cgi.user_agent() %]
+Build Identifier: [%+ cgi.param("buildid") %]
+
+[%+ cgi.param("comment") IF cgi.param("comment") %]
+
+[%+ IF cgi.param("reproducible") != "Choose one..." -%]
+Reproducible: [%+ cgi.param("reproducible") %]
+[% END %]
+
+[% IF !(cgi.param("reproduce_steps").match('^1\.\s*2\.\s*3\.\s*$') || cgi.param("reproduce_steps").match('^\s*$')) %]
+Steps to Reproduce:
+[%+ cgi.param("reproduce_steps") %]
+[% END %]
+
+[% IF cgi.param("actual_results") -%]
+Actual Results:
+[%+ cgi.param("actual_results") %]
+[% END %]
+
+[% IF cgi.param("expected_results") %]
+Expected Results:
+[%+ cgi.param("expected_results") %]
+[% END %]
+
+[%+ cgi.param("additional_info") %]
diff --git a/template/en/default/bug/create/comment.txt.tmpl b/template/en/default/bug/create/comment.txt.tmpl
new file mode 100644
index 0000000..e7339d3
--- /dev/null
+++ b/template/en/default/bug/create/comment.txt.tmpl
@@ -0,0 +1,32 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+[%# INTERFACE:
+ # This template has no interface.
+ #
+ # Form variables from a bug submission (i.e. the fields on a template from
+ # enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
+ # pull out various custom fields and format an initial Description entry
+ # from them.
+ #%]
+[% USE Bugzilla %]
+[% Hook.process("form") %]
+
+
+[% Bugzilla.cgi.param("comment") %]
diff --git a/template/en/default/bug/create/confirm-create-dupe.html.tmpl b/template/en/default/bug/create/confirm-create-dupe.html.tmpl
new file mode 100644
index 0000000..b0a5cdd
--- /dev/null
+++ b/template/en/default/bug/create/confirm-create-dupe.html.tmpl
@@ -0,0 +1,57 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Olav Vitters.
+ #
+ # Contributor(s): Olav Vitters <olav@bkor.dhs.org>
+ #%]
+
+[%# INTERFACE:
+ # bugid: integer. ID of the bug previously used to create a bug.
+ # allow_override: boolean int. Is 1 if the user may submit the bug again.
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Already filed $terms.bug"
+%]
+
+[% USE Bugzilla %]
+
+<table cellpadding="20">
+ <tr>
+ <td bgcolor="#ff0000">
+ <font size="+2">
+ You already used the form to file [% "$terms.bug $bugid" FILTER bug_link(bugid) FILTER none %].
+ </font>
+ </td>
+ </tr>
+</table>
+
+<p><font size="big">You are highly encouraged to visit [% "$terms.bug $bugid"
+FILTER bug_link(bugid) FILTER none %].</font></p>
+
+[% IF allow_override %]
+ <p>If you are sure you used the same form to submit a new [% terms.bug %],
+ click 'File [% terms.bug %] again'.<p>
+
+ <form name="create" id="create" method="post" action="post_bug.cgi"
+ [%- IF Bugzilla.cgi.param("data") %] enctype="multipart/form-data"[% END %]>
+ [% PROCESS "global/hidden-fields.html.tmpl"
+ exclude="^(Bugzilla_login|Bugzilla_password|ignore_token)$" %]
+ <input type="hidden" name="ignore_token" value="[% bugid FILTER html %]">
+ <input type="submit" value="File [% terms.bug %] again" id="file_bug_again">
+ </form>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/create/create-guided.html.tmpl b/template/en/default/bug/create/create-guided.html.tmpl
new file mode 100644
index 0000000..9f2a21b
--- /dev/null
+++ b/template/en/default/bug/create/create-guided.html.tmpl
@@ -0,0 +1,523 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Christine Begle <cbegle@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # This template has the same interface as create.html.tmpl
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Enter $terms.ABug"
+ onload = "PutDescription()"
+ style = "#somebugs { width: 100%; height: 500px }"
+ %]
+
+<p>
+ <font color="red">
+ This is a template used on mozilla.org. This template, and the
+ comment-guided.txt.tmpl template that formats the data submitted via
+ the form in this template, are included as a demo of what it's
+ possible to do with custom templates in general, and custom [% terms.bug %]
+ entry templates in particular. As much of the text will not apply,
+ you should alter it
+ if you want to use this form on your [% terms.Bugzilla %] installation.
+ </font>
+</p>
+
+[% tablecolour = "#FFFFCC" %]
+
+[%# This script displays the descriptions for selected components. %]
+<script type="text/javascript">
+var descriptions = [
+[% FOREACH c = product.components %]
+ '[% c.description FILTER js %]',
+[% END %]
+];
+
+function PutDescription() {
+ if ((document.getElementById) && (document.body.innerHTML)) {
+ var componentIndex = document.getElementById('component').selectedIndex;
+ if (componentIndex != -1) {
+ var description = document.getElementById('description');
+ description.innerHTML = descriptions[componentIndex];
+ }
+ }
+}
+</script>
+
+<a name="step1"></a>
+<h3>Step 1 of 3 - has your [% terms.bug %] already been reported?</h3>
+
+<p>
+ <font color="red">Please don't skip this step - half of all
+ [% terms.bugs %] filed are
+ reported already.</font>
+ Check the two lists of frequently-reported [% terms.bugs %]:
+</p>
+
+[%# Include other products if sensible %]
+[% IF product.name == "Firefox" %]
+ [% productstring = "product=Mozilla%20Application%20Suite&amp;product=Firefox" %]
+[% ELSIF product.name == "Thunderbird" %]
+ [% productstring = "product=Mozilla%20Application%20Suite&amp;product=Thunderbird" %]
+[% ELSE %]
+ [% productstring = BLOCK %]product=[% product.name FILTER url_quote %][% END %]
+[% END %]
+
+<p>
+ <a href="duplicates.cgi?[% productstring %]&amp;format=simple" target="somebugs">All-time Top 100</a> (loaded initially) |
+ <a href="duplicates.cgi?[% productstring %]&amp;format=simple&amp;sortby=delta&amp;reverse=1&amp;maxrows=100&amp;changedsince=14" target="somebugs">Hot in the last two weeks</a>
+</p>
+
+<iframe name="somebugs" id="somebugs"
+ style="border: 2px black solid"
+ src="duplicates.cgi?[% productstring %]&amp;format=simple">
+</iframe>
+
+<p>
+ If your [% terms.bug %] isn't there, search [% terms.Bugzilla %] by entering
+ a few key words having to do with your [% terms.bug %] in this box.
+ For example: <tt><b>pop3 mail</b></tt> or <tt><b>copy paste</b></tt>.
+ The results will appear above.
+ </p>
+
+[%# All bugs opened inside the past six months %]
+ <form action="buglist.cgi" method="get" target="somebugs">
+ <input type="hidden" name="format" value="simple">
+ <input type="hidden" name="order" value="relevance desc">
+ <input type="hidden" name="bug_status" value="__all__">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ [% IF product.name == "Firefox" OR
+ product.name == "Thunderbird" OR
+ product.name == "Mozilla Application Suite" OR
+ product.name == "Camino" %]
+ <input type="hidden" name="product" value="Core">
+ <input type="hidden" name="product" value="Toolkit">
+ <input type="hidden" name="product" value="PSM">
+ <input type="hidden" name="product" value="NSPR">
+ <input type="hidden" name="product" value="NSS">
+ [% END %]
+ <input type="hidden" name="chfieldfrom" value="-6m">
+ <input type="hidden" name="chfieldto" value="Now">
+ <input type="hidden" name="chfield" value="[Bug creation]">
+ <input type="text" name="content" size="40">
+ <input type="submit" id="search" value="Search">
+ </form>
+
+<p>
+ Look through the search results. If you get the
+ <tt><b>[% terms.zeroSearchResults %]</b></tt> message, [% terms.Bugzilla %]
+ found no [% terms.bugs %] that
+ match. Check for typing mistakes, or try fewer or different keywords.
+ If you find [% terms.abug %] that looks the same as yours, please add
+ any useful extra information you have to it, rather than opening a new one.
+</p>
+
+
+<a name="step2"></a>
+<h3>Step 2 of 3 - give information</h3>
+
+<p>
+ If you've tried a few searches and your [% terms.bug %] really isn't in
+ there, tell us all about it.
+</p>
+
+<form method="post" action="post_bug.cgi">
+ <input type="hidden" name="format" value="guided">
+ <input type="hidden" name="assigned_to" value="">
+ <input type="hidden" name="priority"
+ value="[% default.priority FILTER html %]">
+ <input type="hidden" name="version"
+ value="[% default.version FILTER html %]">
+ <input type="hidden" name="token" value="[% token FILTER html %]">
+
+<table valign="top" cellpadding="5" cellspacing="5" border="0">
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Product</b>
+ </td>
+ <td valign="top">
+ <input type="hidden" name="product" value="[% product.name FILTER html %]">
+ [% product.name FILTER html %]
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>Component</b>
+ </td>
+ <td valign="top">
+ <table border="0" cellpadding="0" cellspacing="0">
+ <tr>
+ <td valign="top">
+ <select name="component" id="component"
+ size="5" onchange="PutDescription()">
+ [% IF NOT default.component_ %]
+ [%# Various b.m.o. products have a "General" component,
+ which is a useful default. %]
+ [% default.component_ = "General" %]
+ [% END %]
+ [% FOREACH c = product.components %]
+ <option value="[% c.name FILTER html %]"
+ [% " selected=\"selected\"" IF c.name == default.component_ %]>
+ [% c.name FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ </td>
+ <td valign="top" width="100%">
+ <div id="description" style="color: green; margin-left: 10px;
+ height: 5em; overflow: auto;">
+ <script type="text/javascript">
+ if ((document.getElementById) && (document.body.innerHTML)) {
+ document.write("\
+ Select a component to see its description here.");
+ }
+ </script>
+ </div>
+ </td>
+ </tr>
+ </table>
+
+ <p>
+ The area where the problem occurs.
+ To pick the right component, you could use the same one as
+ similar [% terms.bugs %] you found in your search, or read the full list of
+ <a target="_blank" href="describecomponents.cgi?product=
+ [% product.name FILTER url_quote %]">component
+ descriptions</a> (opens in new window) if you need more help.
+ </p>
+ </td>
+ </tr>
+
+ [%# We override rep_platform and op_sys for simplicity. The values chosen
+ are based on which are most common in the b.m.o database %]
+ [% rep_platform = [ "PC", "Macintosh", "All", "Other" ] %]
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Hardware Platform</b>
+ </td>
+ <td valign="top">
+ [% PROCESS select sel = 'rep_platform' %]
+ </td>
+ </tr>
+
+ [% op_sys = [ "Windows 2000", "Windows XP", "Windows Vista", "Windows 7",
+ "Mac OS X", "Linux", "All", "Other" ] %]
+
+ <tr>
+ <td align="right" valign="top">
+ <b>Operating System</b>
+ </td>
+ <td valign="top">
+ [% PROCESS select sel = 'op_sys' %]
+ </td>
+ </tr>
+
+ [% IF product.name.match("Firefox|Camino|Mozilla Application Suite") %]
+ [% matches = cgi.user_agent('Gecko/(\d+)') %]
+ [% buildid = cgi.user_agent() IF matches %]
+ [% END %]
+
+ [%# Accept URL parameter build ID for non-browser products %]
+ [% IF cgi.param("buildid") %]
+ [% buildid = cgi.param("buildid") %]
+ [% END %]
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Build Identifier</b>
+ </td>
+ <td valign="top">
+ <input type="text" size="80" name="buildid" value="[% buildid FILTER html %]">
+ <p>
+ This should identify the exact version of the product you were using.
+ If the above field is blank or you know it is incorrect, copy the
+ version text from the product's Help |
+ About menu (for browsers this will begin with "Mozilla/5.0...").
+ If the product won't start, instead paste the complete URL you downloaded
+ it from.
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>URL</b>
+ </td>
+ <td valign="top">
+ <input type="text" size="80" name="bug_file_loc" value="http://">
+ <p>
+ URL that demonstrates the problem you are seeing (optional).<br>
+ <b>IMPORTANT</b>: if the problem is with a broken web page, you need
+ to report it
+ <a href="https://bugzilla.mozilla.org/page.cgi?id=broken-website.html">a different way</a>.
+ </p>
+ </td>
+ </tr>
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Summary</b>
+ </td>
+ <td valign="top">
+ <input type="text" size="80" name="short_desc" id="short_desc"
+ maxlength="255" spellcheck="true">
+ <p>
+ A sentence which summarises the problem.
+ Please be descriptive and use lots of keywords.
+ </p>
+ <p>
+ <tt>
+ <font color="#990000">Bad example</font>: mail crashed
+ </tt>
+ <br>
+ <tt>
+ <font color="#009900">Good example</font>:
+ crash if I close the mail window while checking for new POP mail
+ </tt>
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>Details</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'comment'
+ minrows = 6
+ cols = constants.COMMENT_COLS
+ %]
+ <p>
+ Expand on the Summary. Please be
+ as specific as possible about what is wrong.
+ </p>
+ <p>
+ <tt>
+ <font color="#990000">Bad example</font>: Mozilla crashed.
+ You suck!
+ </tt>
+ <br>
+ <tt>
+ <font color="#009900">Good example</font>: After a crash which
+ happened when I was sorting in the Bookmark Manager,<br> all of my
+ top-level bookmark folders beginning with the letters Q to Z are
+ no longer present.
+ </tt>
+ </p>
+ </td>
+ </tr>
+
+ <tr bgcolor="[% tablecolour %]">
+ <td align="right" valign="top">
+ <b>Reproducibility</b>
+ </td>
+ <td valign="top">
+ <select name="reproducible">
+ <option name="AlwaysReproducible" value="Always">
+ Happens every time.
+ </option>
+ <option name="Sometimes" value="Sometimes">
+ Happens sometimes, but not always.
+ </option>
+ <option name="DidntTry" value="Didn't try">
+ Haven't tried to reproduce it.
+ </option>
+ <option name="NotReproducible" value="Couldn't Reproduce">
+ Tried, but couldn't reproduce it.
+ </option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <td align="right" valign="top">
+ <b>Steps to Reproduce</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'reproduce_steps'
+ minrows = 4
+ cols = constants.COMMENT_COLS
+ defaultcontent = "1.\n2.\n3."
+ %]
+ <p>
+ Describe how to reproduce the problem, step by
+ step. Include any special setup steps.
+ </p>
+ </td>
+ </tr>
+
+ <tr bgcolor="[% tablecolour %]">
+ <td valign="top" align="right">
+ <b>Actual Results</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'actual_results'
+ minrows = 4
+ cols = constants.COMMENT_COLS
+ %]
+ <p>
+ What happened after you performed the steps above?
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="top" align="right">
+ <b>Expected Results</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'expected_results'
+ minrows = 4
+ cols = constants.COMMENT_COLS
+ %]
+ <p>
+ What should the software have done instead?
+ </p>
+ </td>
+ </tr>
+
+ <tr bgcolor="[% tablecolour %]">
+ <td valign="top" align="right">
+ <b>Additional Information</b>
+ </td>
+ <td valign="top">
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'additional_info'
+ minrows = 8
+ cols = constants.COMMENT_COLS
+ %]
+ <p>
+ Add any additional information you feel may be
+ relevant to this [% terms.bug %], such as the <b>theme</b> you were
+ using (does the [% terms.bug %] still occur
+ with the default theme?), a
+ <b><a href="http://kb.mozillazine.org/Quality_Feedback_Agent">Talkback crash ID</a></b>, or special
+ information about <b>your computer's configuration</b>. Any information
+ longer than a few lines, such as a <b>stack trace</b> or <b>HTML
+ testcase</b>, should be added
+ using the "Add an Attachment" link on the [% terms.bug %], after
+ it is filed. If you believe that it's relevant, please also include
+ your build configuration, obtained by typing <tt>about:buildconfig</tt>
+ into your URL bar.
+ <br>
+ <br>
+ If you are reporting a crash, note the module in
+ which the software crashed (e.g., <tt>Application Violation in
+ gkhtml.dll</tt>).
+ </p>
+ </td>
+ </tr>
+
+ <tr>
+ <td valign="top" align="right">
+ <b>Severity</b>
+ </td>
+ <td valign="top">
+ <select name="bug_severity">
+ <option name="critical" value="critical">
+ Critical: The software crashes, hangs, or causes you to
+ lose data.
+ </option>
+ <option name="major" value="major">
+ Major: A major feature is broken.
+ </option>
+ <option name="normal" value="normal" selected="selected">
+ Normal: It's [% terms.abug %] that should be fixed.
+ </option>
+ <option name="minor" value="minor">
+ Minor: Minor loss of function, and there's an easy workaround.
+ </option>
+ <option name="trivial" value="trivial">
+ Trivial: A cosmetic problem, such as a misspelled word or
+ misaligned text.
+ </option>
+ <option name="enhancement" value="enhancement">
+ Enhancement: Request for new feature or enhancement.
+ </option>
+ </select>
+ <p>
+ Say how serious the problem is, or if your [% terms.bug %] is a
+ request for a new feature.
+ </p>
+ </td>
+ </tr>
+</table>
+
+
+<a name="step3"></a>
+<h3>Step 3 of 3 - submit the [% terms.bug %] report</h3>
+
+<p>
+ <input type="submit" id="report" value=" Submit [% terms.Bug %] Report "
+ onclick="if (this.form.comment.value == '')
+ { alert('Please enter some details about this [% terms.bug %].');
+ this.form.comment.focus();
+ return false; } return true;">
+</p>
+
+<p>
+ That's it! Thanks very much. You'll be notified by email about any
+ progress that is made on fixing your [% terms.bug %].
+
+<p>
+ Please be warned
+ that we get a lot of [% terms.bug %] reports filed - it may take quite a
+ while to get around to yours. You can help the process by making sure your
+ [%+ terms.bug %] is
+ complete and easy to understand, and by quickly replying to any questions
+ which may arrive by email.
+</p>
+
+ </form>
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ <select name="[% sel %]">
+ [%- IF default.$sel %]
+ <option value="[% default.$sel FILTER html %]" selected="selected">
+ [% default.$sel FILTER html -%]
+ </option>
+ [% END %]
+ [%- FOREACH x = $sel %]
+ [% NEXT IF x == default.$sel %]
+ <option value="[% x FILTER html %]">
+ [% x FILTER html -%]
+ </option>
+ [%- END %]
+ </select>
+[% END %]
diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl
new file mode 100644
index 0000000..4b17457
--- /dev/null
+++ b/template/en/default/bug/create/create.html.tmpl
@@ -0,0 +1,705 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Ville Skyttä <ville.skytta@iki.fi>
+ # Shane H. W. Travis <travis@sedsystems.ca>
+ # Marc Schumann <wurblzap@gmail.com>
+ # Akamai Technologies <bugzilla-dev@akamai.com>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% title = BLOCK %]Enter [% terms.Bug %]: [% product.name FILTER html %][% END %]
+
+[% PROCESS global/header.html.tmpl
+ title = title
+ style_urls = [ 'skins/standard/create_attachment.css',
+ 'skins/standard/yui/calendar.css' ]
+ javascript_urls = [ "js/attachment.js", "js/util.js", "js/yui/calendar.js",
+ "js/field.js", "js/TUI.js" ]
+ onload = 'set_assign_to();'
+%]
+
+<script type="text/javascript">
+<!--
+
+var initialowners = new Array([% product.components.size %]);
+var last_initialowner;
+var initialccs = new Array([% product.components.size %]);
+var components = new Array([% product.components.size %]);
+var comp_desc = new Array([% product.components.size %]);
+var flags = new Array([% product.components.size %]);
+[% IF Param("useqacontact") %]
+ var initialqacontacts = new Array([% product.components.size %]);
+ var last_initialqacontact;
+[% END %]
+[% count = 0 %]
+[%- FOREACH c = product.components %]
+ components[[% count %]] = "[% c.name FILTER js %]";
+ comp_desc[[% count %]] = "[% c.description FILTER html_light FILTER js %]";
+ initialowners[[% count %]] = "[% c.default_assignee.login FILTER js %]";
+ [% flag_list = [] %]
+ [% FOREACH f = c.flag_types.bug %]
+ [% NEXT UNLESS f.is_active %]
+ [% flag_list.push(f.id) %]
+ [% END %]
+ [% FOREACH f = c.flag_types.attachment %]
+ [% NEXT UNLESS f.is_active %]
+ [% flag_list.push(f.id) %]
+ [% END %]
+ flags[[% count %]] = [[% flag_list.join(",") FILTER js %]];
+ [% IF Param("useqacontact") %]
+ initialqacontacts[[% count %]] = "[% c.default_qa_contact.login FILTER js %]";
+ [% END %]
+
+ [% SET initial_cc_list = [] %]
+ [% FOREACH cc_user = c.initial_cc %]
+ [% initial_cc_list.push(cc_user.login) %]
+ [% END %]
+ initialccs[[% count %]] = "[% initial_cc_list.join(', ') FILTER js %]";
+
+ [% count = count + 1 %]
+[%- END %]
+
+function set_assign_to() {
+ // Based on the selected component, fill the "Assign To:" field
+ // with the default component owner, and the "QA Contact:" field
+ // with the default QA Contact. It also selectively enables flags.
+ var form = document.Create;
+ var assigned_to = form.assigned_to.value;
+
+[% IF Param("useqacontact") %]
+ var qa_contact = form.qa_contact.value;
+[% END %]
+
+ var index = -1;
+ if (form.component.type == 'select-one') {
+ index = form.component.selectedIndex;
+ } else if (form.component.type == 'hidden') {
+ // Assume there is only one component in the list
+ index = 0;
+ }
+ if (index != -1) {
+ var owner = initialowners[index];
+ var component = components[index];
+ if (assigned_to == last_initialowner
+ || assigned_to == owner
+ || assigned_to == '') {
+ form.assigned_to.value = owner;
+ last_initialowner = owner;
+ }
+
+ document.getElementById('initial_cc').innerHTML = initialccs[index];
+ document.getElementById('comp_desc').innerHTML = comp_desc[index];
+
+ [% IF Param("useqacontact") %]
+ var contact = initialqacontacts[index];
+ if (qa_contact == last_initialqacontact
+ || qa_contact == contact
+ || qa_contact == '') {
+ form.qa_contact.value = contact;
+ last_initialqacontact = contact;
+ }
+ [% END %]
+
+ // First, we disable all flags. Then we re-enable those
+ // which are available for the selected component.
+ var inputElements = document.getElementsByTagName("select");
+ var inputElement, flagField;
+ for ( var i=0 ; i<inputElements.length ; i++ ) {
+ inputElement = inputElements.item(i);
+ if (inputElement.name.search(/^flag_type-(\d+)$/) != -1) {
+ var id = inputElement.name.replace(/^flag_type-(\d+)$/, "$1");
+ inputElement.disabled = true;
+ // Also disable the requestee field, if it exists.
+ inputElement = document.getElementById("requestee_type-" + id);
+ if (inputElement) inputElement.disabled = true;
+ }
+ }
+ // Now enable flags available for the selected component.
+ for (var i = 0; i < flags[index].length; i++) {
+ flagField = document.getElementById("flag_type-" + flags[index][i]);
+ // Do not enable flags the user cannot set nor request.
+ if (flagField && flagField.options.length > 1) {
+ flagField.disabled = false;
+ // Re-enabling the requestee field depends on the status
+ // of the flag.
+ toggleRequesteeField(flagField, 1);
+ }
+ }
+ }
+}
+
+function handleWantsAttachment(wants_attachment) {
+ if (wants_attachment) {
+ document.getElementById('attachment_false').style.display = 'none';
+ document.getElementById('attachment_true').style.display = 'block';
+ }
+ else {
+ document.getElementById('attachment_false').style.display = 'block';
+ document.getElementById('attachment_true').style.display = 'none';
+ clearAttachmentFields();
+ }
+}
+
+
+TUI_alternates['expert_fields'] = 'Show Advanced Fields';
+// Hide the Advanced Fields by default, unless the user has a cookie
+// that specifies otherwise.
+TUI_hide_default('expert_fields');
+
+-->
+</script>
+
+[% USE Bugzilla %]
+[% SET select_fields = {} %]
+[% FOREACH field = Bugzilla.get_fields(
+ { type => constants.FIELD_TYPE_SINGLE_SELECT, custom => 0 })
+%]
+ [% select_fields.${field.name} = field %]
+[% END %]
+
+<form name="Create" id="Create" method="post" action="post_bug.cgi"
+ enctype="multipart/form-data">
+<input type="hidden" name="product" value="[% product.name FILTER html %]">
+<input type="hidden" name="token" value="[% token FILTER html %]">
+
+<table cellspacing="4" cellpadding="2" border="0">
+<tbody>
+ <tr>
+ <td colspan="4">
+ [%# Migration note: The following file corresponds to the old Param
+ # 'entryheaderhtml'
+ #%]
+ [% PROCESS 'bug/create/user-message.html.tmpl' %]
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="2">
+ <a id="expert_fields_controller" class="controller bz_default_hidden"
+ href="javascript:TUI_toggle_class('expert_fields')">Hide
+ Advanced Fields</a>
+ [%# Show the link if the browser supports JS %]
+ <script type="text/javascript">
+ YAHOO.util.Dom.removeClass('expert_fields_controller',
+ 'bz_default_hidden');
+ </script>
+ </td>
+ <td colspan="2">
+ (<span class="required_star">*</span> =
+ <span class="required_explanation">Required Field</span>)
+ </td>
+ </tr>
+
+ <tr>
+ <th>Product:</th>
+ <td width="10%">[% product.name FILTER html %]</td>
+
+ <th>Reporter:</th>
+ <td width="100%">[% user.login FILTER html %]</td>
+ </tr>
+
+ [%# We can't use the select block in these two cases for various reasons. %]
+ <tr>
+ <th class="required">
+ <a href="describecomponents.cgi?product=[% product.name FILTER url_quote %]">
+ Component</a>:
+ </th>
+ <td>
+ <select name="component" onchange="set_assign_to();" size="7"
+ aria-required="true" class="required">
+ [%# Build the lists of assignees and QA contacts if "usemenuforusers" is enabled. %]
+ [% IF Param("usemenuforusers") %]
+ [% assignees_list = user.get_userlist.clone %]
+ [% qa_contacts_list = user.get_userlist.clone %]
+ [% END %]
+
+ [%- FOREACH c = product.components %]
+ <option value="[% c.name FILTER html %]"
+ [% " selected=\"selected\"" IF c.name == default.component_ %]>
+ [% c.name FILTER html -%]
+ </option>
+ [% IF Param("usemenuforusers") %]
+ [% INCLUDE build_userlist default_user = c.default_assignee,
+ userlist = assignees_list %]
+ [% INCLUDE build_userlist default_user = c.default_qa_contact,
+ userlist = qa_contacts_list %]
+ [% END %]
+ [%- END %]
+ </select>
+ </td>
+
+ <td colspan="2">
+ [%# Enclose the fieldset in a nested table so that its width changes based
+ # on the length on the component description. %]
+ <table>
+ <tr>
+ <td>
+ <fieldset>
+ <legend>Component Description</legend>
+ <div id="comp_desc" class="comment">Select a component to read its description.</div>
+ </fieldset>
+ </td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+
+ <tr>
+ <th rowspan="3">Version:</th>
+ <td rowspan="3">
+ <select name="version" size="5">
+ [%- FOREACH v = version %]
+ <option value="[% v FILTER html %]"
+ [% ' selected="selected"' IF v == default.version %]>[% v FILTER html -%]
+ </option>
+ [%- END %]
+ </select>
+ </td>
+
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = select_fields.bug_severity, editable = 1,
+ value = default.bug_severity %]
+ </tr>
+
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = select_fields.rep_platform, editable = 1,
+ value = default.rep_platform %]
+ </tr>
+
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = select_fields.op_sys, editable = 1,
+ value = default.op_sys %]
+ </tr>
+</tbody>
+
+<tbody class="expert_fields">
+ <tr>
+ [% IF Param('usetargetmilestone') && Param('letsubmitterchoosemilestone') %]
+ [% sel = { description => 'Target Milestone', name => 'target_milestone' } %]
+ [% INCLUDE select %]
+ [% ELSE %]
+ <td colspan="2">&nbsp;</td>
+ [% END %]
+
+ [% IF Param('letsubmitterchoosepriority') %]
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = select_fields.priority, editable = 1,
+ value = default.priority %]
+ [% ELSE %]
+ <td colspan="2">&nbsp;</td>
+ [% END %]
+ </tr>
+</tbody>
+
+[% IF !Param('defaultplatform') || !Param('defaultopsys') %]
+ <tbody>
+ <tr>
+ <th>&nbsp;</th>
+ <td colspan="3" class="comment">
+ We've made a guess at your
+ [% IF Param('defaultplatform') %]
+ operating system. Please check it
+ [% ELSIF Param('defaultopsys') %]
+ platform. Please check it
+ [% ELSE %]
+ operating system and platform. Please check them
+ [% END %]
+ and make any corrections if necessary.
+ </td>
+ </tr>
+ </tbody>
+[% END %]
+
+<tbody class="expert_fields">
+ <tr>
+ <td colspan="4">&nbsp;</td>
+ </tr>
+
+ <tr>
+[% IF bug_status.size <= 1 %]
+ <input type="hidden" name="bug_status"
+ value="[% default.bug_status FILTER html %]">
+ <th>Initial State:</th>
+ <td>[% display_value("bug_status", default.bug_status) FILTER html %]</td>
+[% ELSE %]
+ [% sel = { description => 'Initial State', name => 'bug_status' } %]
+ [% INCLUDE select %]
+[% END %]
+
+ <td>&nbsp;</td>
+ [%# Calculate the number of rows we can use for flags %]
+ [% num_rows = 6 + (Param("useqacontact") ? 1 : 0) +
+ (user.is_timetracker ? 3 : 0) +
+ (Param("usebugaliases") ? 1 : 0)
+ %]
+
+ <td rowspan="[% num_rows FILTER html %]">
+ [% IF product.flag_types.bug.size > 0 %]
+ [% display_flag_headers = 0 %]
+ [% any_flags_requesteeble = 0 %]
+
+ [% FOREACH flag_type = product.flag_types.bug %]
+ [% NEXT UNLESS flag_type.is_active %]
+ [% display_flag_headers = 1 %]
+ [% SET any_flags_requesteeble = 1 IF flag_type.is_requestable && flag_type.is_requesteeble %]
+ [% END %]
+
+ [% IF display_flag_headers %]
+ [% PROCESS "flag/list.html.tmpl" flag_types = product.flag_types.bug
+ any_flags_requesteeble = any_flags_requesteeble
+ flag_table_id = "bug_flags"
+ %]
+ [% END %]
+ [% END %]
+ </td>
+ </tr>
+
+ <tr>
+ <th><a href="page.cgi?id=fields.html#assigned_to">Assign To</a>:</th>
+ <td colspan="2">
+ [% INCLUDE global/userselect.html.tmpl
+ name => "assigned_to"
+ value => assigned_to
+ disabled => assigned_to_disabled
+ size => 30
+ emptyok => 1
+ custom_userlist => assignees_list
+ %]
+ <noscript>(Leave blank to assign to component's default assignee)</noscript>
+ </td>
+ </tr>
+
+[% IF Param("useqacontact") %]
+ <tr>
+ <th>QA Contact:</th>
+ <td colspan="2">
+ [% INCLUDE global/userselect.html.tmpl
+ name => "qa_contact"
+ value => qa_contact
+ disabled => qa_contact_disabled
+ size => 30
+ emptyok => 1
+ custom_userlist => qa_contacts_list
+ %]
+ <noscript>(Leave blank to assign to default qa contact)</noscript>
+ </td>
+ </tr>
+[% END %]
+
+ <tr>
+ <th>CC:</th>
+ <td colspan="2">
+ [% INCLUDE global/userselect.html.tmpl
+ name => "cc"
+ value => cc
+ disabled => cc_disabled
+ size => 30
+ multiple => 5
+ %]
+ </td>
+ </tr>
+
+ <tr>
+ <th>Default CC:</th>
+ <td colspan="2">
+ <div id="initial_cc">
+ </div>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="3">&nbsp;</td>
+ </tr>
+
+[% IF user.is_timetracker %]
+ <tr>
+ <th>Estimated Hours:</th>
+ <td colspan="2">
+ <input name="estimated_time" size="6" maxlength="6" value="[% estimated_time FILTER html %]">
+ </td>
+ </tr>
+ <tr>
+ <th>Deadline:</th>
+ <td colspan="2">
+ <input name="deadline" size="10" maxlength="10" value="[% deadline FILTER html %]">
+ <small>(YYYY-MM-DD)</small>
+ </td>
+ </tr>
+
+ <tr>
+ <td colspan="3">&nbsp;</td>
+ </tr>
+[% END %]
+
+[% IF Param("usebugaliases") %]
+ <tr>
+ <th>Alias:</th>
+ <td colspan="2">
+ <input name="alias" size="20" value="[% alias FILTER html %]">
+ </td>
+ </tr>
+[% END %]
+
+ <tr>
+ <th>URL:</th>
+ <td colspan="2">
+ <input name="bug_file_loc" size="40"
+ value="[% bug_file_loc FILTER html %]">
+ </td>
+ </tr>
+</tbody>
+
+<tbody class="expert_fields">
+ [% USE Bugzilla %]
+
+ [% FOREACH field = Bugzilla.active_custom_fields %]
+ [% NEXT UNLESS field.enter_bug %]
+ [% SET value = ${field.name}.defined ? ${field.name} : "" %]
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = default, field = field, value = value, editable = 1,
+ value_span = 3 %]
+ </tr>
+ [% END %]
+</tbody>
+
+<tbody>
+
+ <tr>
+ <th class="required">Summary:</th>
+ <td colspan="3">
+ <input name="short_desc" size="70" value="[% short_desc FILTER html %]"
+ maxlength="255" spellcheck="true" aria-required="true"
+ class="required">
+ </td>
+ </tr>
+
+ <tr>
+ <th>Description:</th>
+ <td colspan="3">
+ [% defaultcontent = BLOCK %]
+ [% IF cloned_bug_id %]
++++ This [% terms.bug %] was initially created as a clone of [% terms.Bug %] #[% cloned_bug_id %] +++
+
+
+ [% END %]
+ [%-# We are within a BLOCK. The comment will be correctly HTML-escaped
+ # by global/textarea.html.tmpl. So we must not escape the comment here. %]
+ [% comment FILTER none %]
+ [%- END %]
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'comment'
+ id = 'comment'
+ minrows = 10
+ maxrows = 25
+ cols = constants.COMMENT_COLS
+ defaultcontent = defaultcontent
+ %]
+ <br>
+ </td>
+ </tr>
+
+ [% IF user.is_insider %]
+ <tr class="expert_fields">
+ <th>&nbsp;</th>
+ <td colspan="3">
+ &nbsp;&nbsp;
+ <input type="checkbox" id="commentprivacy" name="commentprivacy"
+ [% " checked=\"checked\"" IF commentprivacy %]>
+ <label for="commentprivacy">
+ Make description private (visible only to members of the
+ <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+ </label>
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th>Attachment:</th>
+ <td colspan="3">
+ <script type="text/javascript">
+ <!--
+ document.write( '<div id="attachment_false">'
+ + '<input type="button" value="Add an attachment" '
+ + 'onClick="handleWantsAttachment(true)"> '
+ + '<em style="display: none">This button has no '
+ + 'functionality for you because your browser does '
+ + 'not support CSS or does not use it.<\/em>'
+ + '<\/div>'
+ + '<div id="attachment_true" style="display: none">'
+ + '<input type="button" '
+ + 'value="Don\'t add an attachment " '
+ + 'onClick="handleWantsAttachment(false)">');
+ //-->
+ </script>
+ <fieldset>
+ <legend>Add an attachment</legend>
+ <table class="attachment_entry">
+ [% PROCESS attachment/createformcontents.html.tmpl
+ flag_types = product.flag_types.attachment
+ any_flags_requesteeble = 1
+ flag_table_id ="attachment_flags" %]
+ </table>
+ </fieldset>
+ <script type="text/javascript">
+ <!--
+ document.write('<\/div>');
+ //-->
+ </script>
+ </td>
+ </tr>
+</tbody>
+
+<tbody class="expert_fields">
+ [% IF user.in_group('editbugs', product.id) %]
+ [% IF use_keywords %]
+ <tr>
+ <th><a href="describekeywords.cgi">Keywords</a>:</th>
+ <td colspan="3">
+ <input id="keywords" name="keywords" size="40"
+ value="[% keywords FILTER html %]"> (optional)
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <th>Depends on:</th>
+ <td colspan="3">
+ <input name="dependson" accesskey="d" value="[% dependson FILTER html %]">
+ </td>
+ </tr>
+ <tr>
+ <th>Blocks:</th>
+ <td colspan="3">
+ <input name="blocked" accesskey="b" value="[% blocked FILTER html %]">
+ </td>
+ </tr>
+ [% END %]
+</tbody>
+
+<tbody class="expert_fields">
+ [% IF group.size %]
+ <tr>
+ <th>&nbsp;</th>
+ <td colspan="3">
+ <br>
+ <strong>
+ Only users in all of the selected groups can view this [% terms.bug %]:
+ </strong>
+ <br>
+ <font size="-1">
+ (Leave all boxes unchecked to make this a public [% terms.bug %].)
+ </font>
+ <br>
+ <br>
+
+ <!-- Checkboxes -->
+ [% FOREACH g = group %]
+ &nbsp;&nbsp;&nbsp;&nbsp;
+ <input type="checkbox" id="bit-[% g.bit %]"
+ name="bit-[% g.bit %]" value="1"
+ [% " checked=\"checked\"" IF g.checked %]>
+ <label for="bit-[% g.bit %]">[% g.description FILTER html_light %]</label><br>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+</tbody>
+
+<tbody>
+ [%# Form controls for entering additional data about the bug being created. %]
+ [% Hook.process("form") %]
+
+ <tr>
+ <th>&nbsp;</th>
+ <td colspan="3">
+ <input type="submit" id="commit" value="Submit [% terms.Bug %]"
+ onclick="if (this.form.short_desc.value == '')
+ { alert('Please enter a summary sentence for this [% terms.bug %].');
+ return false; } return true;">
+ &nbsp;&nbsp;&nbsp;&nbsp;
+ <input type="submit" name="maketemplate" id="maketemplate"
+ value="Remember values as bookmarkable template"
+ class="expert_fields">
+ </td>
+ </tr>
+</tbody>
+ </table>
+ <input type="hidden" name="form_name" value="enter_bug">
+</form>
+
+[%# Links or content with more information about the bug being created. %]
+[% Hook.process("end") %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ [% IF sel.description %]
+ <th>
+ <a href="page.cgi?id=fields.html#[% sel.name %]">[% sel.description %]</a>:
+ </th>
+ [% END %]
+
+ <td>
+ <select name="[% sel.name %]" id="[% sel.name %]">
+ [%- FOREACH x = ${sel.name} %]
+ <option value="[% x FILTER html %]"
+ [% " selected=\"selected\"" IF x == default.${sel.name} %]>
+ [% display_value(sel.name, x) FILTER html %]
+ </option>
+ [% END %]
+ </select>
+
+ [% IF sel.name == "bug_status" %]
+ <script type="text/javascript">
+ <!--
+ [%+ INCLUDE "bug/field-events.js.tmpl"
+ field = select_fields.bug_status %]
+ //-->
+ </script>
+ [% END %]
+ </td>
+[% END %]
+
+[% BLOCK build_userlist %]
+ [% user_found = 0 %]
+ [% default_login = default_user.login %]
+ [% RETURN UNLESS default_login %]
+
+ [% FOREACH user = userlist %]
+ [% IF user.login == default_login %]
+ [% user_found = 1 %]
+ [% LAST %]
+ [% END %]
+ [% END %]
+
+ [% userlist.push({login => default_login,
+ identity => default_user.identity,
+ visible => 1})
+ UNLESS user_found %]
+[% END %]
diff --git a/template/en/default/bug/create/created.html.tmpl b/template/en/default/bug/create/created.html.tmpl
new file mode 100644
index 0000000..d9eaccb
--- /dev/null
+++ b/template/en/default/bug/create/created.html.tmpl
@@ -0,0 +1,61 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # id: number; the ID of the bug that was created.
+ # sentmail: array of hash; bugs for which BugMail should be sent, contains:
+ # type: string; type of change for this bug, either 'created' if this bug
+ # was created or 'dep' if it was added as a dependent/blocker
+ # id: integer; the ID of the bug
+ # bug: object; Bugzilla::Bug object of the bug that was created (used in
+ # template bug/edit.html.tmpl
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS "bug/show-header.html.tmpl" %]
+[% PROCESS global/header.html.tmpl
+ title = "$terms.Bug $id Submitted &ndash; $filtered_desc"
+ header = "$terms.Bug&nbsp;$id Submitted"
+%]
+
+[% header_done = 1 %]
+
+[% FOREACH item = sentmail %]
+ [% PROCESS bug/process/results.html.tmpl
+ type = item.type
+ id = item.id
+ sent_bugmail = item
+ %]
+[% END %]
+
+<br>
+
+<hr>
+
+[% PROCESS bug/edit.html.tmpl %]
+
+<hr>
+
+[% PROCESS bug/navigate.html.tmpl bottom_navigator => 1 %]
+
+<br>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/create/make-template.html.tmpl b/template/en/default/bug/create/make-template.html.tmpl
new file mode 100644
index 0000000..1397483
--- /dev/null
+++ b/template/en/default/bug/create/make-template.html.tmpl
@@ -0,0 +1,46 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# INTERFACE:
+ # url: URL to a pre-filled bug entry form.
+ # short_desc: Bug summary as entered in the form.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Bookmarks are your friend"
+ header = "Template constructed"
+%]
+
+<p>
+ You can bookmark this link:
+ &ldquo;<a href="enter_bug.cgi?[% url FILTER html %]">
+ [% IF short_desc %]
+ [% short_desc FILTER html %]
+ [% ELSE %]
+ [% terms.Bug %] entry template
+ [% END %]</a>&rdquo;.
+ This bookmark will bring up the <em>Enter [% terms.Bug %]</em> page with the
+ fields initialized as you've requested.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/create/user-message.html.tmpl b/template/en/default/bug/create/user-message.html.tmpl
new file mode 100644
index 0000000..ac2cc29
--- /dev/null
+++ b/template/en/default/bug/create/user-message.html.tmpl
@@ -0,0 +1,36 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Matthew Tuck <matty@chariot.net.au>
+ #%]
+
+[%# Migration note: this file corresponds to the old Param
+ # 'entryheaderhtml'
+ #%]
+
+[%# You can make the output of this template product-specific by using
+ # Template Toolkit IF statements. The current product name is stored in
+ # the 'product' variable.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+Before reporting [% terms.abug %], please read the
+<a href="page.cgi?id=bug-writing.html">
+[% terms.bug %] writing guidelines</a>, please look at the list of
+<a href="duplicates.cgi">most frequently reported [% terms.bugs %]</a>, and please
+<a href="query.cgi">search</a> for the [% terms.bug %].
diff --git a/template/en/default/bug/dependency-graph.html.tmpl b/template/en/default/bug/dependency-graph.html.tmpl
new file mode 100644
index 0000000..37dcde0
--- /dev/null
+++ b/template/en/default/bug/dependency-graph.html.tmpl
@@ -0,0 +1,106 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # bug_id: integer. The number of the bug(s).
+ # multiple_bugs: boolean. True if bug_id contains > 1 bug number.
+ # doall: boolean. True if we are displaying every bug in the database.
+ # showsummary: boolean. True if we are showing bug summaries.
+ # rankdir: string. "TB" if we are ranking top-to-bottom,
+ "LR" if left-to-right.
+ # image_url: string. The URL of the graphic showing the dependencies.
+ # map_url: string. The URL of the map file for the image. (Optional)
+ # image_map: string. The image map for the graphic showing the
+ dependencies. (Optional)
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% title = "Dependency Graph"
+ header = title
+ %]
+
+[% IF NOT multiple_bugs AND NOT doall %]
+ [% filtered_desc = short_desc FILTER html %]
+ [% title = "$title for $terms.bug $bug_id"
+ header = "$header for $terms.bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>"
+ subheader = filtered_desc
+ %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl %]
+
+[% image_map %]
+
+<p>
+ Green circles represent open [% terms.bugs %].
+</p>
+
+[% IF image_map %]
+ <img src="[% image_url %]" alt="Dependency graph" usemap="#imagemap">
+[% ELSE %]
+ <a href="[% map_url %]">
+ <img src="[% image_url %]" alt="Dependency graph" ismap="ismap">
+ </a>
+[% END %]
+
+<hr>
+
+<form action="showdependencygraph.cgi" method="GET">
+ <table>
+ <tr>
+ <th align="left"><label for="id">[% terms.Bug %] numbers</label>:</th>
+ <td><input id="id" name="id" value="[% bug_id %]"></td>
+ <td>
+ <input type="checkbox" id="showsummary" name="showsummary" [% " checked" IF showsummary %]>
+ <label for="showsummary">Show the summaries of all displayed [% terms.bugs %]</label>
+ </td>
+ </tr>
+
+ <tr>
+ <th align="left"><label for="display">Display:</label></th>
+ <td colspan="2">
+ <select id="display" name="display">
+ <option value="tree"[% 'selected="selected"' IF (!display || display == "tree") %]>
+ Restrict to [% terms.bugs %] having a direct relationship with entered [% terms.bugs %]</option>
+ <option value="web" [% 'selected="selected"' IF display == "web" %]>
+ Show all [% terms.bugs %] having any relationship with entered [% terms.bugs %]</option>
+ <option value="doall" [% 'selected="selected"' IF display == "doall" %]>
+ Show every [% terms.bug %] in the system with dependencies</option>
+ </select>
+ </td>
+ </tr>
+
+ <tr>
+ <th align="left"><label for="rankdir">Orientation:</label></th>
+ <td colspan="2">
+ <select id="rankdir" name="rankdir">
+ <option value="TB"[% " selected" IF rankdir == "TB" %]>Top to bottom</option>
+ <option value="BT"[% " selected" IF rankdir == "BT" %]>Bottom to top</option>
+ <option value="LR"[% " selected" IF rankdir == "LR" %]>Left to right</option>
+ <option value="RL"[% " selected" IF rankdir == "RL" %]>Right to left</option>
+ </select>
+ </td>
+ </tr>
+ </table>
+ <input type="submit" id="change" value="Change Parameters">
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/dependency-tree.html.tmpl b/template/en/default/bug/dependency-tree.html.tmpl
new file mode 100644
index 0000000..c42c3c4
--- /dev/null
+++ b/template/en/default/bug/dependency-tree.html.tmpl
@@ -0,0 +1,266 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Tobias Burnus <burnus@net-b.de>
+ # Ville Skyttä <ville.skytta@iki.fi>
+ # Myk Melez <myk@mozilla.org>
+ # André Batosti <batosti@async.com.br>
+ #%]
+
+[% PROCESS 'global/field-descs.none.tmpl' %]
+
+[% filtered_desc = blocked_tree.$bugid.short_desc FILTER html %]
+[% PROCESS global/header.html.tmpl
+ title = "Dependency tree for $terms.Bug $bugid"
+ header = "Dependency tree for
+ <a href=\"show_bug.cgi?id=$bugid\">$terms.Bug $bugid</a>"
+ javascript_urls = ["js/expanding-tree.js"]
+ style_urls = ["skins/standard/dependency-tree.css"]
+ subheader = filtered_desc
+ doc_section = "hintsandtips.html#dependencytree"
+%]
+
+[% PROCESS depthControlToolbar %]
+
+[% INCLUDE tree_section ids=dependson_ids type=1 %]
+
+[% INCLUDE tree_section ids=blocked_ids type=2 %]
+
+[% PROCESS depthControlToolbar %]
+
+[% PROCESS global/footer.html.tmpl %]
+
+[%###########################################################################%]
+[%# Tree-drawing blocks #%]
+[%###########################################################################%]
+
+[% BLOCK tree_section %]
+ [%# INTERFACE
+ # - ids: a list of bug IDs to be displayed as children
+ # - type: the type of tree. 1 = depends on, 2 = blockeds
+ # GLOBALS
+ # - seen: Maintains a global hash of bugs that have been displayed
+ #%]
+ [% global.seen = {} %]
+ [%# Display the tree of bugs that this bug depends on. %]
+ <h3>
+ <a href="show_bug.cgi?id=[% bugid %]">[% terms.Bug %] [%+ bugid %]</a>
+ [% IF type == 1 %]
+ [% tree_name = "dependson_tree" %]
+ [% IF ids.size %]
+ depends on
+ [% ELSE %]
+ does not depend on any [% terms.bugs %].
+ [% END %]
+ [% ELSIF type == 2 %]
+ [% tree_name = "blocked_tree" %]
+ [% IF ids.size %]
+ blocks
+ [% ELSE %]
+ does not block any [% terms.bugs %].
+ [% END %]
+ [% END %]
+ [% IF ids.size %]
+ [%+ (ids.size == 1) ? "one" : ids.size %]
+ [%+ IF hide_resolved %]open[% END %]
+ [%+ (ids.size == 1) ? terms.bug : terms.bugs %]:
+ [% END %]
+ </h3>
+ [% IF ids.size %]
+ ([% IF maxdepth -%]Up to [% maxdepth %] level[% "s" IF maxdepth > 1 %] deep | [% END -%]
+ <a href="buglist.cgi?bug_id=[% ids.join(",") %]">view as [% terms.bug %] list</a>
+ [% IF user.in_group('editbugs') && ids.size > 1 %]
+ | <a href="buglist.cgi?bug_id=[% ids.join(",") %]&amp;tweak=1">change several</a>
+ [% END %])
+ <ul class="tree">
+ [% INCLUDE display_tree tree=$tree_name %]
+ </ul>
+ [% END %]
+[% END %]
+
+
+[% BLOCK display_tree %]
+ [%# INTERFACE
+ # - bugid: the ID of the bug being displayed
+ # - tree: a hash of bug objects and of bug dependencies
+ #%]
+ [% bug = tree.$bugid %]
+ <li>
+ [%- INCLUDE bullet bugid=bugid tree=tree -%]
+ <span class="summ[% "_deep" IF tree.dependencies.$bugid.size %]"
+ id="[% bugid FILTER html %]"
+ [% IF global.seen.$bugid %]
+ onMouseover="duplicatedover('[% bugid FILTER html %]')"
+ onMouseout="duplicatedout('[% bugid FILTER html %]')"
+ [% END %]>
+ [%- INCLUDE buglink bug=bug bugid=bugid %]
+ </span>
+ [% IF global.seen.$bugid %]
+ <b><a title="Already displayed above; click to locate"
+ onclick="duplicated('[% bugid FILTER html %]')"
+ href="#b[% bugid %]">(*)</a></b>
+ [% ELSIF tree.dependencies.$bugid.size %]
+ <ul>
+ [% FOREACH depid = tree.dependencies.$bugid %]
+ [% INCLUDE display_tree bugid=depid %]
+ [% END %]
+ </ul>
+ [% END %]
+ </li>
+ [% global.seen.$bugid = 1 %]
+[% END %]
+
+[% BLOCK bullet %]
+ [% IF tree.dependencies.$bugid.size && ! global.seen.$bugid %]
+ [% extra_class = " b_open" %]
+ [% extra_args = 'onclick="return doToggle(this, event)"' %]
+ [% END %]
+ <a name="b[% bugid %]"
+ class="b [%+ extra_class FILTER none %]"
+ title="Click to expand or contract this portion of the tree. Hold down the Ctrl key while clicking to expand or contract all subtrees."
+ [% extra_args FILTER none %]>&nbsp;&nbsp;</a>
+[% END %]
+
+[% BLOCK buglink %]
+ [% isclosed = !bug.isopened %]
+ [% FILTER closed(isclosed) -%]
+ <a title="[% INCLUDE buginfo bug=bug %]"
+ href="show_bug.cgi?id=[% bugid %]">
+ <b>[%- bugid %]:</b>
+ <span class="summ_text">[%+ bug.short_desc FILTER html %]</span>
+ <span class="summ_info">[[% INCLUDE buginfo %]]</span>
+ </a>
+ <a href="showdependencytree.cgi?id=[% bugid FILTER url_quote %]"
+ class="tree_link">
+ <img src="skins/standard/dependency-tree/tree.png"
+ title="See dependency tree for [% terms.bug %] [%+ bugid FILTER html %]">
+ </a>
+ [% END %]
+[% END %]
+
+[% BLOCK buginfo %]
+ [% display_value("bug_status", bug.bug_status) FILTER html -%] [%+ display_value("resolution", bug.resolution) FILTER html %];
+ [%-%] assigned to [% bug.assigned_to.login FILTER email FILTER html %]
+ [%-%][% "; Target: " _ bug.target_milestone IF bug.target_milestone %]
+[% END %]
+
+[%###########################################################################%]
+[%# Block for depth control toolbar #%]
+[%###########################################################################%]
+
+[% BLOCK depthControlToolbar %]
+ <table cellpadding="3" border="0" cellspacing="0" bgcolor="#e0e0e0">
+ <tr>
+ [%# Hide/show resolved button
+ Swaps text depending on the state of hide_resolved %]
+ <td align="center">
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ <input name="id" type="hidden" value="[% bugid %]">
+ [% IF maxdepth %]
+ <input name="maxdepth" type="hidden" value="[% maxdepth %]">
+ [% END %]
+ <input type="hidden" name="hide_resolved" value="[% hide_resolved ? 0 : 1 %]">
+ <input type="submit" id="toggle_visibility"
+ value="[% IF hide_resolved %]Show[% ELSE %]Hide[% END %] Resolved">
+ </form>
+ </td>
+
+ <td>
+ Max Depth:
+ </td>
+
+ <td>
+ &nbsp;
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# set to one form %]
+ <input type="submit" id="change_maxdepth"
+ value="&nbsp;1&nbsp;"
+ [% "disabled" IF realdepth < 2 || maxdepth == 1 %]>
+ <input name="id" type="hidden" value="[% bugid %]">
+ <input name="maxdepth" type="hidden" value="1">
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ </form>
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# Minus one form
+ Allow subtracting only when realdepth and maxdepth > 1 %]
+ <input name="id" type="hidden" value="[% bugid %]">
+ <input name="maxdepth" type="hidden" value="[%
+ maxdepth == 1 ? 1
+ : ( maxdepth ? maxdepth - 1 : realdepth - 1 )
+ %]">
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ <input type="submit" id="decrease_depth" value="&nbsp;&lt;&nbsp;"
+ [% "disabled" IF realdepth < 2 || ( maxdepth && maxdepth < 2 ) %]>
+ </form>
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# Limit entry form: the button can not do anything when total depth
+ is less than two, so disable it %]
+ <input name="maxdepth" size="4" maxlength="4" value="[%
+ maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""
+ %]">
+ <input name="id" type="hidden" value="[% bugid %]">
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ <noscript>
+ <input type="submit" id="change_depth" value="Change"
+ [% "disabled" IF realdepth < 2 %]>
+ </noscript>
+ </form>
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# plus one form
+ Disable button if total depth < 2, or if depth set to unlimited %]
+ <input name="id" type="hidden" value="[% bugid %]">
+ [% IF maxdepth %]
+ <input name="maxdepth" type="hidden" value="[% maxdepth + 1 %]">
+ [% END %]
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ <input type="submit" id="increase_depth" value="&nbsp;&gt;&nbsp;"
+ [% "disabled" IF realdepth < 2 || !maxdepth || maxdepth >= realdepth %]>
+ </form>
+ </td>
+
+ <td>
+ <form method="get" action="showdependencytree.cgi"
+ style="display: inline; margin: 0px;">
+ [%# Unlimited button %]
+ <input name="id" type="hidden" value="[% bugid %]">
+ <input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
+ <input type="submit" id="remove_limit"
+ value="&nbsp;Unlimited&nbsp;"
+ [% "disabled" IF maxdepth == 0 || maxdepth == realdepth %]>
+ </form>
+ </td>
+ </tr>
+</table>
+
+[% END %]
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
new file mode 100644
index 0000000..80c6fcd
--- /dev/null
+++ b/template/en/default/bug/edit.html.tmpl
@@ -0,0 +1,1161 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Olav Vitters <olav@bkor.dhs.org>
+ # Guy Pyrzak <guy.pyrzak@gmail.com>
+ # Elliotte Martin <emartin@everythingsolved.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS bug/time.html.tmpl %]
+
+[% USE Bugzilla %]
+[% SET select_fields = {} %]
+[% FOREACH field = Bugzilla.get_fields(
+ { type => constants.FIELD_TYPE_SINGLE_SELECT, custom => 0 })
+%]
+ [% select_fields.${field.name} = field %]
+[% END %]
+
+ <script type="text/javascript">
+ <!--
+
+ /* Outputs a link to call replyToComment(); used to reduce HTML output */
+ function addReplyLink(id, real_id) {
+ /* XXX this should really be updated to use the DOM Core's
+ * createElement, but finding a container isn't trivial.
+ */
+ [% IF user.settings.quote_replies.value != 'off' %]
+ document.write('[<a href="#add_comment" onclick="replyToComment(' +
+ id + ',' + real_id + '); return false;">reply<' + '/a>]');
+ [% END %]
+ }
+
+ /* Adds the reply text to the `comment' textarea */
+ function replyToComment(id, real_id) {
+ var prefix = "(In reply to comment #" + id + ")\n";
+ var replytext = "";
+ [% IF user.settings.quote_replies.value == 'quoted_reply' %]
+ /* pre id="comment_name_N" */
+ var text_elem = document.getElementById('comment_text_'+id);
+ var text = getText(text_elem);
+
+ /* make sure we split on all newlines -- IE or Moz use \r and \n
+ * respectively.
+ */
+ text = text.split(/\r|\n/);
+
+ for (var i=0; i < text.length; i++) {
+ replytext += "> " + text[i] + "\n";
+ }
+
+ replytext = prefix + replytext + "\n";
+ [% ELSIF user.settings.quote_replies.value == 'simple_reply' %]
+ replytext = prefix;
+ [% END %]
+
+ [% IF user.is_insider %]
+ if (document.getElementById('isprivate_' + real_id).checked) {
+ document.getElementById('newcommentprivacy').checked = 'checked';
+ }
+ [% END %]
+
+ /* <textarea id="comment"> */
+ var textarea = document.getElementById('comment');
+ textarea.value += replytext;
+
+ textarea.focus();
+ }
+
+ if (typeof Node == 'undefined') {
+ /* MSIE doesn't define Node, so provide a compatibility object */
+ window.Node = {
+ TEXT_NODE: 3,
+ ENTITY_REFERENCE_NODE: 5
+ };
+ }
+
+ /* Concatenates all text from element's childNodes. This is used
+ * instead of innerHTML because we want the actual text (and
+ * innerText is non-standard).
+ */
+ function getText(element) {
+ var child, text = "";
+ for (var i=0; i < element.childNodes.length; i++) {
+ child = element.childNodes[i];
+ var type = child.nodeType;
+ if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) {
+ text += child.nodeValue;
+ } else {
+ /* recurse into nodes of other types */
+ text += getText(child);
+ }
+ }
+ return text;
+ }
+
+[% IF user.is_timetracker %]
+ var fRemainingTime = [% bug.remaining_time %]; // holds the original value
+ function adjustRemainingTime() {
+ // subtracts time spent from remaining time
+ var new_time;
+
+ // prevent negative values if work_time > fRemainingTime
+ new_time =
+ Math.max(fRemainingTime - document.changeform.work_time.value, 0.0);
+ // get upto 2 decimal places
+ document.changeform.remaining_time.value =
+ Math.round(new_time * 100)/100;
+ }
+
+ function updateRemainingTime() {
+ // if the remaining time is changed manually, update fRemainingTime
+ fRemainingTime = document.changeform.remaining_time.value;
+ }
+
+[% END %]
+
+ //-->
+ </script>
+
+<form name="changeform" method="post" action="process_bug.cgi">
+
+ <input type="hidden" name="delta_ts" value="[% bug.delta_ts %]">
+ <input type="hidden" name="longdesclength" value="[% bug.comments.size %]">
+ <input type="hidden" name="id" value="[% bug.bug_id %]">
+ <input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]">
+
+ [% PROCESS section_title %]
+ <table class="edit_form">
+ <tr>
+ [%# 1st Column %]
+ <td id="bz_show_bug_column_1" class="bz_show_bug_column">
+ <table>
+ [%# *** ID, product, component, status, resolution, Hardware, and OS *** %]
+ [% PROCESS section_status %]
+
+ [% PROCESS section_spacer %]
+
+ [% PROCESS section_details1 %]
+
+ [% PROCESS section_spacer %]
+
+ [%# *** severity, priority, version and milestone *** %]
+ [% PROCESS section_details2 %]
+
+ [%# *** assigned to and qa contact *** %]
+ [% PROCESS section_people %]
+
+ [% PROCESS section_spacer %]
+
+ [% PROCESS section_url_keyword_whiteboard %]
+
+ [% PROCESS section_spacer %]
+
+ [%# *** Dependencies *** %]
+ [% PROCESS section_dependson_blocks %]
+
+ </table>
+ </td>
+ <td>
+ <div class="bz_column_spacer">&nbsp;</div>
+ </td>
+ [%# 2nd Column %]
+ <td id="bz_show_bug_column_2" class="bz_show_bug_column">
+ <table cellpadding="3" cellspacing="1">
+ [%# *** Reported and modified dates *** %]
+ [% PROCESS section_dates %]
+
+ [% PROCESS section_cclist %]
+
+ [% PROCESS section_spacer %]
+
+ [% PROCESS section_see_also %]
+
+ [% PROCESS section_customfields %]
+
+ [% PROCESS section_spacer %]
+
+ [% Hook.process("after_custom_fields") %]
+
+ [% PROCESS section_flags %]
+
+ </table>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="3">
+ <hr id="bz_top_half_spacer">
+ </td>
+ </tr>
+ </table>
+
+ <table id="bz_big_form_parts" cellspacing="0" cellpadding="0"><tr>
+ <td>
+ [% IF user.is_timetracker %]
+ [% PROCESS section_timetracking %]
+ [% END %]
+
+ [%# *** Attachments *** %]
+
+ [% PROCESS attachment/list.html.tmpl
+ attachments = bug.attachments
+ bugid = bug.bug_id
+ num_attachment_flag_types = bug.num_attachment_flag_types
+ show_attachment_flags = bug.show_attachment_flags
+ %]
+
+ [% PROCESS comment_box %]
+ </td>
+ <td>
+ [% PROCESS section_restrict_visibility %]
+ </td>
+ </tr></table>
+
+ [%# *** Additional Comments *** %]
+ <div id="comments">
+ [% PROCESS bug/comments.html.tmpl
+ comments = bug.comments
+ mode = user.id ? "edit" : "show"
+ %]
+ </div>
+
+</form>
+
+[%############################################################################%]
+[%# Block for the Title (alias and short desc) #%]
+[%############################################################################%]
+
+[% BLOCK section_title %]
+ [%# That's the main table, which contains all editable fields. %]
+ <div class="bz_alias_short_desc_container edit_form">
+ [% PROCESS commit_button id="_top"%]
+ <a href="show_bug.cgi?id=[% bug.bug_id %]">
+ [%-# %]<b>[% terms.Bug %]&nbsp;[% bug.bug_id FILTER html %]</b>
+ [%-# %]</a> -<span id="summary_alias_container" class="bz_default_hidden">
+ [% IF Param("usebugaliases") %]
+ [% IF bug.alias != "" %]
+ (<span id="alias_nonedit_display">[% bug.alias FILTER html %]</span>)
+ [% END %]
+ [% END %]
+ <span id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) %]</span>
+ [% IF bug.check_can_change_field('short_desc', 0, 1) ||
+ bug.check_can_change_field('alias', 0, 1) %]
+ <small class="editme">(<a href="#" id="editme_action">edit</a>)</small>
+ [% END %]
+ </span>
+
+
+ <div id="summary_alias_input">
+ <table id="summary">
+ [% IF Param("usebugaliases") %]
+ <tr>
+ [% IF bug.check_can_change_field('alias', 0, 1) %]
+ <td>
+ <label
+ for="alias"
+ title="a name for the
+ [% terms.bug %] that can be used in place of its ID number,
+ [%%] e.g. when adding it to a list of dependencies"
+ >Alias</label>:</td><td>
+ [% ELSIF bug.alias %]
+ <td colspan="2">(
+ [% ELSE %]
+ <td colspan="2">
+ [% END %]
+ [% PROCESS input inputname => "alias"
+ size => "20"
+ maxlength => "20"
+ no_td => 1
+ %][% ")" IF NOT bug.check_can_change_field('alias', 0, 1)
+ && bug.alias %]
+ </td>
+ </tr>
+ [% END %]
+ [%# *** Summary *** %]
+ <tr>
+ <td>
+ <label accesskey="s" for="short_desc"><u>S</u>ummary</label>:
+ </td>
+ <td>
+ [% PROCESS input inputname => "short_desc" size => "80" colspan => 2
+ maxlength => 255 spellcheck => "true" no_td => 1 %]
+ </td>
+ </tr>
+ </table>
+ </div>
+ </div>
+ <script type="text/javascript">
+ hideAliasAndSummary('[% bug.short_desc FILTER js %]', '[% bug.alias FILTER js %]');
+ </script>
+[% END %]
+
+[%############################################################################%]
+[%# Block for the first table in the "Details" section #%]
+[%############################################################################%]
+
+[% BLOCK section_details1 %]
+
+ [%#############%]
+ [%# PRODUCT #%]
+ [%#############%]
+
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.product,
+ override_legal_values = bug.choices.product
+ desc_url = 'describecomponents.cgi', value = bug.product
+ editable = bug.check_can_change_field('product', 0, 1) %]
+ </tr>
+ [%###############%]
+ [%# Component #%]
+ [%###############%]
+ <tr>
+ <td class="field_label">
+ <label for="component" accesskey="m">
+ <b><a href="describecomponents.cgi?product=[% bug.product FILTER url_quote %]">
+ Co<u>m</u>ponent</a>:
+ </b>
+ </label>
+ </td>
+ [% PROCESS select selname => "component" %]
+ </tr>
+ <tr>
+ <td class="field_label">
+ <label for="version"><b>Version</b></label>:
+ </td>
+
+ [% PROCESS select selname => "version" %]
+ </tr>
+ [%############%]
+ [%# PLATFORM #%]
+ [%############%]
+ <tr>
+ <td class="field_label">
+ <label for="rep_platform" accesskey="h"><b>Platform</b></label>:
+ </td>
+ <td class="field_value">
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.rep_platform,
+ no_tds = 1, value = bug.rep_platform
+ editable = bug.check_can_change_field('rep_platform', 0, 1) %]
+ [%+ INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.op_sys,
+ no_tds = 1, value = bug.op_sys
+ editable = bug.check_can_change_field('op_sys', 0, 1) %]
+ <script type="text/javascript">
+ assignToDefaultOnChange(['product', 'component']);
+ </script>
+ </td>
+ </tr>
+
+
+
+[% END %]
+
+[%############################################################################%]
+[%# Block for the status section #%]
+[%############################################################################%]
+
+[% BLOCK section_status %]
+ <tr>
+ <td class="field_label">
+ <b><a href="page.cgi?id=fields.html#status">Status</a></b>:
+ </td>
+ <td id="bz_field_status">
+ <span id="static_bug_status">
+ [% display_value("bug_status", bug.bug_status) FILTER html %]
+ [% IF bug.resolution %]
+ [%+ display_value("resolution", bug.resolution) FILTER html %]
+ [% IF bug.dup_id %]
+ of [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]
+ [% END %]
+ [% END %]
+ [% IF bug.user.canedit || bug.user.isreporter %]
+ (<a href="#add_comment"
+ onclick="window.setTimeout(function() { document.getElementById('bug_status').focus(); }, 10)">edit</a>)
+ [% END %]
+ </span>
+ </td>
+ </tr>
+[% END %]
+
+[%############################################################################%]
+[%# Block for the second table in the "Details" section #%]
+[%############################################################################%]
+
+[% BLOCK section_details2 %]
+
+ [%###############################################################%]
+ [%# Importance (priority, severity and votes) #%]
+ [%###############################################################%]
+ <tr>
+ <td class="field_label">
+ <label for="priority" accesskey="i">
+ <b><a href="page.cgi?id=fields.html#importance"><u>I</u>mportance</a></b></label>:
+ </td>
+ <td>
+ [% INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.priority,
+ no_tds = 1, value = bug.priority
+ editable = bug.check_can_change_field('priority', 0, 1) %]
+ [%+ INCLUDE bug/field.html.tmpl
+ bug = bug, field = select_fields.bug_severity,
+ no_tds = 1, value = bug.bug_severity
+ editable = bug.check_can_change_field('bug_severity', 0, 1) %]
+ [% IF bug.use_votes %]
+ <span id="votes_container">
+ [% IF bug.votes %]
+ with
+ <a href="votes.cgi?action=show_bug&amp;bug_id=[% bug.bug_id %]">
+ [% bug.votes %]
+ [% IF bug.votes == 1 %]
+ vote
+ [% ELSE %]
+ votes
+ [% END %]</a>
+ [% END %]
+ (<a href="votes.cgi?action=show_user&amp;bug_id=
+ [% bug.bug_id %]#vote_[% bug.bug_id %]">vote</a>)
+ </span>
+ [% END %]
+ </td>
+ </tr>
+
+ [% IF Param("usetargetmilestone") && bug.target_milestone %]
+ <tr>
+ <td class="field_label">
+ <label for="target_milestone">
+ <a href="page.cgi?id=fields.html#target_milestone">
+ Target&nbsp;Milestone</a></label>:
+ </td>
+ [% PROCESS select selname = "target_milestone" %]
+ </tr>
+ [% END %]
+
+[% END %]
+
+[%############################################################################%]
+[%# Block for the table in the "People" section #%]
+[%############################################################################%]
+
+[% BLOCK section_people %]
+
+ <tr>
+ <td class="field_label">
+ <b><a href="page.cgi?id=fields.html#assigned_to">Assigned To</a></b>:
+ </td>
+ <td>
+ [% IF bug.check_can_change_field("assigned_to", 0, 1) %]
+ <div id="bz_assignee_edit_container" class="bz_default_hidden">
+ <span>
+ [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
+ (<a href="#" id="bz_assignee_edit_action">edit</a>)
+ </span>
+ </div>
+ <div id="bz_assignee_input">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "assigned_to"
+ name => "assigned_to"
+ value => bug.assigned_to.login
+ size => 30
+ %]
+ <br>
+ <input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1">
+ <label id="set_default_assignee_label" for="set_default_assignee">Reset Assignee to default</label>
+ </div>
+ <script type="text/javascript">
+ hideEditableField('bz_assignee_edit_container',
+ 'bz_assignee_input',
+ 'bz_assignee_edit_action',
+ 'assigned_to',
+ '[% bug.assigned_to.login FILTER js %]' );
+ initDefaultCheckbox('assignee');
+ </script>
+ [% ELSE %]
+ [% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
+ [% END %]
+ </td>
+ </tr>
+
+ [% IF Param('useqacontact') %]
+ <tr>
+ <td class="field_label">
+ <label for="qa_contact" accesskey="q"><b><u>Q</u>A Contact</b></label>:
+ </td>
+ <td>
+ [% IF bug.check_can_change_field("qa_contact", 0, 1) %]
+ [% IF bug.qa_contact != "" %]
+ <div id="bz_qa_contact_edit_container" class="bz_default_hidden">
+ <span>
+ <span id="bz_qa_contact_edit_display">
+ [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]</span>
+ (<a href="#" id="bz_qa_contact_edit_action">edit</a>)
+ </span>
+ </div>
+ [% END %]
+ <div id="bz_qa_contact_input">
+ [% INCLUDE global/userselect.html.tmpl
+ id => "qa_contact"
+ name => "qa_contact"
+ value => bug.qa_contact.login
+ size => 30
+ emptyok => 1
+ %]
+ <br>
+ <input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1">
+ <label for="set_default_qa_contact" id="set_default_qa_contact_label">Reset QA Contact to default</label>
+ </div>
+ <script type="text/javascript">
+ [% IF bug.qa_contact != "" %]
+ hideEditableField('bz_qa_contact_edit_container',
+ 'bz_qa_contact_input',
+ 'bz_qa_contact_edit_action',
+ 'qa_contact',
+ '[% bug.qa_contact.login FILTER js %]');
+ [% END %]
+ initDefaultCheckbox('qa_contact');
+ </script>
+ [% ELSE %]
+ [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for URL Keyword and Whiteboard #%]
+[%############################################################################%]
+[% BLOCK section_url_keyword_whiteboard %]
+[%# *** URL Whiteboard Keywords *** %]
+ <tr>
+ <td class="field_label">
+ <label for="bug_file_loc" accesskey="u"><b>
+ [% IF bug.bug_file_loc
+ AND NOT bug.bug_file_loc.match("^(javascript|data)") %]
+ <a href="[% bug.bug_file_loc FILTER html %]"><u>U</u>RL</a>
+ [% ELSE %]
+ <u>U</u>RL
+ [% END %]
+ [%%]</b></label>:
+ </td>
+ <td>
+ [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
+ <span id="bz_url_edit_container" class="bz_default_hidden">
+ [% IF bug.bug_file_loc
+ AND NOT bug.bug_file_loc.match("^(javascript|data)") %]
+ <a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
+ title="[% bug.bug_file_loc FILTER html %]">
+ [% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a>
+ [% ELSE %]
+ [% bug.bug_file_loc FILTER html %]
+ [% END %]
+ (<a href="#" id="bz_url_edit_action">edit</a>)</span>
+ [% END %]
+ <span id="bz_url_input_area">
+ [% url_output = PROCESS input no_td=1 inputname => "bug_file_loc" size => "40" colspan => 2 %]
+ [% IF NOT bug.check_can_change_field("bug_file_loc", 0, 1) %]
+ <a href="[% bug.bug_file_loc FILTER html %]">[% url_output FILTER none %]</a>
+ [% ELSE %]
+ [% url_output FILTER none %]
+ [% END %]
+ </span>
+ [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
+ <script type="text/javascript">
+ hideEditableField('bz_url_edit_container',
+ 'bz_url_input_area',
+ 'bz_url_edit_action',
+ 'bug_file_loc',
+ "[% bug.bug_file_loc FILTER js %]");
+ </script>
+ [% END %]
+ </td>
+ </tr>
+
+ [% IF Param('usestatuswhiteboard') %]
+ <tr>
+ <td class="field_label">
+ <label for="status_whiteboard" accesskey="w"><b><u>W</u>hiteboard</b></label>:
+ </td>
+ [% PROCESS input inputname => "status_whiteboard" size => "40" colspan => 2 %]
+ </tr>
+ [% END %]
+
+ [% IF use_keywords %]
+ <tr>
+ <td class="field_label">
+ <label for="keywords" accesskey="k">
+ <b><a href="describekeywords.cgi"><u>K</u>eywords</a></b></label>:
+ </td>
+ [% PROCESS input inputname => "keywords" size => 40 colspan => 2
+ value => bug.keywords.join(', ') %]
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for Depends On / Blocks #%]
+[%############################################################################%]
+[% BLOCK section_dependson_blocks %]
+ <tr>
+ [% PROCESS dependencies
+ dep = { title => "Depends&nbsp;on", fieldname => "dependson" } %]
+ </tr>
+
+ <tr>
+ [% PROCESS dependencies accesskey = "b"
+ dep = { title => "<u>B</u>locks", fieldname => "blocked" } %]
+
+ <tr>
+ <th>&nbsp;</th>
+
+ <td colspan="2" align="left" id="show_dependency_tree_or_graph">
+ Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&amp;hide_resolved=1">tree</a>
+
+ [% IF Param('webdotbase') %]
+ /&nbsp;<a href="showdependencygraph.cgi?id=[% bug.bug_id %]">graph</a>
+ [% END %]
+ </td>
+ </tr>
+[% END %]
+
+
+[%############################################################################%]
+[%# Block for Restricting Visibility #%]
+[%############################################################################%]
+
+[% BLOCK section_restrict_visibility %]
+ [% RETURN UNLESS bug.groups.size %]
+
+ <div class="bz_group_visibility_section">
+ [% inallgroups = 1 %]
+ [% inagroup = 0 %]
+ [% emitted_description = 0 %]
+
+ [% FOREACH group = bug.groups %]
+ [% SET inallgroups = 0 IF NOT group.ingroup %]
+ [% SET inagroup = 1 IF group.ison %]
+
+ [% NEXT IF group.mandatory %]
+
+ [% IF NOT emitted_description %]
+ [% emitted_description = 1 %]
+ <div id="bz_restrict_group_visibility_help">
+ <b>Only users in all of the selected groups can view this
+ [%+ terms.bug %]:</b>
+ <p class="instructions">
+ Unchecking all boxes makes this a more public [% terms.bug %].
+ </p>
+ </div>
+ [% END %]
+
+ [% IF group.ingroup %]
+ <input type="hidden" name="defined_bit-[% group.bit %]" value="1">
+ [% END %]
+
+ <input type="checkbox" value="1" name="bit-[% group.bit %]"
+ id="bit-[% group.bit %]"
+ [% ' checked="checked"' IF group.ison %]
+ [% ' disabled="disabled"' IF NOT group.ingroup %]>
+ <label for="bit-[% group.bit %]">
+ [%- group.description FILTER html_light %]</label>
+ <br>
+ [% END %]
+
+ [% IF emitted_description %]
+ [% IF NOT inallgroups %]
+ <p class="instructions">Only members of a group can change the
+ visibility of [% terms.abug %] for that group.</p>
+ [% END %]
+ [% END %]
+
+ [% IF inagroup %]
+ <div id="bz_enable_role_visibility_help">
+ <b>Users in the roles selected below can always view
+ this [% terms.bug %]:</b>
+ </div>
+ <div id="bz_enable_role_visibility">
+ <div>
+ [% user_can_edit_accessible =
+ bug.check_can_change_field("reporter_accessible", 0, 1)
+ %]
+ [% IF user_can_edit_accessible %]
+ <input type="hidden" name="defined_reporter_accessible" value="1">
+ [% END %]
+ <input type="checkbox" value="1"
+ name="reporter_accessible" id="reporter_accessible"
+ [% " checked" IF bug.reporter_accessible %]
+ [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
+ <label for="reporter_accessible">Reporter</label>
+ </div>
+ <div>
+ [% user_can_edit_accessible =
+ bug.check_can_change_field("cclist_accessible", 0, 1)
+ %]
+ [% IF user_can_edit_accessible %]
+ <input type="hidden" name="defined_cclist_accessible" value="1">
+ [% END %]
+ <input type="checkbox" value="1"
+ name="cclist_accessible" id="cclist_accessible"
+ [% " checked" IF bug.cclist_accessible %]
+ [% " disabled=\"disabled\"" UNLESS user_can_edit_accessible %]>
+ <label for="cclist_accessible">CC List</label>
+ </div>
+ <p class="instructions">
+ The assignee
+ [% IF (Param('useqacontact')) %]
+ and QA contact
+ [% END %]
+ can always see [% terms.abug %], and this section does not
+ take effect unless the [% terms.bug %] is restricted to at
+ least one group.
+ </p>
+ </div>
+ [% END %]
+ </div> [%# bz_group_visibility_section %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for Dates #%]
+[%############################################################################%]
+
+[% BLOCK section_dates %]
+ <tr>
+ <td class="field_label">
+ <b>Reported</b>:
+ </td>
+ <td>
+ [% bug.creation_ts FILTER time %] by [% INCLUDE global/user.html.tmpl who = bug.reporter %]
+ </td>
+ </tr>
+
+ <tr>
+ <td class="field_label">
+ <b> Modified</b>:
+ </td>
+ <td>
+ [% bug.delta_ts FILTER time FILTER replace(':\d\d$', '') FILTER replace(':\d\d ', ' ')%]
+ (<a href="show_activity.cgi?id=[% bug.bug_id %]">[%# terms.Bug %]History</a>)
+ </td>
+
+ </tr>
+[% END %]
+
+[%############################################################################%]
+[%# Block for CC LIST #%]
+[%############################################################################%]
+[% BLOCK section_cclist %]
+ <tr>
+ <td class="field_label">
+ <label for="newcc" accesskey="a"><b>CC List</b>:</label>
+ </td>
+ <td>
+ [% IF user.id %]
+ [% IF NOT bug.cc || NOT bug.cc.contains(user.login) %]
+ [% has_role = bug.user.isreporter
+ || bug.assigned_to.id == user.id
+ || (Param('useqacontact')
+ && bug.qa_contact
+ && bug.qa_contact.id == user.id) %]
+ <input type="checkbox" id="addselfcc" name="addselfcc"
+ [% " checked=\"checked\""
+ IF user.settings.state_addselfcc.value == 'always'
+ || (!has_role
+ && user.settings.state_addselfcc.value == 'cc_unless_role') %]>
+ <label for="addselfcc">Add me to CC list</label>
+ <br>
+ [% END %]
+ [% END %]
+ [% bug.cc.size || 0 FILTER html %]
+ [% IF bug.cc.size == 1 %]
+ user
+ [% ELSE %]
+ users
+ [% END %]
+ [% IF user.id %]
+ [% IF bug.cc.contains( user.email ) %]
+ including you
+ [% END %]
+ [% END %]
+ <span id="cc_edit_area_showhide_container" class="bz_default_hidden">
+ (<a href="#" id="cc_edit_area_showhide">[% IF user.id %]edit[% ELSE %]show[% END %]</a>)
+ </span>
+ <div id="cc_edit_area">
+ <br>
+ [% IF user.id %]
+ <div>
+ <div><label for="cc"><b>Add</b></label></div>
+ [% INCLUDE global/userselect.html.tmpl
+ id => "newcc"
+ name => "newcc"
+ value => ""
+ size => 30
+ multiple => 5
+ %]
+ </div>
+ [% END %]
+ [% IF bug.cc %]
+ <select id="cc" name="cc" multiple="multiple" size="5">
+ [% FOREACH c = bug.cc %]
+ <option value="[% c FILTER email FILTER html %]">
+ [% c FILTER email FILTER html %]</option>
+ [% END %]
+ </select>
+ [% IF user.id %]
+ <br>
+ <input type="checkbox" id="removecc" name="removecc">
+ [%%]<label for="removecc">Remove selected CCs</label>
+ <br>
+ [% END %]
+ [% END %]
+ </div>
+ <script type="text/javascript">
+ hideEditableField( 'cc_edit_area_showhide_container',
+ 'cc_edit_area',
+ 'cc_edit_area_showhide',
+ '',
+ '');
+ </script>
+ </td>
+ </tr>
+[% END %]
+
+[%############################################################################%]
+[%# Block for See Also #%]
+[%############################################################################%]
+[% BLOCK section_see_also %]
+ [% IF Param('use_see_also') || bug.see_also.size %]
+ <tr>
+ [% INCLUDE bug/field.html.tmpl
+ field = bug_fields.see_also
+ value = bug.see_also
+ editable = bug.check_can_change_field('see_also', 0, 1)
+ %]
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for FLAGS #%]
+[%############################################################################%]
+
+[% BLOCK section_flags %]
+ [%# *** Flags *** %]
+ [% show_bug_flags = 0 %]
+ [% FOREACH type = bug.flag_types %]
+ [% IF (type.flags && type.flags.size > 0) || (user.id && type.is_active) %]
+ [% show_bug_flags = 1 %]
+ [% LAST %]
+ [% END %]
+ [% END %]
+ [% IF show_bug_flags %]
+ <tr>
+ <td class="field_label flags_label">
+ <label><b>Flags:</b></label>
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td colspan="2">
+ [% IF bug.flag_types.size > 0 %]
+ [% PROCESS "flag/list.html.tmpl" flag_no_header = 1
+ flag_types = bug.flag_types
+ any_flags_requesteeble = bug.any_flags_requesteeble %]
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for Custom Fields #%]
+[%############################################################################%]
+
+[% BLOCK section_customfields %]
+[%# *** Custom Fields *** %]
+
+ [% FOREACH field = Bugzilla.active_custom_fields %]
+ <tr>
+ [% PROCESS bug/field.html.tmpl value=bug.${field.name}
+ editable = bug.check_can_change_field(field.name, 0, 1)
+ value_span = 2 %]
+ </tr>
+ [% END %]
+[% END %]
+
+[%############################################################################%]
+[%# Block for Section Spacer #%]
+[%############################################################################%]
+
+[% BLOCK section_spacer %]
+ <tr>
+ <td colspan="2" class="bz_section_spacer"></td>
+ </tr>
+[% END %]
+
+
+
+
+[%############################################################################%]
+[%# Block for dependencies #%]
+[%############################################################################%]
+
+[% BLOCK dependencies %]
+
+ <th class="field_label">
+ <label for="[% dep.fieldname %]"[% " accesskey=\"$accesskey\"" IF accesskey %]>
+ [% dep.title %]</label>:
+ </th>
+ <td>
+ <span id="[% dep.fieldname %]_input_area">
+ [% IF bug.check_can_change_field(dep.fieldname, 0, 1) %]
+ <input name="[% dep.fieldname %]" id="[% dep.fieldname %]"
+ class="text_input"
+ value="[% bug.${dep.fieldname}.join(', ') %]">
+ [% END %]
+ </span>
+
+ [% FOREACH depbug = bug.${dep.fieldname} %]
+ [% depbug FILTER bug_link(depbug, use_alias => 1) FILTER none %][% " " %]
+ [% END %]
+ [% IF bug.check_can_change_field(dep.fieldname, 0, 1) %]
+ <span id="[% dep.fieldname %]_edit_container" class="edit_me bz_default_hidden" >
+ (<a href="#" id="[% dep.fieldname %]_edit_action">edit</a>)
+ </span>
+ <script type="text/javascript">
+ hideEditableField('[% dep.fieldname %]_edit_container',
+ '[% dep.fieldname %]_input_area',
+ '[% dep.fieldname %]_edit_action',
+ '[% dep.fieldname %]',
+ "[% bug.${dep.fieldname}.join(', ') %]");
+ </script>
+ [% END %]
+ </td>
+
+ [% accesskey = undef %]
+
+[% END %]
+
+[%############################################################################%]
+[%# Block for Time Tracking Group #%]
+[%############################################################################%]
+
+[% BLOCK section_timetracking %]
+ <table class="bz_time_tracking_table">
+ <tr>
+ <th>
+ <label for="estimated_time">Orig. Est.</label>
+ </th>
+ <th>
+ Current Est.
+ </th>
+ <th>
+ <label for="work_time">Hours Worked</label>
+ </th>
+ <th>
+ <label for="remaining_time">Hours Left</label>
+ </th>
+ <th>
+ %Complete
+ </th>
+ <th>
+ Gain
+ </th>
+ <th>
+ <label for="deadline">Deadline</label>
+ </th>
+ </tr>
+ <tr>
+ <td>
+ <input name="estimated_time" id="estimated_time"
+ value="[% PROCESS formattimeunit
+ time_unit=bug.estimated_time %]"
+ size="6" maxlength="6">
+ </td>
+ <td>
+ [% PROCESS formattimeunit
+ time_unit=(bug.actual_time + bug.remaining_time) %]
+ </td>
+ <td>
+ [% PROCESS formattimeunit time_unit=bug.actual_time %] +
+ <input name="work_time" id="work_time"
+ value="0" size="3" maxlength="6"
+ onchange="adjustRemainingTime();">
+ </td>
+ <td>
+ <input name="remaining_time" id="remaining_time"
+ value="[% PROCESS formattimeunit
+ time_unit=bug.remaining_time %]"
+ size="6" maxlength="6" onchange="updateRemainingTime();">
+ </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>
+ <td>
+ <input name="deadline" id="deadline" value="[% bug.deadline %]"
+ size="10" maxlength="10"><br />
+ <small>(YYYY-MM-DD)</small>
+ </td>
+ </tr>
+ <tr>
+ <td colspan="7" class="bz_summarize_time">
+ <a href="summarize_time.cgi?id=[% bug.bug_id %]&amp;do_depends=1">
+ Summarize time (including time for [% terms.bugs %]
+ blocking this [% terms.bug %])</a>
+ </td>
+ </tr>
+ </table>
+[% END %]
+
+[%############################################################################%]
+[%# Block for the Additional Comments box #%]
+[%############################################################################%]
+
+[% BLOCK comment_box %]
+ <div class="bz_section_additional_comments">
+ <a name="add_comment"></a>
+ [% IF user.id %]
+ <label for="comment" accesskey="c"><b>Additional
+ <u>C</u>omments</b></label>:
+
+ [% IF user.is_insider %]
+ <input type="checkbox" name="commentprivacy" value="1"
+ id="newcommentprivacy"
+ onClick="updateCommentTagControl(this, form)">
+ <label for="newcommentprivacy">
+ Make comment private (visible only to members of the
+ <strong>[% Param('insidergroup') FILTER html %]</strong> group)
+ </label>
+ [% END %]
+
+ <!-- This table keeps the submit button aligned with the box. -->
+ <table><tr><td>
+ [% INCLUDE global/textarea.html.tmpl
+ name = 'comment'
+ id = 'comment'
+ minrows = 10
+ maxrows = 25
+ cols = constants.COMMENT_COLS
+ %]
+ [% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %]
+ <br>
+ [% PROCESS commit_button id=""%]
+
+ <table class="status" cellspacing="0" cellpadding="0">
+ <tr>
+ <td class="field_label">
+ <b><a href="page.cgi?id=fields.html#status">Status</a></b>:
+ </td>
+ <td>
+ <a name="bug_status_bottom"></a>
+ [% PROCESS bug/knob.html.tmpl %]
+ </td>
+ </tr>
+ </table>
+ </td></tr></table>
+
+ [%# For logged-out users %]
+ [% ELSE %]
+ <table><tr><td><fieldset>
+ <legend>Note</legend>
+ You need to
+ <a href="show_bug.cgi?id=
+ [%- bug.bug_id %]&amp;GoAheadAndLogIn=1">log in</a>
+ before you can comment on or make changes to this [% terms.bug %].
+ </fieldset></table><tr></td>
+ [% END %]
+ </div>
+[% END %]
+
+[%############################################################################%]
+[%# Block for SELECT fields #%]
+[%############################################################################%]
+
+[% BLOCK select %]
+ <td>
+ [% IF bug.check_can_change_field(selname, 0, 1)
+ AND bug.choices.${selname}.size > 1 %]
+ <select id="[% selname %]" name="[% selname %]">
+ [% FOREACH x = bug.choices.${selname} %]
+ <option value="[% x.name FILTER html %]"
+ [% " selected" IF x.name == bug.${selname} %]>
+ [%- x.name FILTER html %]
+ </option>
+ [% END %]
+ </select>
+ [% ELSE %]
+ [% bug.${selname} FILTER html %]
+ [% END %]
+ </td>
+[% END %]
+
+[%############################################################################%]
+[%# Block for INPUT fields #%]
+[%############################################################################%]
+
+[% BLOCK input %]
+ [% IF no_td != 1 %]
+ <td[% " colspan=\"$colspan\"" IF colspan %]>
+ [% END %]
+ [% val = value ? value : bug.$inputname %]
+ [% IF bug.check_can_change_field(inputname, 0, 1) %]
+ <input id="[% inputname %]" name="[% inputname %]" class="text_input"
+ value="[% val FILTER html %]"[% " size=\"$size\"" IF size %]
+ [% " maxlength=\"$maxlength\"" IF maxlength %]
+ [% " spellcheck=\"$spellcheck\"" IF spellcheck %]>
+ [% ELSE %]
+ [% IF size && val.length > size %]
+ <span title="[% val FILTER html %]">
+ [% val FILTER truncate(size) FILTER html %]
+ </span>
+ [% ELSE %]
+ [% val FILTER html %]
+ [% END %]
+ [% END %]
+ [% IF no_td != 1 %]
+ </td>
+ [% END %]
+ [% no_td = 0 %]
+ [% maxlength = 0 %]
+ [% colspan = 0 %]
+ [% size = 0 %]
+ [% value = undef %]
+ [% spellcheck = undef %]
+[% END %]
+[% BLOCK commit_button %]
+ [% IF user.id %]
+ <div class="knob-buttons">
+ <input type="submit" value="Save Changes"
+ id="commit[% id FILTER css_class_quote %]">
+ [% IF bug.user.canmove %]
+ <input type="submit" name="action" id="action[% id FILTER css_class_quote %]" value="[% Param("move-button-text") %]">
+ [% END %]
+ </div>
+ [% END %]
+[% END %]
diff --git a/template/en/default/bug/field-events.js.tmpl b/template/en/default/bug/field-events.js.tmpl
new file mode 100644
index 0000000..06fba12
--- /dev/null
+++ b/template/en/default/bug/field-events.js.tmpl
@@ -0,0 +1,40 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is the San Jose State
+ # University Foundation. Portions created by the Initial Developer
+ # are Copyright (C) 2008 the Initial Developer. All Rights Reserved.
+ #
+ # Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # field: a Bugzilla::Field object
+ #%]
+
+[% FOREACH controlled_field = field.controls_visibility_of %]
+ showFieldWhen('[% controlled_field.name FILTER js %]',
+ '[% field.name FILTER js %]',
+ '[% controlled_field.visibility_value.name FILTER js %]');
+[% END %]
+[% FOREACH legal_value = field.legal_values %]
+ [% FOREACH controlled_field = legal_value.controlled_values.keys %]
+ [% SET cont_ids = [] %]
+ [% FOREACH val = legal_value.controlled_values.$controlled_field %]
+ [% cont_ids.push(val.id) %]
+ [% END %]
+ showValueWhen('[% controlled_field FILTER js %]',
+ [[% cont_ids.join(',') FILTER js %]],
+ '[% field.name FILTER js %]',
+ [% legal_value.id FILTER js %]);
+ [% END %]
+[% END %]
diff --git a/template/en/default/bug/field.html.tmpl b/template/en/default/bug/field.html.tmpl
new file mode 100644
index 0000000..bb678d7
--- /dev/null
+++ b/template/en/default/bug/field.html.tmpl
@@ -0,0 +1,215 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Elliotte Martin <elliotte_martin@yahoo.com>
+ #%]
+
+[%# INTERFACE:
+ # field: a Bugzilla::Field object
+ # value: The value of the field for this bug.
+ # override_legal_values (optional): The list of legal values, for select fields.
+ # editable: Whether the field should be displayed as an editable
+ # <input> or as just the plain text of its value.
+ # allow_dont_change: display the --do_not_change-- option for select fields.
+ # value_span: A colspan for the table cell containing
+ # the field value.
+ # no_tds: boolean; if true, don't display the label <th> or the
+ # wrapping <td> for the field.
+ # desc_url: string; Normally the label of a non-custom field links to
+ # fields.html. If you want it to link elsewhere, specify the
+ # relative URL you want to link to, here. Remember to call
+ # url_quote on any query string arguments.
+ # bug (optional): The current Bugzilla::Bug being displayed, or a hash
+ # with default field values being displayed on a page.
+ #%]
+
+[% SET hidden = 0 %]
+[% IF field.visibility_field.defined %]
+ [% IF !bug.${field.visibility_field.name}
+ .contains(field.visibility_value.name)
+ %]
+ [% SET hidden = 1 %]
+ [% END %]
+[% END %]
+
+[% IF NOT no_tds %]
+ <th class="field_label [% ' bz_hidden_field' IF hidden %]"
+ id="field_label_[% field.name FILTER html %]">
+ [% IF editable %]
+ <label for="[% field.name FILTER html %]">
+ [% END %]
+ [% IF desc_url %]
+ <a href="[% desc_url FILTER html %]">
+ [% ELSIF !field.custom %]
+ <a href="page.cgi?id=fields.html#[% field.name FILTER url_quote %]">
+ [% END -%]
+ [% field_descs.${field.name} FILTER html %]:
+ [%- '</a>' IF (!field.custom || desc_url) %]
+ [% '</label>' IF editable %]
+ </th>
+[% END %]
+
+[% IF NOT no_tds %]
+<td class="field_value [% ' bz_hidden_field' IF hidden %]"
+ id="field_container_[% field.name FILTER html %]"
+ [% " colspan=\"$value_span\"" FILTER none IF value_span %]>
+[% END %]
+[% Hook.process('start_field_column') %]
+[% IF editable %]
+ [% SWITCH field.type %]
+ [% CASE constants.FIELD_TYPE_FREETEXT %]
+ <input id="[% field.name FILTER html %]" class="text_input"
+ name="[% field.name FILTER html %]"
+ value="[% value FILTER html %]" size="40"
+ maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]">
+ [% CASE constants.FIELD_TYPE_DATETIME %]
+ <input name="[% field.name FILTER html %]" size="20"
+ id="[% field.name FILTER html %]"
+ value="[% value FILTER html %]"
+ onchange="updateCalendarFromField(this)">
+ <button type="button" class="calendar_button"
+ id="button_calendar_[% field.name FILTER html %]"
+ onclick="showCalendar('[% field.name FILTER js %]')">
+ <span>Calendar</span>
+ </button>
+
+ <div id="con_calendar_[% field.name FILTER html %]"
+ class="yui-skin-sam"></div>
+
+ <script type="text/javascript">
+ createCalendar('[% field.name FILTER js %]')
+ </script>
+ [% CASE constants.FIELD_TYPE_BUG_ID %]
+ <span id="[% field.name FILTER html %]_input_area">
+ <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]"
+ value="[% value FILTER html %]" size="7">
+ </span>
+
+ [% IF bug.${field.name} %]
+ [% bug.${field.name} FILTER bug_link(bug.${field.name}) FILTER none %]
+ [% END %]
+ <span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden">
+ (<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>)
+ </span>
+ <script type="text/javascript">
+ hideEditableField('[% field.name FILTER js %]_edit_container',
+ '[% field.name FILTER js %]_input_area',
+ '[% field.name FILTER js %]_edit_action',
+ '[% field.name FILTER js %]',
+ "[% bug.${field.name} FILTER js %]");
+ </script>
+ [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
+ constants.FIELD_TYPE_MULTI_SELECT ] %]
+ <select id="[% field.name FILTER html %]"
+ name="[% field.name FILTER html %]"
+ [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
+ [% SET field_size = 5 %]
+ [% IF field.legal_values.size < 5 %]
+ [% SET field_size = field.legal_values.size %]
+ [% END %]
+ size="[% field_size FILTER html %]" multiple="multiple"
+ [% END %]
+ >
+ [% IF allow_dont_change %]
+ <option value="[% dontchange FILTER html %]"
+ [% ' selected="selected"' IF value == dontchange %]>
+ [% dontchange FILTER html %]
+ </option>
+ [% END %]
+ [% IF override_legal_values %]
+ [% legal_values = override_legal_values %]
+ [% ELSE %]
+ [% legal_values = field.legal_values %]
+ [% END %]
+ [% FOREACH legal_value = legal_values %]
+ [% SET control_value = legal_value.visibility_value %]
+ [% SET control_field = field.value_field %]
+ <option value="[% legal_value.name FILTER html %]"
+ id="v[% legal_value.id FILTER html %]_
+ [%- field.name FILTER html %]"
+ [%# We always show selected values, even if they should be
+ # hidden %]
+ [% IF value.contains(legal_value.name).size %]
+ selected="selected"
+ [% ELSIF (control_field && control_value
+ && !bug.${control_field.name}.contains(control_value.name))
+ || !legal_value.is_active
+ %]
+ class="bz_hidden_option" disabled="disabled"
+ [% END %]>
+ [%- display_value(field.name, legal_value.name) FILTER html ~%]
+ </option>
+ [% END %]
+ </select>
+ [%# When you pass an empty multi-select in the web interface,
+ # it doesn't appear at all in the CGI object. Instead of
+ # forcing all users of process_bug to always specify every
+ # multi-select, we have this field defined if the multi-select
+ # field is defined, and then if this is passed but the multi-select
+ # isn't, we know that the multi-select was emptied.
+ %]
+ [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
+ <input type="hidden" name="defined_[% field.name FILTER html %]">
+ [% END %]
+
+ <script type="text/javascript">
+ <!--
+ initHidingOptionsForIE('[% field.name FILTER js %]');
+ [%+ INCLUDE "bug/field-events.js.tmpl" field = field %]
+ //-->
+ </script>
+
+ [% CASE constants.FIELD_TYPE_TEXTAREA %]
+ [% INCLUDE global/textarea.html.tmpl
+ id = field.name name = field.name minrows = 4 maxrows = 8
+ cols = 60 defaultcontent = value %]
+ [% CASE constants.FIELD_TYPE_BUG_URLS %]
+ [% '<ul class="bug_urls">' IF value.size %]
+ [% FOREACH url = value %]
+ <li>
+ <a href="[% url FILTER html %]">[% url FILTER html %]</a>
+ [% IF editable %]
+ <label><input type="checkbox" value="[% url FILTER html %]"
+ name="remove_[% field.name FILTER html %]">
+ Remove</label>
+ [% END %]
+ </li>
+ [% END %]
+ [% '</ul>' IF value.size %]
+
+ [% IF editable && Param('use_see_also') %]
+ <label for="[% field.name FILTER html %]">
+ <strong>Add [% terms.Bug %] URLs:</strong>
+ </label><br>
+ <input type="text" id="[% field.name FILTER html %]" size="40"
+ class="text_input" name="[% field.name FILTER html %]">
+ [% END %]
+ [% END %]
+[% ELSIF field.type == constants.FIELD_TYPE_TEXTAREA %]
+ <div class="uneditable_textarea">[% value FILTER wrap_comment(60)
+ FILTER html %]</div>
+[% ELSIF field.type == constants.FIELD_TYPE_BUG_ID %]
+ [% IF bug.${field.name} %]
+ [% bug.${field.name} FILTER bug_link(bug.${field.name}) FILTER none %]
+ [% END %]
+[% ELSE %]
+ [% value.join(', ') FILTER html %]
+[% END %]
+[% Hook.process('end_field_column') %]
+[% '</td>' IF NOT no_tds %]
diff --git a/template/en/default/bug/format_comment.txt.tmpl b/template/en/default/bug/format_comment.txt.tmpl
new file mode 100644
index 0000000..7d33c23
--- /dev/null
+++ b/template/en/default/bug/format_comment.txt.tmpl
@@ -0,0 +1,68 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Marc Schumann.
+ # Portions created by Marc Schumann are Copyright (c) 2008 Marc Schumann.
+ # All rights reserved.
+ #
+ # Contributor(s): Marc Schumann <wurblzap@gmail.com>
+ #%]
+
+[%# NOTE: Everywhere you use this template, you must call
+ # "FILTER remove('^X')" on the result. This is unfortunately the only way
+ # to preserve leading whitespace in comments.
+ #%]
+
+[%# INTERFACE:
+ # comment: A Bugzilla::Comment object.
+ # is_bugmail: boolean; True if this comment is going into a plain-text
+ # bugmail.
+ #%]
+
+[%# Please don't use field-descs here. It can slow down Bugzilla. %]
+[% PROCESS 'global/variables.none.tmpl' %]
+
+[% SET comment_body = comment.body %]
+
+[% IF comment.type == constants.CMT_DUPE_OF %]
+X[% comment_body %]
+
+*** This [% terms.bug %] has been marked as a duplicate of [% terms.bug %] [%+ comment.extra_data %] ***
+[% ELSIF comment.type == constants.CMT_HAS_DUPE %]
+*** [% terms.Bug %] [%+ comment.extra_data %] has been marked as a duplicate of this [% terms.bug %]. ***
+[% ELSIF comment.type == constants.CMT_POPULAR_VOTES %]
+*** This [% terms.bug %] has been confirmed by popular vote. ***
+[% ELSIF comment.type == constants.CMT_MOVED_TO %]
+X[% comment_body %]
+
+[%+ terms.Bug %] moved to [% Param("move-to-url") %].
+If the move succeeded, [% comment.extra_data %] will receive a mail containing
+the number of the new [% terms.bug %] in the other database.
+If all went well, please paste in a link to the new [% terms.bug %].
+Otherwise, reopen this [% terms.bug %].
+[% ELSIF comment.type == constants.CMT_ATTACHMENT_CREATED %]
+Created attachment [% comment.extra_data %]
+[% IF is_bugmail %]
+ --> [% urlbase _ "attachment.cgi?id=" _ comment.extra_data %]
+[% END %]
+[%+ comment.attachment.description %]
+
+[%+ comment.body %]
+[% ELSIF comment.type == constants.CMT_ATTACHMENT_UPDATED %]
+Comment on attachment [% comment.extra_data %]
+[% IF is_bugmail %]
+ --> [% urlbase _ "attachment.cgi?id=" _ comment.extra_data %]
+[% END %]
+[%+ comment.attachment.description %]
+
+[%+ comment.body %]
+[% END %]
diff --git a/template/en/default/bug/knob.html.tmpl b/template/en/default/bug/knob.html.tmpl
new file mode 100644
index 0000000..ac14e6d
--- /dev/null
+++ b/template/en/default/bug/knob.html.tmpl
@@ -0,0 +1,100 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Guy Pyrzak <guy.pyrzak@gmail.com>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+<div id="status">
+ [% PROCESS bug/field.html.tmpl
+ no_tds = 1
+ field = bug_fields.bug_status
+ value = bug.bug_status
+ override_legal_values = bug.choices.bug_status
+ editable = bug.choices.bug_status.size > 1
+ %]
+
+ [% IF bug.resolution
+ OR bug.check_can_change_field('resolution', bug.resolution, 1)
+ %]
+ <noscript><br>resolved&nbsp;as&nbsp;</noscript>
+ [% END %]
+
+ <span id="resolution_settings">
+ [% PROCESS bug/field.html.tmpl
+ no_tds = 1
+ field = bug_fields.resolution
+ value = bug.resolution
+ override_legal_values = bug.choices.resolution
+ editable = bug.check_can_change_field('resolution', bug.resolution, 1)
+ %]
+ </span>
+
+ [% IF bug.check_can_change_field('dup_id', 0, 1) %]
+ <noscript><br> duplicate</noscript>
+ <span id="duplicate_settings">of
+ <span id="dup_id_container" class="bz_default_hidden">
+ [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]
+ (<a href="#" id="dup_id_edit_action">edit</a>)
+ </span
+ ><input id="dup_id" name="dup_id" size="6"
+ value="[% bug.dup_id FILTER html %]">
+ </span>
+ [% IF bug.dup_id %]
+ <noscript>[% bug.dup_id FILTER bug_link(bug.dup_id) FILTER none %]</noscript>
+ [% END %]
+ <div id="dup_id_discoverable" class="bz_default_hidden">
+ <a href="#" id="dup_id_discoverable_action">Mark as Duplicate</a>
+ </div>
+ [% ELSIF bug.dup_id %]
+ <noscript><br> duplicate</noscript>
+ <span id="duplicate_display">of
+ [% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]</span>
+ [% END %]
+</div>
+
+<script type="text/javascript">
+ var close_status_array = [
+ [% FOREACH status = bug.choices.bug_status %]
+ [% NEXT IF status.is_open %]
+ '[% status.name FILTER js %]'[% ',' UNLESS loop.last %]
+ [% END %]
+ ];
+ YAHOO.util.Dom.removeClass('dup_id_discoverable', 'bz_default_hidden');
+ hideEditableField( "dup_id_container", "dup_id", 'dup_id_edit_action',
+ 'dup_id', '[% bug.dup_id FILTER js %]' )
+ showHideStatusItems( "", ['[% "is_duplicate" IF bug.dup_id %]',
+ '[% bug.bug_status FILTER js %]']);
+ YAHOO.util.Event.addListener( 'bug_status', "change", showHideStatusItems,
+ ['[% "is_duplicate" IF bug.dup_id %]',
+ '[% bug.bug_status FILTER js %]']);
+ YAHOO.util.Event.addListener( 'resolution', "change", showDuplicateItem);
+ YAHOO.util.Event.addListener( 'dup_id_discoverable_action',
+ 'click',
+ setResolutionToDuplicate,
+ '[% Param('duplicate_or_move_bug_status')
+ FILTER js %]');
+ YAHOO.util.Event.addListener( window, 'load', showHideStatusItems,
+ ['[% "is_duplicate" IF bug.dup_id %]',
+ '[% bug.bug_status FILTER js %]'] );
+
+ [% INCLUDE "bug/field-events.js.tmpl" field = select_fields.bug_status %]
+ [% INCLUDE "bug/field-events.js.tmpl" field = select_fields.resolution %]
+</script>
diff --git a/template/en/default/bug/navigate.html.tmpl b/template/en/default/bug/navigate.html.tmpl
new file mode 100644
index 0000000..4a3d063
--- /dev/null
+++ b/template/en/default/bug/navigate.html.tmpl
@@ -0,0 +1,87 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% IF bottom_navigator == 1 %]
+ <ul class="related_actions">
+ <li><a href="show_bug.cgi?format=multiple&amp;id=
+ [% bug.bug_id FILTER url_quote %]">Format For Printing</a></li>
+ <li>&nbsp;-&nbsp;<a href="show_bug.cgi?ctype=xml&amp;id=
+ [% bug.bug_id FILTER url_quote %]">XML</a></li>
+ <li>&nbsp;-&nbsp;<a href="enter_bug.cgi?cloned_bug_id=
+ [% bug.bug_id FILTER url_quote %]">Clone This
+ [% terms.Bug %]</a></li>
+ [%# Links to more things users can do with this bug. %]
+ [% Hook.process("links") %]
+ <li>&nbsp;-&nbsp;<a href="#">Top of page </a></li>
+ </ul>
+[% END %]
+
+
+<div class="navigation">
+[% IF last_bug_list.size > 0 %]
+ [% this_bug_idx = lsearch(last_bug_list, bug.id) %]
+ <b>[% terms.Bug %] List:</b>
+ [% IF this_bug_idx != -1 %]
+ ([% this_bug_idx + 1 %] of [% last_bug_list.size %])
+ [% END %]
+
+ [% IF this_bug_idx != -1 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.first FILTER url_quote %]">First</a>
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.last FILTER url_quote %]">Last</a>
+ [% END %]
+
+ [% IF bug.bug_id %]
+ [% IF this_bug_idx != -1 %]
+ [% IF this_bug_idx > 0 %]
+ [% prev_bug = this_bug_idx - 1 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.$prev_bug FILTER url_quote %]">Prev</a>
+ [% ELSE %]
+ <i><font color="#777777">Prev</font></i>
+ [% END %]
+
+ [% IF this_bug_idx + 1 < last_bug_list.size %]
+ [% next_bug = this_bug_idx + 1 %]
+ <a href="show_bug.cgi?id=
+ [%- last_bug_list.$next_bug FILTER url_quote %]">Next</a>
+ [% ELSE %]
+ <i><font color="#777777">Next</font></i>
+ [% END %]
+ [% ELSE %]
+ (This [% terms.bug %] is not in your last search results)
+ [% END %]
+ [% ELSE %]
+ &nbsp;&nbsp;
+ [% END %]
+
+ &nbsp;&nbsp;<a href="buglist.cgi?regetlastlist=1">Show last search results</a>
+[% ELSE %]
+ [%# With no list, don't show link to search results %]
+ <i><font color="#777777">First</font></i>
+ <i><font color="#777777">Last</font></i>
+ <i><font color="#777777">Prev</font></i>
+ <i><font color="#777777">Next</font></i>
+ &nbsp;&nbsp;
+ <i><font color="#777777">No search results available</font></i>
+[% END %]
+</div>
diff --git a/template/en/default/bug/process/bugmail.html.tmpl b/template/en/default/bug/process/bugmail.html.tmpl
new file mode 100644
index 0000000..b0132a2
--- /dev/null
+++ b/template/en/default/bug/process/bugmail.html.tmpl
@@ -0,0 +1,60 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # J. Paul Reed <preed@sigkill.com>
+ #%]
+
+[%# INTERFACE:
+ # mailing_bugid: The bug ID that email is being sent for.
+ # sent_bugmail: The results of Bugzilla::BugMail::Send().
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<dl>
+[% PROCESS emails
+ description = "Email sent to"
+ names = sent_bugmail.sent
+%]
+
+[% PROCESS emails
+ description = "Excluding"
+ names = sent_bugmail.excluded
+%]
+</dl>
+
+[%############################################################################%]
+[%# Block for a set of email addresses #%]
+[%############################################################################%]
+
+[% BLOCK emails %]
+ <dt>[% description FILTER html %]:</dt>
+ <dd>
+ [% IF user.can_see_bug(mailing_bugid) %]
+ [% IF names.size > 0 %]
+ [%+ FOREACH name = names %]
+ <code>[% name FILTER html %]</code>[% ", " UNLESS loop.last() %]
+ [% END %]
+ [% ELSE %]
+ no one
+ [% END %]
+ [% ELSE %]
+ (list of e-mails not available)
+ [% END %]
+ </dd>
+[% END %]
diff --git a/template/en/default/bug/process/confirm-duplicate.html.tmpl b/template/en/default/bug/process/confirm-duplicate.html.tmpl
new file mode 100644
index 0000000..d89c8da
--- /dev/null
+++ b/template/en/default/bug/process/confirm-duplicate.html.tmpl
@@ -0,0 +1,75 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # original_bug_id: number; the bug number for the bug
+ # against which a bug is being duped
+ # duplicate_bug_id: number; the bug number for the bug
+ # being duped
+ # cclist_accessible: boolean; whether or not users on the cc: list
+ # of the original bug can access that bug.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+[% PROCESS global/header.html.tmpl title="Duplicate Warning" %]
+[% orig_bug = "$terms.bug $original_bug_id"
+ FILTER bug_link(original_bug_id) %]
+
+<p>
+ When marking [% terms.abug %] as a duplicate, the reporter of the duplicate
+ is normally added to the CC list of the original. The permissions
+ on [% orig_bug FILTER none %] (the original) are currently set
+ such that the reporter would not normally be able to see it.
+</p>
+
+<p>
+ <b>Adding the reporter to the CC list of [% orig_bug FILTER none %]
+ [% IF cclist_accessible %]
+ will immediately
+ [% ELSE %]
+ might, in the future,
+ [% END %]
+ allow him/her access to view this [% terms.bug %].</b>
+ Do you wish to do this?
+</p>
+
+<form method="post" action="process_bug.cgi">
+
+[% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %]
+
+<p>
+ <input type="radio" name="confirm_add_duplicate" value="1">
+ Yes, add the reporter to CC list on [% orig_bug FILTER none %]
+</p>
+<p>
+ <input type="radio" name="confirm_add_duplicate" value="0" checked="checked">
+ No, do not add the reporter to CC list on [% orig_bug FILTER none %]
+</p>
+<p>
+ [% "Throw away my changes, and revisit $terms.bug $duplicate_bug_id"
+ FILTER bug_link(duplicate_bug_id) FILTER none %]
+</p>
+<p>
+ <input type="submit" id="process" value="Submit">
+</p>
+
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/process/header.html.tmpl b/template/en/default/bug/process/header.html.tmpl
new file mode 100644
index 0000000..79f0126
--- /dev/null
+++ b/template/en/default/bug/process/header.html.tmpl
@@ -0,0 +1,46 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # As global/header.html.tmpl.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% USE Bugzilla %]
+
+[% PROCESS "bug/show-header.html.tmpl" %]
+
+[% IF title_tag == "bug_processed" %]
+ [% title = BLOCK %]
+ [% IF Bugzilla.cgi.param('id') %]
+ [% terms.Bug %] [%+ id FILTER html %]
+ [% ELSE %]
+ [% terms.Bugs %]
+ [% END %]
+ processed
+ [% END %]
+[% ELSIF title_tag == "mid_air" %]
+ [% title = "Mid-air collision!" %]
+[% ELSIF title_tag == "change_votes" %]
+ [% title = "Change Votes" %]
+[% END %]
+
+[% PROCESS global/header.html.tmpl %]
diff --git a/template/en/default/bug/process/midair.html.tmpl b/template/en/default/bug/process/midair.html.tmpl
new file mode 100644
index 0000000..34031fc
--- /dev/null
+++ b/template/en/default/bug/process/midair.html.tmpl
@@ -0,0 +1,109 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # operations: array; bug activity since the user last displayed the bug form,
+ # used by bug/activity/table.html.tmpl to display recent changes that will
+ # be overwritten if the user submits these changes. See that template
+ # for further documentation.
+ # start_at: number; the comment at which show/comments.tmpl should begin
+ # displaying comments, either the index of the last comment (if the user
+ # entered a comment along with their change) or a number less than that
+ # (if they didn't), in which case no comments are displayed.
+ # comments: array; all the comments on the bug.
+ # bug: Bugzilla::Bug; the bug being changed.
+ #%]
+
+[%# The global Bugzilla->cgi object is used to obtain form variable values. %]
+[% USE Bugzilla %]
+[% cgi = Bugzilla.cgi %]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% UNLESS header_done %]
+ [% PROCESS bug/process/header.html.tmpl %]
+[% END %]
+
+<h1>Mid-air collision detected!</h1>
+
+<p>
+ Someone else has made changes to
+ [%+ "$terms.bug $bug.id" FILTER bug_link(bug) FILTER none %]
+ at the same time you were trying to.
+ The changes made were:
+</p>
+
+<p>
+ [% PROCESS "bug/activity/table.html.tmpl" incomplete_data=0 %]
+</p>
+
+[% IF comments.size > start_at %]
+<p>
+ Added the comment(s):
+ <blockquote>
+ [% PROCESS "bug/comments.html.tmpl" %]
+ </blockquote>
+</p>
+[% END %]
+
+[% IF cgi.param("comment") %]
+<p>
+ Your comment was:<br>
+ <blockquote><pre class="bz_comment_text">
+ [% cgi.param("comment") FILTER wrap_comment FILTER html %]
+ </pre></blockquote>
+</p>
+[% END %]
+
+<p>
+You have the following choices:
+</p>
+
+<ul>
+ <li>
+ <form method="post" action="process_bug.cgi">
+ <input type="hidden" name="delta_ts"
+ value="[% bug.delta_ts FILTER html %]">
+ [% PROCESS "global/hidden-fields.html.tmpl"
+ exclude="^Bugzilla_login|Bugzilla_password|delta_ts$" %]
+ <input type="submit" id="process" value="Submit my changes anyway">
+ This will cause all of the above changes to be overwritten
+ [% ", except for the added comment(s)" IF comments.size > start_at %].
+ </form>
+ </li>
+ [% IF cgi.param("comment") %]
+ <li>
+ <form method="post" action="process_bug.cgi">
+ <input type="hidden" name="id" value="[% cgi.param("id") FILTER html %]">
+ <input type="hidden" name="delta_ts" value="[% bug.delta_ts FILTER html %]">
+ <input type="hidden" name="comment" value="[% cgi.param("comment") FILTER html %]">
+ <input type="hidden" name="commentprivacy" value="[% cgi.param("commentprivacy") FILTER html %]">
+ <input type="hidden" name="token" value="[% cgi.param("token") FILTER html %]">
+ <input type="submit" id="process_comment" value="Submit only my new comment">
+ </form>
+ </li>
+ [% END %]
+ <li>
+ Throw away my changes, and
+ [%+ "revisit $terms.bug $bug.id" FILTER bug_link(bug) FILTER none %]
+ </li>
+</ul>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/process/results.html.tmpl b/template/en/default/bug/process/results.html.tmpl
new file mode 100644
index 0000000..ee218d4
--- /dev/null
+++ b/template/en/default/bug/process/results.html.tmpl
@@ -0,0 +1,58 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ #%]
+
+[%# INTERFACE:
+ # id: number; the ID of the bug that was changed/checked.
+ #
+ # type: string; the type of change/check that was made: "bug" when a bug
+ # is changed, "dupe" when a duplication notation is added to a bug,
+ # and "dep" when a bug is checked for changes to its dependencies.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% UNLESS header_done %]
+ [% PROCESS bug/process/header.html.tmpl %]
+[% END %]
+
+[% DEFAULT type="bug" %]
+
+[% Link = BLOCK %][% "$terms.Bug $id" FILTER bug_link(id) %][% END %]
+[% link = BLOCK %][% "$terms.bug $id" FILTER bug_link(id) %][% END %]
+
+[%
+ title = {
+ 'bug' => "Changes submitted for $link" ,
+ 'dupe' => "Duplicate notation added to $link" ,
+ 'dep' => "Checking for dependency changes on $link" ,
+ 'votes' => "$Link confirmed by number of votes" ,
+ 'created' => "$Link has been added to the database" ,
+ 'move' => "$Link has been moved to another database" ,
+ }
+%]
+
+<dl>
+ <dt>[% title.$type %]</dt>
+ <dd>
+ [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = id %]
+ [%# Links to more information about the changed bug. %]
+ [% Hook.process("links") %]
+ </dd>
+</dl>
diff --git a/template/en/default/bug/process/verify-new-product.html.tmpl b/template/en/default/bug/process/verify-new-product.html.tmpl
new file mode 100644
index 0000000..1cc186c
--- /dev/null
+++ b/template/en/default/bug/process/verify-new-product.html.tmpl
@@ -0,0 +1,205 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# INTERFACE:
+ # product: object; the new product.
+ # versions: array; versions for the new product.
+ # components: array; components for the new product.
+ # milestones: array; milestones for the new product.
+ # defaults: hash; keys are names of fields, values are defaults for
+ # those fields
+ #
+ # verify_bug_groups: If groups need to be confirmed in addition to fields.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = 'Verify New Product Details...' %]
+
+<form action="process_bug.cgi" method="post">
+
+[% SET exclude_items = ['version', 'component', 'target_milestone'] %]
+[% IF verify_bug_groups %]
+ [% exclude_items.push('bit-\d+') %]
+[% END %]
+[% Hook.process('exclude') %]
+
+[% PROCESS "global/hidden-fields.html.tmpl"
+ exclude = '^' _ exclude_items.join('|') _ '$' %]
+
+<input type="hidden" name="confirm_product_change" value="1">
+
+[%# Verify the version, component, and target milestone fields. %]
+<h3>Verify Version, Component
+ [%- ", Target Milestone"
+ IF Param("usetargetmilestone")
+ && bug.check_can_change_field('target_milestone', 0, 1) %]</h3>
+
+<p>
+[% IF Param("usetargetmilestone")
+ && bug.check_can_change_field('target_milestone', 0, 1)
+%]
+ You are moving the [% terms.bug %](s) to the product
+ <b>[% product.name FILTER html %]</b>,
+ and the version, component, and/or target milestone fields are no longer
+ correct. Please set the correct version, component, and target milestone now:
+[% ELSE %]
+ You are moving the [% terms.bug %](s) to the product
+ <b>[% product.name FILTER html %]</b>,
+ and the version and component fields are no longer correct.
+ Please set the correct version and component now:
+[% END %]
+</p>
+
+<table>
+ <tr>
+ <td>
+ <b>Version:</b><br>
+ [% IF versions.size == 1 %]
+ [% SET default_version = versions.0 %]
+ [% ELSE %]
+ [% SET default_version = defaults.version %]
+ [% END %]
+ [% PROCESS "global/select-menu.html.tmpl"
+ name="version"
+ options=versions
+ default=default_version
+ size=10 %]
+ </td>
+ <td>
+ <b>Component:</b><br>
+ [% IF components.size == 1 %]
+ [% SET default_component = components.0 %]
+ [% ELSE %]
+ [% SET default_component = defaults.component %]
+ [% END %]
+ [% PROCESS "global/select-menu.html.tmpl"
+ name="component"
+ options=components
+ default=default_component
+ size=10 %]
+ </td>
+ [% IF Param("usetargetmilestone")
+ && bug.check_can_change_field('target_milestone', 0, 1)
+ %]
+ <td>
+ <b>Target Milestone:</b><br>
+ [% PROCESS "global/select-menu.html.tmpl"
+ name="target_milestone"
+ options=milestones
+ default=defaults.milestone
+ size=10 %]
+ </td>
+ [% END %]
+ [% Hook.process('field') %]
+ </tr>
+</table>
+
+[% IF verify_bug_groups %]
+ <h3>Verify [% terms.Bug %] Group</h3>
+
+ [% IF old_groups.size %]
+ <p>These groups are not legal for the '[% product.name FILTER html %]'
+ product or you are not allowed to restrict [% terms.bugs %] to these groups.
+ [%+ terms.Bugs %] will no longer be restricted to these groups and may become
+ public if no other group applies:<br>
+ [% FOREACH group = old_groups %]
+ <input type="checkbox" id="bit-[% group.id FILTER html %]"
+ name="bit-[% group.id FILTER html %]" disabled="disabled" value="1">
+ <label for="bit-[% group.id FILTER html %]">
+ [% group.name FILTER html %]: [% group.description FILTER html %]
+ </label>
+ <br>
+ [% END %]
+ </p>
+ [% END %]
+
+ [% mandatory_groups = [] %]
+ [% optional_groups = [] %]
+
+ [% FOREACH gid = product.group_controls.keys %]
+ [% group = product.group_controls.$gid %]
+ [% NEXT UNLESS group.group.is_active %]
+
+ [% IF group.membercontrol == constants.CONTROLMAPMANDATORY
+ || (group.othercontrol == constants.CONTROLMAPMANDATORY && !user.in_group(group.group.name)) %]
+ [% mandatory_groups.push(group) %]
+ [% ELSIF (group.membercontrol != constants.CONTROLMAPNA && user.in_group(group.group.name))
+ || group.othercontrol != constants.CONTROLMAPNA %]
+ [% optional_groups.push(group) %]
+ [% END %]
+ [% END %]
+
+ [% IF optional_groups.size %]
+ <p>These groups are optional. You can decide to restrict [% terms.bugs %] to
+ one or more of the following groups:<br>
+ [% FOREACH group = optional_groups %]
+ <input type="hidden" name="defined_bit-[% group.group.id FILTER html %]"
+ value="1">
+ <input type="checkbox" id="bit-[% group.group.id FILTER html %]"
+ name="bit-[% group.group.id FILTER html %]"
+ [%+ ((group.membercontrol == constants.CONTROLMAPDEFAULT && user.in_group(group.group.name))
+ || (group.othercontrol == constants.CONTROLMAPDEFAULT && !user.in_group(group.group.name))
+ || cgi.param("bit-$group.group.id") == 1) ?
+ 'checked="checked"' : ''
+ %] value="1">
+ <label for="bit-[% group.group.id FILTER html %]">
+ [% group.group.name FILTER html %]: [% group.group.description FILTER html %]
+ </label>
+ <br>
+ [% END %]
+ </p>
+ [% END %]
+
+ [% IF mandatory_groups.size %]
+ <p>These groups are mandatory and [% terms.bugs %] will be automatically
+ restricted to these groups:<br>
+ [% FOREACH group = mandatory_groups %]
+ <input type="checkbox" id="bit-[% group.group.id FILTER html %]" checked="checked"
+ name="bit-[% group.group.id FILTER html %]" value="1" disabled="disabled">
+ <label for="bit-[% group.group.id FILTER html %]">
+ [% group.group.name FILTER html %]: [% group.group.description FILTER html %]
+ </label>
+ <br>
+ [% END %]
+ </p>
+ [% END %]
+[% END %]
+
+<input type="submit" id="change_product" value="Commit">
+
+</form>
+<hr>
+
+[%# If 'id' is defined, then we are editing a single bug.
+ # Else we are editing several bugs at once. %]
+
+[% IF cgi.param('id') AND cgi.param('id').match('^\d+$') %]
+ [% id = cgi.param('id') %]
+ Cancel and Return to [% "$terms.bug $id" FILTER bug_link(id) FILTER none %]
+[% ELSE %]
+ Cancel and Return to <a href="buglist.cgi?regetlastlist=1">the last search results</a>
+[% END %]
+
+[% PROCESS global/footer.html.tmpl %]
+
diff --git a/template/en/default/bug/show-header.html.tmpl b/template/en/default/bug/show-header.html.tmpl
new file mode 100644
index 0000000..3f81e57
--- /dev/null
+++ b/template/en/default/bug/show-header.html.tmpl
@@ -0,0 +1,50 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[%# This template should be called with PROCESS before processing
+ # "global/header.html.tmpl" in any template that is going to load the
+ # bug form. It expects only a "bug" object, and can even manage to get
+ # along without that. Some of these variables are just defaults that will
+ # be overridden by the calling templates.
+ #%]
+
+[% filtered_desc = bug.short_desc FILTER html %]
+[% subheader = filtered_desc %]
+[% filtered_timestamp = bug.delta_ts FILTER time %]
+[% title = "$terms.Bug $bug.bug_id &ndash; $filtered_desc" %]
+[% header = "$terms.Bug&nbsp;$bug.bug_id" %]
+[% header_addl_info = "Last modified: $filtered_timestamp" %]
+[% javascript_urls = [ "js/util.js", "js/field.js", "js/yui/calendar.js" ] %]
+[% style_urls = [ "skins/standard/yui/calendar.css",
+ "skins/standard/show_bug.css" ] %]
+[% doc_section = "bug_page.html" %]
+
+[% bodyclasses = ['bz_bug',
+ "bz_status_$bug.bug_status",
+ "bz_product_$bug.product",
+ "bz_component_$bug.component",
+ "bz_bug_$bug.bug_id",
+ ] %]
+[% FOREACH group = bug.groups_in %]
+ [% bodyclasses.push("bz_group_$group.name") %]
+[% END %]
diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl
new file mode 100644
index 0000000..177bea1
--- /dev/null
+++ b/template/en/default/bug/show-multiple.html.tmpl
@@ -0,0 +1,366 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Terry Weissman <terry@mozilla.org>
+ # Gervase Markham <gerv@gerv.net>
+ # Toms Baugis <toms@myrealbox.com>
+ # Olav Vitters <olav@bkor.dhs.org>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ # Elliotte Martin <emartin@everythingsolved.com>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Full Text $terms.Bug Listing"
+ h1 = ""
+ style_urls = ["skins/standard/show_multiple.css",
+ "skins/standard/buglist.css"]
+ doc_section = "bug_page.html"
+%]
+[% 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 Param("usebugaliases") AND bug.alias AND NOT bug.error %]
+ (<a href="show_bug.cgi?id=[% bug.alias FILTER url_quote %]">
+ [% bug.alias FILTER html %]</a>)
+ [% END %]
+ </h1>
+
+ <table class="bugfields">
+ [% IF bug.error %]
+ <tr>
+ <td class="error">
+ [% IF bug.error == "InvalidBugId" %]
+ '[%+ bug.bug_id FILTER html %]' is not a valid [% terms.bug %] number
+ [%- IF Param("usebugaliases") %] nor a known [% terms.bug %] alias[% END %].
+ [% 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 %]
+ [% 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 bug.bug_file_loc.match("^(javascript|data)") %]
+ [% bug.bug_file_loc FILTER html %]
+ [% ELSE %]
+ <a href="[% bug.bug_file_loc FILTER html %]">
+ [% bug.bug_file_loc FILTER html %]</a>
+ [% END %]
+ </td>
+ </tr>
+ [% END %]
+
+ [% IF Param("usestatuswhiteboard") %]
+ [% PROCESS row cell = "status_whiteboard" fullrow = 1 %]
+ [% END %]
+
+ [% USE Bugzilla %]
+ [% 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) %]
+ [% 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>
+ [% 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 %]:
+ [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %]
+ [% 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 %]:
+ [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %]
+ [%+ 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 %]
diff --git a/template/en/default/bug/show.html.tmpl b/template/en/default/bug/show.html.tmpl
new file mode 100644
index 0000000..8d8e63a
--- /dev/null
+++ b/template/en/default/bug/show.html.tmpl
@@ -0,0 +1,53 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ # Vaskin Kissoyan <vkissoyan@yahoo.com>
+ # Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # Max Kanat-Alexander <mkanat@bugzilla.org>
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[%# This script/template only handles one bug #%]
+[% bug = bugs.0 %]
+
+[% IF !header_done %]
+ [% PROCESS "bug/show-header.html.tmpl" %]
+ [% PROCESS global/header.html.tmpl %]
+[% END %]
+
+[% IF nextbug %]
+ <hr>
+ <p>
+ The next [% terms.bug %] in your list is [% terms.bug %]
+ <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a>:
+ </p>
+ <hr>
+[% END %]
+
+[% PROCESS bug/navigate.html.tmpl %]
+
+[% PROCESS bug/edit.html.tmpl %]
+
+<hr>
+
+[% PROCESS bug/navigate.html.tmpl bottom_navigator => 1%]
+
+<br>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/show.xml.tmpl b/template/en/default/bug/show.xml.tmpl
new file mode 100644
index 0000000..2349602
--- /dev/null
+++ b/template/en/default/bug/show.xml.tmpl
@@ -0,0 +1,157 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Bradley Baetz <bbaetz@student.usyd.edu.au>
+ # Colin Ogilvie <mozilla@colinogilvie.co.uk>
+ #
+ #%]
+[% PROCESS bug/time.html.tmpl %]
+<?xml version="1.0" [% IF Param('utf8') %]encoding="UTF-8" [% END %]standalone="yes" ?>
+<!DOCTYPE bugzilla SYSTEM "[% urlbase FILTER html %]bugzilla.dtd">
+
+<bugzilla version="[% constants.BUGZILLA_VERSION %]"
+ urlbase="[% urlbase FILTER xml %]"
+ [%# Note that the maintainer's email is not filtered,
+ # intentionally. Even logged-out users should be able
+ # to see that, since it will be in error messages anyway.
+ %]
+ maintainer="[% Param('maintainer') FILTER xml %]"
+[% IF user.id %]
+ exporter="[% user.email FILTER email FILTER xml %]"
+[% END %]
+>
+
+[% FOREACH bug = bugs %]
+ [% IF bug.error %]
+ <bug error="[% bug.error FILTER xml %]">
+ <bug_id>[% bug.bug_id FILTER xml %]</bug_id>
+ </bug>
+ [% ELSE %]
+ <bug>
+ [% FOREACH field = bug.fields %]
+ [% IF displayfields.$field %]
+ [%+ PROCESS bug_field %]
+ [% END %]
+ [% END %]
+
+ [%# This is here so automated clients can still use process_bug.cgi %]
+ [% IF displayfields.token && user.id %]
+ <token>[% issue_hash_token([bug.id, bug.delta_ts]) FILTER xml %]</token>
+ [% END %]
+
+ [%# Now handle 'special' fields #%]
+ [% IF displayfields.group %]
+ [% FOREACH g = bug.groups %]
+ [% NEXT UNLESS g.ison %]
+ <group id="[% g.bit FILTER xml %]">[% g.name FILTER xml %]</group>
+ [% END %]
+ [% END %]
+
+ [%# Bug Flags %]
+ [% PROCESS section_flags obj => bug %]
+
+ [% IF displayfields.long_desc %]
+ [% FOREACH c = bug.comments %]
+ [% NEXT IF c.is_private && !user.is_insider %]
+ <long_desc isprivate="[% c.is_private FILTER xml %]">
+ <commentid>[% c.id FILTER xml %]</commentid>
+ [% IF c.is_about_attachment %]
+ <attachid>[% c.extra_data FILTER xml %]</attachid>
+ [% END %]
+ <who name="[% c.author.name FILTER xml %]">[% c.author.email FILTER email FILTER xml %]</who>
+ <bug_when>[% c.creation_ts FILTER time("%Y-%m-%d %T %z") FILTER xml %]</bug_when>
+ [% IF user.is_timetracker && (c.work_time - 0 != 0) %]
+ <work_time>[% PROCESS formattimeunit time_unit = c.work_time FILTER xml %]</work_time>
+ [% END %]
+ <thetext>[% c.body_full FILTER xml %]</thetext>
+ </long_desc>
+ [% END %]
+ [% END %]
+
+ [% IF displayfields.attachment %]
+ [% FOREACH a = bug.attachments %]
+ [% NEXT IF a.isprivate && !user.is_insider %]
+ <attachment
+ isobsolete="[% a.isobsolete FILTER xml %]"
+ ispatch="[% a.ispatch FILTER xml %]"
+ isprivate="[% a.isprivate FILTER xml %]"
+ isurl="[% a.isurl FILTER xml %]"
+ >
+ <attachid>[% a.id %]</attachid>
+ <date>[% a.attached FILTER time("%Y-%m-%d %T %z") FILTER xml %]</date>
+ <delta_ts>[% a.modification_time FILTER time("%Y-%m-%d %T %z") FILTER xml %]</delta_ts>
+ <desc>[% a.description FILTER xml %]</desc>
+ <filename>[% a.filename FILTER xml %]</filename>
+ <type>[% a.contenttype FILTER xml %]</type>
+ <size>[% a.datasize FILTER xml %]</size>
+ <attacher>[% a.attacher.email FILTER email FILTER xml %]</attacher>
+ [%# This is here so automated clients can still use attachment.cgi %]
+ [% IF displayfields.token && user.id %]
+ <token>[% issue_hash_token([a.id, a.modification_time]) FILTER xml %]</token>
+ [% END %]
+ [% IF displayfields.attachmentdata %]
+ <data encoding="base64">[% a.data FILTER base64 %]</data>
+ [% END %]
+
+ [% PROCESS section_flags obj => a %]
+ </attachment>
+ [% END %]
+ [% END %]
+
+ [% Hook.process("bug_end") %]
+
+ </bug>
+ [% END %]
+[% END %]
+
+</bugzilla>
+
+[% BLOCK bug_field %]
+ [% FOREACH val = bug.$field %]
+ [%# We need to handle some fields differently. This should become
+ # nicer once we have custfields, and a type attribute for the fields
+ #%]
+ [% name = '' %]
+ [% IF field == 'reporter' OR field == 'assigned_to' OR
+ field == 'qa_contact' %]
+ [% name = val.name %]
+ [% val = val.email FILTER email %]
+ [% ELSIF field == 'cc' %]
+ [% val = val FILTER email %]
+ [% ELSIF field == 'creation_ts' OR field == 'delta_ts' %]
+ [% val = val FILTER time("%Y-%m-%d %T %z") %]
+ [% END %]
+ <[% field %][% IF name != '' %] name="[% name FILTER xml %]"[% END -%]>
+ [%- val FILTER xml %]</[% field %]>
+ [% END %]
+[% END %]
+
+[% BLOCK section_flags %]
+ [% RETURN UNLESS displayfields.flag %]
+
+ [% FOREACH flag = obj.flags %]
+ <flag name="[% flag.type.name FILTER xml %]"
+ id="[% flag.id FILTER xml %]"
+ type_id="[% flag.type_id FILTER xml %]"
+ status="[% flag.status FILTER xml %]"
+ setter="[% flag.setter.email FILTER email FILTER xml %]"
+ [% IF flag.status == "?" && flag.requestee %]
+ requestee="[% flag.requestee.email FILTER email FILTER xml %]"
+ [% END %]
+ />
+ [% END %]
+[% 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 0000000..eb5ba7a
--- /dev/null
+++ b/template/en/default/bug/summarize-time.html.tmpl
@@ -0,0 +1,335 @@
+[%# 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>
+ # Frédéric Buclin <LpSolit@gmail.com>
+ #%]
+
+[% PROCESS "global/field-descs.none.tmpl" %]
+
+[% 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/summarize-time.css"]
+ doc_section = "timetracking.html"
+ %]
+
+[% 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 %]
+ <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 %]
+ [% END %]
+
+ [% IF detailed %]
+ <h4 style="margin: 0">
+ 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 style="margin: 0">Total of [% global.grand_total FILTER format("%.2f") %] hours worked</h4>
+ <hr noshade size="1">
+ [% END %]
+
+ [% IF null.size > 0 %]
+ [% INCLUDE inactive_report %]
+ <h4 style="margin: 0">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 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 %]
+ [% 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>
+ <td colspan="4" 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">
+ [% 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>&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="80" valign="top">
+ <b>[% "$terms.Bug $id" FILTER bug_link(id) FILTER none %]</b>
+ </td>
+ <td width="100"><b>[% display_value("bug_status", bugs.$id.bug_status) FILTER html %]</b></td>
+ <td colspan="2">[% bugs.$id.short_desc FILTER html %]</td>
+ [% IF extra %]
+ <td align="right" valign="top">[% bugdata.total_time FILTER html %]</td>
+ [% END %]
+ </tr>
+ [% IF detailed %]
+ <tr class="bug_header[% '2' IF cid % 2 %]">
+ <td>&nbsp;</td>
+ <td colspan="3">
+ <table width="100%" cellpadding="0" cellspacing="0">
+ <tr>
+ <td width="33%">
+ Estimated: [% bugs.$id.estimated_time FILTER format("%.2f") %]h
+ </td>
+ <td width="33%">
+ Remaining: [% bugs.$id.remaining_time FILTER format("%.2f") %]h
+ </td>
+ <td width="33%">
+ Deadline: [% bugs.$id.deadline || "<b>Not set</b>" %]
+ </td>
+ </tr>
+ </table>
+ </td>
+ [% IF extra %]
+ <td>&nbsp;</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 cellpadding="4" cellspacing="0" width="90%" 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>
+ <td colspan="[% colspan FILTER html %]" align="right"><b>[% additional FILTER html %]</b></td>
+ <td align="right"><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="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 %]
+ <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><label accesskey="s"
+ for="start_date">Period <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" id="summarize" 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">
+ <label for="ctype"><b>Format</b></label>: <select name="ctype" id="ctype">
+ <option value="html">HTML Report</option>
+ </select>
+</td></tr><tr>
+<td>&nbsp;</td><td colspan="4">
+ <input type="checkbox" name="monthly" [% 'checked="checked"' IF
+ monthly %] id="monthly">
+ <label for="monthly" accesskey="m">Split by <u>m</u>onth</label>
+ [%# XXX: allow splitting by other intervals %]
+ &nbsp;
+ <input type="checkbox" name="detailed" [% 'checked="checked"' IF
+ detailed %] id="detailed">
+ <label for="detailed" accesskey="t">De<u>t</u>ailed summaries</label>
+ &nbsp;
+ <input type="checkbox" name="inactive" [% 'checked="checked"' IF
+ inactive %] id="inactive">
+ <label for="inactive" accesskey="i">Also show <u>i</u>nactive
+ [%+ terms.bugs %]</label>
+</td>
+</tr></table>
+
+</form>
+<script type="text/javascript">
+<!--
+ document.forms['summary'].start_date.focus()
+//--></script>
+<hr noshade size=1>
+[% END %]
diff --git a/template/en/default/bug/time.html.tmpl b/template/en/default/bug/time.html.tmpl
new file mode 100644
index 0000000..e070e7d
--- /dev/null
+++ b/template/en/default/bug/time.html.tmpl
@@ -0,0 +1,47 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Jeff Hedlund <jeff.hedlund@matrixsi.com>
+ #
+ #%]
+
+[% BLOCK formattimeunit %]
+ [%# INTERFACE:
+ # time_unit: the number converting, converts to 2 decimal places
+ # unless the last character is a 0, then it truncates to
+ # 1 decimal place
+ #%]
+ [% time_unit = time_unit FILTER format('%.2f') %]
+ [% IF time_unit.match('0\Z') %]
+ [% time_unit FILTER format('%.1f') %]
+ [% ELSE %]
+ [% time_unit FILTER format('%.2f') %]
+ [% END %]
+[% END %]
+
+[% BLOCK calculatepercentage %]
+ [%# INTERFACE:
+ # act: actual time
+ # rem: remaining time
+ # %]
+ [% IF (act + rem) > 0 %]
+ [% (act / (act + rem)) * 100
+ FILTER format("%d") %]
+ [% ELSE %]
+ 0
+ [% END %]
+[% END %]
diff --git a/template/en/default/bug/votes/delete-all.html.tmpl b/template/en/default/bug/votes/delete-all.html.tmpl
new file mode 100644
index 0000000..41b7512
--- /dev/null
+++ b/template/en/default/bug/votes/delete-all.html.tmpl
@@ -0,0 +1,51 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # This template has no interface.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Remove your votes?"
+ %]
+
+<p>
+ You are about to remove all of your [% terms.bug %] votes. Are you sure you wish to
+ remove your vote from every [% terms.bug %] you've voted on?
+</p>
+
+<form action="votes.cgi" method="post">
+ <input type="hidden" name="action" value="vote">
+ <p>
+ <input type="radio" name="delete_all_votes" value="1">
+ Yes, delete all my votes
+ </p>
+ <p>
+ <input type="radio" name="delete_all_votes" value="0" checked="checked">
+ No, go back and review my votes
+ </p>
+ <p>
+ <input type="submit" id="vote" value="Submit">
+ </p>
+</form>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/votes/list-for-bug.html.tmpl b/template/en/default/bug/votes/list-for-bug.html.tmpl
new file mode 100644
index 0000000..a599dc0
--- /dev/null
+++ b/template/en/default/bug/votes/list-for-bug.html.tmpl
@@ -0,0 +1,60 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # bug_id: integer. ID of the bug we are listing the votes for.
+ # users: list of hashes. May be empty. Each hash has two members:
+ # login_name: string. The login name of the user whose vote is attached
+ # vote_count: integer. The number of times that user has votes for this bug.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Show Votes"
+ subheader = "$terms.Bug <a href=\"show_bug.cgi?id=$bug_id\">$bug_id</a>"
+ %]
+
+[% total = 0 %]
+<table cellspacing="4">
+ <tr>
+ <th>Who</th>
+ <th>Number of votes</th>
+ </tr>
+
+ [% FOREACH voter = users %]
+ [% total = total + voter.vote_count %]
+ <tr>
+ <td>
+ <a href="votes.cgi?action=show_user&amp;user_id=
+ [%- voter.id FILTER url_quote %]">
+ [% voter.login_name FILTER email FILTER html %]
+ </a>
+ </td>
+ <td align="right">
+ [% voter.vote_count %]
+ </td>
+ </tr>
+ [% END %]
+</table>
+
+<p>Total votes: [% total %]</p>
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/bug/votes/list-for-user.html.tmpl b/template/en/default/bug/votes/list-for-user.html.tmpl
new file mode 100644
index 0000000..2f97616
--- /dev/null
+++ b/template/en/default/bug/votes/list-for-user.html.tmpl
@@ -0,0 +1,185 @@
+[%# 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.
+ #
+ # The Initial Developer of the Original Code is Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
+ #%]
+
+[%# INTERFACE:
+ # voting_user: hash containing a 'login' field
+ #
+ # products: list of hashes containing details of products relating to
+ # voting:
+ # name: name of product
+ # bugs: list of bugs the user has voted for
+ # bug_ids: list of bug ids the user has voted for
+ # onevoteonly: one or more votes allowed per bug?
+ # total: users current vote count for the product
+ # maxvotes: max votes allowed for a user in this product
+ # maxperbug: max votes per bug allowed for a user in this product
+ #
+ # bug_id: number; if the user is voting for a bug, this is the bug id
+ #
+ # canedit: boolean; Should the votes be presented in a form, or readonly?
+ #
+ # all_bug_ids: List of all bug ids the user has voted for, across all products
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% IF !header_done %]
+ [% subheader = voting_user.login FILTER html %]
+ [% IF canedit %]
+ [% title = "Change Votes" %]
+ [% IF bug_id %]
+ [%# We .select and .focus the input so it works for textbox and
+ checkbox %]
+ [% onload = "document.forms['voting_form'].bug_" _ bug_id _
+ ".select();document.forms['voting_form'].bug_" _ bug_id _
+ ".focus()" %]
+ [% END %]
+ [% ELSE %]
+ [% title = "Show Votes" %]
+ [% END %]
+ [% PROCESS global/header.html.tmpl
+ style_urls = [ "skins/standard/voting.css" ]
+ %]
+[% ELSE %]
+ <hr>
+[% END %]
+
+[% IF votes_recorded %]
+ <p>
+ <font color="red">
+ The changes to your votes have been saved.
+ </font>
+ </p>
+[% ELSE %]
+ <br>
+[% END %]
+
+[% IF products.size %]
+ <form name="voting_form" method="post" action="votes.cgi">
+ <input type="hidden" name="action" value="vote">
+ <table cellspacing="4">
+ <tr>
+ <td></td>
+ <th>Votes</th>
+ <th>[% terms.Bug %] #</th>
+ <th>Summary</th>
+ </tr>
+
+ [% onevoteproduct = 0 %]
+ [% multivoteproduct = 0 %]
+ [% FOREACH product = products %]
+ [% IF product.onevoteonly %]
+ [% onevoteproduct = 1 %]
+ [% ELSE %]
+ [% multivoteproduct = 1 %]
+ [% END %]
+ <tr>
+ <th>[% product.name FILTER html %]</th>
+ <td colspan="2" ><a href="buglist.cgi?bug_id=
+ [%- product.bug_ids.join(",") FILTER url_quote %]">([% terms.bug %] list)</a>
+ </td>
+ <td>
+ [% IF product.maxperbug < product.maxvotes AND
+ product.maxperbug > 1 %]
+ <font size="-1">
+ (Note: only [% product.maxperbug %] vote
+ [% "s" IF product.maxperbug != 1 %] allowed per [% terms.bug %] in
+ this product.)
+ </font>
+ [% END %]
+ </td>
+ </tr>
+
+ [% FOREACH bug = product.bugs %]
+ <tr [% IF bug.id == bug_id && canedit %]
+ class="bz_bug_being_voted_on" [% END %]>
+ <td>[% IF bug.id == bug_id && canedit %]Enter New Vote here &rarr;
+ [%- END %]</td>
+ <td align="right"><a name="vote_[% bug.id %]">
+ [% IF canedit %]
+ [% IF product.onevoteonly %]
+ <input type="checkbox" name="[% bug.id %]" value="1"
+ [% " checked" IF bug.count %] id="bug_[% bug.id %]">
+ [% ELSE %]
+ <input name="[% bug.id %]" value="[% bug.count %]"
+ size="2" id="bug_[% bug.id %]">
+ [% END %]
+ [% ELSE %]
+ [% bug.count %]
+ [% END %]
+ </a></td>
+ <td align="center">
+ [% bug.id FILTER bug_link(bug) FILTER none %]
+ </td>
+ <td>
+ [% bug.summary FILTER html %]
+ (<a href="votes.cgi?action=show_bug&amp;bug_id=[% bug.id %]">Show Votes</a>)
+ </td>
+ </tr>
+ [% END %]
+
+ <tr>
+ <td></td>
+ <td colspan="3">[% product.total %] vote
+ [% "s" IF product.total != 1 %] used out of [% product.maxvotes %]
+ allowed.
+ <br>
+ <br>
+ </td>
+ </tr>
+ [% END %]
+ </table>
+
+ [% IF canedit %]
+ <input type="submit" value="Change My Votes" id="change"> or
+ <a href="buglist.cgi?bug_id=[% all_bug_ids.join(",") FILTER url_quote %]">view all
+ as [% terms.bug %] list</a>
+ <br>
+ <br>
+ To change your votes,
+ [% IF multivoteproduct %]
+ type in new numbers (using zero to mean no votes)
+ [% " or " IF onevoteproduct %]
+ [% END %]
+ [% IF onevoteproduct %]
+ change the checkbox
+ [% END %]
+ and then click <b>Change My Votes</b>.
+ [% ELSE %]
+ <a href="buglist.cgi?bug_id=[% all_bug_ids.join(",") FILTER url_quote %]">View all
+ as [% terms.bug %] list</a>
+ [% END %]
+ </form>
+[% ELSE %]
+ <p>
+ [% IF canedit %]
+ You are
+ [% ELSE %]
+ This user is
+ [% END %]
+ currently not voting on any [% terms.bugs %].
+ </p>
+[% END %]
+
+<p>
+ <a href="page.cgi?id=voting.html">Help with voting</a>.
+</p>
+
+[% PROCESS global/footer.html.tmpl %]