diff options
-rw-r--r-- | template/en/default/account/auth/login-small.html.tmpl | 120 | ||||
-rw-r--r-- | template/en/default/bug/create/comment-guided.txt.tmpl | 52 | ||||
-rw-r--r-- | template/en/default/bug/create/create-guided.html.tmpl | 443 | ||||
-rw-r--r-- | template/en/default/bug/edit.html.tmpl | 1186 | ||||
-rw-r--r-- | template/en/default/email/bugmail-header.txt.tmpl | 36 | ||||
-rw-r--r-- | template/en/default/filterexceptions.pl | 510 | ||||
-rw-r--r-- | template/en/default/global/common-links.html.tmpl | 111 | ||||
-rw-r--r-- | template/en/default/global/variables.none.tmpl | 33 | ||||
-rw-r--r-- | template/en/default/index.html.tmpl | 172 | ||||
-rw-r--r-- | template/en/default/list/list.html.tmpl | 340 |
10 files changed, 3003 insertions, 0 deletions
diff --git a/template/en/default/account/auth/login-small.html.tmpl b/template/en/default/account/auth/login-small.html.tmpl new file mode 100644 index 0000000..356edbc --- /dev/null +++ b/template/en/default/account/auth/login-small.html.tmpl @@ -0,0 +1,120 @@ +[%# 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): Jacob Steenhagen <jake@bugzilla.org> + #%] + +[% PROCESS global/variables.none.tmpl %] + +[%# Use the current script name. If an empty name is returned, + # then we are accessing the home page. %] + +[% login_target = cgi.url("-relative" => 1, "-query" => 1) %] +[% IF !login_target OR login_target.match("^token.cgi") %] + [% login_target = "index.cgi" %] +[% END %] + +[% login_target = urlbase _ login_target %] + +<li id="mini_login_container[% qs_suffix %]"> + <span class="separator">| </span> + [% connector = "?" %] + [% IF cgi.request_method == "GET" AND cgi.query_string %] + [% connector = "&" %] + [% END %] + [% script_name = login_target _ connector _ "GoAheadAndLogIn=1" %] + <a id="login_link[% qs_suffix %]" href="[% script_name FILTER html %]" + onclick="return show_mini_login_form('[% qs_suffix %]')">Log In</a> + <form action="[% login_target FILTER html %]" method="POST" + class="mini_login bz_default_hidden" + id="mini_login[% qs_suffix FILTER html %]" + onsubmit="return check_mini_login_fields( '[% qs_suffix FILTER html %]' );" + > + <input id="Bugzilla_login[% qs_suffix FILTER html %]" + class="bz_login" + name="Bugzilla_login" + onfocus="mini_login_on_focus('[% qs_suffix FILTER js %]')" + > + <input class="bz_password" + id="Bugzilla_password[% qs_suffix FILTER html %]" + name="Bugzilla_password" + type="password" + > + <input class="bz_password bz_default_hidden bz_mini_login_help" type="text" + id="Bugzilla_password_dummy[% qs_suffix %]" value="password" + onfocus="mini_login_on_focus('[% qs_suffix FILTER js %]')" + > + [% IF Param('rememberlogin') == 'defaulton' || + Param('rememberlogin') == 'defaultoff' + %] + <input type="checkbox" id="Bugzilla_remember[% qs_suffix %]" + name="Bugzilla_remember" value="on" class="bz_remember" + [%+ "checked" IF Param('rememberlogin') == "defaulton" %]> + <label for="Bugzilla_remember[% qs_suffix %]">Remember</label> + [% END %] + <input type="submit" name="GoAheadAndLogIn" value="Log in" + id="log_in[% qs_suffix %]"> + <script type="text/javascript"> + mini_login_constants = { + "login" : "login", + "warning" : "You must set the login and password before logging in." + }; + [%# We need this event to fire after autocomplete, because it does + # something different depending on whether or not there's already + # data in the login and password box. + # However, autocomplete happens at all sorts of different times in + # different browsers (before or after onDOMReady, before or after + # window.onload, in almost all combinations you can imagine). + # The only good solution I found is to time the event 200 + # milliseconds after window.onload for WebKit (doing it immediately + # at onload works in Chrome but not in Safari, but I can't detect + # them separately using YUI), and right after onDOMReady in Gecko. + # The WebKit solution is also fairly guaranteed to work on any + # browser (it's just strange, since the fields only populate 200 ms + # after the page loads), so it's the default. IE doesn't even + # recognize our forms as login forms, so I made it use the Gecko + # method also (since it's nicer visually). Opera never autocompletes + # forms without user interaction, so it also uses the Gecko method. + #%] + if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) { + YAHOO.util.Event.onDOMReady(function() { + init_mini_login_form('[% qs_suffix FILTER html %]'); + }); + } + else { + YAHOO.util.Event.on(window, 'load', function () { + window.setTimeout(function() { + init_mini_login_form('[% qs_suffix FILTER html %]'); + }, 200); + }); + } + </script> + <a href="#" onclick="return hide_mini_login_form('[% qs_suffix %]')">[x]</a> + </form> +</li> +<li id="forgot_container[% qs_suffix %]"> + <span class="separator">| </span> + <a href="http://identity.mageia.org/">Forgot Password</a> + <form action="token.cgi" method="post" id="forgot_form[% qs_suffix %]" + class="mini_forgot bz_default_hidden"> + <label>Login: <input type="text" name="loginname" size="20"></label> + <input id="forgot_button[% qs_suffix %]" value="Reset Password" + type="submit"> + <input type="hidden" name="a" value="reqpw"> + <a href="#" onclick="return hide_forgot_form('[% qs_suffix %]')">[x]</a> + </form> +</li> 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..66220ec --- /dev/null +++ b/template/en/default/bug/create/comment-guided.txt.tmpl @@ -0,0 +1,52 @@ +[%# 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 %] + +[%+ 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/create-guided.html.tmpl b/template/en/default/bug/create/create-guided.html.tmpl new file mode 100644 index 0000000..8df0896 --- /dev/null +++ b/template/en/default/bug/create/create-guided.html.tmpl @@ -0,0 +1,443 @@ +[%# 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 }" + %] + +[% style = "" %] + +[% tablecolour = "#efefef" %] + +[%# 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]; + } + } +} + +var initialowners = new Array([% product.components.size %]); +var last_initialowner; +var components = new Array([% product.components.size %]); +[% count = 0 %] +[%- FOREACH c = product.components %] + components[[% count %]] = "[% c.name FILTER js %]"; + initialowners[[% count %]] = "[% c.default_assignee.login 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. + var form = document.Create; + var assigned_to = form.assigned_to.value; + + 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; + } + } + PutDescription(); +} + +// this is courtesy of John Keller + +var http_connection = null; + +// init XMLHttpRequest object, based on browser type +function initHttpConnection() { + http_connection = null; + + try { + // Firefox, Opera 8.0+, Safari + http_connection = new XMLHttpRequest(); + } catch (e) { + // Internet Explorer + try { + http_connection = new ActiveXObject("Msxml2.XMLHTTP"); + } catch (e) { + try { + http_connection = new ActiveXObject("Microsoft.XMLHTTP"); + } catch (e) { + // browser does not support AJAX + } + } + } + + if (http_connection != null) { + http_connection.onreadystatechange = onLoadMaintainer; + } +} + +// handler for data received +// text field to set should be similar to +// <input name="assigned_to" id="assigned_to" /> +function onLoadMaintainer() { + var field_obj; + + if ((http_connection.readyState == 4) && (http_connection.status == 200)) { + if ((http_connection.responseText != null) && (http_connection.responseText != 'NOT_FOUND')) { + if ((field_obj = document.getElementById('assigned_to')) != null) { + field_obj.value = http_connection.responseText; + } + } + } else { + // by default, we'll leave form value alone and don't do anything else + // this is a good place to set a default or show an error, though + } +} + +// handler for when user enters a package +// text field to set should be similar to +// <input name="cf_rpmpkg" onchange="onChangePackage(this)" /> +function onChangePackage(input_obj) { + initHttpConnection(); + + if ((http_connection != null) && (input_obj.value != "")) { + http_connection.open("GET", '/lookup.php?pkg=' + encodeURIComponent(input_obj.value)); + http_connection.send(null); + } +}; + + +--> +</script> + +<p> Submit [% terms.abug %] using the +<a href="enter_bug.cgi?product=[% product.name FILTER html %]">expert [% terms.bug %] form</a>.</p> + + +<form name="Create" id="Create" method="post" action="post_bug.cgi"> + <input type="hidden" name="format" value="guided"> + <input type="hidden" name="priority" + value="[% default.priority FILTER html %]"> + <input type="hidden" name="token" value="[% token FILTER html %]"> + <input type="hidden" name="op_sys" value="[% Param('defaultopsys') FILTER html %]"> + +<table valign="top" cellpadding="5" cellspacing="5" border="0"> + + <tr> + <td align="right" valign="top" bgcolor="[% tablecolour %]" width="10%"> + <b>Product:</b> + </td> + <td valign="top"> + <input type="hidden" name="product" value="[% product.name FILTER html %]"> + <b>[% product.name FILTER html %]</b> + </td> + </tr> + + <tr> + <td align="right" valign="top" bgcolor="[% tablecolour %]"> + <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 uri %]">component + descriptions</a> (opens in new window) if you need more help. + </p> + </td> + </tr> + + <tr> + <td align="right" valign="top" bgcolor="[% tablecolour %]"> + <b>Version:</b> + </td> + <td valign="top"> + <select name="version" size="5"> + [%- FOREACH v = version %] + <option value="[% v.name FILTER html %]" + [% " selected=\"selected\"" IF v == default.version %]>[% v.name FILTER html %] + </option> + [% END %] + </select> + </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 = [ "All", "i586", "x86_64" ] %] + + <tr> + <td align="right" valign="top" bgcolor="[% tablecolour %]"> + <b>Hardware Platform:</b> + </td> + <td valign="top"> + [% PROCESS select sel = 'rep_platform' %] + </td> + </tr> + + <tr> + <td align="right" valign="top" bgcolor="[% tablecolour %]"> + <b>Source RPM:</b> + </td> + <td valign="top"> + <input type="text" size="80" name="cf_rpmpkg" value="" onchange="onChangePackage(this)"> + <p> + This is where you can identify exactly which RPM package is involved in this [% terms.bug %] report. For instance, + if you know the problem you are having is with the program <tt>mysqld</tt>, then execute + <tt>rpm -qif /usr/sbin/mysqld</tt>. This will tell you the name and version of the RPM + package (i.e. MySQL-5.0.27-1mga1) as well as other information. In particular, you are looking for + the "Source RPM" field (i.e. MySQL-5.0.27-1mga1.src.rpm) -- this is the information you should + provide here. Alternatively, you may use <tt>rpm -qf /usr/sbin/mysqld --qf '%{SOURCERPM}\n'</tt> to + obtain the information. If you do not know the location of the program in question, use <tt>rpm -qf `which mysqld`</tt> + to obtain it. Please enter that information above. + </p> + </td> + </tr> + + <tr> + <td align="right" valign="top" bgcolor="[% tablecolour %]"> + <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 submitting (optional). + </p> + </td> + </tr> + + <tr> + <td align="right" valign="top" bgcolor="[% tablecolour %]"> + <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 that summarizes 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 in Evolution while checking for new POP mail + </tt> + </p> + </td> + </tr> + + <tr> + <td align="right" valign="top" bgcolor="[% tablecolour %]"> + <b>Details:</b> + </td> + <td valign="top"> + [% INCLUDE global/textarea.html.tmpl + name = 'comment' + minrows = 10 + maxrows = 25 + cols = constants.COMMENT_COLS + defaultcontent = "Description of problem:\n\n\nVersion-Release number of selected component (if applicable):\n\n\nHow reproducible:\n\n\nSteps to Reproduce:\n1.\n2.\n3.\n" + %] + [% IF user.is_insider %] + <br> + <input type="checkbox" id="comment_is_private" name="comment_is_private" + [% ' checked="checked"' IF comment_is_private %]> + <label for="comment_is_private">Initial Description is Private</label> + [% END %] + + <p> + Expand on the Summary. Please be + as specific as possible about what is wrong. + </p> + <p> + <tt> + <font color="#990000">Bad example</font>: I can't seem to login to the system. Please help! + </tt> + <br> + <tt> + <font color="#009900">Good example</font>:<br /><br /> + Description of problem:<br /><br /> + I'm unable to login to the system via ssh. The /var/log/messages + log indicates there is a problem with the pam module pam_ldap, but the /etc/pam.d/system-auth file doesn't + contain that module and I'm not using LDAP. I looked at /etc/pam.d/sshd and it does contain that module but I'm + not sure how it got there, unless it was due to the super-spiffy super-ldap-mojo package I installed yesterday. <br /><br /> + Version-Release number of selected component (if applicable):<br /><br /> + openldap-2.3.34-5mga1, pam-0.99.7.1-2mga1<br /><br /> + How reproducible:<br /><br /> + Every time I attempt to login.<br /><br /> + Steps to Reproduce:<br /> + 1. ssh user@host<br /> + 2. see the rejection<br /> + </tt> + </p> + </td> + </tr> + + <tr> + <td valign="top" align="right" bgcolor="[% tablecolour %]"> + <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="enhancement" value="enhancement"> + Enhancement: Request for new feature or enhancement. + </option> + </select> + <p> + Indicate how serious the problem is, or if your [% terms.bug %] is a + request for a new feature. + </p> + </td> + </tr> + <tr> + <td valign="top" align="right" bgcolor="[% tablecolour %]"> + <b>Assign To:</b> + </td> + <td valign="top"> + [% INCLUDE global/userselect.html.tmpl + id => "assigned_to" + name => "assigned_to" + value => "" + emptyok => 1 + size => 32 + %] + <p>Leave the above blank to assign to the default component owner.</p> + </td> + </tr> + + [% Hook.process('form') %] +</table> + +<p> + <input type="submit" id="report" value=" Submit [% terms.Bug %] Report " + onclick="if (this.form.comment.value == 'Description of problem:\n\n\nVersion-Release number of selected component (if applicable):\n\n\nHow reproducible:\n\n\nSteps to Reproduce:\n1.\n2.\n3.\n') + { 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 %]. + Thank you for choosing Mageia! +</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/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl new file mode 100644 index 0000000..2d8d3f8 --- /dev/null +++ b/template/en/default/bug/edit.html.tmpl @@ -0,0 +1,1186 @@ +[%# 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 %] + + <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'; + updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment'); + } + [% 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 %] + + /* Index all classifications so we can keep track of the classification + * for the selected product, which could control field visibility. + */ + var all_classifications = new Array([% bug.choices.product.size %]); + [%- FOREACH product = bug.choices.product %] + all_classifications['[% product.name FILTER js %]'] = ' + [%- product.classification.name FILTER js %]'; + [%- END %] + + //--> + </script> + +<form name="changeform" id="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"> </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 + %] + + [% IF user.settings.comment_box_position.value == 'before_comments' %] + [% PROCESS comment_box %] + [% END %] + </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> + + [% IF user.settings.comment_box_position.value == 'after_comments' %] + <hr> + [% PROCESS comment_box %] + [% END %] + +</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 %] [% 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 = bug_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> + + [%# Classification is here so that it can be used in value controllers + # and visibility controllers. It comes after product because + # it uses some javascript that depends on the existence of the + # product field. + #%] + <tr class="bz_default_hidden"> + [% INCLUDE bug/field.html.tmpl + bug = bug field = bug_fields.classification + override_legal_values = bug.choices.classification + value = bug.classification + editable = bug.check_can_change_field('product', 0, 1) %] + </tr> + [%###############%] + [%# Component #%] + [%###############%] + <tr> + [% INCLUDE bug/field.html.tmpl + bug = bug, field = bug_fields.component, value = bug.component + override_legal_values = bug.choices.component + desc_url = "describecomponents.cgi?product=$bug.product" + editable = bug.check_can_change_field('component', 0, 1) + %] + </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 = bug_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 = bug_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 and severity) #%] + [%###############################################################%] + <tr> + <td class="field_label"> + <label for="priority" accesskey="i"> + <b><a href="page.cgi?id=fields.html#importance"><u>P</u>riority</a></b></label>: + </td> + <td> + [% INCLUDE bug/field.html.tmpl + bug = bug, field = bug_fields.priority, + no_tds = 1, value = bug.priority + editable = bug.check_can_change_field('priority', 0, 1) %] + <b><a href="page.cgi?id=fields.html#importance"><u>S</u>everity</a></b></label>: + [%+ INCLUDE bug/field.html.tmpl + bug = bug, field = bug_fields.bug_severity, + no_tds = 1, value = bug.bug_severity + editable = bug.check_can_change_field('bug_severity', 0, 1) %] + [% Hook.process('after_importance', 'bug/edit.html.tmpl') %] + </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 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 + classes => ["bz_userfield"] + 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 + classes => ["bz_userfield"] + 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 is_safe_url(bug.bug_file_loc) %] + <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 is_safe_url(bug.bug_file_loc) %] + <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) + AND is_safe_url(bug.bug_file_loc) %] + <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> + <td class="field_value" colspan="2"> + [% INCLUDE bug/field.html.tmpl + bug = bug, field = bug_fields.keywords, value = bug.keywords + editable = bug.check_can_change_field("keywords", 0, 1), + no_tds = 1 + %] + </td> + </tr> + [% END %] +[% END %] + +[%############################################################################%] +[%# Block for Depends On / Blocks #%] +[%############################################################################%] +[% BLOCK section_dependson_blocks %] + <tr> + [% PROCESS dependencies + dep = { title => "Depends on", fieldname => "dependson" } %] + </tr> + + <tr> + [% PROCESS dependencies accesskey = "b" + dep = { title => "<u>B</u>locks", fieldname => "blocked" } %] + + <tr> + <th> </th> + + <td colspan="2" align="left" id="show_dependency_tree_or_graph"> + Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&hide_resolved=1">tree</a> + + [% IF Param('webdotbase') %] + / <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_groups" + value="[% group.name FILTER html %]"> + [% END %] + + <input type="checkbox" value="[% group.name FILTER html %]" + name="groups" id="group_[% group.bit %]" + [% ' checked="checked"' IF group.ison %] + [% ' disabled="disabled"' IF NOT group.ingroup %]> + <label for="group_[% 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 %] + [% IF user.id || bug.cc.size %] + <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> + [% END %] + <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 + classes => ["bz_userfield"] + 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> + [% IF user.id || bug.cc.size %] + <script type="text/javascript"> + hideEditableField( 'cc_edit_area_showhide_container', + 'cc_edit_area', + 'cc_edit_area_showhide', + '', + ''); + </script> + [% END %] + </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 *** %] + [% USE Bugzilla %] + [% 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> + [% IF extra_field_item %] + <tr> + <th class="field_label">[% extra_field_item.header FILTER none %]</th> + <td>[% extra_field_item.data FILTER none %]</td> + </tr> + [% END %] + [% 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> + [% INCLUDE bug/field.html.tmpl + field = bug_fields.deadline, value = bug.deadline, no_tds = 1 + editable = bug.check_can_change_field('deadline', 0, 1) %] + </td> + </tr> + <tr> + <td colspan="7" class="bz_summarize_time"> + <a href="summarize_time.cgi?id=[% bug.bug_id %]&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 id="add_comment" class="bz_section_additional_comments"> + [% IF user.id %] + <label for="comment" accesskey="c"><b>Additional + <u>C</u>omments</b></label>: + + [% IF user.is_insider %] + <input type="checkbox" name="comment_is_private" value="1" + id="newcommentprivacy" + onClick="updateCommentTagControl(this, 'comment')"> + <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 id="bug_status_bottom" + 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> + [% 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 %]&GoAheadAndLogIn=1">log in</a> + before you can comment on or make changes to this [% terms.bug %]. + </fieldset> + </td> + </tr> + </table> + [% 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 %]"> + </div> + [% END %] +[% END %] diff --git a/template/en/default/email/bugmail-header.txt.tmpl b/template/en/default/email/bugmail-header.txt.tmpl new file mode 100644 index 0000000..cdda89a --- /dev/null +++ b/template/en/default/email/bugmail-header.txt.tmpl @@ -0,0 +1,36 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[% PROCESS "global/reason-descs.none.tmpl" %] +[% isnew = bug.lastdiffed ? 0 : 1 %] +[% show_new = isnew + && (to_user.settings.bugmail_new_prefix.value == 'on') %] + +From: [% Param('mailfrom') %] +To: [% to_user.email %] +Subject: [[% terms.Bug %] [%+ bug.id %]] [% '[New]: ' IF show_new %][%+ bug.short_desc %] +Date: [% date %] +X-Bugzilla-Reason: [% reasonsheader %] +X-Bugzilla-Type: [% isnew ? 'new' : 'changed' %] +X-Bugzilla-Watch-Reason: [% reasonswatchheader %] +[% IF Param('useclassification') %] +X-Bugzilla-Classification: [% bug.classification %] +[% END %] +X-Bugzilla-Product: [% bug.product %] +X-Bugzilla-Component: [% bug.component %] +X-Bugzilla-Version: [% bug.version %] +X-Bugzilla-Keywords: [% bug.keywords %] +X-Bugzilla-Severity: [% bug.bug_severity %] +X-Bugzilla-Who: [% changer.login %] +X-Bugzilla-Status: [% bug.bug_status %] +X-Bugzilla-Priority: [% bug.priority %] +X-Bugzilla-Assigned-To: [% bug.assigned_to.login %] +X-Bugzilla-Target-Milestone: [% bug.target_milestone %] +X-Bugzilla-Flags:[% FOREACH flag = bug.flags %] [%+ flag.name %][% flag.status %][% END %] +X-Bugzilla-Changed-Fields: [% changedfields.join(" ") %] +[%+ threadingmarker %] diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl new file mode 100644 index 0000000..49bf3a9 --- /dev/null +++ b/template/en/default/filterexceptions.pl @@ -0,0 +1,510 @@ +# -*- Mode: perl; indent-tabs-mode: nil -*- +# +# 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 are the Bugzilla tests. +# +# The Initial Developer of the Original Code is Jacob Steenhagen. +# Portions created by Jacob Steenhagen are +# Copyright (C) 2001 Jacob Steenhagen. All +# Rights Reserved. +# +# Contributor(s): Gervase Markham <gerv@gerv.net> + +# Important! The following classes of directives are excluded in the test, +# and so do not need to be added here. Doing so will cause warnings. +# See 008filter.t for more details. +# +# Comments - [%#... +# Directives - [% IF|ELSE|UNLESS|FOREACH... +# Assignments - [% foo = ... +# Simple literals - [% " selected" ... +# Values always used for numbers - [% (i|j|k|n|count) %] +# Params - [% Param(... +# Safe functions - [% (time2str)... +# Safe vmethods - [% foo.size %] [% foo.length %] +# [% foo.push() %] +# TT loop variables - [% loop.count %] +# Already-filtered stuff - [% wibble FILTER html %] +# where the filter is one of html|csv|js|url_quote|quoteUrls|time|uri|xml|none + +%::safe = ( + +'whine/schedule.html.tmpl' => [ + 'event.key', + 'query.id', + 'query.sort', + 'schedule.id', + 'option.0', + 'option.1', +], + +'whine/mail.html.tmpl' => [ + 'bug.bug_id', +], + +'flag/list.html.tmpl' => [ + 'flag.id', + 'flag.status', + 'type.id', +], + +'search/boolean-charts.html.tmpl' => [ + '"field${chartnum}-${rownum}-${colnum}"', + 'field.name', + '"${chartnum}-${rownum}-${newor}"', + '"${chartnum}-${newand}-0"', + 'newchart', + 'jsmagic', +], + +'search/form.html.tmpl' => [ + 'qv.name', + 'qv.description', +], + +'search/search-specific.html.tmpl' => [ + 'status.name', +], + +'search/tabs.html.tmpl' => [ + 'content', +], + +'request/queue.html.tmpl' => [ + 'column_headers.$group_field', + 'column_headers.$column', + 'request.status', + 'request.bug_id', + 'request.attach_id', +], + +'reports/keywords.html.tmpl' => [ + 'keyword.bug_count', +], + +'reports/report-table.csv.tmpl' => [ + 'data.$tbl.$col.$row', + 'colsepchar', +], + +'reports/report-table.html.tmpl' => [ + '"&$tbl_vals" IF tbl_vals', + '"&$col_vals" IF col_vals', + '"&$row_vals" IF row_vals', + 'classes.$row_idx.$col_idx', + 'urlbase', + 'data.$tbl.$col.$row', + 'row_total', + 'col_totals.$col', + 'grand_total', +], + +'reports/report.html.tmpl' => [ + 'width', + 'height', + 'imageurl', + 'formaturl', + 'other_format.name', + 'sizeurl', + 'switchbase', + 'format', + 'cumulate', +], + +'reports/chart.html.tmpl' => [ + 'width', + 'height', + 'imageurl', + 'sizeurl', + 'height + 100', + 'height - 100', + 'width + 100', + 'width - 100', +], + +'reports/series-common.html.tmpl' => [ + 'sel.name', + '"onchange=\"$sel.onchange\"" IF sel.onchange', +], + +'reports/chart.csv.tmpl' => [ + 'data.$j.$i', + 'colsepchar', +], + +'reports/create-chart.html.tmpl' => [ + 'series.series_id', + 'newidx', +], + +'reports/edit-series.html.tmpl' => [ + 'default.series_id', +], + +'list/edit-multiple.html.tmpl' => [ + 'group.id', + 'menuname', +], + +'list/list.rdf.tmpl' => [ + 'template_version', + 'bug.bug_id', + 'column', +], + +'list/table.html.tmpl' => [ + 'tableheader', + 'bug.bug_id', + 'abbrev.$id.title || field_descs.$id || column.title', +], + +'list/list.csv.tmpl' => [ + 'bug.bug_id', + 'colsepchar', +], + +'list/list.js.tmpl' => [ + 'bug.bug_id', +], + +'global/choose-product.html.tmpl' => [ + 'target', +], + +# You are not permitted to add any values here. Everything in this file should +# be filtered unless there's an extremely good reason why not, in which case, +# use the "none" dummy filter. +'global/code-error.html.tmpl' => [ +], + +'global/header.html.tmpl' => [ + 'javascript', + 'style', + 'onload', + 'title', + '" – $header" IF header', + 'subheader', + 'header_addl_info', + 'message', +], + +'global/messages.html.tmpl' => [ + 'message_tag', + 'series.frequency * 2', +], + +'global/per-bug-queries.html.tmpl' => [ + '" value=\"$bugids\"" IF bugids', +], + +'global/select-menu.html.tmpl' => [ + 'options', + 'size', +], + +'global/tabs.html.tmpl' => [ + 'content', +], + +# You are not permitted to add any values here. Everything in this file should +# be filtered unless there's an extremely good reason why not, in which case, +# use the "none" dummy filter. +'global/user-error.html.tmpl' => [ +], + +'global/confirm-user-match.html.tmpl' => [ + 'script', + 'fields.${field_name}.flag_type.name', +], + +'global/site-navigation.html.tmpl' => [ + 'bug.bug_id', +], + +'bug/comments.html.tmpl' => [ + 'comment.id', + 'bug.bug_id', +], + +'bug/dependency-graph.html.tmpl' => [ + 'image_map', # We need to continue to make sure this is safe in the CGI + 'image_url', + 'map_url', + 'bug_id', +], + +'bug/dependency-tree.html.tmpl' => [ + 'bugid', + 'maxdepth', + 'hide_resolved', + 'ids.join(",")', + 'maxdepth + 1', + 'maxdepth > 0 && maxdepth <= realdepth ? maxdepth : ""', + 'maxdepth == 1 ? 1 + : ( maxdepth ? maxdepth - 1 : realdepth - 1 )', +], + +'bug/edit.html.tmpl' => [ + 'bug.remaining_time', + 'bug.delta_ts', + 'bug.bug_id', + 'group.bit', + 'dep.title', + 'dep.fieldname', + 'bug.${dep.fieldname}.join(\', \')', + 'selname', + '" accesskey=\"$accesskey\"" IF accesskey', + 'inputname', + '" colspan=\"$colspan\"" IF colspan', + '" size=\"$size\"" IF size', + '" maxlength=\"$maxlength\"" IF maxlength', + '" spellcheck=\"$spellcheck\"" IF spellcheck', +], + +'bug/show-multiple.html.tmpl' => [ + 'attachment.id', + 'flag.status', +], + +'bug/show.html.tmpl' => [ + 'bug.bug_id', +], + +'bug/show.xml.tmpl' => [ + 'constants.BUGZILLA_VERSION', + 'a.id', + 'field', +], + +'bug/summarize-time.html.tmpl' => [ + 'global.grand_total FILTER format("%.2f")', + 'subtotal FILTER format("%.2f")', + 'work_time FILTER format("%.2f")', + 'global.total FILTER format("%.2f")', + 'global.remaining FILTER format("%.2f")', + 'global.estimated FILTER format("%.2f")', + 'bugs.$id.remaining_time FILTER format("%.2f")', + 'bugs.$id.estimated_time FILTER format("%.2f")', +], + + +'bug/time.html.tmpl' => [ + 'time_unit FILTER format(\'%.1f\')', + 'time_unit FILTER format(\'%.2f\')', + '(act / (act + rem)) * 100 + FILTER format("%d")', +], + +'bug/process/results.html.tmpl' => [ + 'title.$type', + '"$terms.Bug $id" FILTER bug_link(id)', + '"$terms.bug $id" FILTER bug_link(id)', +], + +'bug/create/create.html.tmpl' => [ + 'cloned_bug_id', +], + +'bug/create/create-guided.html.tmpl' => [ + 'tablecolour', + 'sel', +], + +'bug/activity/table.html.tmpl' => [ + 'change.attachid', +], + +'attachment/create.html.tmpl' => [ + 'bug.bug_id', + 'attachment.id', +], + +'attachment/created.html.tmpl' => [ + 'attachment.id', + 'attachment.bug_id', +], + +'attachment/edit.html.tmpl' => [ + 'attachment.id', + 'attachment.bug_id', + 'a', + 'editable_or_hide', +], + +'attachment/list.html.tmpl' => [ + 'attachment.id', + 'flag.status', + 'bugid', + 'obsolete_attachments', +], + +'attachment/midair.html.tmpl' => [ + 'attachment.id', +], + +'attachment/show-multiple.html.tmpl' => [ + 'a.id', + 'flag.status' +], + +'attachment/updated.html.tmpl' => [ + 'attachment.id', +], + +'attachment/diff-header.html.tmpl' => [ + 'attachid', + 'id', + 'bugid', + 'oldid', + 'newid', + 'patch.id', +], + +'attachment/diff-file.html.tmpl' => [ + 'lxr_prefix', + 'file.minus_lines', + 'file.plus_lines', + 'bonsai_prefix', + 'section.old_start', + 'section_num', + 'current_line_old', + 'current_line_new', +], + +'admin/admin.html.tmpl' => [ + 'class' +], + +'admin/table.html.tmpl' => [ + 'link_uri' +], + +'admin/custom_fields/cf-js.js.tmpl' => [ + 'constants.FIELD_TYPE_SINGLE_SELECT', + 'constants.FIELD_TYPE_MULTI_SELECT', + 'constants.FIELD_TYPE_BUG_ID', +], + +'admin/params/common.html.tmpl' => [ + 'sortlist_separator', +], + +'admin/products/groupcontrol/confirm-edit.html.tmpl' => [ + 'group.count', +], + +'admin/products/groupcontrol/edit.html.tmpl' => [ + 'group.id', + 'constants.CONTROLMAPNA', + 'constants.CONTROLMAPSHOWN', + 'constants.CONTROLMAPDEFAULT', + 'constants.CONTROLMAPMANDATORY', +], + +'admin/products/list.html.tmpl' => [ + 'classification_url_part', +], + +'admin/products/footer.html.tmpl' => [ + 'classification_url_part', + 'classification_text', +], + +'admin/flag-type/confirm-delete.html.tmpl' => [ + 'flag_type.flag_count', + 'flag_type.id', +], + +'admin/flag-type/edit.html.tmpl' => [ + 'action', + 'type.id', + 'type.target_type', + 'type.sortkey || 1', + 'typeLabelLowerPlural', + 'typeLabelLowerSingular', + 'selname', +], + +'admin/flag-type/list.html.tmpl' => [ + 'type.id', +], + + +'admin/components/confirm-delete.html.tmpl' => [ + 'comp.bug_count' +], + +'admin/groups/delete.html.tmpl' => [ + 'shared_queries' +], + +'admin/users/confirm-delete.html.tmpl' => [ + 'attachments', + 'reporter', + 'assignee_or_qa', + 'cc', + 'component_cc', + 'flags.requestee', + 'flags.setter', + 'longdescs', + 'quips', + 'series', + 'watch.watched', + 'watch.watcher', + 'whine_events', + 'whine_schedules', + 'otheruser.id' +], + +'admin/users/edit.html.tmpl' => [ + 'otheruser.id', + 'group.id', +], + +'admin/components/edit.html.tmpl' => [ + 'comp.bug_count' +], + +'admin/workflow/edit.html.tmpl' => [ + 'status.id', + 'new_status.id', +], + +'admin/workflow/comment.html.tmpl' => [ + 'status.id', + 'new_status.id', +], + +'account/auth/login-small.html.tmpl' => [ + 'qs_suffix', +], + +'account/prefs/email.html.tmpl' => [ + 'relationship.id', + 'event.id', + 'prefname', +], + +'account/prefs/prefs.html.tmpl' => [ + 'current_tab.label', + 'current_tab.name', +], + +'account/prefs/saved-searches.html.tmpl' => [ + 'group.id', +], + +'config.rdf.tmpl' => [ + 'escaped_urlbase', +], + +); diff --git a/template/en/default/global/common-links.html.tmpl b/template/en/default/global/common-links.html.tmpl new file mode 100644 index 0000000..ec43619 --- /dev/null +++ b/template/en/default/global/common-links.html.tmpl @@ -0,0 +1,111 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[% DEFAULT qs_suffix = "" %] +[% USE Bugzilla %] + +<ul class="links"> + <li><a href="./">Home</a></li> + <li><span class="separator">| </span><a href="enter_bug.cgi?format=guided&classification=__all">New</a></li> + <li><span class="separator">| </span><a href="describecomponents.cgi">Browse</a></li> + <li><span class="separator">| </span><a href="query.cgi">Search</a></li> + + <li class="form"> + <span class="separator">| </span> + <form action="buglist.cgi" method="get" + onsubmit="if (this.quicksearch.value == '') + { alert('Please enter one or more search terms first.'); + return false; } return true;"> + <input type="hidden" id="no_redirect[% qs_suffix FILTER html %]" name="no_redirect" value="0"> + <script type="text/javascript"> + if (history && history.replaceState) { + var no_redirect = document.getElementById("no_redirect[% qs_suffix FILTER js %]"); + no_redirect.value = 1; + } + </script> + <input class="txt" type="text" id="quicksearch[% qs_suffix FILTER html %]" name="quicksearch" + title="Quick Search" value="[% quicksearch FILTER html %]"> + <input class="btn" type="submit" value="Search" + id="find[% qs_suffix FILTER html %]"> + [%-# Work around FF bug: keep this on one line %]</form> + <a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">[?]</a></li> + + <li><span class="separator">| </span><a href="report.cgi">Reports</a></li> + + <li> + [% IF Param('shutdownhtml') || Bugzilla.has_flags %] + <span class="separator">| </span> + [% IF user.id %] + <a href="request.cgi?requester=[% user.login FILTER uri %]&requestee= + [% user.login FILTER uri %]&do_union=1&group=type&action=queue">My Requests</a> + [% ELSE %] + <a href="request.cgi">Requests</a> + [% END %] + [% END %] + [%-# Work around FF bug: keep this on one line %]</li> + + [% IF user.login %] + <li><span class="separator">| </span><a href="userprefs.cgi">Preferences</a></li> + [% IF user.in_group('tweakparams') || user.in_group('editusers') || user.can_bless + || (Param('useclassification') && user.in_group('editclassifications')) + || user.in_group('editcomponents') || user.in_group('admin') || user.in_group('creategroups') + || user.in_group('editkeywords') || user.in_group('bz_canusewhines') + || user.get_products_by_permission("editcomponents").size %] + <li><span class="separator">| </span><a href="admin.cgi">Administration</a></li> + [% END %] + + [% PROCESS link_to_documentation %] + + <li> + <span class="separator">| </span> + [% IF user.authorizer.can_logout %] + <a href="index.cgi?logout=1">Log out</a> + [% ELSE %] + Logged in as + [% END %] + [% IF sudoer %] + [%+ sudoer.login FILTER html %] (<b>impersonating + [%+ user.login FILTER html %]</b> + <a href="relogin.cgi?action=end-sudo">end session</a>) + [% ELSE %] + [%+ user.login FILTER html %] + [% END %] + [%-# Work around FF bug: keep this on one line %]</li> + [% ELSE %] + + [% PROCESS link_to_documentation %] + + [% IF Param('createemailregexp') + && user.authorizer.user_can_create_account %] + <li id="new_account_container[% qs_suffix FILTER html %]"> + <span class="separator">| </span> + <a href="createaccount.cgi">New Account</a> + </li> + [% END %] + + [%# Only display one login form when we're on a LOGIN_REQUIRED page. That + # way, we're guaranteed that the user will use the form that has + # hidden_fields in it (the center form) instead of this one. Also, it's + # less confusing to have one form (as opposed to three) when you're + # required to log in. + #%] + [% IF user.authorizer.can_login && !Bugzilla.page_requires_login %] + [% PROCESS "account/auth/login-small.html.tmpl" %] + [% END %] + [% END %] +</ul> + +[% Hook.process("link-row") %] +[% BLOCK link_to_documentation %] + [% IF doc_section && Param('docs_urlbase') %] + <li> + <span class="separator">| </span> + <a href="[% docs_urlbase _ doc_section FILTER html %]" target="_blank">Help</a> + </li> + [% END %] +[% END %] diff --git a/template/en/default/global/variables.none.tmpl b/template/en/default/global/variables.none.tmpl new file mode 100644 index 0000000..dd32a98 --- /dev/null +++ b/template/en/default/global/variables.none.tmpl @@ -0,0 +1,33 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# This is a list of terms that may be changed to "brand" the Bugzilla + # instance (for example, referring to "bugs" as "issues".) When used, these + # strings are used in several different types of content, and are not + # protected with Template-Toolkit FILTERs. Consequently, no special + # characters are allowed. + # + # Remember to PROCESS rather than INCLUDE this template. + #%] + +[% terms = { + "bug" => "bug", + "Bug" => "Bug", + "abug" => "a bug", + "Abug" => "A bug", + "aBug" => "a Bug", + "ABug" => "A Bug", + "bugs" => "bugs", + "Bugs" => "Bugs", + "zeroSearchResults" => "Zarro Boogs found", + "Bugzilla" => "Mageia Bugzilla" + } +%] + +[% USE Hook %] +[% Hook.process("end") %] diff --git a/template/en/default/index.html.tmpl b/template/en/default/index.html.tmpl new file mode 100644 index 0000000..002f08a --- /dev/null +++ b/template/en/default/index.html.tmpl @@ -0,0 +1,172 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # release: a hash containing data about new releases, if any. + #%] + +[% PROCESS global/header.html.tmpl + title = "$terms.Bugzilla Main Page" + header = "Main Page" + header_addl_info = "version $constants.BUGZILLA_VERSION" + style_urls = [ 'skins/standard/index.css' ] +%] + + +<script type="text/javascript"> +<!-- +function onLoadActions() { + quicksearchHelpText('quicksearch_main', 'show'); + if( window.external.AddSearchProvider ){ + YAHOO.util.Dom.removeClass('quicksearch_plugin', 'bz_default_hidden'); + } + document.getElementById('quicksearch_top').focus(); +} +var quicksearch_message = "Enter [% terms.abug %] # or some search terms"; + +function checkQuicksearch( form ) { + if (form.quicksearch.value == '' || form.quicksearch.value == quicksearch_message ) { + alert('Please enter one or more search terms first.'); + return false; + } + return true; +} + +function quicksearchHelpText(el_id, action){ + var el = document.getElementById(el_id); + if ( action == "show") { + if( el.value == "" ) { + el.value = quicksearch_message + YAHOO.util.Dom.addClass(el, "quicksearch_help_text"); + } + } else { + if( el.value == quicksearch_message ) { + el.value = ""; + YAHOO.util.Dom.removeClass(el, "quicksearch_help_text"); + } + } +} +YAHOO.util.Event.onDOMReady(onLoadActions); +//--> +</script> + +[% IF release %] + <div id="new_release"> + [% IF release.data %] + [% IF release.deprecated %] + <p>[% terms.Bugzilla %] [%+ release.deprecated FILTER html %] is no longer + supported. You are highly encouraged to upgrade in order to keep your + system secure.</p> + [% END %] + + <p>A new [% terms.Bugzilla %] version ([% release.data.latest_ver FILTER html %]) + is available at + <a href="[% release.data.url FILTER html %]">[% release.data.url FILTER html %]</a>.<br> + Release date: [% release.data.date FILTER html %]</p> + + <p class="notice">This message is only shown to logged in users with admin privs. + You can configure this notification from the + <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p> + [% ELSIF release.error == "cannot_download" %] + <p>The remote file <a href="[% constants.REMOTE_FILE FILTER html %]"> + [%~ constants.REMOTE_FILE FILTER html %]</a> cannot be downloaded + (reason: [% release.reason FILTER html %]).<br> + Either the remote server is temporarily unavailable, or your web server cannot access + the web. If you are behind a proxy, set the + <a href="editparams.cgi?section=advanced#proxy_url_desc">proxy_url</a> parameter correctly.</p> + [% ELSIF release.error == "no_write" %] + <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be created + (reason: [% release.reason FILTER html %]).<br> + Please make sure the web server can write into this directory. + [% ELSIF release.error == "no_update" %] + <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be updated. + Please make sure the web server can edit this file.</p> + [% ELSIF release.error == "no_access" %] + <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' cannot be read. + Please make sure this file has the correct rights set on it.</p> + [% ELSIF release.error == "corrupted" %] + <p>The local XML file '[% constants.LOCAL_FILE FILTER html %]' has an invalid XML format. + Please delete it and try accessing this page again.</p> + [% ELSIF release.error == "unknown_parameter" %] + <p>'[% Param("upgrade_notification") FILTER html %]' is not a valid notification + parameter. Please check this parameter in the + <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p> + [% END %] + </div> +[% END %] + +<div id="page-index"> + <table> + <tr> + <td> + <h1 id="welcome"> Welcome to [% terms.Bugzilla %]</h1> + <div class="intro">[% Hook.process('intro') %]</div> + + <div class="bz_common_actions"> + <ul> + <li> + <a id="enter_bug" href="enter_bug.cgi?format=guided&classification=__all"><span>File + [%= terms.aBug %]</span></a> + </li> + <li> + <a id="query" href="query.cgi"><span>Search</span></a> + </li> + <li> + <a id="account" + [% IF user.id %] + href="userprefs.cgi"><span>User Preferences</span></a> + [% ELSIF Param('createemailregexp') + %] + href="http://identity.mageia.org/register"><span>Open a New Account</span></a> + [% ELSE %] + href="?GoAheadAndLogIn=1"><span>Log In</span></a> + [% END %] + </li> + </ul> + </div> + + <form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi" + onsubmit="return checkQuicksearch(this);"> + <div> + <input id="quicksearch_main" type="text" name="quicksearch" + title="Quick Search" + onfocus="quicksearchHelpText(this.id, 'hide');" + onblur="quicksearchHelpText(this.id, 'show');" + > + <input id="find" type="submit" value="Quick Search"> + <ul class="additional_links" id="quicksearch_links"> + <li> + <a href="page.cgi?id=quicksearch.html">Quick Search help</a> + </li> + <li class="bz_default_hidden" id="quicksearch_plugin"> + | + <a href="javascript:window.external.AddSearchProvider('[% urlbase FILTER html %]search_plugin.cgi')"> + Install the Quick Search plugin + </a> + </li> + </ul> + <ul class="additional_links"> + <li> + <a href="[% docs_urlbase FILTER html %]using.html"> + [%- terms.Bugzilla %] User's Guide</a> + </li> + <li> + | + <a href="page.cgi?id=release-notes.html">Release Notes</a> + </li> + [% Hook.process('additional_links') %] + </ul> + </div> + </form> + <div class="outro">[% Hook.process('outro') %]</div> + </td> + </tr> + </table> +</div> + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl new file mode 100644 index 0000000..91b1da2 --- /dev/null +++ b/template/en/default/list/list.html.tmpl @@ -0,0 +1,340 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # searchtype: string. Type of search - either "series", "saved" or undef. + # ... + # defaultsavename: string. The default name for saving the query. + #%] + +[%############################################################################%] +[%# Template Initialization #%] +[%############################################################################%] + +[% PROCESS "global/field-descs.none.tmpl" %] + +[% USE Bugzilla %] +[% cgi = Bugzilla.cgi %] + +[% unfiltered_title = "$terms.Bug List" %] +[% IF searchname || defaultsavename %] + [% unfiltered_title = unfiltered_title _ ": " _ (searchname OR defaultsavename) %] +[% END %] +[% title = unfiltered_title FILTER html %] + +[% qorder = order FILTER uri IF order %] + +[% javascript = BLOCK %] + [% new_url = cgi.self_url %] + [% IF quicksearch %] + [% new_url = BLOCK ~%] + buglist.cgi?quicksearch=[% quicksearch FILTER uri %] + [%~ IF cgi.param('list_id') ~%] + &list_id=[% cgi.param('list_id') FILTER uri %] + [%~ END %] + [% END %] + [% ELSIF cgi.param('token') != '' %] + [% new_url = 'buglist.cgi?' + _ cgi.canonicalise_query('token', 'cmdtype', 'remtype') %] + [% END %] + + if (history && history.replaceState) { + history.replaceState(null, "[% unfiltered_title FILTER js %]", + "[% new_url FILTER js %]"); + document.title = "[% unfiltered_title FILTER js %]"; + } + [% javascript FILTER none %] +[% END %] + +[%############################################################################%] +[%# Page Header #%] +[%############################################################################%] + +[% PROCESS global/header.html.tmpl + title = title + style = style + atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom" + yui = [ 'autocomplete', 'calendar' ] + javascript_urls = [ "js/util.js", "js/field.js", "js/TUI.js" ] + style_urls = [ "skins/standard/buglist.css" ] + doc_section = "query.html#list" +%] + +<div class="bz_query_head"> + <span class="bz_query_timestamp"> + [% currenttime FILTER time('%a %b %e %Y %T %Z') FILTER html %]<br> + </span> + + [% IF debug %] + <div class="bz_query_debug"> + <p>Total execution time: [% query_time FILTER html %] seconds</p> + [% FOREACH query = queries %] + <p>[% query.sql FILTER html %]</p> + <p>Execution time: [% query.time FILTER html %] seconds</p> + [% IF query.explain %] + <pre>[% query.explain FILTER html %]</pre> + [% END %] + [% END %] + </div> + [% END %] + + [% IF user.settings.display_quips.value == 'on' %] + [% DEFAULT quip = "$terms.Bugzilla would like to put a random quip here, but no one has entered any." %] + <span class="bz_quip"> + <a href="quips.cgi"><em>[% quip FILTER html %]</em></a> + </span> + [% END %] + +</div> + +[% IF toolong %] + <h2 class="bz_smallminded"> + This list is too long for [% terms.Bugzilla %]'s little mind; the + Next/Prev/First/Last buttons won't appear on individual [% terms.bugs %]. + </h2> +[% END %] + +[% SET shown_types = [ + 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq', + 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter', + 'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords', + 'nowordssubstr', 'notmatches', +] %] +<a id="search_description_controller" class="bz_default_hidden" + href="javascript:TUI_toggle_class('search_description')">Hide Search Description</a> +[%# Show the link if the browser supports JS %] +<script type="text/javascript"> + TUI_alternates['search_description'] = 'Show Search Description'; + YAHOO.util.Dom.removeClass('search_description_controller', + 'bz_default_hidden'); +</script> + +<ul class="search_description"> +[% FOREACH desc_item = search_description %] + <li> + <strong>[% field_descs.${desc_item.field} FILTER html %]:</strong> + [% IF shown_types.contains(desc_item.type) || debug %] + ([% search_descs.${desc_item.type} FILTER html %]) + [% END %] + [% FOREACH val IN desc_item.value.split(',') %] + [%+ display_value(desc_item.field, val) FILTER html %][% ',' UNLESS loop.last %] + [% END %] + [% IF debug %] + (<code>[% desc_item.term FILTER html %]</code>) + [% END %] + </li> +[% END %] +</ul> + +<hr> + +[%############################################################################%] +[%# Preceding Status Line #%] +[%############################################################################%] + +[% IF bugs.size > 9 %] + [% PROCESS num_results %] +[% END %] + +[%############################################################################%] +[%# Start of Change Form #%] +[%############################################################################%] + +[% IF dotweak %] + <form name="changeform" method="post" action="process_bug.cgi"> +[% END %] + +[%############################################################################%] +[%# Bug Table #%] +[%############################################################################%] + +[% PROCESS list/table.html.tmpl %] + +[%############################################################################%] +[%# Succeeding Status Line #%] +[%############################################################################%] + +[% PROCESS num_results %] + +[% IF bugs.size == 0 %] + <ul class="zero_result_links"> + <li>[% PROCESS enter_bug_link %]</li> + [% IF one_product.defined %] + <li><a href="enter_bug.cgi?format=guided&classification=__all">File a new [% terms.bug %] in a + different product</a></li> + [% END %] + <li><a href="[% PROCESS edit_search_url %]">Edit this search</a></li> + <li><a href="query.cgi">Start a new search</a></li> + </ul> +[% END %] + +<br> + +[%############################################################################%] +[%# Rest of Change Form #%] +[%############################################################################%] + +[% IF dotweak %] + [% PROCESS "list/edit-multiple.html.tmpl" %] + </form> + <hr> +[% END %] + +[%############################################################################%] +[%# Navigation Bar #%] +[%############################################################################%] + +<table> + <tr> + [% IF bugs.size > 0 %] + <td valign="middle" class="bz_query_buttons"> + <form method="post" action="show_bug.cgi"> + [% id = buglist.join(",") %] + <input type="hidden" name="id" value="[% id FILTER html %]"> + <input type="hidden" name="format" value="multiple"> + <input type="submit" id="long_format" value="Long Format"> + </form> + <form method="post" action="show_bug.cgi"> + <input type="hidden" name="ctype" value="xml"> + [% FOREACH id = buglist %] + <input type="hidden" name="id" value="[% id FILTER html %]"> + [% END %] + <input type="hidden" name="excludefield" value="attachmentdata"> + <input type="submit" value="XML" id="xml"> + </form> + + [% IF user.is_timetracker %] + <form method="post" action="summarize_time.cgi"> + <input type="hidden" name="id" value="[% buglist_joined FILTER html %]"> + <input type="submit" id="timesummary" value="Time Summary"> + </form> + [% IF time_summary_limited %] + <small> + Time Summary will only include the [% terms.bugs %] shown above. In order to + to see a time summary for all [% terms.bugs %] found by the search, you can + <a href="buglist.cgi?[% urlquerypart FILTER html %] + [%- "&order=$qorder" FILTER html IF order %]&limit=0"> + Show all search results</a>.</small> + [% END %] + [% END %] + </td> + + <td> </td> + + <td valign="middle" class="bz_query_links"> + <a href="buglist.cgi? + [% urlquerypart FILTER html %]&ctype=csv&human=1">CSV</a> | + <a href="buglist.cgi? + [% urlquerypart FILTER html %]&title= + [%- title FILTER html %]&ctype=atom">Feed</a> | + <a href="buglist.cgi? + [% urlquerypart FILTER html %]&ctype=ics">iCalendar</a> | + <a href="colchange.cgi? + [% urlquerypart FILTER html %]&query_based_on= + [% defaultsavename OR searchname FILTER uri %]">Change Columns</a> | + + [% IF bugs.size > 1 && caneditbugs && !dotweak %] + <a href="buglist.cgi?[% urlquerypart FILTER html %] + [%- "&order=$qorder" FILTER html IF order %]&tweak=1" + >Change Several [% terms.Bugs %] at Once</a> + | + [% END %] + + [% IF bugowners && user.id %] + <a href="mailto: + [% bugowners FILTER html %]">Send Mail to [% terms.Bug %] Assignees</a> | + [% END %] + + [%# Links to more things users can do with this bug list. %] + [% Hook.process("links") %] + </td> + [% END %] + + <td valign="middle" class="bz_query_edit"> + <a href="[% PROCESS edit_search_url %]">Edit Search</a> + </td> + + [% IF searchtype == "saved" %] + <td valign="middle" nowrap="nowrap" class="bz_query_forget"> + | + <a href="buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd= + [% searchname FILTER uri %]&token= + [% issue_hash_token([search_id, searchname]) FILTER uri %]"> + Forget Search '[% searchname FILTER html %]'</a> + </td> + [% ELSE %] + <td> </td> + + <td valign="middle" class="bz_query_remember"> + <form method="get" action="buglist.cgi"> + <input type="submit" id="remember" value="Remember search"> as + <input type="hidden" name="newquery" + value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]"> + <input type="hidden" name="cmdtype" value="doit"> + <input type="hidden" name="remtype" value="asnamed"> + <input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]"> + <input type="text" id="save_newqueryname" name="newqueryname" size="20" + title="New query name" value="[% defaultsavename FILTER html %]"> + </form> + </td> + [% END %] + </tr> +</table> + +[% IF one_product.defined && bugs.size %] + <p class="bz_query_single_product"> + [% PROCESS enter_bug_link %] + </p> +[% END %] + +[%############################################################################%] +[%# Page Footer #%] +[%############################################################################%] + +[% PROCESS global/footer.html.tmpl %] + +[%##########%] +[%# Blocks #%] +[%##########%] + +[% BLOCK edit_search_url %] + [% editqueryname = searchname OR defaultsavename OR '' %] + query.cgi?[% urlquerypart FILTER html %] + [%- IF editqueryname != '' %]&known_name= + [%- editqueryname FILTER uri %] + [% END %] +[% END %] + +[% BLOCK enter_bug_link %] + <a href="enter_bug.cgi + [%- IF one_product.defined %]?product= + [%- one_product.name FILTER uri %][% END %]">File + a new [% terms.bug %] + [% IF one_product.defined %] + in the "[% one_product.name FILTER html %]" product + [% END %]</a> +[% END %] + +[% BLOCK num_results %] + <span class="bz_result_count"> + [% IF bugs.size == 0 %] + <span class="zero_results">[% terms.zeroSearchResults %].</span> + [% ELSIF default_limited AND bugs.size >= Param('default_search_limit') %] + This result was limited to [% Param('default_search_limit') FILTER html %] + [%+ terms.bugs %]. + <a href="buglist.cgi?[% urlquerypart FILTER html %] + [%- "&order=$qorder" FILTER html IF order %]&limit=0">See + all search results for this query</a>. + [% time_summary_limited = 1 %] + [% ELSIF bugs.size == 1 %] + One [% terms.bug %] found. + [% ELSE %] + [% bugs.size %] [%+ terms.bugs %] found. + [% END %] + </span> +[% END %] |