diff options
author | Dexter Morgan <dmorgan@mageia.org> | 2013-02-20 16:07:49 +0000 |
---|---|---|
committer | Colin Guthrie <colin@mageia.org> | 2014-09-15 20:44:40 +0100 |
commit | ba702dcd7ac9b2e6c4d46ad21c7bfacfd6883189 (patch) | |
tree | ece0d9c9d8fa1eff83f8527397da6b2c8c755dd6 /template | |
parent | 48a4cb57974b7f1932c3fe31825c02e4dc4ab30c (diff) | |
download | bugzilla-ba702dcd7ac9b2e6c4d46ad21c7bfacfd6883189.tar bugzilla-ba702dcd7ac9b2e6c4d46ad21c7bfacfd6883189.tar.gz bugzilla-ba702dcd7ac9b2e6c4d46ad21c7bfacfd6883189.tar.bz2 bugzilla-ba702dcd7ac9b2e6c4d46ad21c7bfacfd6883189.tar.xz bugzilla-ba702dcd7ac9b2e6c4d46ad21c7bfacfd6883189.zip |
Add 4.0 branch
Diffstat (limited to 'template')
129 files changed, 4590 insertions, 2679 deletions
diff --git a/template/en/default/4.0.2/patches/bugzilla-add-easy-report-page.patch b/template/en/default/4.0.2/patches/bugzilla-add-easy-report-page.patch new file mode 100644 index 0000000..5bbf52e --- /dev/null +++ b/template/en/default/4.0.2/patches/bugzilla-add-easy-report-page.patch @@ -0,0 +1,629 @@ +=== modified file 'template/en/default/bug/create/create-guided.html.tmpl' +--- template/en/default/bug/create/create-guided.html.tmpl 2011-07-26 09:16:15 +0000 ++++ template/en/default/bug/create/create-guided.html.tmpl 2011-11-15 00:37:40 +0000 +@@ -36,22 +36,11 @@ + + [% style = "" %] + +-<p> +- <font color="red"> +- This is a template used on mozilla.org. This template, and the +- comment-guided.txt.tmpl template that formats the data submitted via +- the form in this template, are included as a demo of what it's +- possible to do with custom templates in general, and custom [% terms.bug %] +- entry templates in particular. As much of the text will not apply, +- you should alter it +- if you want to use this form on your [% terms.Bugzilla %] installation. +- </font> +-</p> +- +-[% tablecolour = "#FFFFCC" %] ++[% tablecolour = "#efefef" %] + + [%# This script displays the descriptions for selected components. %] + <script type="text/javascript"> ++<!-- + var descriptions = [ + [% FOREACH c = product.components %] + '[% c.description FILTER js %]', +@@ -67,114 +56,139 @@ + } + } + } ++ ++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> + +-<h3 id="step1">Step 1 of 3 - has your [% terms.bug %] already been reported?</h3> +- +-<p> +- <font color="red">Please don't skip this step - half of all +- [% terms.bugs %] filed are +- reported already.</font> +- Check the two lists of frequently-reported [% terms.bugs %]: +-</p> +- +-[%# Include other products if sensible %] +-[% IF product.name == "Firefox" %] +- [% productstring = "product=Mozilla%20Application%20Suite&product=Firefox" %] +-[% ELSIF product.name == "Thunderbird" %] +- [% productstring = "product=Mozilla%20Application%20Suite&product=Thunderbird" %] +-[% ELSE %] +- [% productstring = BLOCK %]product=[% product.name FILTER url_quote %][% END %] +-[% END %] +- +-<p> +- <a href="duplicates.cgi?[% productstring %]&format=simple" target="somebugs">All-time Top 100</a> (loaded initially) | +- <a href="duplicates.cgi?[% productstring %]&format=simple&sortby=delta&reverse=1&maxrows=100&changedsince=14" target="somebugs">Hot in the last two weeks</a> +-</p> +- +-<iframe name="somebugs" id="somebugs" +- style="border: 2px black solid" +- src="duplicates.cgi?[% productstring %]&format=simple"> +-</iframe> +- +-<p> +- If your [% terms.bug %] isn't there, search [% terms.Bugzilla %] by entering +- a few key words having to do with your [% terms.bug %] in this box. +- For example: <tt><b>pop3 mail</b></tt> or <tt><b>copy paste</b></tt>. +- The results will appear above. +- </p> +- +-[%# All bugs opened inside the past six months %] +- <form action="buglist.cgi" method="get" target="somebugs"> +- <input type="hidden" name="format" value="simple"> +- <input type="hidden" name="order" value="relevance desc"> +- <input type="hidden" name="bug_status" value="__all__"> +- <input type="hidden" name="product" value="[% product.name FILTER html %]"> +- [% IF product.name == "Firefox" OR +- product.name == "Thunderbird" OR +- product.name == "Mozilla Application Suite" OR +- product.name == "Camino" %] +- <input type="hidden" name="product" value="Core"> +- <input type="hidden" name="product" value="Toolkit"> +- <input type="hidden" name="product" value="PSM"> +- <input type="hidden" name="product" value="NSPR"> +- <input type="hidden" name="product" value="NSS"> +- [% END %] +- <input type="hidden" name="chfieldfrom" value="-6m"> +- <input type="hidden" name="chfieldto" value="Now"> +- <input type="hidden" name="chfield" value="[Bug creation]"> +- <input type="text" name="content" size="40"> +- <input type="submit" id="search" value="Search"> +- </form> +- +-<p> +- Look through the search results. If you get the +- <tt><b>[% terms.zeroSearchResults %]</b></tt> message, [% terms.Bugzilla %] +- found no [% terms.bugs %] that +- match. Check for typing mistakes, or try fewer or different keywords. +- If you find [% terms.abug %] that looks the same as yours, please add +- any useful extra information you have to it, rather than opening a new one. +-</p> +- +- +-<h3 id="step2">Step 2 of 3 - give information</h3> +- +-<p> +- If you've tried a few searches and your [% terms.bug %] really isn't in +- there, tell us all about it. +-</p> +- +-<form method="post" action="post_bug.cgi"> ++<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="assigned_to" value=""> + <input type="hidden" name="priority" + value="[% default.priority FILTER html %]"> +- <input type="hidden" name="version" +- value="[% default.version FILTER html %]"> + <input type="hidden" name="token" value="[% token FILTER html %]"> ++ <input type="hidden" name="op_sys" value="[% Param('defaultopsys') FILTER html %]"> + + <table valign="top" cellpadding="5" cellspacing="5" border="0"> + +- <tr bgcolor="[% tablecolour %]"> +- <td align="right" valign="top"> +- <b>Product</b> ++ <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 %]"> +- [% product.name FILTER html %] ++ <b>[% product.name FILTER html %]</b> + </td> + </tr> + + <tr> +- <td align="right" valign="top"> +- <b>Component</b> ++ <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()"> ++ size="5" onchange="PutDescription();"> + [% IF NOT default.component_ %] + [%# Various b.m.o. products have a "General" component, + which is a useful default. %] +@@ -213,82 +227,74 @@ + </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 FILTER html %]" ++ [% " selected=\"selected\"" IF v == default.version %]>[% v 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 = [ "PC", "Macintosh", "All", "Other" ] %] ++ [% rep_platform = [ "All", "i586", "x86_64" ] %] + +- <tr bgcolor="[% tablecolour %]"> +- <td align="right" valign="top"> +- <b>Hardware Platform</b> ++ <tr> ++ <td align="right" valign="top" bgcolor="[% tablecolour %]"> ++ <b>Hardware Platform:</b> + </td> + <td valign="top"> + [% PROCESS select sel = 'rep_platform' %] + </td> + </tr> + +- [% op_sys = [ "Windows 2000", "Windows XP", "Windows Vista", "Windows 7", +- "Mac OS X", "Linux", "All", "Other" ] %] +- + <tr> +- <td align="right" valign="top"> +- <b>Operating System</b> +- </td> +- <td valign="top"> +- [% PROCESS select sel = 'op_sys' %] +- </td> +- </tr> +- +- [% IF product.name.match("Firefox|Camino|Mozilla Application Suite") %] +- [% matches = cgi.user_agent('Gecko/(\d+)') %] +- [% buildid = cgi.user_agent() IF matches %] +- [% END %] +- +- [%# Accept URL parameter build ID for non-browser products %] +- [% IF cgi.param("buildid") %] +- [% buildid = cgi.param("buildid") %] +- [% END %] +- +- <tr bgcolor="[% tablecolour %]"> +- <td align="right" valign="top"> +- <b>Build Identifier</b> +- </td> +- <td valign="top"> +- <input type="text" size="80" name="buildid" value="[% buildid FILTER html %]"> +- <p> +- This should identify the exact version of the product you were using. +- If the above field is blank or you know it is incorrect, copy the +- version text from the product's Help | +- About menu (for browsers this will begin with "Mozilla/5.0..."). +- If the product won't start, instead paste the complete URL you downloaded +- it from. ++ <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"> +- <b>URL</b> ++ <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 seeing (optional).<br> +- <b>IMPORTANT</b>: if the problem is with a broken web page, you need +- to report it +- <a href="https://bugzilla.mozilla.org/page.cgi?id=broken-website.html">a different way</a>. ++ URL that demonstrates the problem you are submitting (optional). + </p> + </td> + </tr> + +- <tr bgcolor="[% tablecolour %]"> +- <td align="right" valign="top"> +- <b>Summary</b> ++ <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 which summarises the problem. ++ A sentence that summarizes the problem. + Please be descriptive and use lots of keywords. + </p> + <p> +@@ -298,149 +304,62 @@ + <br> + <tt> + <font color="#009900">Good example</font>: +- crash if I close the mail window while checking for new POP mail ++ crash in Evolution while checking for new POP mail + </tt> + </p> + </td> + </tr> + + <tr> +- <td align="right" valign="top"> +- <b>Details</b> ++ <td align="right" valign="top" bgcolor="[% tablecolour %]"> ++ <b>Details:</b> + </td> + <td valign="top"> + [% INCLUDE global/textarea.html.tmpl + name = 'comment' +- minrows = 6 ++ 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>: Mozilla crashed. +- You suck! ++ <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>: After a crash which +- happened when I was sorting in the Bookmark Manager,<br> all of my +- top-level bookmark folders beginning with the letters Q to Z are +- no longer present. ++ <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 bgcolor="[% tablecolour %]"> +- <td align="right" valign="top"> +- <b>Reproducibility</b> +- </td> +- <td valign="top"> +- <select name="reproducible"> +- <option name="AlwaysReproducible" value="Always"> +- Happens every time. +- </option> +- <option name="Sometimes" value="Sometimes"> +- Happens sometimes, but not always. +- </option> +- <option name="DidntTry" value="Didn't try"> +- Haven't tried to reproduce it. +- </option> +- <option name="NotReproducible" value="Couldn't Reproduce"> +- Tried, but couldn't reproduce it. +- </option> +- </select> +- </td> +- </tr> +- +- <tr> +- <td align="right" valign="top"> +- <b>Steps to Reproduce</b> +- </td> +- <td valign="top"> +- [% INCLUDE global/textarea.html.tmpl +- name = 'reproduce_steps' +- minrows = 4 +- cols = constants.COMMENT_COLS +- defaultcontent = "1.\n2.\n3." +- %] +- <p> +- Describe how to reproduce the problem, step by +- step. Include any special setup steps. +- </p> +- </td> +- </tr> +- +- <tr bgcolor="[% tablecolour %]"> +- <td valign="top" align="right"> +- <b>Actual Results</b> +- </td> +- <td valign="top"> +- [% INCLUDE global/textarea.html.tmpl +- name = 'actual_results' +- minrows = 4 +- cols = constants.COMMENT_COLS +- %] +- <p> +- What happened after you performed the steps above? +- </p> +- </td> +- </tr> +- +- <tr> +- <td valign="top" align="right"> +- <b>Expected Results</b> +- </td> +- <td valign="top"> +- [% INCLUDE global/textarea.html.tmpl +- name = 'expected_results' +- minrows = 4 +- cols = constants.COMMENT_COLS +- %] +- <p> +- What should the software have done instead? +- </p> +- </td> +- </tr> +- +- <tr bgcolor="[% tablecolour %]"> +- <td valign="top" align="right"> +- <b>Additional Information</b> +- </td> +- <td valign="top"> +- [% INCLUDE global/textarea.html.tmpl +- name = 'additional_info' +- minrows = 8 +- cols = constants.COMMENT_COLS +- %] +- <p> +- Add any additional information you feel may be +- relevant to this [% terms.bug %], such as the <b>theme</b> you were +- using (does the [% terms.bug %] still occur +- with the default theme?), a +- <b><a href="http://kb.mozillazine.org/Quality_Feedback_Agent">Talkback crash ID</a></b>, or special +- information about <b>your computer's configuration</b>. Any information +- longer than a few lines, such as a <b>stack trace</b> or <b>HTML +- testcase</b>, should be added +- using the "Add an Attachment" link on the [% terms.bug %], after +- it is filed. If you believe that it's relevant, please also include +- your build configuration, obtained by typing <tt>about:buildconfig</tt> +- into your URL bar. +- <br> +- <br> +- If you are reporting a crash, note the module in +- which the software crashed (e.g., <tt>Application Violation in +- gkhtml.dll</tt>). +- </p> +- </td> +- </tr> +- +- <tr> +- <td valign="top" align="right"> +- <b>Severity</b> ++ <tr> ++ <td valign="top" align="right" bgcolor="[% tablecolour %]"> ++ <b>Severity:</b> + </td> + <td valign="top"> + <select name="bug_severity"> +@@ -466,21 +385,33 @@ + </option> + </select> + <p> +- Say how serious the problem is, or if your [% terms.bug %] is a ++ 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> + +- +-<h3 id="step3">Step 3 of 3 - submit the [% terms.bug %] report</h3> +- + <p> + <input type="submit" id="report" value=" Submit [% terms.Bug %] Report " +- onclick="if (this.form.comment.value == '') ++ 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;"> +@@ -488,17 +419,9 @@ + + <p> + That's it! Thanks very much. You'll be notified by email about any +- progress that is made on fixing your [% terms.bug %]. +- +-<p> +- Please be warned +- that we get a lot of [% terms.bug %] reports filed - it may take quite a +- while to get around to yours. You can help the process by making sure your +- [%+ terms.bug %] is +- complete and easy to understand, and by quickly replying to any questions +- which may arrive by email. ++ progress that is made on fixing your [% terms.bug %]. ++ Thank you for choosing Mageia! + </p> +- + </form> + + [% PROCESS global/footer.html.tmpl %] + +=== modified file 'template/en/default/filterexceptions.pl' +--- template/en/default/filterexceptions.pl 2010-10-20 12:05:31 +0000 ++++ template/en/default/filterexceptions.pl 2011-11-15 00:38:16 +0000 +@@ -317,7 +317,6 @@ + 'bug/create/create-guided.html.tmpl' => [ + 'tablecolour', + 'sel', +- 'productstring', + ], + + 'bug/activity/table.html.tmpl' => [ + diff --git a/template/en/default/account/auth/login-small.html.tmpl b/template/en/default/account/auth/login-small.html.tmpl index 34e5ff9..356edbc 100644 --- a/template/en/default/account/auth/login-small.html.tmpl +++ b/template/en/default/account/auth/login-small.html.tmpl @@ -32,7 +32,12 @@ <li id="mini_login_container[% qs_suffix %]"> <span class="separator">| </span> - <a id="login_link[% qs_suffix %]" href="?GoAheadAndLogIn=1" + [% 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" @@ -103,7 +108,7 @@ </li> <li id="forgot_container[% qs_suffix %]"> <span class="separator">| </span> - <a href="http://identity.mageia.org/">Forgot Password</a> + <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> diff --git a/template/en/default/account/email/confirm-new.html.tmpl b/template/en/default/account/email/confirm-new.html.tmpl index ed0ff34..a677db7 100644 --- a/template/en/default/account/email/confirm-new.html.tmpl +++ b/template/en/default/account/email/confirm-new.html.tmpl @@ -24,11 +24,11 @@ title = title onload = "document.forms['confirm_account_form'].realname.focus();" %] -<div> +<p> To create your account, you must enter a password in the form below. Your email address and Real Name (if provided) will be shown with changes you make. -</div> +</p> <form id="confirm_account_form" method="post" action="token.cgi"> <input type="hidden" name="t" value="[% token FILTER html %]"> @@ -44,7 +44,10 @@ </tr> <tr> <th align="right"><label for="passwd1">Type your password</label>:</th> - <td><input type="password" id="passwd1" name="passwd1" value=""></td> + <td> + <input type="password" id="passwd1" name="passwd1" value=""> + (minimum [% constants.USER_PASSWORD_MIN_LENGTH FILTER none %] characters) + </td> </tr> <tr> <th align="right"><label for="passwd2">Confirm your password</label>:</th> @@ -52,7 +55,7 @@ </tr> <tr> <th align="right"> </th> - <td><input type="submit" id="confirm" value="Send"></td> + <td><input type="submit" id="confirm" value="Create"></td> </tr> </table> </form> diff --git a/template/en/default/account/password/set-forgotten-password.html.tmpl b/template/en/default/account/password/set-forgotten-password.html.tmpl index ca134a4..a2ae517 100644 --- a/template/en/default/account/password/set-forgotten-password.html.tmpl +++ b/template/en/default/account/password/set-forgotten-password.html.tmpl @@ -33,6 +33,7 @@ <th align="right">New Password:</th> <td> <input type="password" name="password"> + (minimum [% constants.USER_PASSWORD_MIN_LENGTH FILTER none %] characters) </td> </tr> diff --git a/template/en/default/account/prefs/email.html.tmpl b/template/en/default/account/prefs/email.html.tmpl index a4d22db..96a111b 100644 --- a/template/en/default/account/prefs/email.html.tmpl +++ b/template/en/default/account/prefs/email.html.tmpl @@ -35,9 +35,6 @@ [% PROCESS global/variables.none.tmpl %] -[% useqacontact = Param('useqacontact') %] -[% usevotes = Param('usevotes') %] - <p> If you don't like getting a notification for "trivial" changes to [% terms.bugs %], you can use the settings below to @@ -80,8 +77,8 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb [% prefname = "email-$constants.REL_ANY-$constants.EVT_FLAG_REQUESTED" %] <input type="checkbox" name="[% prefname %]" id="[% prefname %]" value="1" - [% " checked" IF - mail.${constants.REL_ANY}.${constants.EVT_FLAG_REQUESTED} %]> + [% " checked" + IF user.mail_settings.${constants.REL_ANY}.${constants.EVT_FLAG_REQUESTED} %]> <label for="[% prefname %]">Email me when someone asks me to set a flag</label> <br> </td> @@ -92,8 +89,8 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb [% prefname = "email-$constants.REL_ANY-$constants.EVT_REQUESTED_FLAG" %] <input type="checkbox" name="[% prefname %]" id="[% prefname %]" value="1" - [% " checked" IF - mail.${constants.REL_ANY}.${constants.EVT_REQUESTED_FLAG} %]> + [% " checked" + IF user.mail_settings.${constants.REL_ANY}.${constants.EVT_REQUESTED_FLAG} %]> <label for="[% prefname %]">Email me when someone sets a flag I asked for</label> <br> </td> @@ -150,21 +147,28 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb [% relationships = [ { id = constants.REL_ASSIGNEE, description = "Assignee" }, - { id = constants.REL_QA, - description = "QA Contact" }, { id = constants.REL_REPORTER, description = "Reporter" }, { id = constants.REL_CC, description = "CCed" }, - { id = constants.REL_VOTER, - description = "Voter" }, ] %] +[% IF Param('useqacontact') %] + [% relationships.push({ id = constants.REL_QA, + description = "QA Contact" }) %] +[% END %] + + +[%# This is up here so that the "relationships" hook can modify it. %] +[% no_added_removed = [constants.REL_REPORTER] %] + +[% Hook.process('relationships') %] + +[% num_columns = relationships.size %] + <table class="bz_emailprefs" border="1"> <tr> - <td colspan="[% (useqacontact AND usevotes) ? '5' : - ((useqacontact OR usevotes) ? '4' : '3') %]" - align="center" width="50%"> + <td colspan="[% num_columns FILTER html %]" align="center" width="50%"> <b>When my relationship to this [% terms.bug %] is:</b> </td> <td rowspan="2" width="40%"> @@ -174,8 +178,6 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb <tr> [% FOREACH relationship = relationships %] - [% NEXT IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR - (relationship.id == constants.REL_VOTER AND NOT usevotes) %] <th align="center" width="9%"> [% relationship.description FILTER html %] </th> @@ -186,18 +188,16 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb [% count = loop.count() %] <tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]"> [% FOREACH relationship = relationships %] - [% NEXT IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR - (relationship.id == constants.REL_VOTER AND NOT usevotes) %] <td align="center"> <input type="checkbox" name="email-[% relationship.id %]-[% event.id %]" value="1" [%# The combinations don't always make sense; disable a couple %] [% IF event.id == constants.EVT_ADDED_REMOVED AND - (relationship.id == constants.REL_REPORTER OR - relationship.id == constants.REL_VOTER) %] + no_added_removed.contains(relationship.id) + %] disabled - [% ELSIF mail.${relationship.id}.${event.id} %] + [% ELSIF user.mail_settings.${relationship.id}.${event.id} %] checked [% END %]> </td> @@ -209,8 +209,7 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb [% END %] <tr> - <td colspan="[% (useqacontact AND usevotes) ? '5' : - ((useqacontact OR usevotes) ? '4' : '3') %]" + <td colspan="[% num_columns FILTER html %]" align="center" width="50%"> </td> @@ -223,13 +222,11 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb [% count = loop.count() %] <tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]"> [% FOREACH relationship = relationships %] - [% NEXT IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR - (relationship.id == constants.REL_VOTER AND NOT usevotes) %] <td align="center"> <input type="checkbox" name="neg-email-[% relationship.id %]-[% event.id %]" value="1" - [% " checked" IF NOT mail.${relationship.id}.${event.id} %]> + [% " checked" IF NOT user.mail_settings.${relationship.id}.${event.id} %]> </td> [% END %] <td> @@ -240,29 +237,6 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb </table> -[%# Add hidden form fields for fields not used %] -[% FOREACH event = events %] - [% FOREACH relationship = relationships %] - [% IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR - (relationship.id == constants.REL_VOTER AND NOT usevotes) %] - <input type="hidden" - name="email-[% relationship.id %]-[% event.id %]" - value="[% mail.${relationship.id}.${event.id} ? "1" : "0" %]"> - [% END %] - [% END %] -[% END %] - -[% FOREACH event = neg_events %] - [% FOREACH relationship = relationships %] - [% IF (relationship.id == constants.REL_QA AND NOT useqacontact) OR - (relationship.id == constants.REL_VOTER AND NOT usevotes) %] - <input type="hidden" - name="neg-email-[% relationship.id %]-[% event.id %]" - value="[% mail.${relationship.id}.${event.id} ? "0" : "1" %]"> - [% END %] - [% END %] -[% END %] - <hr> <b>User Watching</b> @@ -290,11 +264,17 @@ You are currently not watching any users. [% END %] </p> -<p><a name="new_watched_by_you" id="new_watched_by_you">Add users to my watch list (comma separated list)</a>: - <input size="60" name="new_watchedusers" value=""> +<p id="new_watched_by_you">Add users to my watch list (comma separated list): + [% INCLUDE global/userselect.html.tmpl + id => "new_watchedusers" + name => "new_watchedusers" + value => "" + size => 60 + multiple => 5 + %] </p> -<p><a name="watching_you" id="watching_you">Users watching you</a>:<br> +<p id="watching_you">Users watching you:<br> [% IF watchers.size %] [% FOREACH watcher = watchers %] [% watcher FILTER html %] <br> diff --git a/template/en/default/account/prefs/prefs.html.tmpl b/template/en/default/account/prefs/prefs.html.tmpl index 71e411d..2e7d98c 100644 --- a/template/en/default/account/prefs/prefs.html.tmpl +++ b/template/en/default/account/prefs/prefs.html.tmpl @@ -50,11 +50,13 @@ link => "userprefs.cgi?tab=email", saveable => "1" }, { name => "saved-searches", label => "Saved Searches", link => "userprefs.cgi?tab=saved-searches", saveable => "1" }, - { name => "account", label => "Name and Password", + { name => "account", label => "Account Information", link => "userprefs.cgi?tab=account", saveable => "1" }, { name => "permissions", label => "Permissions", link => "userprefs.cgi?tab=permissions", saveable => "0" } ] %] +[% Hook.process('tabs') %] + [% FOREACH tab IN tabs %] [% IF tab.name == current_tab_name %] [% current_tab = tab %] diff --git a/template/en/default/account/prefs/saved-searches.html.tmpl b/template/en/default/account/prefs/saved-searches.html.tmpl index f128613..6d87ade 100644 --- a/template/en/default/account/prefs/saved-searches.html.tmpl +++ b/template/en/default/account/prefs/saved-searches.html.tmpl @@ -31,9 +31,9 @@ var checkbox = document.getElementById(group.name.replace(/share_(\d+)/, "force_$1")); if (bz_isValueInArray(bless_groups, group.value)) { - checkbox.disabled = false; + YAHOO.util.Dom.removeClass(checkbox.parentNode, "bz_default_hidden"); } else { - checkbox.disabled = true; + YAHOO.util.Dom.addClass(checkbox.parentNode, "bz_default_hidden"); checkbox.checked = false; } } //--> @@ -132,12 +132,12 @@ [% END %] </select> [% IF user.can_bless %] - <input type="checkbox" id="force_[% q.id FILTER html %]" - name="force_[% q.id FILTER html %]" value="1" - [% " disabled" - IF !bless_group_ids.grep("^$q.shared_with_group.id\$").0 - %]> - <label for="force_[% q.id FILTER html %]">Add to footer</label> + <span [% IF !bless_group_ids.grep("^$q.shared_with_group.id\$").0 + %]class="bz_default_hidden"[% END %]> + <input type="checkbox" id="force_[% q.id FILTER html %]" + name="force_[% q.id FILTER html %]" value="1"> + <label for="force_[% q.id FILTER html %]">Add to footer</label> + </span> [% END %] [% IF q.shared_with_users %] (shared with [% q.shared_with_users FILTER html %] diff --git a/template/en/default/admin/classifications/add.html.tmpl b/template/en/default/admin/classifications/add.html.tmpl index cd949f2..1a6941f 100644 --- a/template/en/default/admin/classifications/add.html.tmpl +++ b/template/en/default/admin/classifications/add.html.tmpl @@ -24,26 +24,9 @@ <form method=post action="editclassifications.cgi"> <table border=0 cellpadding=4 cellspacing=0> - <tr> - <th align="right">Classification:</th> - <td><input size=64 maxlength=64 name="classification"></td> - </tr> - <tr> - <th align="right">Description:</th> - <td> - [% INCLUDE global/textarea.html.tmpl - name = 'description' - minrows = 4 - cols = 64 - wrap = 'virtual' - %] - </td> - </tr> - <tr> - <th align="right"><label for="sortkey">Sortkey:</label></th> - <td><input id="sortkey" size="20" maxlength="20" name="sortkey" - value=""></td> - </tr> + + [% PROCESS "admin/classifications/edit-common.html.tmpl" %] + </table> <hr> <input type=submit value="Add"> diff --git a/template/en/default/admin/classifications/edit-common.html.tmpl b/template/en/default/admin/classifications/edit-common.html.tmpl new file mode 100644 index 0000000..e0db008 --- /dev/null +++ b/template/en/default/admin/classifications/edit-common.html.tmpl @@ -0,0 +1,47 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Tiago Rodrigues de Mello <timello@linux.vnet.ibm.com> + #%] + +[%# INTERFACE: + # classification: Bugzilla::Classifiation object. + #%] + +<tr> + <th align="right">Classification:</th> + <td><input size=64 maxlength=64 name="classification" + value="[% classification.name FILTER html %]"></td> +</tr> +<tr> + <th align="right">Description:</th> + <td> + [% INCLUDE global/textarea.html.tmpl + name = 'description' + minrows = 4 + cols = 64 + defaultcontent = classification.description + %] + </td> +</tr> +<tr> + <th align="right"><label for="sortkey">Sortkey:</label></th> + <td><input id="sortkey" size="20" maxlength="20" name="sortkey" + value="[%- classification.sortkey FILTER html %]"></td> +</tr> + +[% Hook.process('rows') %] diff --git a/template/en/default/admin/classifications/edit.html.tmpl b/template/en/default/admin/classifications/edit.html.tmpl index 80d7f98..2ef1725 100644 --- a/template/en/default/admin/classifications/edit.html.tmpl +++ b/template/en/default/admin/classifications/edit.html.tmpl @@ -24,27 +24,9 @@ <form method=post action="editclassifications.cgi"> <table border=0 cellpadding=4 cellspacing=0> - <tr> - <th align="right">Classification:</th> - <td><input size=64 maxlength=64 name="classification" - value="[% classification.name FILTER html %]"></td> - </tr> - <tr> - <th align="right">Description:</th> - <td> - [% INCLUDE global/textarea.html.tmpl - name = 'description' - minrows = 4 - cols = 64 - defaultcontent = classification.description - %] - </td> - </tr> - <tr> - <th align="right"><label for="sortkey">Sortkey:</label></th> - <td><input id="sortkey" size="20" maxlength="20" name="sortkey" value=" - [%- classification.sortkey FILTER html %]"></td> - </tr> + + [% PROCESS "admin/classifications/edit-common.html.tmpl" %] + <tr valign=top> <th align="right"> <a href="editproducts.cgi?classification=[% classification.name FILTER url_quote %]"> diff --git a/template/en/default/admin/components/create.html.tmpl b/template/en/default/admin/components/create.html.tmpl index 86411ad..c3b691d 100644 --- a/template/en/default/admin/components/create.html.tmpl +++ b/template/en/default/admin/components/create.html.tmpl @@ -26,70 +26,16 @@ [% title = BLOCK %]Add component to the [% product.name FILTER html %] product[% END %] [% PROCESS global/header.html.tmpl + yui = [ 'autocomplete' ] + javascript_urls = [ "js/field.js" ] title = title %] <form method="post" action="editcomponents.cgi"> <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <th align="right">Component:</th> - <td><input size="64" maxlength="64" name="component" value=""></td> - </tr> - <tr> - <th align="right">Description:</th> - <td> - [% INCLUDE global/textarea.html.tmpl - name = 'description' - minrows = 4 - cols = 64 - wrap = 'virtual' - %] - </td> - </tr> - <tr> - <th align="right"><label for="initialowner">Default Assignee:</label></th> - <td> - [% INCLUDE global/userselect.html.tmpl - name => "initialowner" - id => "initialowner" - value => "" - size => 64 - %] - </td> - </tr> -[% IF Param('useqacontact') %] - <tr> - <th align="right"> - <label for="initialqacontact">Default QA Contact:</label></th> - <td> - [% INCLUDE global/userselect.html.tmpl - name => "initialqacontact" - id => "initialqacontact" - value => "" - size => 64 - emptyok => 1 - %] - </td> - </tr> -[% END %] - <tr> - <th align="right"> - <label for="initialcc">Default CC List:</label> - </th> - <td> - [% INCLUDE global/userselect.html.tmpl - name => "initialcc" - id => "initialcc" - value => "" - size => 64 - multiple => 5 - %] - <br> - [% IF !Param("usemenuforusers") %] - <em>Enter user names for the CC list as a comma-separated list.</em> - [% END %] - </td> - </tr> + + [% PROCESS "admin/components/edit-common.html.tmpl" %] + </table> <hr> <input type="submit" id="create" value="Add"> diff --git a/template/en/default/admin/components/edit-common.html.tmpl b/template/en/default/admin/components/edit-common.html.tmpl new file mode 100644 index 0000000..069b56c --- /dev/null +++ b/template/en/default/admin/components/edit-common.html.tmpl @@ -0,0 +1,86 @@ +[%# 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): Tiago Rodrigues de Mello <timello@linux.vnet.ibm.com> + #%] + +[%# INTERFACE: + # comp: object; Bugzilla::Component object. + #%] + +<tr> + <td valign="top">Component:</td> + <td><input size="64" maxlength="64" name="component" + value="[%- comp.name FILTER html %]"></td> +</tr> +<tr> + <td valign="top">Component Description:</td> + <td> + [% INCLUDE global/textarea.html.tmpl + name = 'description' + minrows = 4 + cols = 64 + wrap = 'virtual' + defaultcontent = comp.description + %] + </td> +</tr> +<tr> + <td valign="top"><label for="initialowner">Default Assignee:</label></td> + <td> + [% INCLUDE global/userselect.html.tmpl + name => "initialowner" + id => "initialowner" + value => comp.default_assignee.login + size => 64 + %] + </td> +</tr> +[% IF Param('useqacontact') %] + <tr> + <td valign="top"><label for="initialqacontact">Default QA contact:</label></td> + <td> + [% INCLUDE global/userselect.html.tmpl + name => "initialqacontact" + id => "initialqacontact" + value => comp.default_qa_contact.login + size => 64 + emptyok => 1 + %] + </td> + </tr> +[% END %] +<tr> + <td valign="top"> + <label for="initialcc">Default CC List:</label> + </td> + <td> + [% INCLUDE global/userselect.html.tmpl + name => "initialcc" + id => "initialcc" + value => initial_cc_names + size => 64 + multiple => 5 + %] + <br> + [% IF !Param("usemenuforusers") %] + <em>Enter user names for the CC list as a comma-separated list.</em> + [% END %] + </td> +</tr> + +[% Hook.process('rows') %] diff --git a/template/en/default/admin/components/edit.html.tmpl b/template/en/default/admin/components/edit.html.tmpl index 9ddb8ca..be14be0 100644 --- a/template/en/default/admin/components/edit.html.tmpl +++ b/template/en/default/admin/components/edit.html.tmpl @@ -33,73 +33,15 @@ [% END %] [% PROCESS global/header.html.tmpl title = title + yui = [ 'autocomplete' ] + javascript_urls = [ "js/field.js" ] %] <form method="post" action="editcomponents.cgi"> <table border="0" cellpadding="4" cellspacing="0"> - <tr> - <td valign="top">Component:</td> - <td><input size="64" maxlength="64" name="component" value=" - [%- comp.name FILTER html %]"></td> - </tr> - <tr> - <td valign="top">Component Description:</td> - <td> - [% INCLUDE global/textarea.html.tmpl - name = 'description' - minrows = 4 - cols = 64 - wrap = 'virtual' - defaultcontent = comp.description - %] - </td> - </tr> - <tr> - <td valign="top"><label for="initialowner">Default Assignee:</label></td> - <td> - [% INCLUDE global/userselect.html.tmpl - name => "initialowner" - id => "initialowner" - value => comp.default_assignee.login - size => 64 - %] - </td> - -[% IF Param('useqacontact') %] - </tr> - <tr> - <td valign="top"><label for="initialqacontact">Default QA contact:</label></td> - <td> - [% INCLUDE global/userselect.html.tmpl - name => "initialqacontact" - id => "initialqacontact" - value => comp.default_qa_contact.login - size => 64 - emptyok => 1 - %] - </td> -[% END %] - - </tr> - <tr> - <td valign="top"> - <label for="initialcc">Default CC List:</label> - </td> - <td> - [% INCLUDE global/userselect.html.tmpl - name => "initialcc" - id => "initialcc" - value => initial_cc_names - size => 64 - multiple => 5 - %] - <br> - [% IF !Param("usemenuforusers") %] - <em>Enter user names for the CC list as a comma-separated list.</em> - [% END %] - </td> - </tr> + [% PROCESS "admin/components/edit-common.html.tmpl" %] + <tr> <td>[% terms.Bugs %]:</td> <td> diff --git a/template/en/default/admin/custom_fields/cf-js.js.tmpl b/template/en/default/admin/custom_fields/cf-js.js.tmpl index 5ece96e..528b88b 100644 --- a/template/en/default/admin/custom_fields/cf-js.js.tmpl +++ b/template/en/default/admin/custom_fields/cf-js.js.tmpl @@ -28,7 +28,15 @@ var select_values = new Array(); [% FOREACH sel_field = Bugzilla.get_fields({ is_select => 1 }) %] select_values[[% sel_field.id FILTER js %]] = [ [% FOREACH legal_value = sel_field.legal_values %] - [[% legal_value.id FILTER js %], '[% display_value(sel_field.name, legal_value.name) FILTER js %]'][% ',' UNLESS loop.last %] + [%# Prefix components with the name of their product so that admins + know which component we're talking about. #%] + [% IF sel_field.name == 'component' %] + [% SET value_name = display_value('product', legal_value.product.name) _ ': ' + _ display_value(sel_field.name, legal_value.name) %] + [% ELSE %] + [% SET value_name = display_value(sel_field.name, legal_value.name) %] + [% END %] + [[% legal_value.id FILTER js %], '[% value_name FILTER js %]'][% ',' UNLESS loop.last %] [% END %] ]; [% END %] @@ -43,6 +51,16 @@ function onChangeType(type_field) { else { value_field.disabled = true; } + + var reverse_desc = document.getElementById('reverse_desc'); + if (type_field.value == [% constants.FIELD_TYPE_BUG_ID %]) + { + reverse_desc.disabled = false; + } + else { + reverse_desc.disabled = true; + reverse_desc.value = ''; + } } function onChangeVisibilityField() { diff --git a/template/en/default/admin/custom_fields/create.html.tmpl b/template/en/default/admin/custom_fields/create.html.tmpl index a2db470..fcdf73b 100644 --- a/template/en/default/admin/custom_fields/create.html.tmpl +++ b/template/en/default/admin/custom_fields/create.html.tmpl @@ -28,8 +28,14 @@ onload = "document.getElementById('new_bugmail').disabled = true;" javascript_urls = [ 'js/util.js' ] doc_section = "custom-fields.html#add-custom-fields" + style_urls = ['skins/standard/admin.css'] %] +[%# set initial editability of fields such as Reverse Relationship Description %] +<script type="text/javascript"> +YAHOO.util.Event.onDOMReady(function() {onChangeType(document.getElementById('type'))}); +</script> + <p> Adding custom fields can make the interface of [% terms.Bugzilla %] very complicated. Many admins who are new to [% terms.Bugzilla %] start off @@ -48,14 +54,14 @@ </ul> <form id="add_field" action="editfields.cgi" method="GET"> - <table border="0" cellspacing="0" cellpadding="5"> + <table border="0" cellspacing="0" cellpadding="5" id="edit_custom_field"> <tr> - <th align="right"><label for="name">Name:</label></th> + <th class="narrow_label"><label for="name">Name:</label></th> <td> <input type="text" id="name" name="name" value="cf_" size="40" maxlength="64"> </td> - <th align="right"> + <th> <label for="enter_bug">Can be set on [% terms.bug %] creation:</label> </th> <td> @@ -64,16 +70,16 @@ </td> </tr> <tr> - <th align="right"><label for="desc">Description:</label></th> + <th class="narrow_label"><label for="desc">Description:</label></th> <td><input type="text" id="desc" name="desc" value="" size="40"></td> - <th align="right"> + <th> <label for="new_bugmail">Displayed in [% terms.bug %]mail for new [% terms.bugs %]:</label> </th> <td><input type="checkbox" id="new_bugmail" name="new_bugmail" value="1"></td> </tr> <tr> - <th align="right"><label for="type">Type:</label></th> + <th class="narrow_label"><label for="type">Type:</label></th> <td> <select id="type" name="type" onchange="onChangeType(this)"> [% FOREACH type = field_types.keys %] @@ -83,16 +89,34 @@ </select> </td> - <th align="right"><label for="obsolete">Is obsolete:</label></th> + <th><label for="obsolete">Is obsolete:</label></th> <td><input type="checkbox" id="obsolete" name="obsolete" value="1"></td> </tr> <tr> - <th align="right"><label for="sortkey">Sortkey:</label></th> + <th class="narrow_label"><label for="sortkey">Sortkey:</label></th> <td> <input type="text" id="sortkey" name="sortkey" size="6" maxlength="6"> </td> - <th align="right"> + <th align="right"><label for="is_mandatory">Is mandatory:</label></th> + <td><input type="checkbox" id="is_mandatory" name="is_mandatory" value="1"></td> + </tr> + + <tr> + <th class="narrow_label"> + <label for="reverse_desc">Reverse Relationship Description:</label> + </th> + <td> + <input type="text" id="reverse_desc" name="reverse_desc" value="" size="40" disabled="disabled"> + <br/> + Use this label for the list of [% terms.bugs %] that link to + [%+ terms.abug %] with this + [%+ field_types.${constants.FIELD_TYPE_BUG_ID} FILTER html %] + field. For example, if the description is "Is a duplicate of", + the reverse description would be "Duplicates of this [% terms.bug %]". + Leave blank to disable the list for this field. + </td> + <th> <label for="visibility_field_id">Field only appears when:</label> </th> <td> diff --git a/template/en/default/admin/custom_fields/edit.html.tmpl b/template/en/default/admin/custom_fields/edit.html.tmpl index c5ac53d..755c364 100644 --- a/template/en/default/admin/custom_fields/edit.html.tmpl +++ b/template/en/default/admin/custom_fields/edit.html.tmpl @@ -32,6 +32,7 @@ onload = "toggleCheckbox(document.getElementById('enter_bug'), 'new_bugmail');" javascript_urls = [ 'js/util.js' ] doc_section = "custom-fields.html#edit-custom-fields" + style_urls = ['skins/standard/admin.css'] %] <p> @@ -40,12 +41,12 @@ </p> <form id="edit_field" action="editfields.cgi" method="GET"> - <table border="0" cellspacing="0" cellpadding="5"> + <table border="0" cellspacing="0" cellpadding="5" id="edit_custom_field"> <tr> - <th align="right">Name:</th> + <th class="narrow_label">Name:</th> <td>[% field.name FILTER html %]</td> - <th align="right"> + <th> <label for="enter_bug">Can be set on [% terms.bug %] creation:</label> </th> <td><input type="checkbox" id="enter_bug" name="enter_bug" value="1" @@ -53,31 +54,54 @@ onchange="toggleCheckbox(this, 'new_bugmail');"></td> </tr> <tr> - <th align="right"><label for="desc">Description:</label></th> + <th class="narrow_label"><label for="desc">Description:</label></th> <td><input type="text" id="desc" name="desc" size="40" value="[% field.description FILTER html %]"></td> - <th align="right"> + <th> <label for="new_bugmail">Displayed in [% terms.bug %]mail for new [% terms.bugs %]:</label> </th> <td><input type="checkbox" id="new_bugmail" name="new_bugmail" value="1" [%- " checked" IF field.mailhead %]></td> </tr> <tr> - <th align="right">Type:</th> + <th class="narrow_label">Type:</th> <td>[% field_types.${field.type} FILTER html %]</td> - <th align="right"><label for="obsolete">Is obsolete:</label></th> + <th><label for="obsolete">Is obsolete:</label></th> <td><input type="checkbox" id="obsolete" name="obsolete" value="1" [%- " checked" IF field.obsolete %]></td> </tr> <tr> - <th align="right"><label for="sortkey">Sortkey:</label></th> + <th class="narrow_label"><label for="sortkey">Sortkey:</label></th> <td> <input type="text" id="sortkey" name="sortkey" size="6" maxlength="6" value="[% field.sortkey FILTER html %]"> </td> - <th align="right"> + <th align="right"><label for="is_mandatory">Is mandatory:</label></th> + <td><input type="checkbox" id="is_mandatory" name="is_mandatory" value="1" + [%- ' checked="checked"' IF field.is_mandatory %]></td> + </tr> + <tr> + [% IF field.type == constants.FIELD_TYPE_BUG_ID %] + <th class="narrow_label"> + <label for="reverse_desc">Reverse Relationship Description:</label> + </th> + <td> + <input type="text" id="reverse_desc" name="reverse_desc" size="40" + value="[% field.reverse_desc FILTER html %]"> + <br/> + Use this label for the list of [% terms.bugs %] that link to + [%+ terms.abug %] with this + [%+ field_types.${constants.FIELD_TYPE_BUG_ID} FILTER html %] field. + For example, if the description is "Is a duplicate of", + the reverse description would be "Duplicates of this [% terms.bug %]". + Leave blank to disable the list for this field. + </td> + [% ELSE %] + <td colspan="2"> </td> + [% END %] + <th> <label for="visibility_field_id">Field only appears when:</label> </th> <td> @@ -100,7 +124,10 @@ <option value="[% value.id FILTER html %]" [% ' selected="selected"' IF field.visibility_value.id == value.id %]> - [% display_value(field.visibility_field.name, value.name) FILTER html %] + [% IF field.visibility_field.name == 'component' %] + [% display_value('product', value.product.name) FILTER html %]: + [% END %] + [%+ display_value(field.visibility_field.name, value.name) FILTER html %] </option> [% END %] </select> diff --git a/template/en/default/admin/custom_fields/list.html.tmpl b/template/en/default/admin/custom_fields/list.html.tmpl index dd266c7..385650a 100644 --- a/template/en/default/admin/custom_fields/list.html.tmpl +++ b/template/en/default/admin/custom_fields/list.html.tmpl @@ -57,6 +57,10 @@ heading => "Is Obsolete" }, { + name => "is_mandatory" + heading => "Is Mandatory" + }, + { name => "action" heading => "Action" content => "" diff --git a/template/en/default/admin/fieldvalues/create.html.tmpl b/template/en/default/admin/fieldvalues/create.html.tmpl index f1eec1a..0198314 100644 --- a/template/en/default/admin/fieldvalues/create.html.tmpl +++ b/template/en/default/admin/fieldvalues/create.html.tmpl @@ -75,6 +75,9 @@ [% FOREACH field_value = field.value_field.legal_values %] [% NEXT IF field_value.name == '' %] <option value="[% field_value.id FILTER none %]"> + [% IF field.value_field.name == 'component' %] + [% field_value.product.name FILTER html %]: + [% END %] [%- field_value.name FILTER html -%] </option> [% END %] diff --git a/template/en/default/admin/fieldvalues/edit.html.tmpl b/template/en/default/admin/fieldvalues/edit.html.tmpl index 5650ee8..9c42ce6 100644 --- a/template/en/default/admin/fieldvalues/edit.html.tmpl +++ b/template/en/default/admin/fieldvalues/edit.html.tmpl @@ -73,7 +73,10 @@ <option value="[% field_value.id FILTER none %]" [% ' selected="selected"' IF field_value.id == value.visibility_value.id %]> - [%- field_value.name FILTER html -%] + [% IF field.value_field.name == 'component' %] + [% field_value.product.name FILTER html %]: + [% END %] + [% field_value.name FILTER html -%] </option> [% END %] </select> @@ -91,7 +94,11 @@ [% ELSIF value.is_static %] This value is non-deletable and cannot be disabled. [% END %] - </td> + [% IF !(value.is_default OR value.is_static) %] + <input id="defined_is_active" name="defined_is_active" + type="hidden" value="1"> + [% END %] + </td> </tr> </table> <input type="hidden" name="value" value="[% value.name FILTER html %]"> diff --git a/template/en/default/admin/params/advanced.html.tmpl b/template/en/default/admin/params/advanced.html.tmpl index 4caa2f1..a8e8a29 100644 --- a/template/en/default/admin/params/advanced.html.tmpl +++ b/template/en/default/admin/params/advanced.html.tmpl @@ -24,6 +24,35 @@ desc = "Settings for advanced configurations." %] +[% sts_desc = BLOCK %] + Enables the sending of the + <a href="http://en.wikipedia.org/wiki/Strict_Transport_Security">Strict-Transport-Security</a> + header along with HTTP responses on SSL connections. This adds greater + security to your SSL connections by forcing the browser to always + access your domain over SSL and never accept an invalid certificate. + However, it should only be used if you have the <code>ssl_redirect</code> + parameter turned on, [% terms.Bugzilla %] is the only thing running + on its domain (i.e., your <code>urlbase</code> is something like + <code>http://bugzilla.example.com/</code>), and you never plan to disable + the <code>ssl_redirect</code> parameter. + <ul> + <li> + off - Don't send the Strict-Transport-Security header with requests. + </li> + <li> + this_domain_only - Send the Strict-Transport-Security header with all + requests, but only support it for the current domain. + </li> + <li> + include_subdomains - Send the Strict-Transport-Security header along + with the <code>includeSubDomains</code> flag, which will apply the + security change to all subdomains. This is especially useful when + combined with an <code>attachment_base</code> that exists as (a) + subdomain(s) under the main [% terms.Bugzilla %] domain. + </li> + </ul> +[% END %] + [% param_descs = { cookiedomain => "If your website is at 'www.foo.com', setting this to" @@ -47,4 +76,6 @@ _ " necessary to enter its URL if the web server cannot access the" _ " HTTP_PROXY environment variable. If you have to authenticate," _ " use the <code>http://user:pass@proxy_url/</code> syntax.", + + strict_transport_security => sts_desc, } %] diff --git a/template/en/default/admin/params/attachment.html.tmpl b/template/en/default/admin/params/attachment.html.tmpl index 7d1e29f..12fd491 100644 --- a/template/en/default/admin/params/attachment.html.tmpl +++ b/template/en/default/admin/params/attachment.html.tmpl @@ -45,7 +45,7 @@ _ " That is, a different domain name that resolves to this exact" _ " same $terms.Bugzilla installation.</p>" _ "<p>Note that if you have set the" - _ " <a href=\"editparams.cgi?section=advanced#cookiedomain\"><tt>cookiedomain</tt>" + _ " <a href=\"editparams.cgi?section=advanced#cookiedomain_desc\"><tt>cookiedomain</tt>" _" parameter</a>, you should set <tt>attachment_base</tt> to use a" _ " domain that would <em>not</em> be matched by" _ " <tt>cookiedomain</tt>.</p>" diff --git a/template/en/default/admin/params/auth.html.tmpl b/template/en/default/admin/params/auth.html.tmpl index d2cb3e5..35bddf1 100644 --- a/template/en/default/admin/params/auth.html.tmpl +++ b/template/en/default/admin/params/auth.html.tmpl @@ -70,8 +70,8 @@ <dt>RADIUS</dt> <dd> RADIUS authentication using a RADIUS server. - This method is experimental; please see the - $terms.Bugzilla documentation for more information. + Please see the $terms.Bugzilla documentation for + more information. Using this method requires <a href=\"?section=radius\">additional parameters</a> to be set. diff --git a/template/en/default/admin/params/bugchange.html.tmpl b/template/en/default/admin/params/bugchange.html.tmpl index 9f456ee..15d4f1e 100644 --- a/template/en/default/admin/params/bugchange.html.tmpl +++ b/template/en/default/admin/params/bugchange.html.tmpl @@ -23,6 +23,10 @@ desc = "Set up $terms.bug change policies" %] +[% PROCESS "global/field-descs.none.tmpl" %] + +[% accept_status = display_value('bug_status', 'IN_PROGRESS') FILTER html %] + [% param_descs = { duplicate_or_move_bug_status => "When $terms.abug is marked as a duplicate of another one " _ "or is moved to another installation, use this $terms.bug status." @@ -37,8 +41,10 @@ "If off, then all $terms.bugs initially have the default " _ "milestone for the product being filed in.", - musthavemilestoneonaccept => "If you are using Target Milestone, do you want to require that " _ - "the milestone be set in order for a user to ACCEPT a ${terms.bug}?", + musthavemilestoneonaccept => + "If you are using ${field_descs.target_milestone}, do you want to require" + _ " that the milestone be set in order for a user to set" + _ " ${terms.abug}'s status to ${accept_status}?", commentonchange_resolution => "If this option is on, the user needs to enter a short " _ "comment if the resolution of the $terms.bug changes.", diff --git a/template/en/default/admin/params/bugfields.html.tmpl b/template/en/default/admin/params/bugfields.html.tmpl index 794f925..58b08f6 100644 --- a/template/en/default/admin/params/bugfields.html.tmpl +++ b/template/en/default/admin/params/bugfields.html.tmpl @@ -34,11 +34,6 @@ usestatuswhiteboard => "Do you wish to use the Status Whiteboard field?", - usevotes => "Do you wish to allow users to vote for ${terms.bugs}? Note that in order " _ - "for this to be effective, you will have to change the maximum " _ - "votes allowed in a product to be non-zero in " _ - "<a href=\"editproducts.cgi\">the product edit page</a>.", - usebugaliases => "Do you wish to use $terms.bug aliases, which allow you to assign " _ "$terms.bugs an easy-to-remember name by which you can refer to them?", diff --git a/template/en/default/admin/params/common.html.tmpl b/template/en/default/admin/params/common.html.tmpl index 18aa1fb..d86da0d 100644 --- a/template/en/default/admin/params/common.html.tmpl +++ b/template/en/default/admin/params/common.html.tmpl @@ -28,7 +28,7 @@ <dl> [% FOREACH param = panel.param_list %] - <dt><a name="[% param.name FILTER html %]">[% param.name FILTER html %]</a></dt> + <dt id="[% param.name FILTER html %]_desc">[% param.name FILTER html %]</dt> <dd>[% panel.param_descs.${param.name} FILTER none %] <p> [% IF param.type == "t" %] @@ -62,55 +62,48 @@ [% END %] </select> [% ELSIF param.type == "o" %] - <script type="text/javascript"><!-- - document.write("<span style=\"display: none\">"); - // --> - </script> <input id="input_[% param.name FILTER html %]" size="80" name="[% param.name FILTER html %]" value="[% Param(param.name) FILTER html %]"><br> - <script type="text/javascript"><!-- - document.write("<\/span>"); - // --> - </script> [% boxSize = 7 %] [% boxSize = 3 + param.choices.size IF param.choices.size < 7 %] [% plist = Param(param.name).split(',') %] - <script type="text/javascript"><!-- - document.write( - '<table>' + - ' <tr>' + - ' <td rowspan="2">' + - ' <select id="select_[% param.name FILTER html %]"' + - ' size="[% boxSize FILTER html %]"' + - ' name="select_[% param.name FILTER html %]">' + - [% FOREACH item = plist %] - ' <option value="[% item FILTER html %]">[% item FILTER html %]<\/option>' + - [% END %] - ' <option class="sortlist_separator"' + - ' disabled="disabled"' + - ' value="[% sortlist_separator %]">active↑ ↓inactive<\/option>' + - [% FOREACH item = param.choices %] - [% IF lsearch(plist, item) == -1 %] - ' <option value="[% item FILTER html %]">[% item FILTER html %]<\/option>' + - [% END %] - [% END %] - ' <\/select>' + - ' <\/td>' + - ' <td style="vertical-align: bottom">' + - ' <button type="button"' + - ' onClick="sortedList_moveItem(\'[% param.name FILTER html %]\', -1, \'[% sortlist_separator %]\');">↑<\/button>' + - ' <\/td>' + - ' <\/tr>' + - ' <tr>' + - ' <td style="vertical-align: top">' + - ' <button type="button"' + - ' onClick="sortedList_moveItem(\'[% param.name FILTER html %]\', +1, \'[% sortlist_separator %]\');">↓<\/button>' + - ' <\/td>' + - ' <\/tr>' + - '<\/table>'); - // --> + <table id="table_[% param.name FILTER html %]" class="bz_default_hidden"> + <tr> + <td rowspan="2"> + <select id="select_[% param.name FILTER html %]" + name="select_[% param.name FILTER html %]" + size="[% boxSize FILTER html %]"> + [% FOREACH item = plist %] + <option value="[% item FILTER html %]">[% item FILTER html %]</option> + [% END %] + <option class="sortlist_separator" disabled="disabled" + value="[% sortlist_separator %]">active↑ ↓inactive</option> + [% FOREACH item = param.choices %] + [% IF lsearch(plist, item) == -1 %] + <option value="[% item FILTER html %]">[% item FILTER html %]</option> + [% END %] + [% END %] + </select> + </td> + <td style="vertical-align: bottom"> + <button type="button" + onClick="sortedList_moveItem('[% param.name FILTER html %]', -1, '[% sortlist_separator %]');">↑</button> + </td> + </tr> + + <tr> + <td style="vertical-align: top"> + <button type="button" + onClick="sortedList_moveItem('[% param.name FILTER html %]', +1, '[% sortlist_separator %]');">↓</button> + </td> + </tr> + </table> + + <script type="text/javascript"> + bz_toggleClass("input_[% param.name FILTER html %]", "bz_default_hidden"); + bz_toggleClass("table_[% param.name FILTER html %]", "bz_default_hidden"); </script> [% ELSIF param.type == "s" %] <select name="[% param.name FILTER html %]" id="[% param.name FILTER html %]"> diff --git a/template/en/default/admin/params/dependencygraph.html.tmpl b/template/en/default/admin/params/dependencygraph.html.tmpl index 181cced..4cf22d5 100644 --- a/template/en/default/admin/params/dependencygraph.html.tmpl +++ b/template/en/default/admin/params/dependencygraph.html.tmpl @@ -44,6 +44,6 @@ The default value is a publicly-accessible webdot server. If you change this value, make certain that the webdot server can read files from your webdot directory. On Apache you do this by editing the .htaccess file, - for other systems the needed measures may vary. You can run checksetup.pl + for other systems the needed measures may vary. You can run <kbd>checksetup.pl</kbd> to recreate the .htaccess file if it has been lost."} -%]
\ No newline at end of file +%] diff --git a/template/en/default/admin/params/editparams.html.tmpl b/template/en/default/admin/params/editparams.html.tmpl index 21fa9fa..8d6a987 100644 --- a/template/en/default/admin/params/editparams.html.tmpl +++ b/template/en/default/admin/params/editparams.html.tmpl @@ -56,7 +56,7 @@ title = title message = message style_urls = ['skins/standard/params.css'] - javascript_urls = ['js/params.js'] + javascript_urls = ['js/params.js', 'js/util.js'] doc_section = "parameters.html" %] diff --git a/template/en/default/admin/params/general.html.tmpl b/template/en/default/admin/params/general.html.tmpl index b8c0c77..c19cf14 100644 --- a/template/en/default/admin/params/general.html.tmpl +++ b/template/en/default/admin/params/general.html.tmpl @@ -45,7 +45,7 @@ _ " character encodings to UTF-8, using the <kbd>contrib/recode.pl</kbd>" _ " script</strong>." _ " <p>Note that if you turn this parameter from "off" to" - _ " "on", you must re-run checksetup.pl immediately" + _ " "on", you must re-run <kbd>checksetup.pl</kbd> immediately" _ " afterward.</p>", shutdownhtml => diff --git a/template/en/default/admin/params/index.html.tmpl b/template/en/default/admin/params/index.html.tmpl index 1629c8c..9f80245 100644 --- a/template/en/default/admin/params/index.html.tmpl +++ b/template/en/default/admin/params/index.html.tmpl @@ -35,7 +35,7 @@ <tr> <td> <a href="editparams.cgi?section= - [%- panel.name FILTER url_quote %]#[% param.name FILTER url_quote %]"> + [%- panel.name FILTER url_quote %]#[% param.name FILTER url_quote %]_desc"> [% param.name FILTER html %]</a> </td> <td> diff --git a/template/en/default/admin/params/mta.html.tmpl b/template/en/default/admin/params/mta.html.tmpl index 8533257..05c4485 100644 --- a/template/en/default/admin/params/mta.html.tmpl +++ b/template/en/default/admin/params/mta.html.tmpl @@ -50,19 +50,11 @@ _ " email at once. If you enable this parameter, $terms.Bugzilla will" _ " queue all mail and then send it in the background. This requires" _ " that you have installed certain Perl modules (as listed by" - _ " <code>checksetup.pl</code> for this feature), and that you are" + _ " <kbd>checksetup.pl</kbd> for this feature), and that you are" _ " running the <code>jobqueue.pl</code> daemon (otherwise your mail" _ " won't get sent). This affects all mail sent by $terms.Bugzilla," _ " not just $terms.bug updates.", - sendmailnow => "Sites using anything older than version 8.12 of 'sendmail' " _ - "can achieve a significant performance increase in the " _ - "UI -- at the cost of delaying the sending of mail -- by " _ - "disabling this parameter. Sites using 'sendmail' 8.12 or " _ - "higher should leave this on, as they will see no benefit from " _ - "turning it off. Sites using an MTA other than 'sendmail' " _ - "<b>must</b> leave it on, or no $terms.bug mail will be sent.", - smtpserver => "The SMTP server address (if using SMTP for mail delivery).", smtp_username => "The username to pass to the SMTP server for SMTP authentication. " _ @@ -76,7 +68,7 @@ " $terms.Bugzilla and your SMTP server. You can use this to" _ " troubleshoot email problems.", - whinedays => "The number of days that we'll let a $terms.bug sit untouched in a NEW " _ + whinedays => "The number of days that we'll let a $terms.bug sit untouched in a CONFIRMED " _ "state before our cronjob will whine at the owner.<br> " _ "Set to 0 to disable whining.", diff --git a/template/en/default/admin/params/radius.html.tmpl b/template/en/default/admin/params/radius.html.tmpl index ef2282d..f12e581 100644 --- a/template/en/default/admin/params/radius.html.tmpl +++ b/template/en/default/admin/params/radius.html.tmpl @@ -26,13 +26,13 @@ "(e.g. <code>radius.company.com</code>, or " _ "<code>radius.company.com:portnum</code>).<br>" _ "Required only if " _ - "<a href=\"?section=auth#user_verify_class\">the " _ + "<a href=\"?section=auth#user_verify_class_desc\">the " _ "<code>user_verify_class</code> parameter</a> contains " _ "<code>RADIUS</code>.", RADIUS_secret => "Your RADIUS server's secret.<br>" _ "Required only if " _ - "<a href=\"?section=auth#user_verify_class\">the " _ + "<a href=\"?section=auth#user_verify_class_desc\">the " _ "<code>user_verify_class</code> parameter</a> contains " _ "<code>RADIUS</code>.", @@ -40,14 +40,14 @@ "data with your RADIUS server. " _ "If unspecified, <code>127.0.0.1</code> will be used.<br>" _ "Useful only if " _ - "<a href=\"?section=auth#user_verify_class\">the " _ + "<a href=\"?section=auth#user_verify_class_desc\">the " _ "<code>user_verify_class</code> parameter</a> " _ "contains <code>RADIUS</code>.", RADIUS_email_suffix => "Suffix to append to a RADIUS user name to form an " _ "e-mail address.<br>" _ "Useful only if " _ - "<a href=\"?section=auth#user_verify_class\">the " _ + "<a href=\"?section=auth#user_verify_class_desc\">the " _ "<code>user_verify_class</code> parameter</a> " _ "contains <code>RADIUS</code>.", } diff --git a/template/en/default/admin/params/usermatch.html.tmpl b/template/en/default/admin/params/usermatch.html.tmpl index 54f1509..d574edc 100644 --- a/template/en/default/admin/params/usermatch.html.tmpl +++ b/template/en/default/admin/params/usermatch.html.tmpl @@ -29,6 +29,9 @@ "needs to be selected. This option should not be enabled on " _ "sites where there are a large number of users.", + ajax_user_autocompletion => "If this option is set, typing characters in a certain user " _ + "fields will display a list of matches that can be selected from.", + maxusermatches => "Search for no more than this many matches.<br> " _ "If set to '1', no users will be displayed on ambiguous matches. " _ "This is useful for user privacy purposes.<br> " _ diff --git a/template/en/default/admin/products/create.html.tmpl b/template/en/default/admin/products/create.html.tmpl index f4a2161..1b50661 100644 --- a/template/en/default/admin/products/create.html.tmpl +++ b/template/en/default/admin/products/create.html.tmpl @@ -29,13 +29,10 @@ %] [% DEFAULT - product.votesperuser = "0", - product.maxvotesperbug = "10000", - product.votes_to_confirm = "0", product.is_active = 1, version = "unspecified", product.defaultmilestone = constants.DEFAULT_MILESTONE - product.allows_unconfirmed = 0 + product.allows_unconfirmed = 1 %] <form method="post" action="editproducts.cgi"> @@ -51,7 +48,9 @@ </tr> <tr> <th align="right">Create chart datasets for this product:</th> - <td><input type="checkbox" name="createseries" value="1"></td> + <td> + <input type="checkbox" name="createseries" value="1" checked="checked"> + </td> </tr> </table> diff --git a/template/en/default/admin/products/edit-common.html.tmpl b/template/en/default/admin/products/edit-common.html.tmpl index 2c94402..4812707 100644 --- a/template/en/default/admin/products/edit-common.html.tmpl +++ b/template/en/default/admin/products/edit-common.html.tmpl @@ -76,37 +76,8 @@ in this product:</label> </th> <td><input type="checkbox" id="allows_unconfirmed" name="allows_unconfirmed" - [% ' checked="checked"' IF product.allows_unconfirmed %] - [% IF Param('usevotes') %] - onchange="bz_toggleClass('votes_to_confirm_container', - 'bz_default_hidden')" - [% END %]> - [% IF Param('usevotes') %] - <span id="votes_to_confirm_container" - [% ' class="bz_default_hidden"' IF !product.allows_unconfirmed %]> - ...and automatically confirm [% terms.bugs %] if they get - <input size="3" maxlength="5" name="votestoconfirm" id="votestoconfirm" - value="[% product.votes_to_confirm FILTER html %]"> - votes. (Setting this to 0 disables auto-confirming [% terms.bugs %] - by vote.) - </span> - [% END %] + [% ' checked="checked"' IF product.allows_unconfirmed %]> </td> </tr> -[% IF Param('usevotes') %] - <tr> - <th align="right">Maximum votes per person:</th> - <td><input size="5" maxlength="5" name="votesperuser" id="votesperuser" - value="[% product.votesperuser FILTER html %]"> - </td> - </tr> - <tr> - <th align="right"> - Maximum votes a person can put on a single [% terms.bug %]: - </th> - <td><input size="5" maxlength="5" name="maxvotesperbug" id="maxvotesperbug" - value="[% product.maxvotesperbug FILTER html %]"> - </td> - </tr> -[% END %] +[% Hook.process('rows') %] diff --git a/template/en/default/admin/products/list-classifications.html.tmpl b/template/en/default/admin/products/list-classifications.html.tmpl index 4eddad3..161cc4b 100644 --- a/template/en/default/admin/products/list-classifications.html.tmpl +++ b/template/en/default/admin/products/list-classifications.html.tmpl @@ -27,18 +27,11 @@ title = "Select Classification" %] -[% edit_contentlink = BLOCK %] - editproducts.cgi?classification=%%name%% -[% END %] -[% add_contentlink = BLOCK %] - editproducts.cgi?action=add&classification=%%name%% -[% END %] - [% columns = [ { name => "name" heading => "Edit products of..." - contentlink => edit_contentlink + contentlink => 'editproducts.cgi?classification=%%name%%' }, { name => "description" @@ -57,10 +50,12 @@ [% columns.push({ heading => "Action..." content => "Add product" - contentlink => add_contentlink }) + contentlink => 'editproducts.cgi?action=add&classification=%%name%%' }) %] [% END %] +[% Hook.process('before_table') %] + [% PROCESS admin/table.html.tmpl columns = columns data = classifications diff --git a/template/en/default/admin/products/list.html.tmpl b/template/en/default/admin/products/list.html.tmpl index 57d75d8..93467df 100644 --- a/template/en/default/admin/products/list.html.tmpl +++ b/template/en/default/admin/products/list.html.tmpl @@ -37,22 +37,11 @@ title = "Select product $classification_title" %] -[% edit_contentlink = BLOCK %] - editproducts.cgi?action=edit&product=%%name%% -[% END %] -[% delete_contentlink = BLOCK %] - editproducts.cgi?action=del&product=%%name%% -[% END %] -[% bug_count_contentlink = BLOCK %] - buglist.cgi?product=%%name%% -[% END %] - - [% columns = [ { name => "name" heading => "Edit product..." - contentlink => edit_contentlink + contentlink => 'editproducts.cgi?action=edit&product=%%name%%' }, { name => "description" @@ -64,22 +53,7 @@ heading => "Open For New $terms.Bugs" yesno_field => 1 }, - { - name => "votesperuser" - heading => "Votes Per User" - align => 'right' - }, - { - name => "maxvotesperbug" - heading => "Maximum Votes Per $terms.Bug" - align => 'right' - }, - { - name => "votestoconfirm" - heading => "Votes To Confirm" - align => 'right' - } ] -%] +] %] [% IF showbugcounts %] @@ -87,7 +61,7 @@ name => "bug_count" heading => "$terms.Bug Count" align => 'right' - contentlink => bug_count_contentlink + contentlink => 'buglist.cgi?product=%%name%%' }) %] @@ -96,7 +70,7 @@ [% columns.push({ heading => "Action" content => "Delete" - contentlink => delete_contentlink + contentlink => 'editproducts.cgi?action=del&product=%%name%%' }) %] diff --git a/template/en/default/admin/products/updated.html.tmpl b/template/en/default/admin/products/updated.html.tmpl index c6e8710..4140bab 100644 --- a/template/en/default/admin/products/updated.html.tmpl +++ b/template/en/default/admin/products/updated.html.tmpl @@ -75,33 +75,6 @@ '[% product.default_milestone FILTER html %]'. </p> [% END %] - -[% IF changes.votesperuser.defined %] - <p> - Updated votes per user from - [%+ changes.votesperuser.0 FILTER html %] to - [%+ product.votes_per_user FILTER html %]. - </p> - [% checkvotes = 1 %] -[% END %] - -[% IF changes.maxvotesperbug.defined %] - <p> - Updated maximum votes per [% terms.bug %] from - [%+ changes.maxvotesperbug.0 FILTER html %] to - [%+ product.max_votes_per_bug FILTER html %]. - </p> - [% checkvotes = 1 %] -[% END %] - -[% IF changes.votestoconfirm.defined %] - <p> - Updated number of votes needed to confirm a [% terms.bug %] from - [%+ changes.votestoconfirm.0 FILTER html %] to - [%+ product.votes_to_confirm FILTER html %]. - </p> - [% checkvotes = 1 %] -[% END %] [% IF changes.allows_unconfirmed.defined %] <p> @@ -121,65 +94,12 @@ </p> [% END %] +[% Hook.process('changes') %] + [% IF !changes.keys.size %] <p>Nothing changed for product '[% product.name FILTER html %]'.</p> [% END %] -[%# Note that this display of changed votes and/or confirmed bugs is - not very scalable. We could have a _lot_, and we just list them all. - One day we should limit this perhaps, or have a more scalable display %] - - -[% IF checkvotes %] - <hr> - - <p>Checking existing votes in this product for anybody who now - has too many votes for [% terms.abug %]...<br> - [% IF changes.too_many_votes.size %] - [% FOREACH detail = changes.too_many_votes %] - →removed votes for [% terms.bug %] <a href="show_bug.cgi?id= - [%- detail.id FILTER url_quote %]"> - [%- detail.id FILTER html %]</a> from [% detail.name FILTER html %]<br> - [% END %] - [% ELSE %] - →there were none. - [% END %] - </p> - - <p>Checking existing votes in this product for anybody - who now has too many total votes...<br> - [% IF changes.too_many_total_votes.size %] - [% FOREACH detail = changes.too_many_total_votes %] - →removed votes for [% terms.bug %] <a href="show_bug.cgi?id= - [%- detail.id FILTER url_quote %]"> - [%- detail.id FILTER html %]</a> from [% detail.name FILTER html %]<br> - [% END %] - [% ELSE %] - →there were none. - [% END %] - </p> - - <p>Checking unconfirmed [% terms.bugs %] in this product for any which now have - sufficient votes...<br> - [% IF changes.confirmed_bugs.size %] - [% FOREACH id = changes.confirmed_bugs %] - - [%# This is INCLUDED instead of PROCESSED to avoid variables getting - overwritten, which happens otherwise %] - [% INCLUDE bug/process/results.html.tmpl - type = 'votes' - header_done = 1 - sent_bugmail = changes.confirmed_bugs_sent_bugmail.$id - id = id - %] - [% END %] - [% ELSE %] - →there were none. - [% END %] - </p> - -[% END %] - [% PROCESS admin/products/footer.html.tmpl %] [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/sanitycheck/messages.html.tmpl b/template/en/default/admin/sanitycheck/messages.html.tmpl index c3d5daa..8d8cd35 100644 --- a/template/en/default/admin/sanitycheck/messages.html.tmpl +++ b/template/en/default/admin/sanitycheck/messages.html.tmpl @@ -34,7 +34,8 @@ [% errortext FILTER html %]: [% INCLUDE bug_list badbugs = badbugs %] [% ELSIF san_tag == "bug_check_repair" %] - <a href="sanitycheck.cgi?[% param FILTER url_quote %]=1">[% text FILTER html %]</a>. + <a href="sanitycheck.cgi?[% param FILTER url_quote %]=1&token= + [%- issue_hash_token(['sanitycheck']) FILTER url_quote %]">[% text FILTER html %]</a>. [% ELSIF san_tag == "bug_check_creation_date" %] Checking for [% terms.bugs %] with no creation date (which makes them invisible). @@ -81,12 +82,6 @@ [% ELSIF san_tag == "bug_check_status_everconfirmed_error_text2" %] [% terms.Bugs %] with confirmed status but don't have everconfirmed set - [% ELSIF san_tag == "bug_check_votes_everconfirmed" %] - Checking votes/everconfirmed - - [% ELSIF san_tag == "bug_check_votes_everconfirmed_error_text" %] - [% terms.Bugs %] that have enough votes to be confirmed but haven't been - [% ELSIF san_tag == "bug_check_control_values" %] Checking for bad values in group_control_map @@ -142,11 +137,13 @@ [% END %] [% ELSIF san_tag == "cross_check_attachment_has_references" %] - <a href="sanitycheck.cgi?remove_invalid_attach_references=1">Remove + <a href="sanitycheck.cgi?remove_invalid_attach_references=1&token= + [%- issue_hash_token(['sanitycheck']) FILTER url_quote %]">Remove invalid references to non existent attachments.</a> [% ELSIF san_tag == "cross_check_bug_has_references" %] - <a href="sanitycheck.cgi?remove_invalid_bug_references=1">Remove + <a href="sanitycheck.cgi?remove_invalid_bug_references=1&token= + [%- issue_hash_token(['sanitycheck']) FILTER url_quote %]">Remove invalid references to non existent [% terms.bugs %].</a> [% ELSIF san_tag == "double_cross_check_to" %] @@ -192,7 +189,8 @@ [%+ PROCESS bug_link bug_id = bug_id %]. [% ELSIF san_tag == "flag_fix" %] - <a href="sanitycheck.cgi?remove_invalid_flags=1">Click + <a href="sanitycheck.cgi?remove_invalid_flags=1&token= + [%- issue_hash_token(['sanitycheck']) FILTER url_quote %]">Click here to delete invalid flags</a> [% ELSIF san_tag == "group_control_map_entries_creation" %] @@ -228,23 +226,6 @@ [% ELSIF san_tag == "keyword_check_duplicated_ids" %] Duplicate keyword IDs found in [% PROCESS bug_link bug_id = id %]. - [% ELSIF san_tag == "keyword_cache_start" %] - Checking cached keywords. - - [% ELSIF san_tag == "keyword_cache_alert" %] - [% badbugs.size FILTER none %] [%+ terms.bugs %] found with - incorrect keyword cache: [% INCLUDE bug_list badbugs = badbugs %] - - [% ELSIF san_tag == "keyword_cache_fixing" %] - OK, now fixing keyword cache. - - [% ELSIF san_tag == "keyword_cache_fixed" %] - Keyword cache fixed. - - [% ELSIF san_tag == "keyword_cache_rebuild" %] - <a href="sanitycheck.cgi?rebuildkeywordcache=1">Click here to - rebuild the keyword cache</a>. - [% ELSIF san_tag == "profile_login_start" %] Checking profile logins. @@ -273,26 +254,8 @@ half an hour: [% INCLUDE bug_list badbugs = badbugs %] [% ELSIF san_tag == "unsent_bugmail_fix" %] - <a href="sanitycheck.cgi?rescanallBugMail=1">Send these mails</a>. - - [% ELSIF san_tag == "vote_cache_rebuild_start" %] - OK, now rebuilding vote cache. - - [% ELSIF san_tag == "vote_cache_rebuild_end" %] - Vote cache has been rebuilt. - - [% ELSIF san_tag == "vote_cache_rebuild_fix" %] - <a href="sanitycheck.cgi?rebuildvotecache=1">Click here to - rebuild the vote cache</a> - - [% ELSIF san_tag == "vote_cache_alert" %] - Bad vote cache for [% PROCESS bug_link bug_id = id %] - - [% ELSIF san_tag == "vote_count_start" %] - Checking cached vote counts. - - [% ELSIF san_tag == "vote_count_alert" %] - Bad vote sum for [% terms.bug %] [%+ id FILTER html %]. + <a href="sanitycheck.cgi?rescanallBugMail=1&token= + [%- issue_hash_token(['sanitycheck']) FILTER url_quote %]">Send these mails</a>. [% ELSIF san_tag == "whines_obsolete_target_deletion_start" %] OK, now removing non-existent users/groups from whines. @@ -310,7 +273,8 @@ [% END %] [% ELSIF san_tag == "whines_obsolete_target_fix" %] - <a href="sanitycheck.cgi?remove_old_whine_targets=1">Click here to + <a href="sanitycheck.cgi?remove_old_whine_targets=1&token= + [%- issue_hash_token(['sanitycheck']) FILTER url_quote %]">Click here to remove old users/groups</a> [% ELSE %] diff --git a/template/en/default/admin/sudo.html.tmpl b/template/en/default/admin/sudo.html.tmpl index 680bcfb..283eebe 100644 --- a/template/en/default/admin/sudo.html.tmpl +++ b/template/en/default/admin/sudo.html.tmpl @@ -83,8 +83,7 @@ password</label>: <input type="hidden" name="Bugzilla_login" value=" [%- user.login FILTER html %]"> - <input type="password" id="Bugzilla_password" name="Bugzilla_password" - maxlength="20" size="20"> + <input type="password" id="Bugzilla_password" name="Bugzilla_password" size="20"> <br> This is done for two reasons. First of all, it is done to reduce the chances of someone doing large amounts of damage using your diff --git a/template/en/default/admin/table.html.tmpl b/template/en/default/admin/table.html.tmpl index ce5e985..c7177a6 100644 --- a/template/en/default/admin/table.html.tmpl +++ b/template/en/default/admin/table.html.tmpl @@ -143,7 +143,7 @@ [% link_uri = contentlink %] [% WHILE link_uri.search('%%(.+?)%%')%] [% FOREACH m = link_uri.match('%%(.+?)%%') %] - [% IF row.$m %] + [% IF row.$m.defined %] [% replacement_value = FILTER url_quote; row.$m; END %] [% ELSE %] [% replacement_value = "" %] diff --git a/template/en/default/admin/users/confirm-delete.html.tmpl b/template/en/default/admin/users/confirm-delete.html.tmpl index b61a995..4711376 100644 --- a/template/en/default/admin/users/confirm-delete.html.tmpl +++ b/template/en/default/admin/users/confirm-delete.html.tmpl @@ -33,7 +33,6 @@ # namedquery_group_map: number of named queries the user has shared # profiles_activity: number of changes made to other users' profiles # series: number of series the viewed user has created - # votes: number of bugs the viewed user has voted on # watch.watched: number of users the viewed user is being watched # by # watch.watcher: number of users the viewed user is watching @@ -226,8 +225,8 @@ [% END %] [% IF assignee_or_qa || cc || component_cc || email_setting || flags.requestee || - namedqueries || profile_setting || quips || series || votes || watch.watched || - watch.watcher || whine_events || whine_schedules %] + namedqueries || profile_setting || quips || series || watch.watched || + watch.watcher || whine_events || whine_schedules || other_safe %] <div class="warningmessages"> <p>The following deletions are <b>safe</b> and will not generate referential integrity inconsistencies.</p> @@ -372,23 +371,6 @@ will have no author anymore, but will remain available. </li> [% END %] - [% IF votes %] - <li> - [% otheruser.login FILTER html %] has voted on - [% IF votes == 1 %] - [%+ terms.abug %] - [% ELSE %] - [%+ votes %] [%+ terms.bugs %] - [% END %]. - If you delete the user account, - [% IF votes == 1 %] - this vote - [% ELSE %] - these votes - [% END %] - will be deleted along with the user account. - </li> - [% END %] [% IF watch.watched || watch.watcher %] <li> [% otheruser.login FILTER html %] @@ -445,6 +427,7 @@ but the whines themselves will be left unaltered. </li> [% END %] + [% Hook.process('warn_safe') %] </ul> </div> diff --git a/template/en/default/admin/users/responsibilities.html.tmpl b/template/en/default/admin/users/responsibilities.html.tmpl index bbf121a..5c9c3f3 100644 --- a/template/en/default/admin/users/responsibilities.html.tmpl +++ b/template/en/default/admin/users/responsibilities.html.tmpl @@ -29,6 +29,7 @@ <th>Component</th> <th>Default Assignee</th> <th>Default QA Contact</th> + <th>Default CC</th> </tr> [% FOREACH component = item.components %] <tr> @@ -48,6 +49,9 @@ [% component.$responsibility.id == otheruser.id ? "X" : " " %] </td> [% END %] + <td class="center"> + [% component.initial_cc.contains(otheruser) ? "X" : " " %] + </td> </tr> [% END %] </tbody> diff --git a/template/en/default/admin/users/userdata.html.tmpl b/template/en/default/admin/users/userdata.html.tmpl index f23aa1b..9b182fa 100644 --- a/template/en/default/admin/users/userdata.html.tmpl +++ b/template/en/default/admin/users/userdata.html.tmpl @@ -61,9 +61,8 @@ <tr> <th><label for="password">Password:</label></th> <td> - <input type="password" size="16" maxlength="16" name="password" - autocomplete="off" - id="password" value="" /> + <input type="password" size="16" name="password" id="password" + value="" autocomplete="off" /> [% IF editform %]<br /> (Enter new password to change.) [% END %] diff --git a/template/en/default/attachment/create.html.tmpl b/template/en/default/attachment/create.html.tmpl index f00a0ad..acf9e23 100644 --- a/template/en/default/attachment/create.html.tmpl +++ b/template/en/default/attachment/create.html.tmpl @@ -33,8 +33,9 @@ title = title header = header subheader = subheader - style_urls = [ 'skins/standard/create_attachment.css' ] - javascript_urls = [ "js/attachment.js", "js/util.js" ] + style_urls = [ 'skins/standard/attachment.css' ] + yui = [ 'autocomplete' ] + javascript_urls = [ "js/attachment.js", 'js/field.js', "js/util.js" ] doc_section = "attachments.html" %] @@ -122,6 +123,9 @@ </td> </tr> [% END %] + + [% Hook.process('form_before_submit') %] + <tr> <th> </th> <td><input type="submit" id="create" value="Submit"></td> diff --git a/template/en/default/attachment/createformcontents.html.tmpl b/template/en/default/attachment/createformcontents.html.tmpl index 2cef632..d0ca336 100644 --- a/template/en/default/attachment/createformcontents.html.tmpl +++ b/template/en/default/attachment/createformcontents.html.tmpl @@ -86,7 +86,7 @@ <label for="list">select from list</label>: <select name="contenttypeselection" id="contenttypeselection" onchange="this.form.contenttypemethod[1].checked = true;"> - [% PROCESS "attachment/content-types.html.tmpl" %] + [% PROCESS content_types %] </select><br> <input type="radio" id="manual" name="contenttypemethod" value="manual"> @@ -104,3 +104,19 @@ [% END %] </td> </tr> + +[% BLOCK content_types %] + [% mimetypes = [{type => "text/plain", desc => "plain text"}, + {type => "text/html", desc => "HTML source"}, + {type => "application/xml", desc => "XML source"}, + {type => "image/gif", desc => "GIF image"}, + {type => "image/jpeg", desc => "JPEG image"}, + {type => "image/png", desc => "PNG image"}, + {type => "application/octet-stream", desc => "binary file"}] + %] + [% Hook.process("mimetypes", "attachment/createformcontents.html.tmpl") %] + + [% FOREACH m = mimetypes %] + <option value="[% m.type FILTER html %]">[% m.desc FILTER html %] ([% m.type FILTER html %])</option> + [% END %] +[% END %] diff --git a/template/en/default/attachment/diff-file.html.tmpl b/template/en/default/attachment/diff-file.html.tmpl index 9392ca1..a742a84 100644 --- a/template/en/default/attachment/diff-file.html.tmpl +++ b/template/en/default/attachment/diff-file.html.tmpl @@ -53,7 +53,7 @@ incremental_restore() [% FOREACH section = sections %] [% section_num = section_num + 1 %] <tr><th colspan="4" class="section_head"> - <table cellpadding="0" cellspacing="0"> + <table id="[% file.filename FILTER html %]_sec[% section_num %]" cellpadding="0" cellspacing="0"> <tr><th width="95%" align="left"> [% IF file.is_add %] Added @@ -79,7 +79,7 @@ incremental_restore() [% section.func_info FILTER html IF section.func_info %] [% END %] </th><th> - <a name="[% file.filename FILTER html %]_sec[% section_num %]" href="#[% file.filename FILTER html %]_sec[% section_num %]">Link Here</a> + <a href="#[% file.filename FILTER html %]_sec[% section_num %]">Link Here</a> </th></tr></table> </th></tr> [% current_line_old = section.old_start %] diff --git a/template/en/default/attachment/diff-header.html.tmpl b/template/en/default/attachment/diff-header.html.tmpl index 663d9b7..22e101c 100644 --- a/template/en/default/attachment/diff-header.html.tmpl +++ b/template/en/default/attachment/diff-header.html.tmpl @@ -53,12 +53,14 @@ Interdiff of #[% oldid %] and #[% newid %] for [% terms.bug %] #[% bugid %] [% END %] [% PROCESS global/header.html.tmpl doc_section = "attachments.html#patchviewer" javascript_urls = "js/attachment.js" - style_urls = ['skins/standard/create_attachment.css'] %] + style_urls = ['skins/standard/attachment.css'] %] [% ELSE %] <html> <head> - <link href="skins/standard/create_attachment.css" rel="stylesheet" type="text/css"> - <script src="js/attachment.js" type="text/javascript"></script> + <link href="[% 'skins/standard/attachment.css' FILTER mtime %]" + rel="stylesheet" type="text/css"> + <script src="[% 'js/attachment.js' FILTER mtime %]" + type="text/javascript"></script> </head> <body onload="[% onload FILTER html %]"> [% END %] diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl index fa8a53a..c0d3061 100644 --- a/template/en/default/attachment/edit.html.tmpl +++ b/template/en/default/attachment/edit.html.tmpl @@ -17,6 +17,7 @@ # # Contributor(s): Myk Melez <myk@mozilla.org> # Frédéric Buclin <LpSolit@gmail.com> + # Guy Pyrzak <guy.pyrzak@gmail.com> #%] [% PROCESS global/variables.none.tmpl %] @@ -36,8 +37,10 @@ header = header subheader = subheader doc_section = "attachments.html" - javascript_urls = ['js/attachment.js'] - style_urls = ['skins/standard/create_attachment.css'] + javascript_urls = ['js/attachment.js', 'js/field.js'] + style_urls = ['skins/standard/attachment.css'] + yui = [ 'autocomplete' ] + bodyclasses = "no_javascript" %] [%# No need to display the Diff button and iframe if the attachment is not a patch. %] @@ -54,12 +57,38 @@ <input type="hidden" name="token" value="[% issue_hash_token([attachment.id, attachment.modification_time]) FILTER html %]"> [% END %] - <table class="attachment_info" width="100%"> - - <tr> - <td id="attachment_attributes"> + <div id="attachment_info" class="attachment_info [% IF can_edit %] edit[% ELSE %] read[% END%]"> + <div id="attachment_attributes"> + <div id="attachment_information_read_only" class="[% "bz_private" IF attachment.isprivate %]"> + <div class="title"> + [% "[patch]" IF attachment.ispatch%] + <span class="[% "bz_obsolete" IF attachment.isobsolete %]" title="[% "obsolete" IF attachment.isobsolete %]"> + [% attachment.description FILTER html %] + </span> + [% IF can_edit %] + <span class="bz_edit">(<a href="javascript:toggle_attachment_details_visibility()">edit details</a>)</span> + [% END %] + </div> + [% IF NOT attachment.isurl %] + <div class="details"> + [% attachment.filename FILTER html %] ([% attachment.contenttype FILTER html %]), + [% IF attachment.datasize %] + [%+ attachment.datasize FILTER unitconvert %] + [% ELSE %] + <em>deleted</em> + [% END %], created by [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %] + [% IF attachment.isprivate %]; + <span class="bz_private">only visible to <strong>[% Param('insidergroup') FILTER html %]</strong> members</span> + [% END %] + </div> + [% END %] + </div> + <div id="attachment_information_edit"> + <span class="bz_hide"> + (<a href="javascript:toggle_attachment_details_visibility();">hide</a>) + </span> <div id="attachment_description"> - <label for="description">Description:</label> + <label for="description">Description:</label> [% INCLUDE global/textarea.html.tmpl id = 'description' name = 'description' @@ -68,38 +97,34 @@ wrap = 'soft' classes = 'block' _ editable_or_hide defaultcontent = attachment.description - %] - [% IF !can_edit %] - [%+ attachment.description FILTER wrap_comment(25) FILTER html %] - [% END %] + %] </div> [% IF attachment.isurl %] - <input type="hidden" name="filename" - value="[% attachment.filename FILTER html %]"> - <input type="hidden" name="contenttypeentry" - value="[% attachment.contenttype FILTER html %]"> + <input type="hidden" name="filename" + value="[% attachment.filename FILTER html %]"> + <input type="hidden" name="contenttypeentry" + value="[% attachment.contenttype FILTER html %]"> [% ELSE %] <div id="attachment_filename"> <label for="filename">Filename:</label> - <input type="text" size="20" class="block[% editable_or_hide %]" + <input type="text" size="20" class="text block[% editable_or_hide %]" id="filename" name="filename" - value="[% attachment.filename FILTER html %]"> - [% IF !can_edit %] - [%+ attachment.filename FILTER truncate(25) FILTER html %] - [% END %] + value="[% attachment.filename FILTER html %]"> </div> <div id="attachment_mimetype"> <label for="contenttypeentry">MIME Type:</label> - <input type="text" size="20" class="block[% editable_or_hide %]" + <input type="text" size="20" class="text block[% editable_or_hide %]" id="contenttypeentry" name="contenttypeentry" - value="[% attachment.contenttype FILTER html %]"> - [% IF !can_edit %] - [%+ attachment.contenttype FILTER truncate(25) FILTER html %] - [% END %] + value="[% attachment.contenttype FILTER html %]"> </div> - + + <div id="attachment_creator"> + <span class="label">Creator:</span> + [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %] + </div> + <div id="attachment_size"> <span class="label">Size:</span> [% IF attachment.datasize %] @@ -109,154 +134,158 @@ [% END %] </div> - <div id="attachment_creator"> - <span class="label">Creator:</span> - [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %] - </div> - <div id="attachment_ispatch"> <input type="checkbox" id="ispatch" name="ispatch" value="1" - [%+ IF !can_edit %]class="bz_hidden_option"[% END %] [%+ 'checked="checked"' IF attachment.ispatch %]> - [% IF can_edit %] - <label for="ispatch">patch</label> - [% ELSE %] - <span class="label">Is Patch:</span> - [%+ attachment.ispatch ? "yes" : "no" %] - [% END %] + <label for="ispatch">patch</label> </div> [% END %] + <div class="readonly"> + <div class="checkboxes"> + <div id="attachment_isobsolete"> + <input type="checkbox" id="isobsolete" name="isobsolete" value="1" + [%+ 'checked="checked"' IF attachment.isobsolete %]> + <label for="isobsolete">obsolete</label> + </div> - <div id="attachment_isobsolete"> - <input type="checkbox" id="isobsolete" name="isobsolete" value="1" - [%+ IF !can_edit %]class="bz_hidden_option"[% END %] - [%+ 'checked="checked"' IF attachment.isobsolete %]> - [% IF can_edit %] - <label for="isobsolete">obsolete</label> - [% ELSE %] - <span class="label">Is Obsolete:</span> - [%+ attachment.isobsolete ? "yes" : "no" %] - [% END %] - </div> - - [% IF user.is_insider %] - <div id="attachment_isprivate"> - <input type="checkbox" id="isprivate" name="isprivate" value="1" - [%+ IF !can_edit %]class="bz_hidden_option"[% END %] - [%+ 'checked="checked"' IF attachment.isprivate %]> - [% IF can_edit %] - <label for="isprivate">private (only visible to - <strong>[% Param('insidergroup') FILTER html %]</strong>) - </label> - [% ELSE %] - <span class="label">Is Private:</span> - [%+ attachment.isprivate ? "yes" : "no" %] + [% IF user.is_insider %] + <div id="attachment_isprivate"> + <input type="checkbox" id="isprivate" name="isprivate" value="1" + [%+ 'checked="checked"' IF attachment.isprivate %]> + [% IF can_edit %] + <label for="isprivate">private (only visible to + <strong>[% Param('insidergroup') FILTER html %]</strong>) + </label> + [% ELSE %] + <span class="label">Is Private:</span> + [%+ attachment.isprivate ? "yes" : "no" %] + [% END %] + </div> [% END %] </div> - [% END %] + </div> + </div> - [% IF attachment.flag_types.size > 0 %] - <div id="attachment_flags"> - [% PROCESS "flag/list.html.tmpl" bug_id = attachment.bug_id - attach_id = attachment.id - flag_types = attachment.flag_types - read_only_flags = !can_edit + <div id="attachment_view_window"> + [% IF !attachment.datasize %] + <div><b>The content of this attachment has been deleted.</b></div> + [% ELSIF attachment.isurl %] + <div> + <a href="[% attachment.data FILTER html %]"> + [% IF attachment.datasize < 120 %] + [% attachment.data FILTER html %] + [% ELSE %] + [% attachment.data FILTER truncate(80) FILTER html %] + ... + [% attachment.data.match(".*(.{20})$").0 FILTER html %] + [% END %] + </a> + </div> + [% ELSIF !Param("allow_attachment_display") %] + <div id="view_disabled"> + <p><b> + The attachment is not viewable in your browser due to security + restrictions enabled by your [% terms.Bugzilla %] administrator. + </b></p> + <p><b> + In order to view the attachment, you first have to + <a href="attachment.cgi?id=[% attachment.id %]">download it</a>. + </b></p> + </div> + [% ELSIF attachment.is_viewable %] + <div > + [% INCLUDE global/textarea.html.tmpl + id = 'editFrame' + name = 'comment' + classes = 'bz_default_hidden' + minrows = 10 + cols = 80 + wrap = 'soft' + disabled = 'disabled' + defaultcontent = (attachment.contenttype.match('^text\/')) ? + attachment.data.replace('(.*\n|.+)', '>$1') : undef %] + <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]"> + <b>You cannot view the attachment while viewing its details because your browser does not support IFRAMEs. + <a href="attachment.cgi?id=[% attachment.id %]">View the attachment on a separate page</a>.</b> + </iframe> + <script type="text/javascript"> + <!-- + var patchviewerinstalled = 0; + var attachment_id = [% attachment.id %]; + if (typeof document.getElementById == "function") { + [% IF use_patchviewer %] + var patchviewerinstalled = 1; + document.write('<iframe id="viewDiffFrame" class="bz_default_hidden"><\/iframe>'); + [% END %] + [% IF user.id %] + document.write('<button type="button" id="editButton" onclick="editAsComment(patchviewerinstalled);">Edit Attachment As Comment<\/button>'); + document.write('<button type="button" id="undoEditButton" onclick="undoEditAsComment(patchviewerinstalled);" class="bz_default_hidden">Undo Edit As Comment<\/button>'); + document.write('<button type="button" id="redoEditButton" onclick="redoEditAsComment(patchviewerinstalled);" class="bz_default_hidden">Redo Edit As Comment<\/button>'); + var editFrame = document.getElementById('editFrame'); + if (editFrame) { + editFrame.disabled = false; + } + [% END %] + [% IF use_patchviewer %] + document.write('<button type="button" id="viewDiffButton" onclick="viewDiff(attachment_id, patchviewerinstalled);">View Attachment As Diff<\/button>'); + [% END %] + document.write('<button type="button" id="viewRawButton" onclick="viewRaw(patchviewerinstalled);" class="bz_default_hidden">View Attachment As Raw<\/button>'); + } + //--> + </script> + </div> + [% ELSE %] + <div id="noview"> + <p><b> + Attachment is not viewable in your browser because its MIME type + ([% attachment.contenttype FILTER html %]) is not one that your browser is + able to display. + </b></p> + <p><b> + <a href="attachment.cgi?id=[% attachment.id %]">Download the attachment</a>. + </b></p> </div> [% END %] - + </div> + <div id="attachment_comments_and_flags"> [% IF user.id %] - <div id="smallCommentFrame"> + <div id="smallCommentFrame" > <label for="comment">Comment (on the [% terms.bug %]):</label> + [% classNames = 'block' %] + [% classNames = "$classes bz_private" IF attachment.isprivate %] [% INCLUDE global/textarea.html.tmpl id = 'comment' name = 'comment' - minrows = 5 - cols = 25 + minrows = 10 + cols = 80 wrap = 'soft' - classes = 'block' + classes = classNames %] </div> + [% END %] + <div id="attachment_flags"> + [% IF attachment.flag_types.size > 0 %] + + [% PROCESS "flag/list.html.tmpl" bug_id = attachment.bug_id + attach_id = attachment.id + flag_types = attachment.flag_types + read_only_flags = !can_edit + %] + + [% END %] + </div> - <input type="submit" value="Submit" id="update"><br><br> - [% END %] - </td> + [% Hook.process('form_before_submit') %] - [% IF !attachment.datasize %] - <td width="75%"><b>The content of this attachment has been deleted.</b></td> - [% ELSIF attachment.isurl %] - <td width="75%"> - <a href="[% attachment.data FILTER html %]"> - [% IF attachment.datasize < 120 %] - [% attachment.data FILTER html %] - [% ELSE %] - [% attachment.data FILTER truncate(80) FILTER html %] - ... - [% attachment.data.match(".*(.{20})$").0 FILTER html %] - [% END %] - </a> - </td> - [% ELSIF !Param("allow_attachment_display") %] - <td id="view_disabled" width="50%"> - <p><b> - The attachment is not viewable in your browser due to security - restrictions enabled by [% terms.Bugzilla %]. - </b></p> - <p><b> - In order to view the attachment, you first have to - <a href="attachment.cgi?id=[% attachment.id %]">download it</a>. - </b></p> - </td> - [% ELSIF attachment.is_viewable %] - <td width="75%"> - [% INCLUDE global/textarea.html.tmpl - id = 'editFrame' - name = 'comment' - style = 'height: 400px; width: 100%; display: none' - minrows = 10 - cols = 80 - wrap = 'soft' - defaultcontent = (attachment.contenttype.match('^text\/')) ? - attachment.data.replace('(.*\n|.+)', '>$1') : undef - %] - <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]" style="height: 400px; width: 100%;"> - <b>You cannot view the attachment while viewing its details because your browser does not support IFRAMEs. - <a href="attachment.cgi?id=[% attachment.id %]">View the attachment on a separate page</a>.</b> - </iframe> - <script type="text/javascript"> - <!-- - var patchviewerinstalled = 0; - var attachment_id = [% attachment.id %]; - if (typeof document.getElementById == "function") { -[% IF use_patchviewer %] - var patchviewerinstalled = 1; - document.write('<iframe id="viewDiffFrame" style="height: 400px; width: 100%; display: none;"><\/iframe>'); -[% END %] - document.write('<button type="button" id="editButton" onclick="editAsComment(patchviewerinstalled);">Edit Attachment As Comment<\/button>'); - document.write('<button type="button" id="undoEditButton" onclick="undoEditAsComment(patchviewerinstalled);" style="display: none;">Undo Edit As Comment<\/button>'); - document.write('<button type="button" id="redoEditButton" onclick="redoEditAsComment(patchviewerinstalled);" style="display: none;">Redo Edit As Comment<\/button>'); -[% IF use_patchviewer %] - document.write('<button type="button" id="viewDiffButton" onclick="viewDiff(attachment_id, patchviewerinstalled);">View Attachment As Diff<\/button>'); -[% END %] - document.write('<button type="button" id="viewRawButton" onclick="viewRaw(patchviewerinstalled);" style="display: none;">View Attachment As Raw<\/button>'); - } - //--> - </script> - </td> - [% ELSE %] - <td id="noview" width="50%"> - <p><b> - Attachment is not viewable in your browser because its MIME type - ([% attachment.contenttype FILTER html %]) is not one that your browser is - able to display. - </b></p> - <p><b> - <a href="attachment.cgi?id=[% attachment.id %]">Download the attachment</a>. - </b></p> - </td> - [% END %] - </tr> - </table> + [% IF user.id %] + <div id="update_container"> + <input type="submit" value="Submit" id="update"> + </div> + [% END %] + </div> + </div> + </div> </form> <div id="attachment_actions"> @@ -270,6 +299,7 @@ && attachment.datasize > 0 %] | <a href="attachment.cgi?id=[% attachment.id %]&action=delete">Delete</a> [% END %] + [% Hook.process('action') %] </div> <div id="attachment_list"> @@ -283,7 +313,14 @@ [% " |" UNLESS loop.last() %] [% END %] </div> - +[% IF can_edit %] + <script type="text/javascript"> + <!-- + YAHOO.util.Dom.removeClass( document.body, "no_javascript" ); + toggle_attachment_details_visibility( ); + --> + </script> +[% END %] [% Hook.process('end') %] [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/attachment/list.html.tmpl b/template/en/default/attachment/list.html.tmpl index 6453b4e..89eef18 100644 --- a/template/en/default/attachment/list.html.tmpl +++ b/template/en/default/attachment/list.html.tmpl @@ -19,6 +19,8 @@ # Frédéric Buclin <LpSolit@gmail.com> #%] +[% RETURN UNLESS attachments.size || Param("maxattachmentsize") %] + <script type="text/javascript"> <!-- function toggle_display(link) { @@ -50,9 +52,9 @@ function toggle_display(link) { <br> <table id="attachment_table" cellspacing="0" cellpadding="4"> - <tr> + <tr id="a0"> <th colspan="[% show_attachment_flags ? 3 : 2 %]" align="left"> - <a name="a0" id="a0">Attachments</a> + Attachments </th> </tr> @@ -65,7 +67,7 @@ function toggle_display(link) { [% IF attachment.isobsolete %] [% obsolete_attachments = obsolete_attachments + 1 %] [% END %] - <tr class="[% "bz_contenttype_" _ attachment.contenttype + <tr id="a[% count %]" class="[% "bz_contenttype_" _ attachment.contenttype FILTER css_class_quote UNLESS attachment.isurl %] [% " bz_patch" IF attachment.ispatch %] [% " bz_url" IF attachment.isurl %] @@ -74,7 +76,7 @@ function toggle_display(link) { IF attachment.isobsolete %]"> <td valign="top"> [% IF attachment.datasize %] - <a name="a[% count %]" href="attachment.cgi?id=[% attachment.id %]" + <a href="attachment.cgi?id=[% attachment.id %]" title="View the content of the attachment"> [% END %] <b>[% attachment.description FILTER html FILTER obsolete(attachment.isobsolete) %]</b> @@ -109,10 +111,22 @@ function toggle_display(link) { <i>no flags</i> [% ELSE %] [% FOREACH flag = attachment.flags %] - [% flag.setter.nick FILTER html %]: + [% IF user.id %] + <span title="[% flag.setter.identity FILTER html %]">[% flag.setter.nick FILTER html %]</span>: + [% ELSIF flag.setter.name %] + <span title="[% flag.setter.name FILTER html %]">[% flag.setter.nick FILTER html %]</span>: + [% ELSE %] + [% flag.setter.nick FILTER html %]: + [% END %] [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %] [%+ IF flag.status == "?" && flag.requestee %] - ([% flag.requestee.nick FILTER html %]) + [% IF user.id %] + (<span title="[% flag.requestee.identity FILTER html %]">[% flag.requestee.nick FILTER html %]</span>) + [% ELSIF flag.requestee.name %] + (<span title="[% flag.requestee.name FILTER html %]">[% flag.requestee.nick FILTER html %]</span>) + [% ELSE %] + ([% flag.requestee.nick FILTER html %]) + [% END %] [% END %]<br> [% END %] [% END %] @@ -143,8 +157,10 @@ function toggle_display(link) { [% END %] </span> [% END %] - <a href="attachment.cgi?bugid=[% bugid %]&action=enter">Add an attachment</a> - (proposed patch, testcase, etc.) + [% IF Param("maxattachmentsize") %] + <a href="attachment.cgi?bugid=[% bugid %]&action=enter">Add an attachment</a> + (proposed patch, testcase, etc.) + [% END %] </td> </tr> </table> diff --git a/template/en/default/attachment/show-multiple.html.tmpl b/template/en/default/attachment/show-multiple.html.tmpl index bcc2977..15e20e8 100644 --- a/template/en/default/attachment/show-multiple.html.tmpl +++ b/template/en/default/attachment/show-multiple.html.tmpl @@ -31,7 +31,7 @@ title = title header = header subheader = filtered_summary - style_urls = ['skins/standard/create_attachment.css'] + style_urls = ['skins/standard/attachment.css'] %] <br> diff --git a/template/en/default/bug/activity/table.html.tmpl b/template/en/default/bug/activity/table.html.tmpl index 2492534..a9aca0a 100644 --- a/template/en/default/bug/activity/table.html.tmpl +++ b/template/en/default/bug/activity/table.html.tmpl @@ -73,7 +73,13 @@ <a href="attachment.cgi?id=[% change.attachid %]"> Attachment #[% change.attachid %]</a> [% END %] - [%+ field_descs.${change.fieldname} FILTER html %] + [% IF change.comment.defined %] + [% comment_desc = field_descs.${change.fieldname} %] + [% comment_num = "Comment $change.comment.count" FILTER bug_link(bug.bug_id, comment_num => change.comment.count) %] + [% comment_desc.replace('^(Comment )?', "$comment_num ") FILTER none %] + [% ELSE %] + [%+ field_descs.${change.fieldname} FILTER html %] + [% END %] </td> [% PROCESS change_column change_type = change.removed %] [% PROCESS change_column change_type = change.added %] diff --git a/template/en/default/bug/comments.html.tmpl b/template/en/default/bug/comments.html.tmpl index 41b91d7..580ba6b 100644 --- a/template/en/default/bug/comments.html.tmpl +++ b/template/en/default/bug/comments.html.tmpl @@ -22,76 +22,8 @@ [% PROCESS bug/time.html.tmpl %] - <script type="text/javascript"> - <!-- - function updateCommentPrivacy(checkbox, id) { - var comment_elem = document.getElementById('comment_text_'+id).parentNode; - if (checkbox.checked) { - if (!comment_elem.className.match('bz_private')) { - comment_elem.className = comment_elem.className.concat(' bz_private'); - } - } - else { - comment_elem.className = - comment_elem.className.replace(/(\s*|^)bz_private(\s*|$)/, '$2'); - } - } - - /* The functions below expand and collapse comments */ - - function toggle_comment_display(link, comment_id) { - var comment = document.getElementById('comment_text_' + comment_id); - var re = new RegExp(/\bcollapsed\b/); - if (comment.className.match(re)) - expand_comment(link, comment); - else - collapse_comment(link, comment); - } - - function toggle_all_comments(action) { - var num_comments = [% comments.size FILTER html %]; - - // If for some given ID the comment doesn't exist, this doesn't mean - // there are no more comments, but that the comment is private and - // the user is not allowed to view it. - - for (var id = 0; id < num_comments; id++) { - var comment = document.getElementById('comment_text_' + id); - if (!comment) - continue; - - var link = document.getElementById('comment_link_' + id); - if (action == 'collapse') - collapse_comment(link, comment); - else - expand_comment(link, comment); - } - } - - function collapse_comment(link, comment) { - link.innerHTML = "[+]"; - link.title = "Expand the comment."; - YAHOO.util.Dom.addClass(comment, 'collapsed'); - } - - function expand_comment(link, comment) { - link.innerHTML = "[-]"; - link.title = "Collapse the comment"; - YAHOO.util.Dom.removeClass(comment, 'collapsed'); - } - - /* This way, we are sure that browsers which do not support JS - * won't display this link */ - - function addCollapseLink(count) { - document.write(' <a href="#" class="bz_collapse_comment"' + - ' id="comment_link_' + count + - '" onclick="toggle_comment_display(this, ' + count + - '); return false;" title="Collapse the comment.">[-]<\/a> '); - } - //--> - </script> - +<script src="[% 'js/comments.js' FILTER mtime %]" type="text/javascript"> +</script> [% DEFAULT start_at = 0 mode = "show" %] [% sort_order = user.settings.comment_sort_order.value %] @@ -133,6 +65,14 @@ [% count = count + increment %] [% END %] +[% IF user.settings.comment_box_position.value == "before_comments" && user.id %] + <div class="bz_add_comment"> + <a href="#" + onclick="return goto_add_comments();"> + Add Comment</a> + </div> +[% END %] + [%# Note: this template is used in multiple places; if you use this hook, # make sure you are aware of this fact. #%] @@ -146,6 +86,11 @@ return false;">Collapse All Comments</a></li> <li><a href="#" onclick="toggle_all_comments('expand'); return false;">Expand All Comments</a></li> + [% IF user.settings.comment_box_position.value == "after_comments" && user.id %] + <li class="bz_add_comment"><a href="#" + onclick="return goto_add_comments('bug_status_bottom');"> + Add Comment</a></li> + [% END %] </ul> [% END %] </td> @@ -157,8 +102,10 @@ [% BLOCK a_comment %] [% RETURN IF comment.is_private AND ! user.is_insider %] + [% comment_text = comment.body_full({ wrap => 1 }) %] + [% RETURN IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %] - <div class="bz_comment[% " bz_private" IF comment.is_private %] + <div id="c[% count %]" class="bz_comment[% " bz_private" IF comment.is_private %] [% " bz_comment_hilite" IF marks.$count %] [% " bz_first_comment" IF count == description %]"> [% IF count == description %] @@ -194,7 +141,7 @@ [% END %] <span class="bz_comment_number"> - <a name="c[% count %]" + <a href="show_bug.cgi?id=[% bug.bug_id %]#c[% count %]"> [%- comment_label FILTER html %]</a> </span> @@ -229,7 +176,7 @@ #%] <pre class="bz_comment_text" [% ' id="comment_text_' _ count _ '"' IF mode == "edit" %]> - [%- comment.body_full({ wrap => 1 }) FILTER quoteUrls(bug, comment) -%] + [%- comment_text FILTER quoteUrls(bug, comment) -%] </pre> </div> [% END %] diff --git a/template/en/default/bug/create/comment-guided.txt.tmpl b/template/en/default/bug/create/comment-guided.txt.tmpl index 0f68d28..66220ec 100644 --- a/template/en/default/bug/create/comment-guided.txt.tmpl +++ b/template/en/default/bug/create/comment-guided.txt.tmpl @@ -30,17 +30,13 @@ [%+ cgi.param("comment") IF cgi.param("comment") %] -[% IF cgi.param("reproducible") %] -[%+ IF cgi.param("reproducible") != "Choose one..." -%] +[%+ IF cgi.param("reproducible") != "Choose one..." -%] Reproducible: [%+ cgi.param("reproducible") %] -[% END %] [% END %] -[% IF cgi.param("reproduce_steps") %] -[% IF !(cgi.param("reproduce_steps").match('^1\.\s*2\.\s*3\.\s*$') || cgi.param("reproduce_steps").match('^\s*$')) %] +[% 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 %] [% END %] [% IF cgi.param("actual_results") -%] diff --git a/template/en/default/bug/create/create-guided.html.tmpl b/template/en/default/bug/create/create-guided.html.tmpl index 0628a0e..bee5f01 100644 --- a/template/en/default/bug/create/create-guided.html.tmpl +++ b/template/en/default/bug/create/create-guided.html.tmpl @@ -34,6 +34,8 @@ style = "#somebugs { width: 100%; height: 500px }" %] +[% style = "" %] + [% tablecolour = "#efefef" %] [%# This script displays the descriptions for selected components. %] @@ -57,51 +59,20 @@ function PutDescription() { var initialowners = new Array([% product.components.size %]); var last_initialowner; -var initialccs = new Array([% product.components.size %]); var components = new Array([% product.components.size %]); -var flags = new Array([% product.components.size %]); -[% IF Param("useqacontact") %] - var initialqacontacts = new Array([% product.components.size %]); - var last_initialqacontact; -[% END %] [% count = 0 %] [%- FOREACH c = product.components %] components[[% count %]] = "[% c.name FILTER js %]"; initialowners[[% count %]] = "[% c.default_assignee.login FILTER js %]"; - [% flag_list = [] %] - [% FOREACH f = c.flag_types.bug %] - [% NEXT UNLESS f.is_active %] - [% flag_list.push(f.id) %] - [% END %] - [% FOREACH f = c.flag_types.attachment %] - [% NEXT UNLESS f.is_active %] - [% flag_list.push(f.id) %] - [% END %] - flags[[% count %]] = [[% flag_list.join(",") FILTER js %]]; - [% IF Param("useqacontact") %] - initialqacontacts[[% count %]] = "[% c.default_qa_contact.login FILTER js %]"; - [% END %] - - [% SET initial_cc_list = [] %] - [% FOREACH cc_user = c.initial_cc %] - [% initial_cc_list.push(cc_user.login) %] - [% END %] - initialccs[[% count %]] = "[% initial_cc_list.join(', ') FILTER js %]"; - [% count = count + 1 %] [%- END %] function set_assign_to() { // Based on the selected component, fill the "Assign To:" field - // with the default component owner, and the "QA Contact:" field - // with the default QA Contact. It also selectively enables flags. + // with the default component owner. var form = document.Create; var assigned_to = form.assigned_to.value; -[% IF Param("useqacontact") %] - var qa_contact = form.qa_contact.value; -[% END %] - var index = -1; if (form.component.type == 'select-one') { index = form.component.selectedIndex; @@ -118,137 +89,83 @@ function set_assign_to() { form.assigned_to.value = owner; last_initialowner = owner; } - - document.getElementById('initial_cc').innerHTML = initialccs[index]; - - [% IF Param("useqacontact") %] - var contact = initialqacontacts[index]; - if (qa_contact == last_initialqacontact - || qa_contact == contact - || qa_contact == '') { - form.qa_contact.value = contact; - last_initialqacontact = contact; - } - [% END %] - - // First, we disable all flags. Then we re-enable those - // which are available for the selected component. - var inputElements = document.getElementsByTagName("select"); - var inputElement, flagField; - for ( var i=0 ; i<inputElements.length ; i++ ) { - inputElement = inputElements.item(i); - if (inputElement.name.search(/^flag_type-(\d+)$/) != -1) { - var id = inputElement.name.replace(/^flag_type-(\d+)$/, "$1"); - inputElement.disabled = true; - // Also disable the requestee field, if it exists. - inputElement = document.getElementById("requestee_type-" + id); - if (inputElement) inputElement.disabled = true; - } - } - // Now enable flags available for the selected component. - for (var i = 0; i < flags[index].length; i++) { - flagField = document.getElementById("flag_type-" + flags[index][i]); - // Do not enable flags the user cannot set nor request. - if (flagField && flagField.options.length > 1) { - flagField.disabled = false; - // Re-enabling the requestee field depends on the status - // of the flag. - toggleRequesteeField(flagField, 1); - } - } } PutDescription(); } -function handleWantsAttachment(wants_attachment) { - if (wants_attachment) { - document.getElementById('attachment_false').style.display = 'none'; - document.getElementById('attachment_true').style.display = 'block'; - } - else { - document.getElementById('attachment_false').style.display = 'block'; - document.getElementById('attachment_true').style.display = 'none'; - clearAttachmentFields(); - } -} - // this is courtesy of John Keller -var LOOKUP_ADDR = "/lookup.php?pkg="; -var ASSIGNEE_OBJ_NAME = "assigned_to"; -var NOT_FOUND = "NOT_FOUND"; - 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; - } + 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(ASSIGNEE_OBJ_NAME)) != 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 - } + 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(); + initHttpConnection(); - if ((http_connection != null) && (input_obj.value != "")) { - http_connection.open("GET", LOOKUP_ADDR + encodeURIComponent(input_obj.value)); - http_connection.send(null); - } + 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 a bug using the <a href="enter_bug.cgi?product=[% product.name FILTER html %]">expert bug form</a>.</p> +<p> Submit [% terms.abug %] using the +<a href="enter_bug.cgi?product=[% product.name FILTER html %]">expert [% terms.bug %] form</a>.</p> -<form method="post" action="post_bug.cgi"> +<form name="Create" id="Create" method="post" action="post_bug.cgi"> <input type="hidden" name="format" value="guided"> - <input type="hidden" name="assigned_to" value=""> <input type="hidden" name="priority" value="[% default.priority FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> - <input type="hidden" name="op_sys" value="Linux"> + <input type="hidden" name="op_sys" value="[% Param('defaultopsys') FILTER html %]"> <table valign="top" cellpadding="5" cellspacing="5" border="0"> @@ -298,6 +215,7 @@ function onChangePackage(input_obj) { </td> </tr> </table> + <p> The area where the problem occurs. To pick the right component, you could use the same one as @@ -344,7 +262,7 @@ function onChangePackage(input_obj) { <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 bug report. For instance, + 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 @@ -404,13 +322,11 @@ function onChangePackage(input_obj) { 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 Param("insidergroup") && user.in_group(Param("insidergroup")) %] - <br /> - <input type="checkbox" id="commentprivacy" name="commentprivacy" - [% " checked=\"checked\"" IF commentprivacy %]> - <label for="commentprivacy"> - Initial Description is Private - </label> + [% 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> @@ -475,16 +391,18 @@ function onChangePackage(input_obj) { <b>Assign To:</b> </td> <td valign="top"> - [% safe_assigned_to = FILTER js; bug.assigned_to.login; END %] [% INCLUDE global/userselect.html.tmpl - id => "assigned_to" - name => "assigned_to" - value => bug.assigned_to.login - size => 32 + 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> diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl index 4b17457..c18e1c5 100644 --- a/template/en/default/bug/create/create.html.tmpl +++ b/template/en/default/bug/create/create.html.tmpl @@ -30,11 +30,13 @@ [% PROCESS global/header.html.tmpl title = title - style_urls = [ 'skins/standard/create_attachment.css', - 'skins/standard/yui/calendar.css' ] - javascript_urls = [ "js/attachment.js", "js/util.js", "js/yui/calendar.js", - "js/field.js", "js/TUI.js" ] - onload = 'set_assign_to();' + yui = [ 'autocomplete', 'calendar', 'datatable', 'button' ] + style_urls = [ 'skins/standard/attachment.css', + 'skins/standard/enter_bug.css' ] + javascript_urls = [ "js/attachment.js", "js/util.js", + "js/field.js", "js/TUI.js", "js/bug.js" ] + onload = "set_assign_to(); hideElementById('attachment_true'); + showElementById('attachment_false'); showElementById('btn_no_attachment');" %] <script type="text/javascript"> @@ -128,9 +130,10 @@ function set_assign_to() { if (inputElement.name.search(/^flag_type-(\d+)$/) != -1) { var id = inputElement.name.replace(/^flag_type-(\d+)$/, "$1"); inputElement.disabled = true; - // Also disable the requestee field, if it exists. + // Also hide the requestee field, if it exists. inputElement = document.getElementById("requestee_type-" + id); - if (inputElement) inputElement.disabled = true; + if (inputElement) + YAHOO.util.Dom.addClass(inputElement.parentNode, 'bz_default_hidden'); } } // Now enable flags available for the selected component. @@ -147,18 +150,11 @@ function set_assign_to() { } } -function handleWantsAttachment(wants_attachment) { - if (wants_attachment) { - document.getElementById('attachment_false').style.display = 'none'; - document.getElementById('attachment_true').style.display = 'block'; - } - else { - document.getElementById('attachment_false').style.display = 'block'; - document.getElementById('attachment_true').style.display = 'none'; - clearAttachmentFields(); - } -} - +var status_comment_required = new Array(); +[% FOREACH status = bug_status %] + status_comment_required['[% status.name FILTER js %]'] = + [% status.comment_required_on_change_from() ? 'true' : 'false' %] +[% END %] TUI_alternates['expert_fields'] = 'Show Advanced Fields'; // Hide the Advanced Fields by default, unless the user has a cookie @@ -168,20 +164,13 @@ TUI_hide_default('expert_fields'); --> </script> -[% USE Bugzilla %] -[% SET select_fields = {} %] -[% FOREACH field = Bugzilla.get_fields( - { type => constants.FIELD_TYPE_SINGLE_SELECT, custom => 0 }) -%] - [% select_fields.${field.name} = field %] -[% END %] - <form name="Create" id="Create" method="post" action="post_bug.cgi" - enctype="multipart/form-data"> + class="enter_bug_form" enctype="multipart/form-data" + onsubmit="return validateEnterBug(this)"> <input type="hidden" name="product" value="[% product.name FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> -<table cellspacing="4" cellpadding="2" border="0"> +<table> <tbody> <tr> <td colspan="4"> @@ -210,22 +199,26 @@ TUI_hide_default('expert_fields'); </tr> <tr> - <th>Product:</th> - <td width="10%">[% product.name FILTER html %]</td> - - <th>Reporter:</th> - <td width="100%">[% user.login FILTER html %]</td> + [% INCLUDE bug/field.html.tmpl + bug = default, field = bug_fields.product, editable = 0, + value = product.name %] + [% INCLUDE bug/field.html.tmpl + bug = default, field = bug_fields.reporter, editable = 0, + value = user.login %] </tr> [%# We can't use the select block in these two cases for various reasons. %] <tr> - <th class="required"> - <a href="describecomponents.cgi?product=[% product.name FILTER url_quote %]"> - Component</a>: - </th> - <td> - <select name="component" onchange="set_assign_to();" size="7" - aria-required="true" class="required"> + [% component_desc_url = BLOCK -%] + describecomponents.cgi?product=[% product.name FILTER url_quote %] + [% END %] + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.component editable = 1 + desc_url = component_desc_url + %] + <td id="field_container_component"> + <select name="component" id="component" onchange="set_assign_to();" + size="7" aria-required="true" class="required"> [%# Build the lists of assignees and QA contacts if "usemenuforusers" is enabled. %] [% IF Param("usemenuforusers") %] [% assignees_list = user.get_userlist.clone %] @@ -234,7 +227,13 @@ TUI_hide_default('expert_fields'); [%- FOREACH c = product.components %] <option value="[% c.name FILTER html %]" - [% " selected=\"selected\"" IF c.name == default.component_ %]> + id="v[% c.id FILTER html %]_component" + [% IF c.name == default.component_ %] + [%# This is for bug/field.html.tmpl, for visibility-related + # controls. %] + [% default.component_id = c.id %] + selected="selected" + [% END %]> [% c.name FILTER html -%] </option> [% IF Param("usemenuforusers") %] @@ -245,9 +244,16 @@ TUI_hide_default('expert_fields'); [% END %] [%- END %] </select> + + <script type="text/javascript"> + <!-- + [%+ INCLUDE "bug/field-events.js.tmpl" + field = bug_fields.component %] + //--> + </script> </td> - <td colspan="2"> + <td colspan="2" id="comp_desc_container"> [%# Enclose the fieldset in a nested table so that its width changes based # on the length on the component description. %] <table> @@ -264,9 +270,11 @@ TUI_hide_default('expert_fields'); </tr> <tr> - <th rowspan="3">Version:</th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.version editable = 1 rowspan = 3 + %] <td rowspan="3"> - <select name="version" size="5"> + <select name="version" id="version" size="5"> [%- FOREACH v = version %] <option value="[% v FILTER html %]" [% ' selected="selected"' IF v == default.version %]>[% v FILTER html -%] @@ -276,35 +284,50 @@ TUI_hide_default('expert_fields'); </td> [% INCLUDE bug/field.html.tmpl - bug = default, field = select_fields.bug_severity, editable = 1, + bug = default, field = bug_fields.bug_severity, editable = 1, value = default.bug_severity %] </tr> <tr> [% INCLUDE bug/field.html.tmpl - bug = default, field = select_fields.rep_platform, editable = 1, + bug = default, field = bug_fields.rep_platform, editable = 1, value = default.rep_platform %] </tr> <tr> [% INCLUDE bug/field.html.tmpl - bug = default, field = select_fields.op_sys, editable = 1, + bug = default, field = bug_fields.op_sys, editable = 1, value = default.op_sys %] </tr> + [% IF !Param('defaultplatform') || !Param('defaultopsys') %] + <tr> + <th colspan="3"> </th> + <td id="os_guess_note" class="comment"> + <div>We've made a guess at your + [% IF Param('defaultplatform') %] + operating system. Please check it + [% ELSIF Param('defaultopsys') %] + platform. Please check it + [% ELSE %] + operating system and platform. Please check them + [% END %] + and make any corrections if necessary.</div> + </td> + </tr> + [% END %] </tbody> <tbody class="expert_fields"> <tr> [% IF Param('usetargetmilestone') && Param('letsubmitterchoosemilestone') %] - [% sel = { description => 'Target Milestone', name => 'target_milestone' } %] - [% INCLUDE select %] + [% INCLUDE select field = bug_fields.target_milestone %] [% ELSE %] <td colspan="2"> </td> [% END %] [% IF Param('letsubmitterchoosepriority') %] [% INCLUDE bug/field.html.tmpl - bug = default, field = select_fields.priority, editable = 1, + bug = default, field = bug_fields.priority, editable = 1, value = default.priority %] [% ELSE %] <td colspan="2"> </td> @@ -312,40 +335,16 @@ TUI_hide_default('expert_fields'); </tr> </tbody> -[% IF !Param('defaultplatform') || !Param('defaultopsys') %] - <tbody> - <tr> - <th> </th> - <td colspan="3" class="comment"> - We've made a guess at your - [% IF Param('defaultplatform') %] - operating system. Please check it - [% ELSIF Param('defaultopsys') %] - platform. Please check it - [% ELSE %] - operating system and platform. Please check them - [% END %] - and make any corrections if necessary. - </td> - </tr> - </tbody> -[% END %] - <tbody class="expert_fields"> <tr> <td colspan="4"> </td> </tr> <tr> -[% IF bug_status.size <= 1 %] - <input type="hidden" name="bug_status" - value="[% default.bug_status FILTER html %]"> - <th>Initial State:</th> - <td>[% display_value("bug_status", default.bug_status) FILTER html %]</td> -[% ELSE %] - [% sel = { description => 'Initial State', name => 'bug_status' } %] - [% INCLUDE select %] -[% END %] + [% INCLUDE bug/field.html.tmpl + bug = default, field = bug_fields.bug_status, + editable = (bug_status.size > 1), value = default.bug_status + override_legal_values = bug_status %] <td> </td> [%# Calculate the number of rows we can use for flags %] @@ -376,9 +375,12 @@ TUI_hide_default('expert_fields'); </tr> <tr> - <th><a href="page.cgi?id=fields.html#assigned_to">Assign To</a>:</th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.assigned_to editable = 1 + %] <td colspan="2"> [% INCLUDE global/userselect.html.tmpl + id => "assigned_to" name => "assigned_to" value => assigned_to disabled => assigned_to_disabled @@ -392,9 +394,12 @@ TUI_hide_default('expert_fields'); [% IF Param("useqacontact") %] <tr> - <th>QA Contact:</th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.qa_contact editable = 1 + %] <td colspan="2"> [% INCLUDE global/userselect.html.tmpl + id => "qa_contact" name => "qa_contact" value => qa_contact disabled => qa_contact_disabled @@ -408,9 +413,12 @@ TUI_hide_default('expert_fields'); [% END %] <tr> - <th>CC:</th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.cc editable = 1 + %] <td colspan="2"> [% INCLUDE global/userselect.html.tmpl + id => "cc" name => "cc" value => cc disabled => cc_disabled @@ -421,7 +429,7 @@ TUI_hide_default('expert_fields'); </tr> <tr> - <th>Default CC:</th> + <th>Default [% field_descs.cc FILTER html %]:</th> <td colspan="2"> <div id="initial_cc"> </div> @@ -434,17 +442,17 @@ TUI_hide_default('expert_fields'); [% IF user.is_timetracker %] <tr> - <th>Estimated Hours:</th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.estimated_time editable = 1 + %] <td colspan="2"> <input name="estimated_time" size="6" maxlength="6" value="[% estimated_time FILTER html %]"> </td> </tr> <tr> - <th>Deadline:</th> - <td colspan="2"> - <input name="deadline" size="10" maxlength="10" value="[% deadline FILTER html %]"> - <small>(YYYY-MM-DD)</small> - </td> + [% INCLUDE bug/field.html.tmpl + bug = default, field = bug_fields.deadline, value = deadline, + editable = 1, value_span = 2 %] </tr> <tr> @@ -454,7 +462,9 @@ TUI_hide_default('expert_fields'); [% IF Param("usebugaliases") %] <tr> - <th>Alias:</th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.alias editable = 1 + %] <td colspan="2"> <input name="alias" size="20" value="[% alias FILTER html %]"> </td> @@ -462,21 +472,23 @@ TUI_hide_default('expert_fields'); [% END %] <tr> - <th>URL:</th> - <td colspan="2"> - <input name="bug_file_loc" size="40" - value="[% bug_file_loc FILTER html %]"> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.bug_file_loc editable = 1 + %] + <td colspan="2" class="field_value"> + <input name="bug_file_loc" id="bug_file_loc" class="text_input" + size="40" value="[% bug_file_loc FILTER html %]"> </td> </tr> </tbody> -<tbody class="expert_fields"> +<tbody> [% USE Bugzilla %] [% FOREACH field = Bugzilla.active_custom_fields %] [% NEXT UNLESS field.enter_bug %] [% SET value = ${field.name}.defined ? ${field.name} : "" %] - <tr> + <tr [% 'class="expert_fields"' IF !field.is_mandatory %]> [% INCLUDE bug/field.html.tmpl bug = default, field = field, value = value, editable = 1, value_span = 3 %] @@ -487,17 +499,55 @@ TUI_hide_default('expert_fields'); <tbody> <tr> - <th class="required">Summary:</th> - <td colspan="3"> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.short_desc editable = 1 + %] + <td colspan="3" class="field_value"> <input name="short_desc" size="70" value="[% short_desc FILTER html %]" maxlength="255" spellcheck="true" aria-required="true" - class="required"> + class="required text_input" id="short_desc"> </td> </tr> + [% IF feature_enabled('jsonrpc') AND !cloned_bug_id %] + <tr id="possible_duplicates_container" class="bz_default_hidden"> + <th>Possible<br>Duplicates:</th> + <td colspan="3"> + <div id="possible_duplicates"></div> + <script type="text/javascript"> + var dt_columns = [ + { key: "id", label: "[% field_descs.bug_id FILTER js %]", + formatter: YAHOO.bugzilla.dupTable.formatBugLink }, + { key: "summary", + label: "[% field_descs.short_desc FILTER js %]", + formatter: "text" }, + { key: "status", + label: "[% field_descs.bug_status FILTER js %]", + formatter: YAHOO.bugzilla.dupTable.formatStatus }, + { key: "update_token", label: '', + formatter: YAHOO.bugzilla.dupTable.formatCcButton } + ]; + YAHOO.bugzilla.dupTable.addCcMessage = "Add Me to the CC List"; + YAHOO.bugzilla.dupTable.init({ + container: 'possible_duplicates', + columns: dt_columns, + product_name: '[% product.name FILTER js %]', + summary_field: 'short_desc', + options: { + MSG_LOADING: 'Searching for possible duplicates...', + MSG_EMPTY: 'No possible duplicates found.', + SUMMARY: 'Possible Duplicates' + } + }); + </script> + </td> + </tr> + [% END %] + <tr> <th>Description:</th> <td colspan="3"> + [% defaultcontent = BLOCK %] [% IF cloned_bug_id %] +++ This [% terms.bug %] was initially created as a clone of [% terms.Bug %] #[% cloned_bug_id %] +++ @@ -525,34 +575,28 @@ TUI_hide_default('expert_fields'); <th> </th> <td colspan="3"> - <input type="checkbox" id="commentprivacy" name="commentprivacy" - [% " checked=\"checked\"" IF commentprivacy %]> - <label for="commentprivacy"> - Make description private (visible only to members of the - <strong>[% Param('insidergroup') FILTER html %]</strong> group) + <input type="checkbox" id="comment_is_private" name="comment_is_private" + [% ' checked="checked"' IF comment_is_private %] + onClick="updateCommentTagControl(this, 'comment')"> + <label for="comment_is_private"> + Make description and any new attachment private (visible only to members + of the <strong>[% Param('insidergroup') FILTER html %]</strong> group) </label> </td> </tr> [% END %] + [% IF Param("maxattachmentsize") %] <tr> <th>Attachment:</th> <td colspan="3"> - <script type="text/javascript"> - <!-- - document.write( '<div id="attachment_false">' - + '<input type="button" value="Add an attachment" ' - + 'onClick="handleWantsAttachment(true)"> ' - + '<em style="display: none">This button has no ' - + 'functionality for you because your browser does ' - + 'not support CSS or does not use it.<\/em>' - + '<\/div>' - + '<div id="attachment_true" style="display: none">' - + '<input type="button" ' - + 'value="Don\'t add an attachment " ' - + 'onClick="handleWantsAttachment(false)">'); - //--> - </script> + <div id="attachment_false" class="bz_default_hidden"> + <input type="button" value="Add an attachment" onClick="handleWantsAttachment(true)"> + </div> + + <div id="attachment_true"> + <input type="button" id="btn_no_attachment" value="Don't add an attachment" + class="bz_default_hidden" onClick="handleWantsAttachment(false)"> <fieldset> <legend>Add an attachment</legend> <table class="attachment_entry"> @@ -562,35 +606,36 @@ TUI_hide_default('expert_fields'); flag_table_id ="attachment_flags" %] </table> </fieldset> - <script type="text/javascript"> - <!-- - document.write('<\/div>'); - //--> - </script> + </div> </td> </tr> + [% END %] </tbody> <tbody class="expert_fields"> [% IF user.in_group('editbugs', product.id) %] [% IF use_keywords %] <tr> - <th><a href="describekeywords.cgi">Keywords</a>:</th> - <td colspan="3"> - <input id="keywords" name="keywords" size="40" - value="[% keywords FILTER html %]"> (optional) - </td> + [% INCLUDE bug/field.html.tmpl + bug = default, field = bug_fields.keywords, editable = 1, + value = keywords, desc_url = "describekeywords.cgi", + value_span = 2 + %] </tr> [% END %] <tr> - <th>Depends on:</th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.dependson editable = 1 + %] <td colspan="3"> <input name="dependson" accesskey="d" value="[% dependson FILTER html %]"> </td> </tr> <tr> - <th>Blocks:</th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.blocked editable = 1 + %] <td colspan="3"> <input name="blocked" accesskey="b" value="[% blocked FILTER html %]"> </td> @@ -599,13 +644,14 @@ TUI_hide_default('expert_fields'); </tbody> <tbody class="expert_fields"> - [% IF group.size %] + [% IF product.groups_available.size %] <tr> <th> </th> <td colspan="3"> <br> <strong> - Only users in all of the selected groups can view this [% terms.bug %]: + Only users in all of the selected groups can view this + [%+ terms.bug %]: </strong> <br> <font size="-1"> @@ -615,12 +661,14 @@ TUI_hide_default('expert_fields'); <br> <!-- Checkboxes --> - [% FOREACH g = group %] - - <input type="checkbox" id="bit-[% g.bit %]" - name="bit-[% g.bit %]" value="1" - [% " checked=\"checked\"" IF g.checked %]> - <label for="bit-[% g.bit %]">[% g.description FILTER html_light %]</label><br> + <input type="hidden" name="defined_groups" value="1"> + [% FOREACH group = product.groups_available %] + <input type="checkbox" id="group_[% group.id FILTER html %]" + name="groups" value="[% group.name FILTER html %]" + [% ' checked="checked"' IF default.groups.contains(group.name) + OR group.is_default %]> + <label for="group_[% group.id FILTER html %]"> + [%- group.description FILTER html_light %]</label><br> [% END %] </td> </tr> @@ -634,14 +682,11 @@ TUI_hide_default('expert_fields'); <tr> <th> </th> <td colspan="3"> - <input type="submit" id="commit" value="Submit [% terms.Bug %]" - onclick="if (this.form.short_desc.value == '') - { alert('Please enter a summary sentence for this [% terms.bug %].'); - return false; } return true;"> + <input type="submit" id="commit" value="Submit [% terms.Bug %]"> <input type="submit" name="maketemplate" id="maketemplate" value="Remember values as bookmarkable template" - class="expert_fields"> + onclick="bz_no_validate_enter_bug=true" class="expert_fields"> </td> </tr> </tbody> @@ -659,30 +704,20 @@ TUI_hide_default('expert_fields'); [%############################################################################%] [% BLOCK select %] - [% IF sel.description %] - <th> - <a href="page.cgi?id=fields.html#[% sel.name %]">[% sel.description %]</a>: - </th> - [% END %] + [% INCLUDE "bug/field-label.html.tmpl" + field = field editable = 1 + %] <td> - <select name="[% sel.name %]" id="[% sel.name %]"> - [%- FOREACH x = ${sel.name} %] + <select name="[% field.name FILTER html %]" + id="[% field.name FILTER html %]"> + [%- FOREACH x = ${field.name} %] <option value="[% x FILTER html %]" - [% " selected=\"selected\"" IF x == default.${sel.name} %]> - [% display_value(sel.name, x) FILTER html %] + [% " selected=\"selected\"" IF x == default.${field.name} %]> + [% display_value(field.name, x) FILTER html %] </option> [% END %] </select> - - [% IF sel.name == "bug_status" %] - <script type="text/javascript"> - <!-- - [%+ INCLUDE "bug/field-events.js.tmpl" - field = select_fields.bug_status %] - //--> - </script> - [% END %] </td> [% END %] diff --git a/template/en/default/bug/dependency-tree.html.tmpl b/template/en/default/bug/dependency-tree.html.tmpl index c42c3c4..627c89d 100644 --- a/template/en/default/bug/dependency-tree.html.tmpl +++ b/template/en/default/bug/dependency-tree.html.tmpl @@ -129,7 +129,7 @@ [% extra_class = " b_open" %] [% extra_args = 'onclick="return doToggle(this, event)"' %] [% END %] - <a name="b[% bugid %]" + <a id="b[% bugid %]" class="b [%+ extra_class FILTER none %]" title="Click to expand or contract this portion of the tree. Hold down the Ctrl key while clicking to expand or contract all subtrees." [% extra_args FILTER none %]> </a> diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl index a4d6813..dbc23c8 100644 --- a/template/en/default/bug/edit.html.tmpl +++ b/template/en/default/bug/edit.html.tmpl @@ -30,14 +30,6 @@ [% PROCESS bug/time.html.tmpl %] -[% USE Bugzilla %] -[% SET select_fields = {} %] -[% FOREACH field = Bugzilla.get_fields( - { type => constants.FIELD_TYPE_SINGLE_SELECT, custom => 0 }) -%] - [% select_fields.${field.name} = field %] -[% END %] - <script type="text/javascript"> <!-- @@ -78,6 +70,7 @@ [% IF user.is_insider %] if (document.getElementById('isprivate_' + real_id).checked) { document.getElementById('newcommentprivacy').checked = 'checked'; + updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment'); } [% END %] @@ -136,10 +129,19 @@ [% 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" method="post" action="process_bug.cgi"> +<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 %]"> @@ -211,23 +213,11 @@ </tr> </table> - [%# *** Additional Comments *** %] - <div id="comments"> - [% PROCESS bug/comments.html.tmpl - comments = bug.comments - mode = user.id ? "edit" : "show" - %] - </div> <table id="bz_big_form_parts" cellspacing="0" cellpadding="0"><tr> <td> - - [% PROCESS comment_box %] - - <tr> - <td colspan="3"> - <hr id="bz_top_half_spacer"> - </td> - </tr> + [% IF user.is_timetracker %] + [% PROCESS section_timetracking %] + [% END %] [%# *** Attachments *** %] @@ -238,12 +228,28 @@ 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> [%############################################################################%] @@ -323,26 +329,36 @@ [%#############%] [%# PRODUCT #%] [%#############%] - <tr> [% INCLUDE bug/field.html.tmpl - bug = bug, field = select_fields.product, + 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> - <td class="field_label"> - <label for="component" accesskey="m"> - <b><a href="describecomponents.cgi?product=[% bug.product FILTER url_quote %]"> - Co<u>m</u>ponent</a>: - </b> - </label> - </td> - [% PROCESS select selname => "component" %] + [% 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"> @@ -360,11 +376,11 @@ </td> <td class="field_value"> [% INCLUDE bug/field.html.tmpl - bug = bug, field = select_fields.rep_platform, + 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 = select_fields.op_sys, + 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"> @@ -411,7 +427,7 @@ [% BLOCK section_details2 %] [%###############################################################%] - [%# Importance (priority, severity and votes) #%] + [%# Importance (priority and severity) #%] [%###############################################################%] <tr> <td class="field_label"> @@ -420,30 +436,15 @@ </td> <td> [% INCLUDE bug/field.html.tmpl - bug = bug, field = select_fields.priority, + 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>: + <b><a href="page.cgi?id=fields.html#importance"><u>S</u>everity</a></b></label>: [%+ INCLUDE bug/field.html.tmpl - bug = bug, field = select_fields.bug_severity, + bug = bug, field = bug_fields.bug_severity, no_tds = 1, value = bug.bug_severity editable = bug.check_can_change_field('bug_severity', 0, 1) %] - [% IF bug.use_votes %] - <span id="votes_container"> - [% IF bug.votes %] - with - <a href="votes.cgi?action=show_bug&bug_id=[% bug.bug_id %]"> - [% bug.votes %] - [% IF bug.votes == 1 %] - vote - [% ELSE %] - votes - [% END %]</a> - [% END %] - (<a href="votes.cgi?action=show_user&bug_id= - [% bug.bug_id %]#vote_[% bug.bug_id %]">vote</a>) - </span> - [% END %] + [% Hook.process('after_importance', 'bug/edit.html.tmpl') %] </td> </tr> @@ -483,6 +484,7 @@ id => "assigned_to" name => "assigned_to" value => bug.assigned_to.login + classes => ["bz_userfield"] size => 30 %] <br> @@ -525,6 +527,7 @@ name => "qa_contact" value => bug.qa_contact.login size => 30 + classes => ["bz_userfield"] emptyok => 1 %] <br> @@ -554,11 +557,11 @@ [%############################################################################%] [% BLOCK section_url_keyword_whiteboard %] [%# *** URL Whiteboard Keywords *** %] +[% IF Param('useurl') %] <tr> <td class="field_label"> <label for="bug_file_loc" accesskey="u"><b> - [% IF bug.bug_file_loc - AND NOT bug.bug_file_loc.match("^(javascript|data)") %] + [% 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 @@ -568,8 +571,7 @@ <td> [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %] <span id="bz_url_edit_container" class="bz_default_hidden"> - [% IF bug.bug_file_loc - AND NOT bug.bug_file_loc.match("^(javascript|data)") %] + [% 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> @@ -580,7 +582,8 @@ [% 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) %] + [% 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 %] @@ -597,6 +600,7 @@ [% END %] </td> </tr> +[% END %] [% IF Param('usestatuswhiteboard') %] <tr> @@ -613,8 +617,13 @@ <label for="keywords" accesskey="k"> <b><a href="describekeywords.cgi"><u>K</u>eywords</a></b></label>: </td> - [% PROCESS input inputname => "keywords" size => 40 colspan => 2 - value => bug.keywords.join(', ') %] + <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 %] @@ -676,14 +685,15 @@ [% END %] [% IF group.ingroup %] - <input type="hidden" name="defined_bit-[% group.bit %]" value="1"> + <input type="hidden" name="defined_groups" + value="[% group.name FILTER html %]"> [% END %] - <input type="checkbox" value="1" name="bit-[% group.bit %]" - id="bit-[% group.bit %]" + <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="bit-[% group.bit %]"> + <label for="group_[% group.bit %]"> [%- group.description FILTER html_light %]</label> <br> [% END %] @@ -803,9 +813,11 @@ including you [% END %] [% END %] - <span id="cc_edit_area_showhide_container" class="bz_default_hidden"> - (<a href="#" id="cc_edit_area_showhide">[% IF user.id %]edit[% ELSE %]show[% END %]</a>) - </span> + [% 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 %] @@ -816,6 +828,7 @@ name => "newcc" value => "" size => 30 + classes => ["bz_userfield"] multiple => 5 %] </div> @@ -835,13 +848,15 @@ [% END %] [% END %] </div> - <script type="text/javascript"> - hideEditableField( 'cc_edit_area_showhide_container', - 'cc_edit_area', - 'cc_edit_area_showhide', - '', - ''); - </script> + [% 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 %] @@ -899,13 +914,19 @@ [% BLOCK section_customfields %] [%# *** Custom Fields *** %] - + [% USE Bugzilla %] [% FOREACH field = Bugzilla.active_custom_fields %] <tr> - [% PROCESS bug/field.html.tmpl value=bug.${field.name} + [% 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 %] @@ -1022,9 +1043,9 @@ [% PROCESS formattimeunit time_unit=bug.estimated_time - (bug.actual_time + bug.remaining_time) %] </td> <td> - <input name="deadline" id="deadline" value="[% bug.deadline %]" - size="10" maxlength="10"><br /> - <small>(YYYY-MM-DD)</small> + [% 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> @@ -1042,16 +1063,15 @@ [%############################################################################%] [% BLOCK comment_box %] - <div class="bz_section_additional_comments"> - <a name="add_comment"></a> + <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="commentprivacy" value="1" + <input type="checkbox" name="comment_is_private" value="1" id="newcommentprivacy" - onClick="updateCommentTagControl(this, form)"> + onClick="updateCommentTagControl(this, 'comment')"> <label for="newcommentprivacy"> Make comment private (visible only to members of the <strong>[% Param('insidergroup') FILTER html %]</strong> group) @@ -1071,13 +1091,13 @@ <br> [% PROCESS commit_button id=""%] - <table class="status" cellspacing="0" cellpadding="0"> + <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> - <a name="bug_status_bottom"></a> [% PROCESS bug/knob.html.tmpl %] </td> </tr> @@ -1086,13 +1106,19 @@ [%# 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></table><tr></td> + <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 %] @@ -1157,9 +1183,6 @@ <div class="knob-buttons"> <input type="submit" value="Save Changes" id="commit[% id FILTER css_class_quote %]"> - [% IF bug.user.canmove %] - <input type="submit" name="action" id="action[% id FILTER css_class_quote %]" value="[% Param("move-button-text") %]"> - [% END %] </div> [% END %] [% END %] diff --git a/template/en/default/bug/field-events.js.tmpl b/template/en/default/bug/field-events.js.tmpl index 06fba12..f9e0ea9 100644 --- a/template/en/default/bug/field-events.js.tmpl +++ b/template/en/default/bug/field-events.js.tmpl @@ -32,9 +32,13 @@ [% FOREACH val = legal_value.controlled_values.$controlled_field %] [% cont_ids.push(val.id) %] [% END %] + [% NEXT IF !cont_ids.size %] showValueWhen('[% controlled_field FILTER js %]', [[% cont_ids.join(',') FILTER js %]], '[% field.name FILTER js %]', [% legal_value.id FILTER js %]); [% END %] [% END %] +[% IF field.name == 'classification' %] + YAHOO.util.Event.on('product', 'change', setClassification); +[% END %] diff --git a/template/en/default/bug/field-help.none.tmpl b/template/en/default/bug/field-help.none.tmpl new file mode 100644 index 0000000..7ae9991 --- /dev/null +++ b/template/en/default/bug/field-help.none.tmpl @@ -0,0 +1,241 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Gervase Markham <gerv@gerv.net> + # Max Kanat-Alexander <mkanat@bugzilla.org> + #%] + +[%# This file describes both bug fields and search fields. + # As calling this template once per label is very expensive, + # it is called only by Template.pm. %] + +[% RETURN UNLESS in_template_var %] + +[% vars.help_html = { + +# Note that all these keys here are in alphabetical order, though +# search-specific fields are at the bottom. + +############## +# Bug Fields # +############## + +alias => + "A short, unique name assigned to $terms.abug in order to assist with + looking it up and referring to it in other places in ${terms.Bugzilla}.", + +assigned_to => + "The person in charge of resolving the ${terms.bug}.", + +blocked => + "This $terms.bug must be resolved before the $terms.bugs listed in this + field can be resolved.", + +bug_file_loc => + "$terms.Bugs can have a URL associated with them - for example, a" + _ " pointer to a web site where the problem is seen.", + +bug_id => + "The numeric id of $terms.abug, unique within this entire installation" + _ " of ${terms.Bugzilla}.", + +bug_severity => + "How severe the $terms.bug is, or whether it's an enhancement.", + +bug_status => + "$terms.Abug may be in any of a number of states.", + +cc => + "Users who may not have a direct role to play on this $terms.bug, but who + are interested in its progress.", + +classification => + "$terms.Bugs are categorised into Classifications, Products and" + _ " Components. classifications is the top-level categorisation.", + +component => + "Components are second-level categories; each belongs to a" + _ " particular Product. Select a Product to narrow down this list.", + +creation_ts => + "When the $terms.bug was filed.", + +deadline => + "The date that this $terms.bug must be resolved by, entered in YYYY-MM-DD + format.", + +delta_ts => + "When this $terms.bug was last updated.", + +dependson => + "The $terms.bugs listed here must be resolved before this $terms.bug + can be resolved.", + +estimated_time => + "The amount of time that has been estimated it will take to resolve + this ${terms.bug}.", + +keywords => + "You can add keywords from a defined list to $terms.bugs, in order" + _ " to tag and group them.", + +longdesc => + "$terms.Bugs have comments added to them by $terms.Bugzilla users." + _ " You can search for some text in those comments.", + +op_sys => + "The operating system the $terms.bug was observed on.", + +percentage_complete => + "How close to 100% done this $terms.bug is, by comparing its + $vars.field_descs.work_time to its ${vars.field_descs.estimated_time}.", + +priority => + "Engineers prioritize their $terms.bugs using this field.", + +# Note that this has extra text added below if useclassification is on. +product => + "$terms.Bugs are categorised into Products and Components.", + +qa_contact => + "The person responsible for confirming this $terms.bug if it is" + _ " unconfirmed, and for verifying the fix once the $terms.bug" + _ " has been resolved.", + +remaining_time => + "The number of hours of work left on this $terms.bug, calculated by + subtracting the $vars.field_descs.work_time from the + ${vars.field_descs.estimated_time}.", + +rep_platform => + "The hardware platform the $terms.bug was observed on.", + +reporter => + "The person who filed this ${terms.bug}.", + +resolution => + "If $terms.abug is in a resolved state, then one of these reasons" + _ " will be given for its resolution.", + +see_also => + "This allows you to refer to $terms.bugs in other installations. + You can enter a URL to $terms.abug in the 'Add $terms.Bug URLs' + field to note that that $terms.bug is related to this one. You can + enter multiple URLs at once by separating them with a comma. + + <p>You should normally use this field to refer to $terms.bugs in + <em>other</em> installations. For $terms.bugs in this + installation, it is better to use the $vars.field_descs.dependson and + $vars.field_descs.blocked fields.</p>", + +short_desc => + "The $terms.bug summary is a short sentence which succinctly" + _ " describes what the $terms.bug is about.", + +status_whiteboard => + "Each $terms.bug has a free-form single line text entry box for" + _ " adding tags and status information.", + +target_milestone => + "The $vars.field_descs.target_milestone field is used to define when the" + _ " engineer the $terms.bug is assigned to expects to fix it.", + +version => + "The version field defines the version of the software the" + _ " $terms.bug was found in.", + +votes => + "Some $terms.bugs can be voted for, and you can limit your search to" + _ " $terms.bugs with more than a certain number of votes.", + +work_time => + "The total amount of time spent on this $terms.bug so far.", + +########################## +# Search-specific fields # +########################## + +chfield => + "You can search for specific types of change - this field defines" + _" which field you are interested in changes for.", + +# Duplicated to chfieldto below, also. +chfieldfrom => + "Specify the start and end dates either in YYYY-MM-DD format + optionally followed by HH:mm, in 24 hour clock), or in relative + dates such as 1h, 2d, 3w, 4m, 5y, which respectively mean one hour, + two days, three weeks, four months, or five years ago. 0d is last + midnight, and 0h, 0w, 0m, 0y is the beginning of this hour, week, + month, or year.", + +chfieldvalue => + "The value the field defined above changed to during that time.", + +content => + "This is a field available in searches that does a Google-like + 'full-text' search on the $vars.field_descs.short_desc and + $vars.field_descs.longdesc fields.", + +# Duplicated to email2 below, also. +email1 => + "Every $terms.bug has people associated with it in different" + _ " roles. Here, you can search on what people are in what role.", + +} %] + +[% vars.help_html.email2 = vars.help_html.email1 %] +[% vars.help_html.chfieldto = vars.help_html.chfieldfrom %] +[% vars.help_html.deadlinefrom = vars.help_html.deadline %] +[% vars.help_html.deadlineto = vars.help_html.deadline %] + +[% help_all_note = BLOCK %] + <strong>Note:</strong> When searching, selecting the option "All" + only finds [% terms.bugs %] whose value for this field is literally + the word "All". +[% END %] +[% FOREACH all_field = ['op_sys', 'rep_platform'] %] + [% vars.help_html.$all_field = vars.help_html.$all_field _ ' ' _ help_all_note %] +[% END %] + +[% IF Param('useclassification') %] + [% vars.help_html.product = vars.help_html.product + _ " Select a Classification to narrow down this list." %] +[% END %] + +[% FOREACH help_field = bug_fields.keys %] + + [%# Add help for custom fields. %] + [% IF !vars.help_html.${help_field}.defined %] + [% SET field_type = bug_fields.${help_field}.type %] + [% field_type_desc = BLOCK -%] + [% field_types.$field_type FILTER html %] + [%- END %] + [% vars.help_html.${help_field} = + "A custom $field_type_desc field in this installation" + _ " of ${terms.Bugzilla}." %] + [% END %] + + [%# Add help for the search types, for query.cgi. %] + [% type_desc = BLOCK %] + The type of [% vars.field_descs.${help_field} FILTER html %] search you + would like. + [% END %] + [% SET type_name = help_field _ '_type' %] + [% vars.help_html.$type_name = type_desc %] +[% END %] + +[% Hook.process("end") %] diff --git a/template/en/default/bug/field-label.html.tmpl b/template/en/default/bug/field-label.html.tmpl new file mode 100644 index 0000000..2138f03 --- /dev/null +++ b/template/en/default/bug/field-label.html.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 Everything Solved, Inc. + # Portions created by the Initial Developer are Copyright (C) 2010 the + # Initial Developer. All Rights Reserved. + # + # Contributor(s): + # Max Kanat-Alexander <mkanat@bugzilla.org> + #%] + +[%# INTERFACE: + # field: a Bugzilla::Field object + # desc_url: An alternate link to help for the field. + # hidden: True if the field label should start hidden. + # rowspan: a "rowspan" value for the label's <th>. + # tag_name: the tag to use to surround the label + #%] + +[% DEFAULT tag_name = "th" %] +<[% tag_name FILTER html %] class="field_label [% ' bz_hidden_field' IF hidden %] + [%- ' required' IF field.is_mandatory && NOT bug.id %]" + id="field_label_[% field.name FILTER html %]" + [% IF rowspan %] rowspan="[% rowspan FILTER html %]"[% END %]> + + [% IF editable %] + <label for="[% field.name FILTER html %]"> + [% END %] + + <a + [% IF help_html.${field.name}.defined %] + title="[% help_html.${field.name} FILTER txt FILTER collapse FILTER html %]" + class="field_help_link" + [% END %] + [% IF desc_url %] + href="[% desc_url FILTER html %]" + [% ELSE %] + href="page.cgi?id=fields.html#[% field.name FILTER url_quote %]" + [% END %] + >[%- field_descs.${field.name} FILTER html %]:</a> + + [% '</label>' IF editable %] +</[% tag_name FILTER html %]> diff --git a/template/en/default/bug/field.html.tmpl b/template/en/default/bug/field.html.tmpl index bb678d7..b014a6e 100644 --- a/template/en/default/bug/field.html.tmpl +++ b/template/en/default/bug/field.html.tmpl @@ -18,6 +18,8 @@ # Contributor(s): Myk Melez <myk@mozilla.org> # Max Kanat-Alexander <mkanat@bugzilla.org> # Elliotte Martin <elliotte_martin@yahoo.com> + # Guy Pyrzak <guy.pyrzak@gmail.com> + # Reed Loden <reed@reedloden.com> #%] [%# INTERFACE: @@ -40,35 +42,17 @@ #%] [% SET hidden = 0 %] -[% IF field.visibility_field.defined %] - [% IF !bug.${field.visibility_field.name} - .contains(field.visibility_value.name) - %] - [% SET hidden = 1 %] - [% END %] +[% IF field.visibility_field.defined AND bug + AND !field.visibility_value.is_set_on_bug(bug) +%] + [% SET hidden = 1 %] [% END %] [% IF NOT no_tds %] - <th class="field_label [% ' bz_hidden_field' IF hidden %]" - id="field_label_[% field.name FILTER html %]"> - [% IF editable %] - <label for="[% field.name FILTER html %]"> - [% END %] - [% IF desc_url %] - <a href="[% desc_url FILTER html %]"> - [% ELSIF !field.custom %] - <a href="page.cgi?id=fields.html#[% field.name FILTER url_quote %]"> - [% END -%] - [% field_descs.${field.name} FILTER html %]: - [%- '</a>' IF (!field.custom || desc_url) %] - [% '</label>' IF editable %] - </th> -[% END %] - -[% IF NOT no_tds %] -<td class="field_value [% ' bz_hidden_field' IF hidden %]" - id="field_container_[% field.name FILTER html %]" - [% " colspan=\"$value_span\"" FILTER none IF value_span %]> + [% PROCESS "bug/field-label.html.tmpl" %] + <td class="field_value [% ' bz_hidden_field' IF hidden %]" + id="field_container_[% field.name FILTER html %]" + [% " colspan=\"$value_span\"" FILTER none IF value_span %]> [% END %] [% Hook.process('start_field_column') %] [% IF editable %] @@ -77,11 +61,13 @@ <input id="[% field.name FILTER html %]" class="text_input" name="[% field.name FILTER html %]" value="[% value FILTER html %]" size="40" - maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]"> + maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]" + [% ' aria-required="true"' IF field.is_mandatory %]> [% CASE constants.FIELD_TYPE_DATETIME %] <input name="[% field.name FILTER html %]" size="20" id="[% field.name FILTER html %]" value="[% value FILTER html %]" + [% ' aria-required="true"' IF field.is_mandatory %] onchange="updateCalendarFromField(this)"> <button type="button" class="calendar_button" id="button_calendar_[% field.name FILTER html %]" @@ -89,8 +75,7 @@ <span>Calendar</span> </button> - <div id="con_calendar_[% field.name FILTER html %]" - class="yui-skin-sam"></div> + <div id="con_calendar_[% field.name FILTER html %]"></div> <script type="text/javascript"> createCalendar('[% field.name FILTER js %]') @@ -98,11 +83,13 @@ [% CASE constants.FIELD_TYPE_BUG_ID %] <span id="[% field.name FILTER html %]_input_area"> <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]" - value="[% value FILTER html %]" size="7"> + value="[% value FILTER html %]" size="7" + [% ' aria-required="true"' IF field.is_mandatory %]> + </span> - [% IF bug.${field.name} %] - [% bug.${field.name} FILTER bug_link(bug.${field.name}) FILTER none %] + [% IF value %] + [% value FILTER bug_link(value, use_alias => 1) FILTER none %] [% END %] <span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden"> (<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>) @@ -112,7 +99,7 @@ '[% field.name FILTER js %]_input_area', '[% field.name FILTER js %]_edit_action', '[% field.name FILTER js %]', - "[% bug.${field.name} FILTER js %]"); + "[% value FILTER js %]"); </script> [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT constants.FIELD_TYPE_MULTI_SELECT ] %] @@ -124,6 +111,7 @@ [% SET field_size = field.legal_values.size %] [% END %] size="[% field_size FILTER html %]" multiple="multiple" + [% ' aria-required="true"' IF field.is_mandatory %] [% END %] > [% IF allow_dont_change %] @@ -138,8 +126,6 @@ [% legal_values = field.legal_values %] [% END %] [% FOREACH legal_value = legal_values %] - [% SET control_value = legal_value.visibility_value %] - [% SET control_field = field.value_field %] <option value="[% legal_value.name FILTER html %]" id="v[% legal_value.id FILTER html %]_ [%- field.name FILTER html %]" @@ -147,10 +133,7 @@ # hidden %] [% IF value.contains(legal_value.name).size %] selected="selected" - [% ELSIF (control_field && control_value - && !bug.${control_field.name}.contains(control_value.name)) - || !legal_value.is_active - %] + [% ELSIF bug AND !legal_value.is_visible_on_bug(bug) %] class="bz_hidden_option" disabled="disabled" [% END %]> [%- display_value(field.name, legal_value.name) FILTER html ~%] @@ -178,38 +161,70 @@ [% CASE constants.FIELD_TYPE_TEXTAREA %] [% INCLUDE global/textarea.html.tmpl id = field.name name = field.name minrows = 4 maxrows = 8 - cols = 60 defaultcontent = value %] + cols = 60 defaultcontent = value mandatory = field.is_mandatory %] [% CASE constants.FIELD_TYPE_BUG_URLS %] [% '<ul class="bug_urls">' IF value.size %] [% FOREACH url = value %] <li> <a href="[% url FILTER html %]">[% url FILTER html %]</a> - [% IF editable %] - <label><input type="checkbox" value="[% url FILTER html %]" - name="remove_[% field.name FILTER html %]"> - Remove</label> - [% END %] + <label><input type="checkbox" value="[% url FILTER html %]" + name="remove_[% field.name FILTER html %]"> + Remove</label> </li> [% END %] [% '</ul>' IF value.size %] - [% IF editable && Param('use_see_also') %] + [% IF Param('use_see_also') %] <label for="[% field.name FILTER html %]"> <strong>Add [% terms.Bug %] URLs:</strong> </label><br> <input type="text" id="[% field.name FILTER html %]" size="40" class="text_input" name="[% field.name FILTER html %]"> [% END %] + [% CASE constants.FIELD_TYPE_KEYWORDS %] + <div id="keyword_container"> + <input type="text" id="[% field.name FILTER html %]" size="40" + class="text_input" name="[% field.name FILTER html %]" + value="[% value FILTER html %]"> + <div id="keyword_autocomplete"></div> + </div> + <script type="text/javascript" defer="defer"> + YAHOO.bugzilla.keyword_array = [ + [%- FOREACH keyword = all_keywords %] + [%-# %]"[% keyword.name FILTER js %]" + [%- "," IF NOT loop.last %][% END %]]; + YAHOO.bugzilla.keywordAutocomplete.init('[% field.name FILTER js %]', + 'keyword_autocomplete'); + </script> [% END %] [% ELSIF field.type == constants.FIELD_TYPE_TEXTAREA %] <div class="uneditable_textarea">[% value FILTER wrap_comment(60) FILTER html %]</div> [% ELSIF field.type == constants.FIELD_TYPE_BUG_ID %] - [% IF bug.${field.name} %] - [% bug.${field.name} FILTER bug_link(bug.${field.name}) FILTER none %] + [% IF value %] + [% value FILTER bug_link(value, use_alias => 1) FILTER none %] [% END %] +[% ELSIF field.type == constants.FIELD_TYPE_BUG_URLS %] + [% '<ul class="bug_urls">' IF value.size %] + [% FOREACH url = value %] + <li><a href="[% url FILTER html %]">[% url FILTER html %]</a></li> + [% END %] + [% '</ul>' IF value.size %] [% ELSE %] [% value.join(', ') FILTER html %] [% END %] [% Hook.process('end_field_column') %] [% '</td>' IF NOT no_tds %] + +[%# for reverse relationships, we show this pseudo-field after the main field %] +[% IF bug.id && field.is_relationship %] + [% extra_field_item = {} %] + [% extra_field_item.header = field.reverse_desc _ ":" FILTER html %] + [% extra_field_item.data = BLOCK %] + [% FOREACH depbug = bug.related_bugs(field) %] + [% depbug.id FILTER bug_link(depbug, use_alias => 1) FILTER none %][% " " %] + [% END %] + [% END %] +[% ELSE %] + [% extra_field_item = '' %] +[% END %] diff --git a/template/en/default/bug/format_comment.txt.tmpl b/template/en/default/bug/format_comment.txt.tmpl index 7d33c23..ed89188 100644 --- a/template/en/default/bug/format_comment.txt.tmpl +++ b/template/en/default/bug/format_comment.txt.tmpl @@ -39,16 +39,6 @@ X[% comment_body %] *** This [% terms.bug %] has been marked as a duplicate of [% terms.bug %] [%+ comment.extra_data %] *** [% ELSIF comment.type == constants.CMT_HAS_DUPE %] *** [% terms.Bug %] [%+ comment.extra_data %] has been marked as a duplicate of this [% terms.bug %]. *** -[% ELSIF comment.type == constants.CMT_POPULAR_VOTES %] -*** This [% terms.bug %] has been confirmed by popular vote. *** -[% ELSIF comment.type == constants.CMT_MOVED_TO %] -X[% comment_body %] - -[%+ terms.Bug %] moved to [% Param("move-to-url") %]. -If the move succeeded, [% comment.extra_data %] will receive a mail containing -the number of the new [% terms.bug %] in the other database. -If all went well, please paste in a link to the new [% terms.bug %]. -Otherwise, reopen this [% terms.bug %]. [% ELSIF comment.type == constants.CMT_ATTACHMENT_CREATED %] Created attachment [% comment.extra_data %] [% IF is_bugmail %] @@ -65,4 +55,6 @@ Comment on attachment [% comment.extra_data %] [%+ comment.attachment.description %] [%+ comment.body %] +[% ELSE %] +X[% Hook.process('type') %] [% END %] diff --git a/template/en/default/bug/navigate.html.tmpl b/template/en/default/bug/navigate.html.tmpl index 4a3d063..19af18a 100644 --- a/template/en/default/bug/navigate.html.tmpl +++ b/template/en/default/bug/navigate.html.tmpl @@ -16,8 +16,11 @@ # Rights Reserved. # # Contributor(s): Gervase Markham <gerv@gerv.net> + # Max Kanat-Alexander <mkanat@bugzilla.org> #%] +[% RETURN IF !bug %] + [% PROCESS global/variables.none.tmpl %] [% IF bottom_navigator == 1 %] <ul class="related_actions"> @@ -36,45 +39,41 @@ <div class="navigation"> -[% IF last_bug_list.size > 0 %] - [% this_bug_idx = lsearch(last_bug_list, bug.id) %] +[% SET my_search = user.recent_search_for(bug) %] +[% IF my_search %] + [% SET last_bug_list = my_search.bug_list %] + [% SET this_bug_idx = lsearch(last_bug_list, bug.id) %] <b>[% terms.Bug %] List:</b> - [% IF this_bug_idx != -1 %] - ([% this_bug_idx + 1 %] of [% last_bug_list.size %]) - [% END %] - [% IF this_bug_idx != -1 %] - <a href="show_bug.cgi?id= - [%- last_bug_list.first FILTER url_quote %]">First</a> + ([% this_bug_idx + 1 %] of [% last_bug_list.size %]) + + <a href="show_bug.cgi?id= + [%- last_bug_list.first FILTER url_quote %]&list_id= + [%- my_search.id FILTER url_quote %]">First</a> + <a href="show_bug.cgi?id= + [%- last_bug_list.last FILTER url_quote %]&list_id= + [%- my_search.id FILTER url_quote %]">Last</a> + + [% IF this_bug_idx > 0 %] + [% prev_bug = this_bug_idx - 1 %] <a href="show_bug.cgi?id= - [%- last_bug_list.last FILTER url_quote %]">Last</a> + [%- last_bug_list.$prev_bug FILTER url_quote %]&list_id= + [%- my_search.id FILTER url_quote %]">Prev</a> + [% ELSE %] + <i><font color="#777777">Prev</font></i> [% END %] - [% IF bug.bug_id %] - [% IF this_bug_idx != -1 %] - [% IF this_bug_idx > 0 %] - [% prev_bug = this_bug_idx - 1 %] - <a href="show_bug.cgi?id= - [%- last_bug_list.$prev_bug FILTER url_quote %]">Prev</a> - [% ELSE %] - <i><font color="#777777">Prev</font></i> - [% END %] - - [% IF this_bug_idx + 1 < last_bug_list.size %] - [% next_bug = this_bug_idx + 1 %] - <a href="show_bug.cgi?id= - [%- last_bug_list.$next_bug FILTER url_quote %]">Next</a> - [% ELSE %] - <i><font color="#777777">Next</font></i> - [% END %] - [% ELSE %] - (This [% terms.bug %] is not in your last search results) - [% END %] + [% IF this_bug_idx + 1 < last_bug_list.size %] + [% next_bug = this_bug_idx + 1 %] + <a href="show_bug.cgi?id= + [%- last_bug_list.$next_bug FILTER url_quote %]&list_id= + [%- my_search.id FILTER url_quote %]">Next</a> [% ELSE %] - + <i><font color="#777777">Next</font></i> [% END %] - <a href="buglist.cgi?regetlastlist=1">Show last search results</a> + <a href="buglist.cgi?regetlastlist= + [%- my_search.id FILTER url_quote %]">Show last search results</a> [% ELSE %] [%# With no list, don't show link to search results %] <i><font color="#777777">First</font></i> @@ -82,6 +81,7 @@ <i><font color="#777777">Prev</font></i> <i><font color="#777777">Next</font></i> - <i><font color="#777777">No search results available</font></i> + <i><font color="#777777">This [% terms.bug %] is not in your last + search results.</font></i> [% END %] </div> diff --git a/template/en/default/bug/process/header.html.tmpl b/template/en/default/bug/process/header.html.tmpl index 79f0126..6b608b9 100644 --- a/template/en/default/bug/process/header.html.tmpl +++ b/template/en/default/bug/process/header.html.tmpl @@ -39,8 +39,8 @@ [% END %] [% ELSIF title_tag == "mid_air" %] [% title = "Mid-air collision!" %] -[% ELSIF title_tag == "change_votes" %] - [% title = "Change Votes" %] [% END %] +[% Hook.process('title') %] + [% PROCESS global/header.html.tmpl %] diff --git a/template/en/default/bug/process/midair.html.tmpl b/template/en/default/bug/process/midair.html.tmpl index 34031fc..8a49f7c 100644 --- a/template/en/default/bug/process/midair.html.tmpl +++ b/template/en/default/bug/process/midair.html.tmpl @@ -94,7 +94,9 @@ You have the following choices: <input type="hidden" name="id" value="[% cgi.param("id") FILTER html %]"> <input type="hidden" name="delta_ts" value="[% bug.delta_ts FILTER html %]"> <input type="hidden" name="comment" value="[% cgi.param("comment") FILTER html %]"> - <input type="hidden" name="commentprivacy" value="[% cgi.param("commentprivacy") FILTER html %]"> + <input type="hidden" name="comment_is_private" + value="[% cgi.param("comment_is_private") FILTER html %]"> + <input type="hidden" name="longdesclength" value="[% bug.comments.size %]"> <input type="hidden" name="token" value="[% cgi.param("token") FILTER html %]"> <input type="submit" id="process_comment" value="Submit only my new comment"> </form> diff --git a/template/en/default/bug/process/results.html.tmpl b/template/en/default/bug/process/results.html.tmpl index ee218d4..c62a7a5 100644 --- a/template/en/default/bug/process/results.html.tmpl +++ b/template/en/default/bug/process/results.html.tmpl @@ -42,12 +42,13 @@ 'bug' => "Changes submitted for $link" , 'dupe' => "Duplicate notation added to $link" , 'dep' => "Checking for dependency changes on $link" , - 'votes' => "$Link confirmed by number of votes" , 'created' => "$Link has been added to the database" , 'move' => "$Link has been moved to another database" , } %] +[% Hook.process('title') %] + <dl> <dt>[% title.$type %]</dt> <dd> diff --git a/template/en/default/bug/process/verify-new-product.html.tmpl b/template/en/default/bug/process/verify-new-product.html.tmpl index 1cc186c..c02c264 100644 --- a/template/en/default/bug/process/verify-new-product.html.tmpl +++ b/template/en/default/bug/process/verify-new-product.html.tmpl @@ -40,7 +40,7 @@ [% SET exclude_items = ['version', 'component', 'target_milestone'] %] [% IF verify_bug_groups %] - [% exclude_items.push('bit-\d+') %] + [% exclude_items.push('groups', 'defined_groups') %] [% END %] [% Hook.process('exclude') %] @@ -124,9 +124,9 @@ [%+ terms.Bugs %] will no longer be restricted to these groups and may become public if no other group applies:<br> [% FOREACH group = old_groups %] - <input type="checkbox" id="bit-[% group.id FILTER html %]" - name="bit-[% group.id FILTER html %]" disabled="disabled" value="1"> - <label for="bit-[% group.id FILTER html %]"> + <input type="checkbox" id="group_[% group.id FILTER html %]" + name="groups" disabled="disabled" value="[% group.name FILTER html %]"> + <label for="group_[% group.id FILTER html %]"> [% group.name FILTER html %]: [% group.description FILTER html %] </label> <br> @@ -154,16 +154,15 @@ <p>These groups are optional. You can decide to restrict [% terms.bugs %] to one or more of the following groups:<br> [% FOREACH group = optional_groups %] - <input type="hidden" name="defined_bit-[% group.group.id FILTER html %]" - value="1"> - <input type="checkbox" id="bit-[% group.group.id FILTER html %]" - name="bit-[% group.group.id FILTER html %]" - [%+ ((group.membercontrol == constants.CONTROLMAPDEFAULT && user.in_group(group.group.name)) + <input type="hidden" name="defined_groups" + value="[% group.group.name FILTER html %]"> + <input type="checkbox" id="group_[% group.group.id FILTER html %]" + name="groups" + [% ' checked="checked"' IF ((group.membercontrol == constants.CONTROLMAPDEFAULT && user.in_group(group.group.name)) || (group.othercontrol == constants.CONTROLMAPDEFAULT && !user.in_group(group.group.name)) - || cgi.param("bit-$group.group.id") == 1) ? - 'checked="checked"' : '' - %] value="1"> - <label for="bit-[% group.group.id FILTER html %]"> + || cgi.param("groups").contains(group.group.name)) %] + value="[% group.group.name FILTER html %]"> + <label for="group_[% group.group.id FILTER html %]"> [% group.group.name FILTER html %]: [% group.group.description FILTER html %] </label> <br> @@ -175,9 +174,10 @@ <p>These groups are mandatory and [% terms.bugs %] will be automatically restricted to these groups:<br> [% FOREACH group = mandatory_groups %] - <input type="checkbox" id="bit-[% group.group.id FILTER html %]" checked="checked" - name="bit-[% group.group.id FILTER html %]" value="1" disabled="disabled"> - <label for="bit-[% group.group.id FILTER html %]"> + <input type="checkbox" id="group_[% group.group.id FILTER html %]" + checked="checked" disabled="disabled" + name="groups" value="[% group.group.name FILTER html %]"> + <label for="group_[% group.group.id FILTER html %]"> [% group.group.name FILTER html %]: [% group.group.description FILTER html %] </label> <br> diff --git a/template/en/default/bug/show-header.html.tmpl b/template/en/default/bug/show-header.html.tmpl index 3f81e57..e47af94 100644 --- a/template/en/default/bug/show-header.html.tmpl +++ b/template/en/default/bug/show-header.html.tmpl @@ -34,11 +34,10 @@ [% title = "$terms.Bug $bug.bug_id – $filtered_desc" %] [% header = "$terms.Bug $bug.bug_id" %] [% header_addl_info = "Last modified: $filtered_timestamp" %] -[% javascript_urls = [ "js/util.js", "js/field.js", "js/yui/calendar.js" ] %] -[% style_urls = [ "skins/standard/yui/calendar.css", - "skins/standard/show_bug.css" ] %] +[% yui = ['autocomplete', 'calendar'] %] +[% javascript_urls = [ "js/util.js", "js/field.js" ] %] +[% style_urls = [ "skins/standard/show_bug.css" ] %] [% doc_section = "bug_page.html" %] - [% bodyclasses = ['bz_bug', "bz_status_$bug.bug_status", "bz_product_$bug.product", @@ -48,3 +47,5 @@ [% FOREACH group = bug.groups_in %] [% bodyclasses.push("bz_group_$group.name") %] [% END %] + +[% Hook.process('end') %] diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl index 177bea1..406de16 100644 --- a/template/en/default/bug/show-multiple.html.tmpl +++ b/template/en/default/bug/show-multiple.html.tmpl @@ -163,11 +163,11 @@ <tr> <th>[% field_descs.bug_file_loc FILTER html %]:</th> <td colspan="3"> - [% IF bug.bug_file_loc.match("^(javascript|data)") %] - [% bug.bug_file_loc FILTER html %] - [% ELSE %] + [% IF is_safe_url(bug.bug_file_loc) %] <a href="[% bug.bug_file_loc FILTER html %]"> [% bug.bug_file_loc FILTER html %]</a> + [% ELSE %] + [% bug.bug_file_loc FILTER html %] [% END %] </td> </tr> @@ -186,6 +186,13 @@ [% PROCESS bug/field.html.tmpl value=bug.${field.name} editable=0 %] [%# Even-numbered fields get a closing <tr> %] [% '</tr>' IF !(field_counter % 2) %] + [% IF extra_field_item %] + [% field_counter = field_counter + 1 %] + [% '<tr>' IF field_counter % 2 %] + <th>[% extra_field_item.header FILTER none %]</th> + <td>[% extra_field_item.data FILTER none %]</td> + [% '</tr>' IF !(field_counter % 2) %] + [% END %] [% END %] [%# And we have to finish the row if we ended on an odd number. %] [% '<th></th><td></td></tr>' IF field_counter % 2 %] diff --git a/template/en/default/bug/show.xml.tmpl b/template/en/default/bug/show.xml.tmpl index 2349602..8034212 100644 --- a/template/en/default/bug/show.xml.tmpl +++ b/template/en/default/bug/show.xml.tmpl @@ -121,7 +121,13 @@ </bugzilla> [% BLOCK bug_field %] - [% FOREACH val = bug.$field %] + [% field_values = bug.$field %] + [%# Work around TT bug https://rt.cpan.org/Public/Bug/Display.html?id=9802 %] + [% IF bug.$field.size == 1 %] + [% field_values = [bug.$field.first] %] + [% END %] + + [% FOREACH val = field_values %] [%# We need to handle some fields differently. This should become # nicer once we have custfields, and a type attribute for the fields #%] diff --git a/template/en/default/bug/summarize-time.html.tmpl b/template/en/default/bug/summarize-time.html.tmpl index eb5ba7a..21c26e8 100644 --- a/template/en/default/bug/summarize-time.html.tmpl +++ b/template/en/default/bug/summarize-time.html.tmpl @@ -32,6 +32,8 @@ header = header style_urls = ["skins/standard/summarize-time.css"] doc_section = "timetracking.html" + yui = ['calendar'] + javascript_urls = [ "js/util.js", "js/field.js" ] %] [% INCLUDE query_form %] @@ -281,11 +283,23 @@ for="start_date">Period <u>s</u>tarting</label></b>: </td><td colspan="3"> <input type="text" id="start_date" name="start_date" size="11" - align="right" value="[% start_date FILTER html %]" maxlength="10"> + align="right" value="[% start_date FILTER html %]" maxlength="10" + onchange="updateCalendarFromField(this)"> + <button type="button" class="calendar_button" + id="button_calendar_start_date" + onclick="showCalendar('start_date')"><span>Calendar</span> + </button> + <div id="con_calendar_start_date"></div> <b>and <label accesskey="e" for="end_date"><u>e</u>nding</label></b>: <input type="text" name="end_date" size="11" id="end_date" - align="right" value ="[% end_date FILTER html %]" maxlength="10"> + align="right" value ="[% end_date FILTER html %]" maxlength="10" + onchange="updateCalendarFromField(this)"> + <button type="button" class="calendar_button" + id="button_calendar_end_date" + onclick="showCalendar('end_date')"><span>Calendar</span> + </button> + <div id="con_calendar_end_date"></div> </td><td align="right"> <input type="submit" id="summarize" value="Summarize"> </td></tr> @@ -329,7 +343,9 @@ </form> <script type="text/javascript"> <!-- - document.forms['summary'].start_date.focus() + createCalendar('start_date'); + createCalendar('end_date'); + document.forms['summary'].start_date.focus(); //--></script> <hr noshade size=1> [% END %] diff --git a/template/en/default/config.rdf.tmpl b/template/en/default/config.rdf.tmpl index ec80f76..2d69c6e 100644 --- a/template/en/default/config.rdf.tmpl +++ b/template/en/default/config.rdf.tmpl @@ -19,6 +19,10 @@ # Frédéric Buclin <LpSolit@gmail.com> #%] +[%# The url to the installation is going to be displayed many times. + # So we cache it here for better performance. + %] +[% escaped_urlbase = BLOCK %][% urlbase FILTER xml %][% END %] <?xml version="1.0"[% IF Param('utf8') %] encoding="UTF-8"[% END %]?> <!-- Note: this interface is experimental and under development. - We may and probably will make breaking changes to it in the future. --> @@ -27,7 +31,7 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:bz="http://www.bugzilla.org/rdf#"> -<bz:installation rdf:about="[% urlbase FILTER xml %]"> +<bz:installation rdf:about="[% escaped_urlbase %]"> <bz:install_version>[% constants.BUGZILLA_VERSION FILTER html %]</bz:install_version> <bz:maintainer>[% Param('maintainer') FILTER html %]</bz:maintainer> @@ -118,13 +122,14 @@ <Seq> [% FOREACH product = products %] <li> - <bz:product rdf:about="[% urlbase FILTER xml %]product.cgi?name=[% product.name FILTER url_quote %]"> + <bz:product rdf:about="[% escaped_urlbase %]product.cgi?name=[% product.name FILTER url_quote %]"> <bz:name>[% product.name FILTER html %]</bz:name> + <bz:allows_unconfirmed>[% product.allows_unconfirmed FILTER html %]</bz:allows_unconfirmed> <bz:components> <Seq> [% FOREACH component = product.components %] - <li resource="[% urlbase FILTER xml %]component.cgi?name=[% component.name FILTER url_quote + <li resource="[% escaped_urlbase %]component.cgi?name=[% component.name FILTER url_quote %]&product=[% product.name FILTER url_quote %]"/> [% END %] </Seq> @@ -133,7 +138,7 @@ <bz:versions> <Seq> [% FOREACH version = product.versions %] - <li resource="[% urlbase FILTER xml %]version.cgi?name=[% version.name FILTER url_quote %]"/> + <li resource="[% escaped_urlbase %]version.cgi?name=[% version.name FILTER url_quote %]"/> [% END %] </Seq> </bz:versions> @@ -142,7 +147,7 @@ <bz:target_milestones> <Seq> [% FOREACH milestone = product.milestones %] - <li resource="[% urlbase FILTER xml %]milestone.cgi?name=[% milestone.name FILTER url_quote %]"/> + <li resource="[% escaped_urlbase %]milestone.cgi?name=[% milestone.name FILTER url_quote %]"/> [% END %] </Seq> </bz:target_milestones> @@ -160,7 +165,7 @@ [% FOREACH product = products %] [% FOREACH component = product.components %] <li> - <bz:component rdf:about="[% urlbase FILTER xml %]component.cgi?name=[% component.name FILTER url_quote + <bz:component rdf:about="[% escaped_urlbase %]component.cgi?name=[% component.name FILTER url_quote %]&product=[% product.name FILTER url_quote %]"> <bz:name>[% component.name FILTER html %]</bz:name> [% IF show_flags %] @@ -170,7 +175,7 @@ [% FOREACH flag_type = flag_types %] [% NEXT UNLESS flag_type.is_active %] [% all_visible_flag_types.${flag_type.id} = flag_type %] - <li resource="[% urlbase FILTER xml %]flag.cgi?id=[% flag_type.id FILTER url_quote + <li resource="[% escaped_urlbase %]flag.cgi?id=[% flag_type.id FILTER url_quote %]&name=[% flag_type.name FILTER url_quote %]" /> [% END %] </Seq> @@ -188,7 +193,7 @@ [% FOREACH product = products %] [% FOREACH version = product.versions %] <li> - <bz:version rdf:about="[% urlbase FILTER xml %]version.cgi?name=[% version.name FILTER url_quote %]"> + <bz:version rdf:about="[% escaped_urlbase %]version.cgi?name=[% version.name FILTER url_quote %]"> <bz:name>[% version.name FILTER html %]</bz:name> </bz:version> </li> @@ -203,7 +208,7 @@ [% FOREACH product = products %] [% FOREACH milestone = product.milestones %] <li> - <bz:target_milestone rdf:about="[% urlbase FILTER xml %]milestone.cgi?name=[% milestone.name FILTER url_quote %]"> + <bz:target_milestone rdf:about="[% escaped_urlbase %]milestone.cgi?name=[% milestone.name FILTER url_quote %]"> <bz:name>[% milestone.name FILTER html %]</bz:name> </bz:target_milestone> </li> @@ -218,7 +223,7 @@ <Seq> [% FOREACH flag_type = all_visible_flag_types.values.sort('name') %] <li> - <bz:flag_type rdf:about="[% urlbase FILTER xml %]flag.cgi?id=[% flag_type.id FILTER url_quote + <bz:flag_type rdf:about="[% escaped_urlbase %]flag.cgi?id=[% flag_type.id FILTER url_quote %]&name=[% flag_type.name FILTER url_quote %]"> <bz:id>[% flag_type.id FILTER html %]</bz:id> <bz:name>[% flag_type.name FILTER html %]</bz:name> @@ -243,7 +248,7 @@ [% PROCESS "global/field-descs.none.tmpl" %] [% FOREACH item = field %] <li> - <bz:field rdf:about="[% urlbase FILTER xml %]field.cgi?name=[% item.name FILTER url_quote %]"> + <bz:field rdf:about="[% escaped_urlbase %]field.cgi?name=[% item.name FILTER url_quote %]"> <bz:name>[% item.name FILTER html %]</bz:name> <bz:description>[% (field_descs.${item.name} OR item.description) FILTER html %]</bz:description> [%-# These values are meaningful for custom fields only. %] diff --git a/template/en/default/email/newchangedmail.txt.tmpl b/template/en/default/email/newchangedmail.txt.tmpl index 81abc02..c3a9d40 100644 --- a/template/en/default/email/newchangedmail.txt.tmpl +++ b/template/en/default/email/newchangedmail.txt.tmpl @@ -19,28 +19,31 @@ #%] [% PROCESS "global/variables.none.tmpl" %] -From: [% changername %] <bugzilla-daemon@mageia.org> +[% PROCESS "global/reason-descs.none.tmpl" %] + +From: [% Param('mailfrom') %] <bugzilla-daemon@mageia.org> To: [% to_user.email %] -Subject: [[% terms.Bug %] [%+ bugid %]] [% '[New] ' IF isnew %][%+ summary %] +Subject: [[% terms.Bug %] [%+ bugid %]] [% '[New]: ' IF isnew %][%+ 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: [% classification %] +X-Bugzilla-Classification: [% bug.classification %] [% END %] -X-Bugzilla-Product: [% product %] -X-Bugzilla-Component: [% comp %] -X-Bugzilla-Keywords: [% keywords %] -X-Bugzilla-Severity: [% severity %] -X-Bugzilla-Who: [% changer %] -X-Bugzilla-Status: [% status %] -X-Bugzilla-Priority: [% priority %] -X-Bugzilla-Assigned-To: [% assignedto %] -X-Bugzilla-Target-Milestone: [% targetmilestone %] -X-Bugzilla-Changed-Fields: [% changedfields %] +X-Bugzilla-Product: [% bug.product %] +X-Bugzilla-Component: [% bug.component %] +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-Changed-Fields: [% changedfields.join(" ") %] [%+ threadingmarker %] -[%+ urlbase %]show_bug.cgi?id=[% bugid %] +[%+ urlbase %]show_bug.cgi?id=[% bug.id %] [%- IF diffs %] [%+ diffs %] @@ -56,33 +59,12 @@ X-Bugzilla-Changed-Fields: [% changedfields %] -- [%# Protect the trailing space of the signature marker %] Configure [% terms.bug %]mail: [% urlbase %]userprefs.cgi?tab=email ------- You are receiving this mail because: ------- -[% FOREACH relationship = reasons %] - [% SWITCH relationship %] - [% CASE constants.REL_ASSIGNEE %] -You are the assignee for the [% terms.bug %]. - [% CASE constants.REL_REPORTER %] -You reported the [% terms.bug %]. - [% CASE constants.REL_QA %] -You are the QA contact for the [% terms.bug %]. - [% CASE constants.REL_CC %] -You are on the CC list for the [% terms.bug %]. - [% CASE constants.REL_VOTER %] -You are a voter for the [% terms.bug %]. - [% CASE constants.REL_GLOBAL_WATCHER %] -You are watching all [% terms.bug %] changes. - [% END %] +[% SET reason_lines = [] %] +[% FOREACH reason = reasons %] + [% reason_lines.push(reason_descs.$reason) IF reason_descs.$reason %] [% END %] -[% FOREACH relationship = reasons_watch %] - [% SWITCH relationship %] - [% CASE constants.REL_ASSIGNEE %] -You are watching the assignee of the [% terms.bug %]. - [% CASE constants.REL_REPORTER %] -You are watching the reporter. - [% CASE constants.REL_QA %] -You are watching the QA contact of the [% terms.bug %]. - [% CASE constants.REL_CC %] -You are watching someone on the CC list of the [% terms.bug %]. - [% CASE constants.REL_VOTER %] -You are watching a voter for the [% terms.bug %]. - [% END %] +[% FOREACH reason = reasons_watch %] + [% reason_lines.push(watch_reason_descs.$reason) + IF watch_reason_descs.$reason %] [% END %] +[%+ reason_lines.join("\n") %] diff --git a/template/en/default/email/whine.txt.tmpl b/template/en/default/email/whine.txt.tmpl index e90480e..32d8da8 100644 --- a/template/en/default/email/whine.txt.tmpl +++ b/template/en/default/email/whine.txt.tmpl @@ -30,9 +30,8 @@ You have one or more [% terms.bugs %] assigned to you in the [% terms.Bugzilla % [% terms.bug %] tracking system ([% urlbase %]) that require attention. -All of these [% terms.bugs %] are in the [% display_value("bug_status", "NEW") %] or -[%= display_value("bug_status", "REOPENED") %] state, and have not been -touched in [% Param("whinedays") %] days or more. +All of these [% terms.bugs %] are in the [% display_value("bug_status", "CONFIRMED") %] +state, and have not been touched in [% Param("whinedays") %] days or more. You need to take a look at them, and decide on an initial action. Generally, this means one of three things: @@ -44,17 +43,17 @@ Generally, this means one of three things: sure that the Component field seems reasonable, and then use the "Reset Assignee to default" option.) (3) You decide the [% terms.bug %] belongs to you, but you can't solve it this moment. - Accept the [% terms.bug %] by setting the status to [% display_value("bug_status", "ASSIGNED") %]. + Accept the [% terms.bug %] by setting the status to [% display_value("bug_status", "IN_PROGRESS") %]. -To get a list of all [% display_value("bug_status", "NEW") %]/[% display_value("bug_status", "REOPENED") %] [%+ terms.bugs %], you can use this URL (bookmark +To get a list of all [% display_value("bug_status", "CONFIRMED") %] [%+ terms.bugs %], you can use this URL (bookmark it if you like!): - [% urlbase %]buglist.cgi?bug_status=NEW&bug_status=REOPENED&assigned_to=[% email %] + [% urlbase %]buglist.cgi?bug_status=CONFIRMED&assigned_to=[% email %] Or, you can use the general query page, at [%+ urlbase %]query.cgi -Appended below are the individual URLs to get to all of your [% display_value("bug_status", "NEW") %] [%+ terms.bugs %] +Appended below are the individual URLs to get to all of your [% display_value("bug_status", "CONFIRMED") %] [%+ terms.bugs %] that haven't been touched for [% Param("whinedays") %] days or more. You will get this message once a day until you've dealt with these [% terms.bugs %]! diff --git a/template/en/default/extensions/web-readme.txt.tmpl b/template/en/default/extensions/web-readme.txt.tmpl new file mode 100644 index 0000000..55e5939 --- /dev/null +++ b/template/en/default/extensions/web-readme.txt.tmpl @@ -0,0 +1,29 @@ +[%# 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 Everything Solved, Inc. + # Portions created by the Initial Developer are Copyright (C) 2010 the + # Initial Developer. All Rights Reserved. + # + # Contributor(s): + # Max Kanat-Alexander <mkanat@bugzilla.org> + #%] + +[% PROCESS global/variables.none.tmpl %] + +Web-accessible files, like JavaScript, CSS, and images go in this +directory. You can reference them directly in your HTML. For example, +if you have a file called "style.css" and your extension is called +"Foo", you would put it in "extensions/Foo/web/style.css", and then +you could link to it in HTML like: + +<link href="extensions/Foo/web/style.css" rel="stylesheet" type="text/css"> diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl index 2c096df..49bf3a9 100644 --- a/template/en/default/filterexceptions.pl +++ b/template/en/default/filterexceptions.pl @@ -59,7 +59,6 @@ 'search/boolean-charts.html.tmpl' => [ '"field${chartnum}-${rownum}-${colnum}"', - '"value${chartnum}-${rownum}-${colnum}"', 'field.name', '"${chartnum}-${rownum}-${newor}"', '"${chartnum}-${newand}-0"', @@ -70,10 +69,6 @@ 'search/form.html.tmpl' => [ 'qv.name', 'qv.description', - 'field.name', - 'field.description', - 'field.accesskey', - 'sel.name', ], 'search/search-specific.html.tmpl' => [ @@ -233,7 +228,6 @@ 'global/site-navigation.html.tmpl' => [ 'bug.bug_id', - 'bug.votes', ], 'bug/comments.html.tmpl' => [ @@ -260,11 +254,9 @@ ], 'bug/edit.html.tmpl' => [ - 'bug.deadline', 'bug.remaining_time', 'bug.delta_ts', 'bug.bug_id', - 'bug.votes', 'group.bit', 'dep.title', 'dep.fieldname', @@ -312,19 +304,6 @@ FILTER format("%d")', ], -'bug/votes/list-for-bug.html.tmpl' => [ - 'voter.vote_count', - 'total', -], - -'bug/votes/list-for-user.html.tmpl' => [ - 'product.maxperbug', - 'bug.id', - 'bug.count', - 'product.total', - 'product.maxvotes', -], - 'bug/process/results.html.tmpl' => [ 'title.$type', '"$terms.Bug $id" FILTER bug_link(id)', @@ -332,16 +311,12 @@ ], 'bug/create/create.html.tmpl' => [ - 'g.bit', - 'sel.name', - 'sel.description', 'cloned_bug_id', ], 'bug/create/create-guided.html.tmpl' => [ 'tablecolour', 'sel', - 'productstring', ], 'bug/activity/table.html.tmpl' => [ @@ -416,6 +391,7 @@ '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' => [ @@ -481,7 +457,6 @@ 'flags.setter', 'longdescs', 'quips', - 'votes', 'series', 'watch.watched', 'watch.watcher', @@ -528,4 +503,8 @@ 'group.id', ], +'config.rdf.tmpl' => [ + 'escaped_urlbase', +], + ); diff --git a/template/en/default/flag/list.html.tmpl b/template/en/default/flag/list.html.tmpl index 1110fb6..4467e81 100644 --- a/template/en/default/flag/list.html.tmpl +++ b/template/en/default/flag/list.html.tmpl @@ -30,7 +30,7 @@ [% DEFAULT flag_table_id = "flags" %] -<script type="text/javascript" src="js/flag.js"></script> +<script src="[% 'js/flag.js' FILTER mtime %]" type="text/javascript"></script> <table id="[% flag_table_id FILTER html %]"> [% UNLESS flag_no_header %] @@ -47,13 +47,13 @@ [% END %] [%# Step 1: Display every flag type (except inactive types with no flags). %] - [% FOREACH type = flag_types %] - - [%# Step 1a: Display existing flag(s). %] + [% FOREACH type = flag_types -%] + + [%-# Step 1a: Display existing flag(s). %] [% FOREACH flag = type.flags %] <tr> <td> - [% flag.setter.nick FILTER html %]: + <span title="[% flag.setter.identity FILTER html %]">[% flag.setter.nick FILTER html %]</span>: </td> <td> <label title="[% type.description FILTER html %]" @@ -88,6 +88,7 @@ <td> [% IF (type.is_active && type.is_requestable && type.is_requesteeble) || flag.requestee %] <span style="white-space: nowrap;"> + [% SET flag_custom_list = [] %] [% IF Param('usemenuforusers') %] [% flag_custom_list = flag.type.grant_list %] [% IF !(type.is_active && type.is_requestable && type.is_requesteeble) %] @@ -96,30 +97,24 @@ nothing else. %] [% flag_custom_list = [flag.requestee] %] [% END %] - [% INCLUDE global/userselect.html.tmpl - name => "requestee-$flag.id" - id => "requestee-$flag.id" - value => flag.requestee.login - multiple => 0 - emptyok => 1 - custom_userlist => flag_custom_list - %] - [% ELSE %] - (<input type="text" class="requestee" maxlength="255" - id="requestee-[% flag.id %]" - name="requestee-[% flag.id %]" - [% IF flag.status == "?" && flag.requestee %] - value="[% flag.requestee.login FILTER html %]" - [% END %]>) [% END %] + [% INCLUDE global/userselect.html.tmpl + name => "requestee-$flag.id" + id => "requestee-$flag.id" + value => flag.requestee.login + multiple => 0 + emptyok => 1 + classes => ["requestee"] + custom_userlist => flag_custom_list + %] </span> [% END %] </td> [% END %] </tr> - [% END %] - - [%# Step 1b: Display UI for setting flag. %] + [% END -%] + + [%-# Step 1b: Display UI for setting flag. %] [% IF (!type.flags || type.flags.size == 0) && type.is_active %] [% PROCESS flag_row first_cell_empty = 1 addl_text = "" %] @@ -147,10 +142,18 @@ <p><b>Flags:</b></p> [% header_displayed = 1 %] [% END %] - [% flag.setter.nick FILTER html %]: + [% IF flag.setter.name %] + <span title="[% flag.setter.name FILTER html %]">[% flag.setter.nick FILTER html %]</span>: + [% ELSE %] + [% flag.setter.nick FILTER html %]: + [% END %] [%+ type.name FILTER html FILTER no_break %][% flag.status %] [% IF flag.requestee %] - ([% flag.requestee.nick FILTER html %]) + [% IF flag.requestee.name %] + (<span title="[% flag.requestee.name FILTER html %]">[% flag.requestee.nick FILTER html %]</span>) + [% ELSE %] + ([% flag.requestee.nick FILTER html %]) + [% END %] [% END %]<br> [% END %] [% END %] @@ -191,20 +194,20 @@ <td> [% IF type.is_requestable && type.is_requesteeble %] <span style="white-space: nowrap;"> + [% SET grant_list = [] %] [% IF Param('usemenuforusers') %] - [% INCLUDE global/userselect.html.tmpl - name => "requestee_type-$type.id" - id => "requestee_type-$type.id" - multiple => type.is_multiplicable * 3 - emptyok => !type.is_multiplicable - value => "" - custom_userlist => type.grant_list - %] - [% ELSE %] - (<input type="text" class="requestee" maxlength="255" - id="requestee_type-[% type.id %]" - name="requestee_type-[% type.id %]">) + [% grant_list = type.grant_list %] [% END %] + [% INCLUDE global/userselect.html.tmpl + name => "requestee_type-$type.id" + id => "requestee_type-$type.id" + multiple => type.is_multiplicable * 3 + emptyok => !type.is_multiplicable + value => "" + custom_userlist => grant_list + classes => ["requestee"] + %] + </span> [% END %] </td> diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl index 753695b..54e05f6 100644 --- a/template/en/default/global/code-error.html.tmpl +++ b/template/en/default/global/code-error.html.tmpl @@ -37,17 +37,7 @@ [% DEFAULT title = "Internal Error" %] [% error_message = BLOCK %] - [% IF error == "action_unrecognized" %] - [% docslinks = {'query.html' => "Searching for $terms.bugs", - 'query.html#list' => "$terms.Bug lists"} %] - I don't recognize the value (<em>[% action FILTER html %]</em>) - of the <em>action</em> variable. - - [% ELSIF error == "attachment_already_obsolete" %] - Attachment #[% attach_id FILTER html %] ([% description FILTER html %]) - is already obsolete. - - [% ELSIF error == "attachment_local_storage_disabled" %] + [% IF error == "attachment_local_storage_disabled" %] [% title = "Local Storage Disabled" %] You cannot store attachments locally. This feature is disabled. @@ -139,7 +129,7 @@ [% ELSIF error == "db_rename_conflict" %] Name conflict: Cannot rename [% old FILTER html %] to - [% new FILTER html %] because [% new FILTER html %] already exists. + [%+ new FILTER html %] because [% new FILTER html %] already exists. [% ELSIF error == "cookies_need_value" %] Every cookie must have a value. @@ -156,6 +146,11 @@ address. [% END %] + [% ELSIF error == "extension_disabled" %] + [% title = "Extension Disabled" %] + You cannot access this page because the extension '[% name FILTER html %]' + is disabled. + [% ELSIF error == "extension_must_be_subclass" %] <code>[% package FILTER html %]</code> from <code>[% filename FILTER html %]</code> is not a subclass of @@ -216,13 +211,9 @@ [% ELSIF error == "illegal_field" %] A legal [% field FILTER html %] was not set. - [% ELSIF error == "inactive_group" %] - Attempted to add [% terms.bug %] to the '[% name FILTER html %]' - group, which is not used for [% terms.bugs %]. - [% ELSIF error == "invalid_attach_id_to_obsolete" %] The attachment number of one of the attachments you wanted to obsolete, - [% attach_id FILTER html %], is invalid. + [%+ attach_id FILTER html %], is invalid. [% ELSIF error == "invalid_customfield_type" %] [% title = "Invalid Field Type" %] @@ -260,7 +251,7 @@ Attachment [% attach_id FILTER html %] ([% description FILTER html %]) is attached to [% terms.bug %] [%+ attach_bug_id FILTER html %], but you tried to flag it as obsolete while creating a new attachment to - [% terms.bug %] [%+ my_bug_id FILTER html %]. + [%+ terms.bug %] [%+ my_bug_id FILTER html %]. [% ELSIF error == "feature_disabled" %] The [% install_string("feature_$feature") FILTER html %] feature is not @@ -281,13 +272,6 @@ You can't ask a specific person for <em>[% type.name FILTER html %]</em>. - [% ELSIF error == "flag_status_invalid" %] - The flag status <em>[% status FILTER html %]</em> - [% IF id %] - for flag ID #[% id FILTER html %] - [% END %] - is invalid. - [% ELSIF error == "flag_type_inactive" %] [% title = "Inactive Flag Type" %] The flag type [% type FILTER html %] is inactive and cannot be used @@ -356,7 +340,7 @@ [% ELSIF error == "mail_send_error" %] There was an error sending mail from '[% mail.header('From') FILTER html %]' to '[% mail.header('To') FILTER html %]': - [% msg FILTER html %] + [%+ msg FILTER html %] [% ELSIF error == "missing_bug_id" %] No [% terms.bug %] ID was given. @@ -370,14 +354,10 @@ [% ELSIF error == "need_quipid" %] A valid quipid is needed. - [% ELSIF error == "no_manual_moved" %] - You cannot set the resolution of [% terms.abug %] to [% display_value("resolution", "MOVED") FILTER html %] without - moving the [% terms.bug %]. - - [% ELSIF error == "no_open_bug_status" %] - [% title = "$terms.Bug Cannot Be Confirmed" %] - There is no valid transition from - [%+ display_value("bug_status", "UNCONFIRMED") FILTER html %] to an open state. + [% ELSIF error == "object_dep_sort_loop" %] + There is a loop in VALIDATOR_DEPENDENCIES involving + '[%+ field FILTER html %]'. Here are the fields we considered: + [%+ considered.join(', ') FILTER html %]. [% ELSIF error == "param_invalid" %] [% title = "Invalid Parameter" %] @@ -431,9 +411,6 @@ An error occurred while preparing for a RADIUS authentication request: <code>[% errstr FILTER html %]</code>. - [% ELSIF error == "request_queue_group_invalid" %] - The group field <em>[% group FILTER html %]</em> is invalid. - [% ELSIF error == "report_axis_invalid" %] <em>[% val FILTER html %]</em> is not a valid value for [%+ IF fld == "x" %]the horizontal axis @@ -443,7 +420,7 @@ [% ELSIF error == "setting_info_invalid" %] To create a new setting, you must supply a setting name, a list of - value/sortindex pairs, and the devault value. + value/sortindex pairs, and the default value. [% ELSIF error == "setting_name_invalid" %] The setting name <em>[% name FILTER html %]</em> is not a valid @@ -473,13 +450,6 @@ [% ELSIF error == "undefined_field" %] Form field [% field FILTER html %] was not defined. - [% ELSIF error == "unknown_action" %] - [% IF action %] - Unknown action [% action FILTER html %]! - [% ELSE %] - I could not figure out what you wanted to do. - [% END %] - [% ELSIF error == "unknown_method" %] The requested method '[% method FILTER html %]' was not found. @@ -562,6 +532,9 @@ </tr> </table> +<p>Traceback:</p> +<pre>[% traceback FILTER html %]</pre> + [% IF variables %] <pre> Variables: diff --git a/template/en/default/global/common-links.html.tmpl b/template/en/default/global/common-links.html.tmpl index a0d080a..6f99a64 100644 --- a/template/en/default/global/common-links.html.tmpl +++ b/template/en/default/global/common-links.html.tmpl @@ -24,7 +24,7 @@ <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="enter_bug.cgi">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> @@ -34,7 +34,8 @@ onsubmit="if (this.quicksearch.value == '') { alert('Please enter one or more search terms first.'); return false; } return true;"> - <input class="txt" type="text" id="quicksearch[% qs_suffix FILTER html %]" name="quicksearch"> + <input class="txt" type="text" id="quicksearch[% qs_suffix FILTER html %]" name="quicksearch" + 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> diff --git a/template/en/default/global/confirm-action.html.tmpl b/template/en/default/global/confirm-action.html.tmpl index e57a83c..9f9be31 100644 --- a/template/en/default/global/confirm-action.html.tmpl +++ b/template/en/default/global/confirm-action.html.tmpl @@ -27,6 +27,7 @@ style_urls = ['skins/standard/global.css'] %] <div class="throw_error"> +<!--reason=[%reason FILTER html %]--> [% IF reason == "expired_token" %] Your changes have been rejected because you exceeded the time limit of [% constants.MAX_TOKEN_AGE FILTER html %] days before submitting your diff --git a/template/en/default/global/confirm-user-match.html.tmpl b/template/en/default/global/confirm-user-match.html.tmpl index 67a901f..5549b51 100644 --- a/template/en/default/global/confirm-user-match.html.tmpl +++ b/template/en/default/global/confirm-user-match.html.tmpl @@ -150,6 +150,8 @@ [% ELSE %] matched <b>[% query.value.users.0.identity FILTER html %]</b> + <input type="hidden" name="[% field.key FILTER html %]" + value="[% query.value.users.0.login FILTER html %]"> [% END %] [% ELSE %] [% IF (query.key.length < 3) && !Param('emailsuffix') %] @@ -174,7 +176,10 @@ [% IF matchsuccess == 1 %] - [% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %] + [% SET exclude_these = + matches.keys.merge(['Bugzilla_login', 'Bugzilla_password']) %] + [% SET exclude = '^' _ exclude_these.join('|') _ '$' %] + [% PROCESS "global/hidden-fields.html.tmpl" exclude = exclude %] <p> <input type="submit" id="continue" value="Continue"> diff --git a/template/en/default/global/field-descs.none.tmpl b/template/en/default/global/field-descs.none.tmpl index 0c17e57..57af42a 100644 --- a/template/en/default/global/field-descs.none.tmpl +++ b/template/en/default/global/field-descs.none.tmpl @@ -68,13 +68,13 @@ [% value_descs = { "bug_status" => { # "UNCONFIRMED" => "UNCO", - # "NEW" => "NEWISH", + # "CONFIRMED" => "ITSABUG", }, "resolution" => { "" => "---", - # "FIXED" => "NO LONGER AN ISSUE", - # "MOVED" => "BYE-BYE", + # "FIXED" => "NO LONGER AN ISSUE", + # "WORKSFORME" => "NOTMYPROBLEM!", }, } %] @@ -100,6 +100,7 @@ "actual_time" => "Actual Hours", "alias" => "Alias", "assigned_to" => "Assignee", + "assigned_to_realname" => "Assignee Real Name", "attach_data.thedata" => "Attachment data", "attachments.description" => "Attachment description", "attachments.filename" => "Attachment filename", @@ -124,6 +125,7 @@ "component" => "Component", "content" => "Content", "creation_ts" => "Creation date", + "days_elapsed" => "Days since $terms.bug changed", "deadline" => "Deadline", "delta_ts" => "Changed", "dependson" => "Depends on", @@ -143,10 +145,12 @@ "product_id" => "Product ID", "product" => "Product", "qa_contact" => "QA Contact", + "qa_contact_realname" => "QA Contact Real Name", "remaining_time" => "Hours Left", "rep_platform" => "Hardware", "reporter" => "Reporter", "reporter_accessible" => "Reporter accessible", + "reporter_realname" => "Reporter Real Name", "requestees.login_name" => "Flag Requestee", "resolution" => "Resolution", "see_also" => "See Also", @@ -157,7 +161,6 @@ "status_whiteboard" => "Whiteboard", "target_milestone" => "Target Milestone", "version" => "Version", - "votes" => "Votes" "work_time" => "Hours Worked", } %] @@ -171,6 +174,8 @@ IF !vars.field_descs.${bz_field.name}.defined %] [% END %] [% END %] + + [% PROCESS "bug/field-help.none.tmpl" %] [% END %] [% Hook.process("end") %] diff --git a/template/en/default/global/footer.html.tmpl b/template/en/default/global/footer.html.tmpl index 0379f02..661f8af 100644 --- a/template/en/default/global/footer.html.tmpl +++ b/template/en/default/global/footer.html.tmpl @@ -33,7 +33,7 @@ #%] <div id="footer"> - <div class="intro"></div> + <div class="intro">[% Hook.process('intro') %]</div> [%# Migration note: the old param 'blurbhtml' goes here %] @@ -41,9 +41,11 @@ [% PROCESS "global/useful-links.html.tmpl" %] - <div class="outro"></div> + <div class="outro">[% Hook.process('outro') %]</div> </div> +[% Hook.process("end") %] + </body> </html> diff --git a/template/en/default/global/header.html.tmpl b/template/en/default/global/header.html.tmpl index 017701f..4030435 100644 --- a/template/en/default/global/header.html.tmpl +++ b/template/en/default/global/header.html.tmpl @@ -46,8 +46,41 @@ header_addl_info = "" onload = "" style_urls = [] + yui = [] %] +[% SET yui_css = { + autocomplete => 1, + calendar => 1, + datatable => 1, + button => 1, +} %] + +[%# Note: This is simple dependency resolution--you can't have dependencies + # that depend on each other. You have to specify all of a module's deps, + # if that module is going to be specified in "yui". + #%] +[% SET yui_deps = { + autocomplete => ['json', 'connection', 'datasource'], + datatable => ['json', 'connection', 'datasource', 'element'], +} %] + +[%# When using certain YUI modules, we need to process certain + # extra JS templates. + #%] +[% SET yui_templates = { + datatable => ['global/value-descs.js.tmpl'], +} %] + +[%# These are JS URLs that are *always* on the page and come before + # every other JS URL. + #%] +[% SET starting_js_urls = [ + "js/yui/yahoo-dom-event/yahoo-dom-event.js", + "js/yui/cookie/cookie-min.js", +] %] + + [%# We should be able to set the default value of the header variable # to the value of the title variable using the DEFAULT directive, # but that doesn't work if a caller sets header to the empty string @@ -70,96 +103,33 @@ [% PROCESS 'global/setting-descs.none.tmpl' %] - [%# Set up the skin CSS cascade: - # 1. Standard Bugzilla stylesheet set (persistent) - # 2. Standard Bugzilla stylesheet set (selectable) - # 3. All third-party "skin" stylesheet sets (selectable) - # 4. Page-specific styles - # 5. Custom Bugzilla stylesheet set (persistent) - # "Selectable" skin file sets may be either preferred or alternate. - # Exactly one is preferred, determined by the "skin" user preference. - #%] - [% IF user.settings.skin.value != 'standard' %] - [% user_skin = user.settings.skin.value %] - [% END %] - [% style_urls.unshift('skins/standard/global.css') %] + [% SET yui = yui_resolve_deps(yui, yui_deps) %] + [% SET css_sets = css_files(style_urls, yui, yui_css) %] [%# CSS cascade, part 1: Standard Bugzilla stylesheet set (persistent). # Always present. #%] - [% FOREACH style_url = style_urls %] - <link href="[% style_url FILTER html %]" - rel="stylesheet" - type="text/css"> + [%# This allows people to switch back to the "Classic" skin if they + # are in another skin. + #%] + <link href="[% 'skins/standard/global.css' FILTER mtime FILTER html %]" + rel="alternate stylesheet" + title="[% setting_descs.standard FILTER html %]"> + [% FOREACH style_url = css_sets.standard %] + [% PROCESS format_css_link css_set_name = 'standard' %] [% END %] - <!--[if lte IE 7]> - [%# Internet Explorer treats [if IE] HTML comments as uncommented. - # Use it to import CSS fixes so that Bugzilla looks decent on IE 7 - # and below. - #%] - <link href="skins/standard/IE-fixes.css" - rel="stylesheet" - type="text/css"> - <![endif]--> - [%# CSS cascade, part 2: Standard Bugzilla stylesheet set (selectable) - # Present if skin selection is enabled. + [%# CSS cascade, part 2 & 3: Third-party stylesheet set (selected and + # selectable). All third-party skins are present as alternate + # stylesheets, even if they are not currently in use. #%] - [% IF user.settings.skin.is_enabled %] - [% FOREACH style_url = style_urls %] - <link href="[% style_url FILTER html %]" - rel="[% 'alternate ' IF user_skin %]stylesheet" - title="[% setting_descs.standard FILTER html %]" - type="text/css"> - [% END %] - <!--[if lte IE 7]> - [%# Internet Explorer treats [if IE] HTML comments as uncommented. - # Use it to import CSS fixes so that Bugzilla looks decent on IE 7 - # and below. - #%] - <link href="skins/standard/IE-fixes.css" - rel="[% 'alternate ' IF user_skin %]stylesheet" - title="[% setting_descs.standard FILTER html %]" - type="text/css"> - <![endif]--> + [% FOREACH style_url = css_sets.skin %] + [% PROCESS format_css_link css_set_name = user.settings.skin.value %] [% END %] - [%# CSS cascade, part 3: Third-party stylesheet set (selectable). - # All third-party skins are present if skin selection is enabled. - # The admin-selected skin is always present. - #%] - [% FOREACH contrib_skin = user.settings.skin.legal_values %] - [% NEXT IF contrib_skin == 'standard' %] - [% NEXT UNLESS contrib_skin == user_skin - OR user.settings.skin.is_enabled %] - [% contrib_skin = contrib_skin FILTER url_quote %] - [% IF contrib_skin.match('\.css$') %] - [%# 1st skin variant: single-file stylesheet %] - <link href="[% "skins/contrib/$contrib_skin" %]" - rel="[% 'alternate ' UNLESS contrib_skin == user_skin %]stylesheet" - title="[% contrib_skin FILTER html %]" - type="text/css"> - [% ELSE %] - [%# 2nd skin variant: stylesheet set %] - [% FOREACH style_url = style_urls %] - [% IF style_url.match('^skins/standard/') %] - <link href="[% style_url.replace('^skins/standard/', - "skins/contrib/$contrib_skin/") %]" - rel="[% 'alternate ' UNLESS contrib_skin == user_skin %]stylesheet" - title="[% contrib_skin FILTER html %]" - type="text/css"> - [% END %] - [% END %] - <!--[if lte IE 7]> - [%# Internet Explorer treats [if IE] HTML comments as uncommented. - # Use it to import CSS fixes so that Bugzilla looks decent on IE 7 - # and below. - #%] - <link href="skins/contrib/[% contrib_skin FILTER html %]/IE-fixes.css" - rel="[% 'alternate ' UNLESS contrib_skin == user_skin %]stylesheet" - title="[% contrib_skin FILTER html %]" - type="text/css"> - <![endif]--> + [% FOREACH alternate_skin = css_sets.alternate.keys %] + [% FOREACH style_url = css_sets.alternate.$alternate_skin %] + [% PROCESS format_css_link css_set_name = alternate_skin %] [% END %] [% END %] @@ -175,29 +145,29 @@ # Always present. Site administrators may override all other style # definitions, including skins, using custom stylesheets. #%] - [% FOREACH style_url = style_urls %] - [% IF style_url.match('^skins/standard/') %] - <link href="[% style_url.replace('^skins/standard/', "skins/custom/") - FILTER html %]" rel="stylesheet" type="text/css"> - [% END %] + [% FOREACH style_url = css_sets.custom %] + [% PROCESS format_css_link css_set_name = 'standard' %] [% END %] - <!--[if lte IE 7]> - [%# Internet Explorer treats [if IE] HTML comments as uncommented. - # Use it to import CSS fixes so that Bugzilla looks decent on IE 7 - # and below. - #%] - <link href="skins/custom/IE-fixes.css" - rel="stylesheet" - type="text/css"> - <![endif]--> - - <script src="js/yui/yahoo-dom-event.js" type="text/javascript"></script> - <script src="js/yui/cookie.js" type="text/javascript"></script> - <script src="js/global.js" type="text/javascript"></script> + + [%# YUI Scripts %] + [% FOREACH yui_name = yui %] + [% starting_js_urls.push("js/yui/$yui_name/${yui_name}-min.js") %] + [% END %] + [% starting_js_urls.push('js/global.js') %] + + [% FOREACH javascript_url = starting_js_urls %] + [% PROCESS format_js_link %] + [% END %] + <script type="text/javascript"> <!-- YAHOO.namespace('bugzilla'); - if (YAHOO.env.ua.gecko) { + YAHOO.util.Event.addListener = function (el, sType, fn, obj, overrideContext) { + if ( ("onpagehide" in window || YAHOO.env.ua.gecko) && sType === "unload") { sType = "pagehide"; }; + var capture = ((sType == "focusin" || sType == "focusout") && !YAHOO.env.ua.ie) ? true : false; + return this._addListener(el, this._getType(sType), fn, obj, overrideContext, capture); + }; + if ( "onpagehide" in window || YAHOO.env.ua.gecko) { YAHOO.util.Event._simpleRemove(window, "unload", YAHOO.util.Event._unload); } @@ -219,24 +189,39 @@ #%] var BUGZILLA = { param: { - cookiepath: '[% Param('cookiepath') FILTER js %]' + cookiepath: '[% Param('cookiepath') FILTER js %]', + maxusermatches: [% Param('maxusermatches') FILTER js %] }, string: { + [%# Please keep these in alphabetical order. %] + attach_desc_required: - 'You must enter a Description for this attachment.' + 'You must enter a Description for this attachment.', + component_required: + 'You must select a Component for this [% terms.bug %].', + description_required: + 'You must enter a Description for this [% terms.bug %].', + short_desc_required: + 'You must enter a Summary for this [% terms.bug %].', + version_required: + 'You must select a Version for this [% terms.bug %].' } }; + + [% FOREACH yui_name = yui %] + [% FOREACH yui_template = yui_templates.$yui_name %] + [% PROCESS $yui_template %] + [% END %] + [% END %] [% IF javascript %] [% javascript %] [% END %] // --> </script> - [% IF javascript_urls %] - [% FOREACH javascript_url = javascript_urls %] - <script src="[% javascript_url FILTER html %]" type="text/javascript"></script> - [% END %] + [% FOREACH javascript_url = javascript_urls %] + [% PROCESS format_js_link %] [% END %] [%# this puts the live bookmark up on firefox for the Atom feed %] @@ -251,7 +236,6 @@ title="[% terms.Bugzilla %]" href="./search_plugin.cgi"> <link rel="icon" type="image/png" href="https://www.mageia.org/g/favicon.png"> [% Hook.process("additional_header") %] - <meta name="google-site-verification" content="upEZjJeSjjjVNCMOM2xZNi5PmRgMOY9SCtW3xmGY6nQ"> <script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(["_setAccount", "UA-18603191-3"]); @@ -274,13 +258,11 @@ class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') %] [% FOREACH class = bodyclasses %] [% ' ' %][% class FILTER css_class_quote %] - [% END %]"> + [% END %] yui-skin-sam"> [%# Migration note: the following file corresponds to the old Param # 'bannerhtml' #%] - - [% PROCESS "global/mageia-global-navigation.html.tmpl" %] <div id="header"> @@ -337,3 +319,41 @@ [% IF message %] <div id="message">[% message %]</div> [% END %] + +[% BLOCK format_css_link %] + [% IF style_url.match('/IE-fixes\.css') %] + <!--[if lte IE 7]> + [%# Internet Explorer treats [if IE] HTML comments as uncommented. + # We use it to import CSS fixes so that Bugzilla looks decent on IE 7 + # and below. + #%] + [% END %] + + [% IF css_set_name == 'standard' + OR css_set_name == user.settings.skin.value + %] + [% SET css_rel = 'stylesheet' %] + [% SET css_set_display_name = setting_descs.${user.settings.skin.value} + || user.settings.skin.value %] + [% ELSE %] + [% SET css_rel = 'alternate stylesheet' %] + [% SET css_set_display_name = setting_descs.$css_set_name || css_set_name %] + [% END %] + + [% IF css_set_name == 'standard' %] + [% SET css_title_link = '' %] + [% ELSE %] + [% css_title_link = BLOCK ~%] + title="[% css_set_display_name FILTER html %]" + [% END %] + [% END %] + + <link href="[% style_url FILTER html %]" rel="[% css_rel FILTER none %]" + type="text/css" [% css_title_link FILTER none %]> + + [% '<![endif]-->' IF style_url.match('/IE-fixes\.css') %] +[% END %] + +[% BLOCK format_js_link %] + <script type="text/javascript" src="[% javascript_url FILTER mtime FILTER html %]"></script> +[% END %] diff --git a/template/en/default/global/help.html.tmpl b/template/en/default/global/help.html.tmpl index 36439bc..c0ff819 100644 --- a/template/en/default/global/help.html.tmpl +++ b/template/en/default/global/help.html.tmpl @@ -23,8 +23,9 @@ [% IF cgi.param("help") %] <script type="text/javascript"> <!-- - [% FOREACH h = help_html %] - g_helpTexts["[% h.id FILTER js %]"] = "[%- h.html FILTER js -%]"; + [% FOREACH help_name = help_html.keys %] + g_helpTexts["[% help_name FILTER js %]"] = + "[%- help_html.$help_name FILTER js -%]"; [% END %] // --> </script> diff --git a/template/en/default/global/hidden-fields.html.tmpl b/template/en/default/global/hidden-fields.html.tmpl index 24f15c4..c141c64 100644 --- a/template/en/default/global/hidden-fields.html.tmpl +++ b/template/en/default/global/hidden-fields.html.tmpl @@ -52,7 +52,7 @@ [% ELSE %] [% FOREACH mvalue = cgi.param(field).slice(0) %] <input type="hidden" name="[% field FILTER html %]" - value="[% mvalue FILTER html FILTER html_linebreak %]"> + value="[% mvalue FILTER html_linebreak %]"> [% END %] [% END %] [% END %] diff --git a/template/en/default/global/messages.html.tmpl b/template/en/default/global/messages.html.tmpl index 7351aa0..52502a1 100644 --- a/template/en/default/global/messages.html.tmpl +++ b/template/en/default/global/messages.html.tmpl @@ -144,7 +144,7 @@ [% ELSIF message_tag == "buglist_query_gone" %] [% title = "Search is gone" %] - [% link = "Go back to the search page." %] + [% link = "Un-forget the search" %] OK, the <b>[% namedcmd FILTER html %]</b> search is gone. [% ELSIF message_tag == "buglist_sorted_by_relevance" %] @@ -455,10 +455,6 @@ [% ELSIF message_tag == "keyword_deleted" %] [% title = "Keyword Deleted" %] The <em>[% keyword.name FILTER html %]</em> keyword has been deleted. - <b>After you have finished editing keywords, you need to - <a href="sanitycheck.cgi?rebuildkeywordcache=1">rebuild the keyword - cache</a></b> (on a very large installation of [% terms.Bugzilla %], - this can take several minutes). [% ELSIF message_tag == "keyword_updated" %] [% title = "Keyword Updated" %] @@ -467,13 +463,7 @@ been saved: <ul> [% IF changes.name.defined %] - <li> - Keyword renamed to <em>[% keyword.name FILTER html %]</em>. - <b>After you have finished editing keywords, you need to - <a href="sanitycheck.cgi?rebuildkeywordcache=1">rebuild - the keyword cache</a></b> (on a very large installation - of [% terms.Bugzilla %], this can take several minutes). - </li> + <li>Keyword renamed to <em>[% keyword.name FILTER html %]</em>.</li> [% END %] [% IF changes.description.defined %] <li>Description updated to <em>[% keyword.description FILTER html %]</em></li> @@ -568,7 +558,7 @@ [% FOREACH param = param_changed %] Changed <em>[% param FILTER html %]</em><br> [% IF param == 'utf8' && Param('utf8') %] - <strong>You must now re-run checksetup.pl.</strong><br> + <strong>You must now re-run <kbd>checksetup.pl</kbd>.</strong><br> [% END %] [% END %] [% ELSE %] @@ -658,7 +648,7 @@ [% ELSIF message_tag == "install_fk_invalid" %] ERROR: There are invalid values for the [% column FILTER html %] column in the [% table FILTER html %] table. (These values do not exist in the [% foreign_table FILTER html %] table, in the - [% foreign_column FILTER html %] column.) + [%+ foreign_column FILTER html %] column.) Before continuing with checksetup, you will need to fix these values, either by deleting these rows from the database, or changing the values @@ -725,6 +715,9 @@ Verify that the file permissions in your [% terms.Bugzilla %] directory are suitable for your system. Avoid unnecessary write access. + [% ELSIF message_tag == "install_workflow_init" %] + Setting up the default status workflow... + [% ELSIF message_tag == "product_created" %] [% title = "Product Created" %] The product <em>[% product.name FILTER html %]</em> has been created. You will need to @@ -836,6 +829,10 @@ No changes made to version <em>[% version.name FILTER html %]</em>. [% END %] + [% ELSIF message_tag == "whine_query_failed" %] + The query '[% query_name FILTER html %]' from [% author.login FILTER html %] + failed: [% reason FILTER html %] + [% ELSIF message_tag == "workflow_updated" %] The workflow has been updated. [% END %] diff --git a/template/en/default/global/per-bug-queries.html.tmpl b/template/en/default/global/per-bug-queries.html.tmpl index 3c62e35..a7c073b 100644 --- a/template/en/default/global/per-bug-queries.html.tmpl +++ b/template/en/default/global/per-bug-queries.html.tmpl @@ -63,6 +63,7 @@ <input type="hidden" name="cmdtype" value="doit"> <input type="hidden" name="remtype" value="asnamed"> <input type="hidden" name="list_of_bugs" value="1"> + <input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]"> <select id="lob_action" name="action" onchange="update_text();"> <option value="add">Add</option> [% IF lists_of_bugs.size %] diff --git a/template/en/default/global/reason-descs.none.tmpl b/template/en/default/global/reason-descs.none.tmpl new file mode 100644 index 0000000..426085f --- /dev/null +++ b/template/en/default/global/reason-descs.none.tmpl @@ -0,0 +1,40 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Everything Solved, Inc. + # Portions created by the Initial Developer are Copyright (C) 2010 + # the Initial Developer. All Rights Reserved. + # + # Contributor(s): + # Max Kanat-Alexander <mkanat@bugzilla.org> + #%] + +[% SET reason_descs = { + ${constants.REL_ASSIGNEE} => "You are the assignee for the ${terms.bug}.", + ${constants.REL_REPORTER} => "You reported the ${terms.bug}.", + ${constants.REL_QA} => "You are the QA Contact for the ${terms.bug}.", + ${constants.REL_CC} => "You are on the CC list for the ${terms.bug}.", + ${constants.REL_GLOBAL_WATCHER} => "You are watching all $terms.bug changes.", +} %] + +[% SET watch_reason_descs => { + ${constants.REL_ASSIGNEE} => + "You are watching the assignee of the ${terms.bug}.", + ${constants.REL_REPORTER} => + "You are watching the reporter of the ${terms.bug}.", + ${constants.REL_QA} => + "You are watching the QA Contact of the ${terms.bug}.", + ${constants.REL_CC} => + "You are watching someone on the CC list of the ${terms.bug}.", +} %] + +[% Hook.process('end') %] diff --git a/template/en/default/global/setting-descs.none.tmpl b/template/en/default/global/setting-descs.none.tmpl index 661334c..e96e316 100644 --- a/template/en/default/global/setting-descs.none.tmpl +++ b/template/en/default/global/setting-descs.none.tmpl @@ -43,6 +43,9 @@ "quote_replies" => "Quote the associated comment when you click on its reply link", "quoted_reply" => "Quote the full comment", "simple_reply" => "Reference the comment number only", + "comment_box_position" => "Position of the Additional Comments box", + "before_comments" => "Before other comments", + "after_comments" => "After other comments", "timezone" => "Timezone used to display dates and times", "local" => "Same as the server", } diff --git a/template/en/default/global/site-navigation.html.tmpl b/template/en/default/global/site-navigation.html.tmpl index df60b76..60a8ddf 100644 --- a/template/en/default/global/site-navigation.html.tmpl +++ b/template/en/default/global/site-navigation.html.tmpl @@ -37,7 +37,7 @@ [% END %] - [%# *** Dependencies, Votes, Activity, Print-version *** %] + [%# *** Dependencies, Activity, Print-version *** %] [% IF bug %] <link rel="Show" title="Dependency Tree" href="showdependencytree.cgi?id=[% bug.bug_id %]&hide_resolved=1"> @@ -46,11 +46,6 @@ href="showdependencygraph.cgi?id=[% bug.bug_id %]"> [% END %] - [% IF bug.use_votes %] - <link rel="Show" title="Votes ([% bug.votes %])" - href="votes.cgi?action=show_bug&bug_id=[% bug.bug_id %]"> - [% END %] - <link rel="Show" title="[% terms.Bug %] Activity" href="show_activity.cgi?id=[% bug.bug_id %]"> <link rel="Show" title="Printer-Friendly Version" @@ -65,12 +60,6 @@ href="[% Param('mybugstemplate').replace('%userid%', user_login) %]"> [% END %] - [% FOREACH q = user.queries %] - <link rel="Saved Searches" - title="[% q.name FILTER html %]" - href="buglist.cgi?cmdtype=runnamed&namedcmd=[% q.name FILTER url_quote %]"> - [% END %] - [% FOREACH q = user.queries_subscribed %] <link rel="Saved Search" title="[% q.name FILTER html %] ([% q.user.login FILTER html %])" diff --git a/template/en/default/global/textarea.html.tmpl b/template/en/default/global/textarea.html.tmpl index d20422e..c158615 100644 --- a/template/en/default/global/textarea.html.tmpl +++ b/template/en/default/global/textarea.html.tmpl @@ -31,6 +31,8 @@ # minrows will be used. # cols: (required) Number of columns the textarea shall have. # defaultcontent: (optional) Default content for the textarea. + # mandatory: (optional) Boolean specifying whether or not the textarea + # is mandatory. #%] <textarea [% IF name %]name="[% name FILTER html %]"[% END %] @@ -39,6 +41,7 @@ [% IF style %] style="[% style FILTER html %]"[% END %] [% IF classes %] class="[% classes FILTER html %]"[% END %] [% IF wrap %] wrap="[% wrap FILTER html %]"[% END %] + [% IF disabled %] disabled="disabled"[% END %] [% IF defaultrows && user.settings.zoom_textareas.value == 'off' %] rows="[% defaultrows FILTER html %]" [% ELSE %] @@ -47,4 +50,7 @@ cols="[% cols FILTER html %]" [% IF maxrows && user.settings.zoom_textareas.value == 'on' %] onFocus="this.rows=[% maxrows FILTER html %]" + [% END %] + [% IF mandatory %] + aria-required="true" [% END %]>[% defaultcontent FILTER html %]</textarea> diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index 4698c94..2001f77 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -109,6 +109,11 @@ [% terms.Bug %] aliases cannot be longer than 20 characters. Please choose a shorter alias. + [% ELSIF error == "attachment_bug_id_mismatch" %] + [% title = "Invalid Attachments" %] + You tried to perform an action on attachments from different [% terms.bugs %]. + This operation requires all attachments to be from the same [% terms.bug %]. + [% ELSIF error == "auth_cant_create_account" %] [% title = "Can't create accounts" %] This site is using an authentication scheme which does not permit @@ -145,8 +150,6 @@ delete [% ELSIF action == "edit" %] add, modify or delete - [% ELSIF action == "move" %] - move [% ELSIF action == "run" %] run [% ELSIF action == "schedule" %] @@ -155,6 +158,8 @@ use [% ELSIF action == "approve" %] approve + [% ELSE %] + [%+ Hook.process('auth_failure_action') %] [% END %] [% IF object == "administrative_pages" %] @@ -214,6 +219,8 @@ versions [% ELSIF object == "workflow" %] the workflow + [% ELSE %] + [%+ Hook.process('auth_failure_object') %] [% END %]. [% Hook.process("auth_failure") %] @@ -250,9 +257,17 @@ <code>[% url FILTER html %]</code> is not a valid URL to [% terms.abug %]. [% IF reason == 'http' %] URLs must start with "http" or "https". + [% ELSIF reason == 'path_only' %] + You must specify a full URL. [% ELSIF reason == 'show_bug' %] - [%+ terms.Bug %] URLs should point to <code>show_bug.cgi</code> - in a [% terms.Bugzilla %] installation. + [%+ field_descs.see_also FILTER html %] URLs should point to one of: + <ul> + <li><code>show_bug.cgi</code> in a [% terms.Bugzilla %] + installation.</li> + <li>A b[% %]ug on launchpad.net</li> + <li>An issue on code.google.com.</li> + <li>A b[% %]ug on b[% %]ugs.debian.org.</li> + </ul> [% ELSIF reason == 'id' %] There is no valid [% terms.bug %] id in that URL. [% END %] @@ -505,7 +520,7 @@ it controls the visibility of the following fields: [%+ fields.join(', ') FILTER html %]. [% END %] - [% ' and ' IF fields.size AND vals.size %] + [% ' Also, ' IF fields.size AND vals.size %] [% IF vals.size %] it controls the visibility of the following field values: <ul> @@ -521,7 +536,8 @@ [% ELSIF error == "fieldvalue_is_default" %] [% title = "Specified Field Value Is Default" %] '[% value.name FILTER html %]' is the default value for - the '[% field.description FILTER html %]' field and cannot be deleted. + the '[% field.description FILTER html %]' field and cannot be deleted + or disabled. [% IF user.in_group('tweakparams') %] You have to <a href="editparams.cgi?section=bugfields# [%- param_name FILTER url_quote %]">change</a> the default value first. @@ -541,9 +557,9 @@ [% ELSIF error == "fieldvalue_not_deletable" %] [% title = "Field Value Not Deletable" %] - The value '[% value.name FILTER html %]' cannot be removed because - it plays some special role for the '[% field.description FILTER html %]' - field. + The value '[% value.name FILTER html %]' cannot be removed or + disabled, because it plays some special role for the + '[% field.description FILTER html %]' field. [% ELSIF error == "fieldvalue_reserved_word" %] [% title = "Reserved Word Not Allowed" %] @@ -560,7 +576,7 @@ [% ELSIF error == "fieldvalue_still_has_bugs" %] [% title = "You Cannot Delete This Field Value" %] You cannot delete the value '[% value.name FILTER html %]' from the - [% field.description FILTER html %] field, because there are still + [%+ field.description FILTER html %] field, because there are still [%+ value.bug_count FILTER html %] [%+ terms.bugs %] using it. [% ELSIF error == "fieldvalue_undefined" %] @@ -574,7 +590,7 @@ [% ELSIF error == "file_too_large" %] [% title = "File Too Large" %] The file you are trying to attach is [% filesize FILTER html %] - kilobytes (KB) in size. Non-patch attachments cannot be more than + kilobytes (KB) in size. Attachments cannot be more than [%+ Param('maxattachmentsize') %] KB. <br> We recommend that you store your attachment elsewhere [% IF Param("allow_attach_url") %] @@ -625,6 +641,14 @@ and the user you asked isn't in that group. Please choose someone else to ask, or ask an administrator to add the user to the group. + [% ELSIF error == "flag_status_invalid" %] + [% title = "Flag Status Invalid" %] + The flag status <em>[% status FILTER html %]</em> + [% IF id %] + for flag ID #[% id FILTER html %] + [% END %] + is invalid. + [% ELSIF error == "flag_type_cc_list_invalid" %] [% title = "Flag Type CC List Invalid" %] [% admindocslinks = {'flags-overview.html#flags-admin' => 'Administering Flags'} %] @@ -676,10 +700,10 @@ [% ELSIF error == "freetext_too_long" %] [% title = "Text Too Long" %] - The text you entered is too long ([% text.length FILTER html %] characters, - above the maximum length allowed of [% constants.MAX_FREETEXT_LENGTH FILTER none %] - characters): - <p><em>[% text FILTER html %]</em></p> + The text you entered in the [% field_descs.$field FILTER html %] + field is too long ([% text.length FILTER html %] characters, + above the maximum length allowed of + [%+ constants.MAX_FREETEXT_LENGTH FILTER none %] characters). [% ELSIF error == "group_cannot_delete" %] [% title = "Cannot Delete Group" %] @@ -690,12 +714,6 @@ in the database which refer to it. All references to this group must be removed before you can remove it. - [% ELSIF error == "group_change_denied" %] - [% title = "Cannot Add/Remove That Group" %] - You tried to add or remove group id [% group_id FILTER html %] - from [% terms.bug %] [%+ bug.id FILTER html %], but you do not - have permissions to do so. - [% ELSIF error == "group_exists" %] [% title = "The group already exists" %] The group [% name FILTER html %] already exists. @@ -716,16 +734,17 @@ [% ELSIF error == "group_invalid_removal" %] - You tried to remove [% terms.bug %] [%+ bug.id FILTER html %] - from group id [% group_id FILTER html %], but [% terms.bugs %] in the - '[% product FILTER html %]' product can not be removed from that - group. - - [% ELSIF error == "group_invalid_restriction" %] - You tried to restrict [% terms.bug %] [%+ bug.id FILTER html %] to - to group id [% group_id FILTER html %], but [% terms.bugs %] in the - '[% product FILTER html %]' product can not be restricted to - that group. + You tried to remove [% terms.bug %] [%+ bug_id FILTER html %] + from the '[% name FILTER html %]' group, but either this group does not exist, + or you are not allowed to remove [% terms.bugs %] from this group in the + '[% product FILTER html %]' product. + + [% ELSIF error == "group_restriction_not_allowed" %] + [% title = "Group Restriction Not Allowed" %] + You tried to restrict [% bug_id ? "$terms.bug $bug_id" : terms.abug FILTER html %] + to the '[% name FILTER html %]' group, but either this group does not exist, + or you are not allowed to restrict [% terms.bugs %] to this group in the + '[% product FILTER html %]' product. [% ELSIF error == "group_not_specified" %] [% title = "Group not specified" %] @@ -741,11 +760,6 @@ The group [% name FILTER html %] does not exist. Please specify a valid group name. Create it first if necessary! - [% ELSIF error == "illegal_at_least_x_votes" %] - [% title = "Your Search Makes No Sense" %] - The <em>At least ___ votes</em> field must be a simple number. - You entered <tt>[% value FILTER html %]</tt>, which isn't. - [% ELSIF error == "illegal_attachment_edit" %] [% title = "Unauthorized Action" %] You are not authorized to edit attachment [% attach_id FILTER html %]. @@ -781,9 +795,9 @@ to <em>[% newvalue.join(', ') FILTER html %]</em> [% END %] , but only - [% IF privs < 3 %] + [% IF privs < constants.PRIVILEGES_REQUIRED_EMPOWERED %] the assignee - [% IF privs < 2 %] or reporter [% END %] + [% IF privs < constants.PRIVILEGES_REQUIRED_ASSIGNEE %] or reporter [% END %] of the [% terms.bug %], or [% END %] a user with the required permissions may change that field. @@ -902,8 +916,9 @@ [% title = "Invalid Content-Type" %] The content type <em>[% contenttype FILTER html %]</em> is invalid. Valid types must be of the form <em>foo/bar</em> where <em>foo</em> - is one of <em>[% constants.LEGAL_CONTENT_TYPES.join(', ') FILTER html %]</em>. - + is one of <em>[% constants.LEGAL_CONTENT_TYPES.join(', ') FILTER html %]</em> + and <em>bar</em> must not contain any special characters (such as "=", "?", ...). + [% ELSIF error == "invalid_context" %] [% title = "Invalid Context" %] The context [% context FILTER html %] is invalid (must be a number, @@ -911,7 +926,7 @@ [% ELSIF error == "invalid_datasets" %] [% title = "Invalid Datasets" %] - Invalid datasets <em>[% datasets FILTER html %]</em>. Only digits, + Invalid datasets <em>[% datasets.join(":") FILTER html %]</em>. Only digits, letters and colons are allowed. [% ELSIF error == "invalid_format" %] @@ -984,9 +999,24 @@ [%+ constants.LOGIN_LOCKOUT_INTERVAL FILTER html %] minutes. [% END %] + [% ELSIF error == "json_rpc_get_method_required" %] + When using JSON-RPC over GET, you must specify a 'method' + parameter. See the documentation at + [%+ docs_urlbase FILTER html %]api/Bugzilla/WebService/Server/JSONRPC.html + + [% ELSIF error == "json_rpc_invalid_params" %] + Could not parse the 'params' argument as valid JSON. + Error: [% err_msg FILTER html %] + Value: [% params FILTER html %] + + [% ELSIF error == "json_rpc_invalid_callback" %] + You cannot use '[% callback FILTER html %]' as your 'callback' parameter. + For security reasons, only letters, numbers, and the following + characters are allowed in the 'callback' parameter: <code>[]._</code> + [% ELSIF error == "json_rpc_post_only" %] - For security reasons, you may only use JSON-RPC with the POST - HTTP method. + For security reasons, you must use HTTP POST to call the + '[% method FILTER html %]' method. [% ELSIF error == "keyword_already_exists" %] [% title = "Keyword Already Exists" %] @@ -1145,11 +1175,6 @@ A valid resolution is required to mark [% terms.bugs %] as [%+ status FILTER upper FILTER html %]. - [% ELSIF error == "move_bugs_disabled" %] - [% title = BLOCK %][% terms.Bug %] Moving Disabled[% END %] - Sorry, [% terms.bug %] moving has been disabled. If you need - to move [% terms.abug %], please contact [% Param("maintainer") %]. - [% ELSIF error == "missing_subcategory" %] [% title = "Missing Subcategory" %] You did not specify a subcategory for this series. @@ -1168,6 +1193,10 @@ to add a version to this product. [% END %] + [% ELSIF error == "multiple_alias_not_allowed" %] + You cannot set aliases when modifying multiple [% terms.bugs %] + at once. + [% ELSIF error == "need_quip" %] [% title = "Quip Required" %] [% docslinks = {'quips.html' => 'About quips'} %] @@ -1232,10 +1261,6 @@ Either no products have been defined to enter [% terms.bugs %] against or you have not been given access to any. - [% ELSIF error == "no_valid_action" %] - [% title = "No valid action specified" %] - Cannot edit [% field_descs.$field FILTER html %]: no valid action was specified. - [% ELSIF error == "number_not_numeric" %] [% title = "Numeric Value Required" %] The value '[% num FILTER html %]' in the @@ -1276,6 +1301,10 @@ Either you mis-typed the name or that user has not yet registered for a [% terms.Bugzilla %] account. [% END %] + [% IF class == "Bugzilla::Keyword" %] + The legal keyword names are <a href="describekeywords.cgi">listed + here</a>. + [% END %] [% ELSIF error == "old_password_incorrect" %] [% title = "Incorrect Old Password" %] @@ -1293,6 +1322,14 @@ [% title = "Passwords Don't Match" %] The two passwords you entered did not match. + [% ELSIF error == "password_current_too_short" %] + [% title = "New Password Required" %] + Your password is currently less than + [%+ constants.USER_PASSWORD_MIN_LENGTH FILTER html %] characters long, + which is the new minimum length required for passwords. + You must <a href="token.cgi?a=reqpw&loginname=[% locked_user.email FILTER url_quote %]"> + request a new password</a> in order to log in again. + [% ELSIF error == "password_too_short" %] [% title = "Password Too Short" %] The password must be at least @@ -1314,29 +1351,11 @@ [% END %] does not exist or you don't have access to it. - [% ELSIF error == "product_doesnt_exist" %] - [% title = "Specified Product Does Not Exist" %] - The product '[% product FILTER html %]' does not exist. - [% ELSIF error == "product_illegal_group" %] [% title = "Illegal Group" %] [% group.name FILTER html %] is not an active [% terms.bug %] group and so you cannot edit group controls for it. - [% ELSIF error == "product_illegal_votes" %] - [% title = "Votes Must Be Non-negative" %] - [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %] - '[% votes FILTER html %]' is an invalid value for the - <em> - [% IF field == "votesperuser" %] - Votes Per User - [% ELSIF field == "maxvotesperbug" %] - Maximum Votes Per [% terms.Bug %] - [% ELSIF field == "votestoconfirm" %] - Votes To Confirm - [% END %] - </em> field, which should contain a non-negative number. - [% ELSIF error == "product_name_already_in_use" %] [% title = "Product name already exists" %] [% admindocslinks = {'products.html' => 'Administering products'} %] @@ -1401,15 +1420,6 @@ 'versions.html' => 'Administering versions'} %] You must enter a valid version to create a new product. - [% ELSIF error == "product_not_specified" %] - [% title = "No Product Specified" %] - [% admindocslinks = {'products.html' => 'Administering products', - 'components.html' => 'Administering components', - 'milestones.html' => 'Administering milestones', - 'versions.html' => 'Administering versions'} %] - No product specified when trying to edit components, milestones, versions - or product. - [% ELSIF error == "query_name_exists" %] [% title = "Search Name Already In Use" %] The name <em>[% name FILTER html %]</em> is already used by another @@ -1455,10 +1465,24 @@ To file this [% terms.bug %], you must first choose a component. If necessary, just guess. + [% ELSIF error == "relationship_loop_single" %] + [% title = "Relationship Loop Detected" %] + [% field_descs.$field_name FILTER html %] + for [% terms.bug %] [%+ bug_id FILTER html %] + has a circular dependency on [% terms.bug %] [%+ dep_id FILTER html %]. + + [% ELSIF error == "request_queue_group_invalid" %] + The group field <em>[% group FILTER html %]</em> is invalid. + [% ELSIF error == "require_new_password" %] [% title = "New Password Needed" %] You cannot change your password without choosing a new one. + [% ELSIF error == "required_field" %] + [% title = "Field Must Be Set" %] + A value must be set for the '[% field_descs.${field.name} FILTER html %]' + field. + [% ELSIF error == "require_summary" %] [% title = "Summary Needed" %] You must enter a summary for this [% terms.bug %]. @@ -1497,32 +1521,17 @@ <a href="http://www.mozilla.org">Upgrade today</a>. :-) [% ELSIF error == "still_unresolved_bugs" %] - [% IF dependency_count == 1 %] - [% terms.Bug %]# <a href="show_bug.cgi?id=[% dependencies.0.bug_id FILTER none %]">[% dependencies.0.bug_id FILTER none %]</a> - still has [% dependencies.0.dependencies FILTER html %] unresolved - [% IF dependencies.0.dependencies == 1 %] - dependency - [% ELSE %] - dependencies - [% END %]. Show - <a href="showdependencytree.cgi?id=[% dependencies.0.bug_id FILTER none %]&hide_resolved=1">Dependency - Tree</a>. + [% title = "Unresolved Dependencies" %] + [% terms.Bug %] [%+ bug_id FILTER bug_link(bug_id) FILTER none %] + has [% dep_count FILTER none %] unresolved + [% IF dep_count == 1 %] + dependency [% ELSE %] - There are [% dependency_count FILTER none %] open [% terms.bugs %] which - have unresolved dependencies. - <br> - [% FOREACH bug = dependencies %] - [% terms.Bug %]# <a href="show_bug.cgi?id=[% bug.bug_id FILTER none %]">[% bug.bug_id FILTER none %]</a> - has [% bug.dependencies FILTER html %] open - [% IF bug.dependencies == 1 %] - dependency. - [% ELSE %] - dependencies. - [% END %] - (<a href="showdependencytree.cgi?id=[% bug.bug_id FILTER none %]&hide_resolved=1">Dependency - Tree</a>)<br> - [% END %] - [% END %] + dependencies + [% END %]. + They must either be resolved or removed from the + "[% field_descs.dependson FILTER html %]" field before you can resolve + this [% terms.bug %] as [% display_value("resolution", "FIXED") FILTER html %]. [% ELSIF error == "sudo_invalid_cookie" %] [% title = "Invalid Sudo Cookie" %] @@ -1548,36 +1557,21 @@ [% ELSIF error == "sudo_password_required" %] [% title = "Password Required" %] Your [% terms.Bugzilla %] password is required to begin a sudo - session. Please <a href="relogin.cgi?action=prepare-sudo&target_login= - [%- target_login FILTER html %]&reason= - [%- reason FILTER html %]">go back</a> and enter your password. + session. Please <a href="relogin.cgi?action=prepare-sudo&target_login= + [%- target_login FILTER url_quote %]&reason= + [%- reason FILTER url_quote %]">go back</a> and enter your password. [% ELSIF error == "sudo_preparation_required" %] [% title = "Preparation Required" %] You may not start a sudo session directly. Please - <a href="relogin.cgi?action=prepare-sudo&target_login= - [%- target_login FILTER html %]&reason= - [%- reason FILTER html %]">start your session normally</a>. + <a href="relogin.cgi?action=prepare-sudo&target_login= + [%- target_login FILTER url_quote %]&reason= + [%- reason FILTER url_quote %]">start your session normally</a>. [% ELSIF error == "sudo_protected" %] [% title = "User Protected" %] The user [% login FILTER html %] may not be impersonated by sudoers. - [% ELSIF error == "too_many_votes_for_bug" %] - [% title = "Illegal Vote" %] - [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %] - You may only use at most [% max FILTER html %] votes for a single - [%+ terms.bug %] in the - <tt>[% product FILTER html %]</tt> product, but you are trying to - use [% votes FILTER html %]. - - [% ELSIF error == "too_many_votes_for_product" %] - [% title = "Illegal Vote" %] - [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %] - You tried to use [% votes FILTER html %] votes in the - <tt>[% product FILTER html %]</tt> product, which exceeds the maximum of - [%+ max FILTER html %] votes for this product. - [% ELSIF error == "token_does_not_exist" %] [% title = "Token Does Not Exist" %] The token you submitted does not exist, has expired, or has @@ -1593,10 +1587,12 @@ [% END %] token too recently to request another. Please wait a while and try again. - [% ELSIF error == "unknown_keyword" %] - [% title = "Unknown Keyword" %] - <code>[% keyword FILTER html %]</code> is not a known keyword. - The legal keyword names are <a href="describekeywords.cgi">listed here</a>. + [% ELSIF error == "unknown_action" %] + [% IF action %] + Unknown action [% action FILTER html %]! + [% ELSE %] + I could not figure out what you wanted to do. + [% END %] [% ELSIF error == "unknown_tab" %] [% title = "Unknown Tab" %] @@ -1665,11 +1661,6 @@ Sorry, but you are not allowed to (un)mark comments or attachments as private. - [% ELSIF error == "votes_must_be_nonnegative" %] - [% title = "Votes Must Be Non-negative" %] - [% admindocslinks = {'voting.html' => 'Setting up the voting feature'} %] - Only use non-negative numbers for your [% terms.bug %] votes. - [% ELSIF error == "wrong_token_for_cancelling_email_change" %] [% title = "Wrong Token" %] That token cannot be used to cancel an email address change. @@ -1764,7 +1755,7 @@ [% FOREACH q = Bugzilla.user.queries %] [% IF q.name == namedcmd %] - or <a href="query.cgi?[% q.url FILTER html %]">edit</a> + or <a href="query.cgi?[% q.url FILTER url_quote %]">edit</a> [% END %] [% END %] @@ -1779,6 +1770,10 @@ attachment [% ELSIF class == "Bugzilla::User" %] user + [% ELSIF class == "Bugzilla::Classification" %] + classification + [% ELSIF class == "Bugzilla::Product" %] + product [% ELSIF class == "Bugzilla::Component" %] component [% ELSIF class == "Bugzilla::Version" %] @@ -1795,12 +1790,15 @@ field [% ELSIF class == "Bugzilla::Group" %] group - [% ELSIF class == "Bugzilla::Product" %] - product + [% ELSIF class == "Bugzilla::Keyword" %] + keyword + [% ELSIF class == "Bugzilla::Search::Recent" %] + recent search [% ELSIF class == "Bugzilla::Search::Saved" %] saved search [% ELSIF ( matches = class.match('^Bugzilla::Field::Choice::(.+)') ) %] [% SET field_name = matches.0 %] [% field_descs.$field_name FILTER html %] [% END %] + [% Hook.process('end_object_name', 'global/user-error.html.tmpl') %] [% END %] diff --git a/template/en/default/global/userselect.html.tmpl b/template/en/default/global/userselect.html.tmpl index 35075ef..1d03950 100644 --- a/template/en/default/global/userselect.html.tmpl +++ b/template/en/default/global/userselect.html.tmpl @@ -12,32 +12,42 @@ # # Contributor(s): Byron Jones <bugzilla@glob.com.au> # Frédéric Buclin <LpSolit@gmail.com> + # Guy Pyrzak <guy.pyrzak@gmail.com> + # Reed Loden <reed@reedloden.com> #%] [%# INTERFACE: # name: mandatory; field name # id: optional; field id # value: optional; default field value/selection + # classes: optional; an array of classes to be added # onchange: optional; onchange attribute value # disabled: optional; if true, the field is disabled # accesskey: optional, input only; accesskey attribute value # size: optional, input only; size attribute value - # emptyok: optional, select only; if true, prepend menu option to start of select + # emptyok: optional, select only; if true, prepend menu option for "" to start of select + # hyphenok: optional, select only; if true, prepend menu option for "-" to start of select # multiple: optional, do multiselect box, value is size (height) of box # custom_userlist: optional, specify a limited list of users to use + # field_title: optional, extra information to display as a tooltip #%] [% IF Param("usemenuforusers") %] <select name="[% name FILTER html %]" [% IF id %] id="[% id FILTER html %]" [% END %] + [% IF classes %] class="[% classes.join(' ') FILTER html %]" [% END %] [% IF onchange %] onchange="[% onchange FILTER html %]" [% END %] [% IF disabled %] disabled="[% disabled FILTER html %]" [% END %] [% IF accesskey %] accesskey="[% accesskey FILTER html %]" [% END %] [% IF multiple %] multiple="multiple" size="[% multiple FILTER html %]" [% END %] + [% IF field_title %] title="[% field_title FILTER html %]" [% END %] > [% IF emptyok %] <option value=""></option> [% END %] + [% IF hyphenok %] + <option value="-">-</option> + [% END %] [% UNLESS custom_userlist %] [% custom_userlist = user.get_userlist %] @@ -69,15 +79,31 @@ [% END %] </select> [% ELSE %] -<input - name="[% name FILTER html %]" - value="[% value FILTER html %]" - [% IF onchange %] onchange="[% onchange FILTER html %]" [% END %] - [% IF disabled %] disabled="[% disabled FILTER html %]" [% END %] - [% IF accesskey %] accesskey="[% accesskey FILTER html %]" [% END %] - [% IF size %] size="[% size FILTER html %]" [% END %] - [% IF id %] id="[% id FILTER html %]" [% END %] -> + [% IF feature_enabled('jsonrpc') && Param('ajax_user_autocompletion') && id %] + <div id="[% id FILTER html %]_autocomplete" + [% IF classes %] class="[% classes.join(' ') FILTER html %]" [% END %]> + [% END %] + <input + name="[% name FILTER html %]" + value="[% value FILTER html %]" + [% IF classes %] class="[% classes.join(' ') FILTER html %]" [% END %] + [% IF onchange %] onchange="[% onchange FILTER html %]" [% END %] + [% IF disabled %] disabled="[% disabled FILTER html %]" [% END %] + [% IF accesskey %] accesskey="[% accesskey FILTER html %]" [% END %] + [% IF field_title %] title="[% field_title FILTER html %]" [% END %] + [% IF size %] size="[% size FILTER html %]" [% END %] + [% IF id %] id="[% id FILTER html %]" [% END %] + > + [% IF feature_enabled('jsonrpc') && Param('ajax_user_autocompletion') && id %] + <div id="[% id FILTER html %]_autocomplete_container"></div> + </div> + <script type="text/javascript"> + if( typeof(YAHOO.bugzilla.userAutocomplete) !== 'undefined' + && YAHOO.bugzilla.userAutocomplete != null){ + YAHOO.bugzilla.userAutocomplete.init( "[% id FILTER js %]", + "[% id FILTER js %]_autocomplete_container" + [% IF multiple %], true[% END%]); + } + </script> + [% END %] [% END %] - - diff --git a/template/en/default/global/value-descs.js.tmpl b/template/en/default/global/value-descs.js.tmpl new file mode 100644 index 0000000..d432cf1 --- /dev/null +++ b/template/en/default/global/value-descs.js.tmpl @@ -0,0 +1,33 @@ +[%# 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 Everything Solved, Inc. + # Portions created by the Initial Developer are Copyright (C) 2010 + # the Initial Developer. All Rights Reserved. + # + # Contributor(s): + # Max Kanat-Alexander <mkanat@bugzilla.org> + #%] + +[% PROCESS "global/field-descs.none.tmpl" %] + +BUGZILLA.value_descs = { + [% FOREACH vd_field = value_descs.keys %] + [% vd_field FILTER js %]: { + [% FOREACH vd_value = value_descs.${vd_field}.keys %] + '[% vd_value FILTER js %]': + '[% value_descs.${vd_field}.${vd_value} FILTER js %]' + [%~ ',' UNLESS loop.last %] + [% END %] + }[% ',' UNLESS loop.last %] + [% END %] +}; diff --git a/template/en/default/global/variables.none.tmpl b/template/en/default/global/variables.none.tmpl index dd7281e..faf1a54 100644 --- a/template/en/default/global/variables.none.tmpl +++ b/template/en/default/global/variables.none.tmpl @@ -40,3 +40,5 @@ "Bugzilla" => "Bugzilla" } %] + +[% Hook.process("end") %] diff --git a/template/en/default/index.html.tmpl b/template/en/default/index.html.tmpl index fd1f01a..c7bcba3 100644 --- a/template/en/default/index.html.tmpl +++ b/template/en/default/index.html.tmpl @@ -30,7 +30,7 @@ [% PROCESS global/header.html.tmpl - title = "Mageia Bugzilla" + title = "Mageia Main Page" header = "Main Page" header_addl_info = "version $constants.BUGZILLA_VERSION" style_urls = [ 'skins/standard/index.css' ] @@ -96,12 +96,12 @@ YAHOO.util.Event.onDOMReady(onLoadActions); <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">Parameters</a> page.</p> + <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p> [% ELSIF release.error == "cannot_download" %] <p>The local XML file '[% release.xml_file FILTER html %]' cannot be created. Please make sure the web server can write in this directory and that you can access the web. If you are behind a proxy, set the - <a href="editparams.cgi?section=advanced#proxy_url">proxy_url</a> parameter correctly.</p> + <a href="editparams.cgi?section=advanced#proxy_url_desc">proxy_url</a> parameter correctly.</p> [% ELSIF release.error == "no_update" %] <p>The local XML file '[% release.xml_file FILTER html %]' cannot be updated. Please make sure the web server can edit this file.</p> @@ -114,7 +114,7 @@ YAHOO.util.Event.onDOMReady(onLoadActions); [% 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">Parameters</a> page.</p> + <a href="editparams.cgi?section=general#upgrade_notification_desc">Parameters</a> page.</p> [% END %] </div> [% END %] @@ -126,7 +126,7 @@ YAHOO.util.Event.onDOMReady(onLoadActions); <h1 id="welcome"> Welcome to [% terms.Bugzilla %]</h1> <div class="intro">[% Hook.process('intro') %]</div> <a id="enter_bug" class="bz_common_actions" - href="enter_bug.cgi?format=guided&classification=__all"><span>File [% terms.aBug %]</span></a> + href="enter_bug.cgi"><span>File [% terms.aBug %]</span></a> <a id="query" class="bz_common_actions" href="query.cgi"><span>Search</span></a> @@ -166,6 +166,7 @@ YAHOO.util.Event.onDOMReady(onLoadActions); | <a href="page.cgi?id=release-notes.html">Release Notes</a> </li> + [% Hook.process('additional_links') %] </ul> </div> </form> diff --git a/template/en/default/list/change-columns.html.tmpl b/template/en/default/list/change-columns.html.tmpl index 36cd5db..b13055c 100644 --- a/template/en/default/list/change-columns.html.tmpl +++ b/template/en/default/list/change-columns.html.tmpl @@ -34,10 +34,22 @@ [% PROCESS "global/field-descs.none.tmpl" %] [% field_descs.short_short_desc = "Summary (first 60 characters)" %] -[% field_descs.short_desc = "Full Summary" %] -[% field_descs.assigned_to_realname = "Assignee Realname" %] -[% field_descs.reporter_realname = "Reporter Realname" %] -[% field_descs.qa_contact_realname = "QA Contact Realname" %] +[% field_descs.short_desc = "Summary (Full)" %] +[% field_descs.assigned_to_realname = "$field_descs.assigned_to Real Name" %] +[% field_descs.reporter_realname = "$field_descs.reporter Real Name" %] +[% field_descs.qa_contact_realname = "$field_descs.qa_contact Real Name" %] + +[%# Create a mapping of field descriptions to field names, so that + # the "Available Columns" list can be sorted alphabetically by + # field description. + #%] +[% SET available_columns = {} %] +[% FOREACH column = columns.keys %] + [% NEXT IF collist.contains(column) %] + [%# We lowecase the keys so that the sort happens case-insensitively. %] + [% SET column_desc = field_descs.$column || column FILTER lower %] + [% available_columns.$column_desc = column %] +[% END %] <form name="changecolumns" action="colchange.cgi" onsubmit="change_submit();"> <input type="hidden" name="rememberedquery" value="[% buffer FILTER html %]"> @@ -70,12 +82,13 @@ [% (field_descs.${column} || column) FILTER html %] </option> [% END %] - [% FOREACH column = masterlist %] - [% IF lsearch(collist, column) == -1 %] - <option value="[% column FILTER html %]"> - [% (field_descs.${column} || column) FILTER html %] - </option> - [% END %] + [% FOREACH key = available_columns.keys.sort %] + [% SET column = available_columns.$key %] + <option value="[% column FILTER html %]"> + [%# Don't display the lower-cased column description, + # display the correct-case one. %] + [% (field_descs.$column || column) FILTER html %] + </option> [% END %] </select> </td> @@ -108,11 +121,16 @@ <p> <input type="hidden" name="saved_search" value="[% saved_search.id FILTER html%]" > + <input type="hidden" name="token" + value="[% issue_hash_token([saved_search.id, saved_search.name]) FILTER html %]"> <input type="checkbox" id="save_columns_for_search" checked="checked" name="save_columns_for_search" value="1"> <label for="save_columns_for_search">Save this column list only for search '[% saved_search.name FILTER html %]'</label> </p> + [% ELSE %] + <input type="hidden" name="token" + value="[% issue_hash_token(['default-list']) FILTER html %]"> [% END %] <p> diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl index 75f2f83..92e578e 100644 --- a/template/en/default/list/edit-multiple.html.tmpl +++ b/template/en/default/list/edit-multiple.html.tmpl @@ -19,6 +19,7 @@ # Max Kanat-Alexander <mkanat@bugzilla.org> # Frédéric Buclin <LpSolit@gmail.com> # Guy Pyrzak <guy.pyrzak@gmail.com> + # Reed Loden <reed@reedloden.com> #%] [% PROCESS global/variables.none.tmpl %] @@ -149,13 +150,9 @@ value="[% dontchange FILTER html %]" size="6"> </td> - <th><label for="deadline">Deadline (YYYY-MM-DD):</label></th> - <td> - <input id="deadline" - name="deadline" - value="[% dontchange FILTER html %]" - size="10"> - </td> + [% PROCESS bug/field.html.tmpl + field = bug_fields.deadline, value = dontchange + editable = 1, allow_dont_change = 1 %] </tr> <tr> <th><label for="remaining_time">Remaining Hours:</label></th> @@ -177,7 +174,7 @@ id => "assigned_to" name => "assigned_to" value => dontchange - size => 32 + size => 40 %] <input type="checkbox" id="set_default_assignee" name="set_default_assignee" value="1"> <label for="set_default_assignee">Reset Assignee to default</label> @@ -192,7 +189,7 @@ id => "qa_contact" name => "qa_contact" value => dontchange - size => 32 + size => 40 %] <input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1"> <label for="set_default_qa_contact">Reset QA Contact to default</label> @@ -204,7 +201,13 @@ <th><label for="masscc">CC List:</label></th> <td colspan="3"> - <input id="masscc" name="masscc" size="32"> + [% INCLUDE global/userselect.html.tmpl + id => "masscc" + name => "masscc" + value => "" + size => 40 + multiple => 5 + %] <select name="ccaction"> <option value="add">Add these to the CC List</option> <option value="remove">Remove these from the CC List</option> @@ -216,17 +219,19 @@ [% IF use_keywords %] <tr> - <th> - <label for="keywords"> - <a href="describekeywords.cgi">Keywords</a>: - </label> - </th> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.keywords, editable = 1 + desc_url = "describekeywords.cgi" + %] <td colspan="3"> - <input id="keywords" name="keywords" size="32"> + [% INCLUDE bug/field.html.tmpl + field = bug_fields.keywords, editable = 1, value = keywords + no_tds = 1 + %] <select name="keywordaction"> <option value="add">Add these keywords</option> - <option value="delete">Delete these keywords</option> - <option value="makeexact">Make the keywords be exactly this list</option> + <option value="remove">Delete these keywords</option> + <option value="set">Make the keywords be exactly this list</option> </select> </td> @@ -240,7 +245,7 @@ </label> </th> <td colspan="3"> - <input id="dependson" name="dependson" size="32"> + <input id="dependson" name="dependson" size="40"> <select name="dependson_action"> <option value="add">Add these IDs</option> <option value="remove">Delete these IDs</option> @@ -255,7 +260,7 @@ </label> </th> <td colspan="3"> - <input id="blocked" name="blocked" size="32"> + <input id="blocked" name="blocked" size="40"> <select name="blocked_action"> <option value="add">Add these IDs</option> <option value="remove">Delete these IDs</option> @@ -276,6 +281,8 @@ [% END %] [% USE Bugzilla %] + [%# Show all legal values and all fields, ignoring visibility controls. %] + [% bug = 0 %] [% FOREACH field = Bugzilla.active_custom_fields %] <tr> [% PROCESS bug/field.html.tmpl value = dontchange @@ -290,7 +297,7 @@ <b><label for="comment">Additional Comments:</label></b> [% IF user.is_insider %] - <input type="checkbox" name="commentprivacy" value="1" + <input type="checkbox" name="comment_is_private" value="1" id="newcommentprivacy" onClick="updateCommentTagControl(this, form)"/> <label for="newcommentprivacy"> @@ -311,10 +318,18 @@ [% IF groups.size > 0 %] + <script type="text/javascript"> + function turn_off(myself, id) { + var other_checkbox = document.getElementById(id); + if (myself.checked && other_checkbox) { + other_checkbox.checked = false; + } + } + </script> + <b>Groups:</b><br> <table border="1"> <tr> - <th>Don't<br>change<br>this group<br>restriction</th> <th>Remove<br>[% terms.bugs %]<br>from this<br>group</th> <th>Add<br>[% terms.bugs %]<br>to this<br>group</th> <th>Group Name:</th> @@ -323,14 +338,17 @@ [% FOREACH group = groups %] <tr> <td align="center"> - <input type="radio" name="bit-[% group.id %]" value="-1" checked="checked"> - </td> - <td align="center"> - <input type="radio" name="bit-[% group.id %]" value="0"> + <input type="checkbox" name="defined_groups" + id="defined_group_[% group.id %]" + value="[% group.name FILTER html %]" + onchange="turn_off(this, 'group_[% group.id %]')"> </td> [% IF group.is_active %] <td align="center"> - <input type="radio" name="bit-[% group.id %]" value="1"> + <input type="checkbox" name="groups" + id="group_[% group.id FILTER html %]" + value="[% group.name FILTER html %]" + onchange="turn_off(this, 'defined_group_[% group.id %]')"> </td> [% ELSE %] <td> </td> @@ -353,11 +371,10 @@ [% END %] [% END %] -<input type="submit" id="commit" value="Commit"> -[% IF Param('move-enabled') && user.is_mover %] - <input type="submit" name="action" id="action" value="[% Param('move-button-text') %]"> -[% END %] +[%+ Hook.process('after_groups') %] + +<input type="submit" id="commit" value="Commit"> [%############################################################################%] [%# Select Menu Block #%] diff --git a/template/en/default/list/list-simple.html.tmpl b/template/en/default/list/list-simple.html.tmpl index 125a164..f4c3549 100644 --- a/template/en/default/list/list-simple.html.tmpl +++ b/template/en/default/list/list-simple.html.tmpl @@ -39,7 +39,8 @@ <head> <title>[% title FILTER html %]</title> <base href="[% urlbase FILTER html %]"> - <link href="skins/standard/buglist.css" rel="stylesheet" type="text/css"> + <link href="[% 'skins/standard/buglist.css' FILTER mtime %]" + rel="stylesheet" type="text/css"> </head> <body> diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl index 941b34a..8d87b5c 100644 --- a/template/en/default/list/list.html.tmpl +++ b/template/en/default/list/list.html.tmpl @@ -46,8 +46,9 @@ title = title style = style atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom" - javascript_urls = [ "js/util.js", "js/field.js", "js/yui/calendar.js" ] - style_urls = [ "skins/standard/buglist.css", "skins/standard/yui/calendar.css" ] + yui = [ 'autocomplete', 'calendar' ] + javascript_urls = [ "js/util.js", "js/field.js" ] + style_urls = [ "skins/standard/buglist.css" ] doc_section = "query.html#list" %] @@ -252,6 +253,7 @@ 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" value="[% defaultsavename FILTER html %]"> </form> diff --git a/template/en/default/list/list.ics.tmpl b/template/en/default/list/list.ics.tmpl index 3f9e2b8..b135267 100644 --- a/template/en/default/list/list.ics.tmpl +++ b/template/en/default/list/list.ics.tmpl @@ -82,7 +82,7 @@ END:VCALENDAR [% END %] [% END %] [% IF NOT status %] - [% IF bug_status == 'ASSIGNED' %] + [% IF bug_status == 'IN_PROGRESS' || bug_status == 'ASSIGNED' %] [% status = 'IN-PROGRESS' %] [% ELSE %] [% status = 'NEEDS-ACTION' %] diff --git a/template/en/default/list/list.rdf.tmpl b/template/en/default/list/list.rdf.tmpl index 99c06c1..d7879a6 100644 --- a/template/en/default/list/list.rdf.tmpl +++ b/template/en/default/list/list.rdf.tmpl @@ -38,7 +38,7 @@ <bz:id nc:parseType="Integer">[% bug.bug_id %]</bz:id> [% FOREACH column = displaycolumns %] - <bz:[% column %][% ' nc:parseType="Integer"' IF column == "votes" %]>[% bug.$column FILTER html %]</bz:[% column %]> + <bz:[% column %]>[% bug.$column FILTER html %]</bz:[% column %]> [% END %] </bz:bug> diff --git a/template/en/default/list/quips.html.tmpl b/template/en/default/list/quips.html.tmpl index 1404b2e..b330596 100644 --- a/template/en/default/list/quips.html.tmpl +++ b/template/en/default/list/quips.html.tmpl @@ -73,6 +73,8 @@ <form method="post" action="quips.cgi"> <input type="hidden" name="action" value="add"> + <input type="hidden" name="token" + value="[% issue_hash_token(['create-quips']) FILTER html %]"> <input size="80" name="quip"> <p> <input type="submit" id="add" value="Add This Quip"> @@ -103,6 +105,8 @@ </p> <form name="editform" method="post" action="quips.cgi"> <input type="hidden" name="action" value="approve"> + <input type="hidden" name="token" + value="[% issue_hash_token(['approve-quips']) FILTER html %]"> <table border="1"> <thead><tr> <th>Quip</th> @@ -119,7 +123,8 @@ [% "Unknown" IF NOT users.$userid %] </td> <td> - <a href="quips.cgi?action=delete&quipid=[% quipid FILTER url_quote %]"> + <a href="quips.cgi?action=delete&quipid=[% quipid FILTER url_quote %]&token= + [%- issue_hash_token(['quips', quipid]) FILTER url_quote %]"> Delete </a> </td> diff --git a/template/en/default/list/table.html.tmpl b/template/en/default/list/table.html.tmpl index 282ea51..88fae24 100644 --- a/template/en/default/list/table.html.tmpl +++ b/template/en/default/list/table.html.tmpl @@ -45,7 +45,7 @@ [% abbrev = { "bug_severity" => { maxlength => 3 , title => "Sev" } , - "priority" => { maxlength => 3 , title => "Pri" } , + "priority" => { maxlength => 7 , title => "Pri" } , "rep_platform" => { maxlength => 3 , title => "Plt" } , "bug_status" => { maxlength => 4 } , "assigned_to" => { maxlength => 30 , ellipsis => "..." } , @@ -64,6 +64,7 @@ "product" => { maxlength => 8 } , "version" => { maxlength => 5 , title => "Vers" } , "op_sys" => { maxlength => 4 } , + "bug_file_loc" => { maxlength => 30 } , "target_milestone" => { title => "TargetM" } , "percentage_complete" => { format_value => "%d %%" } , } @@ -71,6 +72,8 @@ [% PROCESS bug/time.html.tmpl %] +[% Hook.process("before_table") %] + [%############################################################################%] [%# Table Header #%] [%############################################################################%] @@ -162,14 +165,12 @@ [%# Bug Table #%] [%############################################################################%] -[% Hook.process("before_table") %] - [% tableheader %] [% FOREACH bug = bugs %] [% count = loop.count() %] - <tr class="bz_bugitem + <tr id="b[% bug.bug_id %]" class="bz_bugitem bz_[% bug.bug_severity FILTER css_class_quote -%] bz_[% bug.priority FILTER css_class_quote -%] bz_[% bug.bug_status FILTER css_class_quote -%] @@ -185,8 +186,7 @@ </td> [% END %] <td class="first-child bz_id_column"> - <a name="b[% bug.bug_id %]" - href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a> + <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a> <span style="display: none">[%+ '[SEC]' IF bug.secure_mode %]</span> </td> @@ -207,7 +207,10 @@ [% SET login_column = column.remove('_realname$') %] [% bug.${login_column}.truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html %] - + [% ELSIF column == 'short_desc' || column == "short_short_desc" %] + <a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]"> + [%- bug.$column.truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%] + </a> [% ELSE %] [%- display_value(column, bug.$column).truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%] [% END %] diff --git a/template/en/default/pages/fields.html.tmpl b/template/en/default/pages/fields.html.tmpl index 282b7b6..e68b157 100644 --- a/template/en/default/pages/fields.html.tmpl +++ b/template/en/default/pages/fields.html.tmpl @@ -20,128 +20,111 @@ #%] [% PROCESS "global/field-descs.none.tmpl" %] -[% INCLUDE global/header.html.tmpl title = "A $terms.Bug's Life Cycle" %] +[% PROCESS global/header.html.tmpl + title = "$terms.Bug Fields" + style_urls = ['skins/standard/page.css'] +%] -<p> -The <b>status</b> and <b>resolution</b> fields define and track the life -cycle of [% terms.abug %]. -</p> +<p>This page describes the various fields that you see + on [% terms.abug %].</p> -<a name="status"></a> -<a name="resolution"></a> - -<table border="1" cellpadding="4"> - <tr align="center" valign="top"> - <td width="50%"> - <h1>STATUS</h1> +<table class="field_value_explanation"> + <thead> + <tr> + <td id="bug_status"> + <h2>[% field_descs.bug_status FILTER upper FILTER html %]</h2> </td> - <td> - <h1>RESOLUTION</h1> + <td id="resolution"> + <h2>[% field_descs.resolution FILTER upper FILTER html %]</h2> </td> </tr> - <tr valign="top"> - <td>The <b>status</b> field indicates the general health of a - [% terms.bug %]. Only certain status transitions are allowed.</td> + <tr> + <td>The [% field_descs.bug_status FILTER html %] field indicates the + current state of a [% terms.bug %]. Only certain status transitions + are allowed.</td> - <td>The <b>resolution</b> field indicates what happened to this - [%+ terms.bug %].</td> + <td>The [% field_descs.resolution FILTER html %] field indicates what + happened to this [%+ terms.bug %].</td> </tr> + </thead> - <tr valign="top"> + <tbody> + <tr class="header_row"> + <td colspan="2">Open [% terms.Bugs %]</td> + </tr> + <tr> <td> <dl> <dt> - <b>[% display_value("bug_status", "UNCONFIRMED") FILTER html %]</b> + [% display_value("bug_status", "UNCONFIRMED") FILTER html %] </dt> <dd> This [% terms.bug %] has recently been added to the database. - Nobody has validated that this [% terms.bug %] is true. Users + Nobody has confirmed that this [% terms.bug %] is valid. Users who have the "canconfirm" permission set may confirm - this [% terms.bug %], changing its state to [% display_value("bug_status", "NEW") FILTER html %]. Or, it may be - directly resolved and marked [% display_value("bug_status", "RESOLVED") FILTER html %]. - </dd> - - <dt> - <b>[% display_value("bug_status", "NEW") FILTER html %]</b> - </dt> - <dd> - This [% terms.bug %] has recently been added to the assignee's - list of [% terms.bugs %] and must be processed. [% terms.Bugs %] in - this state may be accepted, and become <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b>, passed - on to someone else, and remain <b>[% display_value("bug_status", "NEW") FILTER html %]</b>, or resolved and marked + this [% terms.bug %], changing its state to + <b>[% display_value("bug_status", "CONFIRMED") FILTER html %]</b>. + Or, it may be directly resolved and marked <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>. </dd> <dt> - <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b> + [% display_value("bug_status", "CONFIRMED") FILTER html %] </dt> <dd> - This [% terms.bug %] is not yet resolved, but is assigned to the - proper person. From here [% terms.bugs %] can be given to another - person and become <b>[% display_value("bug_status", "NEW") FILTER html %]</b>, or - resolved and become <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>. + This [% terms.bug %] is valid and has recently been filed. + [%+ terms.Bugs %] in this state become + <b>[% display_value("bug_status", "IN_PROGRESS") FILTER html %]</b> + when somebody is working on them, or become resolved and marked + <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>. </dd> <dt> - <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b> + [% display_value("bug_status", "IN_PROGRESS") FILTER html %] </dt> <dd> - This [% terms.bug %] was once resolved, but the resolution was - deemed incorrect. For example, a <b>[% display_value("resolution", "WORKSFORME") FILTER html %]</b> [% terms.bug %] is - <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b> when more information shows up and - the [% terms.bug %] is now reproducible. From here [% terms.bugs %] are - either marked <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b> or + This [% terms.bug %] is not yet resolved, but is assigned to the + proper person who is working on the [% terms.bug %]. From here, + [%+ terms.bugs %] can be given to another person and become + <b>[% display_value("bug_status", "CONFIRMED") FILTER html %]</b>, or + resolved and become <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>. </dd> </dl> </td> <td> - <dl> - <dd> - No resolution yet. All [% terms.bugs %] which are in one of - these "open" states have the resolution set to blank. All - other [% terms.bugs %] will be marked with one of the following - resolutions. - </dd> - </dl> + No resolution yet. All [% terms.bugs %] which are in one of + these "open" states have no resolution set. </td> </tr> - <tr valign="top"> + <tr class="header_row"> + <td colspan="2">Closed [% terms.Bugs %]</td> + </tr> + + <tr> <td> <dl> <dt> - <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b> + [% display_value("bug_status", "RESOLVED") FILTER html %] </dt> <dd> - A resolution has been taken, and it is awaiting verification by - QA. From here [% terms.bugs %] are either re-opened and become - <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b>, are marked - <b>[% display_value("bug_status", "VERIFIED") FILTER html %]</b>, or are closed for - good and marked <b>[% display_value("bug_status", "CLOSED") FILTER html %]</b>. + A resolution has been performed, and it is awaiting verification by + QA. From here [% terms.bugs %] are either reopened and given some + open status, or are verified by QA and marked + <b>[% display_value("bug_status", "VERIFIED") FILTER html %]</b>. </dd> <dt> - <b>[% display_value("bug_status", "VERIFIED") FILTER html %]</b> + [% display_value("bug_status", "VERIFIED") FILTER html %] </dt> <dd> - QA has looked at the [% terms.bug %] and the resolution and - agrees that the appropriate resolution has been taken. [% terms.Bugs %] remain - in this state until the product they were reported - against actually ships, at which point they become - <b>[% display_value("bug_status", "CLOSED") FILTER html %]</b>. - </dd> - - <dt> - <b>[% display_value("bug_status", "CLOSED") FILTER html %]</b> - </dt> - <dd> - The [% terms.bug %] is considered dead, the resolution is correct. - Any zombie [% terms.bugs %] who choose to walk the earth again must - do so by becoming <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b>. + QA has looked at the [% terms.bug %] and the resolution and + agrees that the appropriate resolution has been taken. This is + the final status for [% terms.bugs %]. </dd> </dl> </td> @@ -149,7 +132,7 @@ cycle of [% terms.abug %]. <td> <dl> <dt> - <b>[% display_value("resolution", "FIXED") FILTER html %]</b> + [% display_value("resolution", "FIXED") FILTER html %] </dt> <dd> A fix for this [% terms.bug %] is checked into the tree and @@ -157,14 +140,14 @@ cycle of [% terms.abug %]. </dd> <dt> - <b>[% display_value("resolution", "INVALID") FILTER html %]</b> + [% display_value("resolution", "INVALID") FILTER html %] </dt> <dd> The problem described is not [% terms.abug %]. </dd> <dt> - <b>[% display_value("resolution", "WONTFIX") FILTER html %]</b> + [% display_value("resolution", "WONTFIX") FILTER html %] </dt> <dd> The problem described is [% terms.abug %] which will never be @@ -172,17 +155,18 @@ cycle of [% terms.abug %]. </dd> <dt> - <b>[% display_value("resolution", "DUPLICATE") FILTER html %]</b> + [% display_value("resolution", "DUPLICATE") FILTER html %] </dt> <dd> The problem is a duplicate of an existing [% terms.bug %]. - Marking [% terms.abug %] duplicate requires the [% terms.bug %]# - of the duplicating [% terms.bug %] and will at least put - that [% terms.bug %] number in the description field. + When [% terms.abug %] is marked as a + <b>[% display_value("resolution", "DUPLICATE") FILTER html %]</b>, + you will see which [% terms.bug %] it is a duplicate of, + next to the resolution. </dd> <dt> - <b>[% display_value("resolution", "WORKSFORME") FILTER html %]</b> + [% display_value("resolution", "WORKSFORME") FILTER html %] </dt> <dd> All attempts at reproducing this [% terms.bug %] were futile, @@ -190,142 +174,59 @@ cycle of [% terms.abug %]. behavior would occur. If more information appears later, the [% terms.bug %] can be reopened. </dd> - - <dt> - <b>[% display_value("resolution", "MOVED") FILTER html %]</b> - </dt> - <dd> - The problem was specific to a related product - whose [% terms.bugs %] are tracked in - another [% terms.bug %] database. - The [% terms.bug %] has been moved to that database. - </dd> </dl> </td> </tr> + </tbody> </table> -<h2><a name="importance">Importance</a></h2> -The importance of [% terms.abug %] is described as the combination of -its <a href="#priority">priority</a> and <a href="#bug_severity">severity</a>, -as described below. - -<h2><a name="priority">Priority</a></h2> -This field describes the importance and order in which [% terms.abug %] -should be fixed compared to other [% terms.bugs %]. This field is utilized -by the programmers/engineers to prioritize their work to be done. - -<h2><a name="bug_severity">Severity</a></h2> -This field describes the impact of [% terms.abug %]. - -<table> - <tr> - <th>[% display_value("bug_severity", "blocker") FILTER html %]</th> - - <td>Blocks development and/or testing work</td> - </tr> - - <tr> - <th>[% display_value("bug_severity", "critical") FILTER html %]</th> - - <td>crashes, loss of data, severe memory leak</td> - </tr> - - <tr> - <th>[% display_value("bug_severity", "major") FILTER html %]</th> - - <td>major loss of function</td> - </tr> - - <tr> - <th>[% display_value("bug_severity", "normal") FILTER html %]</th> - - <td>regular issue, some loss of functionality under specific circumstances</td> - </tr> - - - <tr> - <th>[% display_value("bug_severity", "minor") FILTER html %]</th> - - <td>minor loss of function, or other problem where easy - workaround is present</td> - </tr> - - <tr> - <th>[% display_value("bug_severity", "trivial") FILTER html %]</th> - - <td>cosmetic problem like misspelled words or misaligned - text</td> - </tr> - - <tr> - <th>[% display_value("bug_severity", "enhancement") FILTER html %]</th> - - <td>Request for enhancement</td> -</table> - -<h2><a name="rep_platform">Platform</a></h2> -This is the hardware platform against which the [% terms.bug %] was -reported. Legal platforms include: - -<ul> - <li>[% display_value("rep_platform", "All") FILTER html %] (happens on all platforms; cross-platform [% terms.bug %])</li> - - <li>[% display_value("rep_platform", "Macintosh") FILTER html %]</li> - - <li>[% display_value("rep_platform", "PC") FILTER html %]</li> -</ul> -<b>Note:</b> When searching, selecting the option -<em>[% display_value("rep_platform", "All") FILTER html %]</em> does not -select [% terms.bugs %] -assigned against any platform. It merely selects [% terms.bugs %] that are -marked as occurring on all platforms, i.e. are designated -<em>[% display_value("rep_platform", "All") FILTER html %]</em>. - -<h2><a name="op_sys">Operating System</a></h2> -This is the operating system against which the [% terms.bug %] was -reported. Legal operating systems include: +<h2>Other Fields</h2> -<ul> - <li>[% display_value("op_sys", "All") FILTER html %] (happens on all operating systems; cross-platform - [% terms.bug %])</li> - - <li>Windows</li> - - <li>Mac OS</li> - - <li>Linux</li> -</ul> -Sometimes the operating system implies the platform, but not -always. For example, Linux can run on PC and Macintosh and -others. - -<h2><a name="assigned_to">Assigned To</a></h2> - -<p> -This is the person in charge of resolving the [% terms.bug %]. Every time -this field changes, the status changes to <b>[% display_value("bug_status", "NEW") FILTER html %]</b> to make it -easy to see which new [% terms.bugs %] have appeared on a person's list.</p> - -<p> -The default status for queries is set to [% display_value("bug_status", "NEW") FILTER html %], -[%+ display_value("bug_status", "ASSIGNED") FILTER html %] and [% display_value("bug_status", "REOPENED") FILTER html %]. -When searching for [% terms.bugs %] that have been resolved or -verified, remember to set the status field appropriately. -</p> - -[% IF Param("use_see_also") %] - <h2><a name="see_also"></a>See Also</h2> - - <p>This allows you to refer to [% terms.bugs %] in other installations. - You can enter a URL to a [%+ terms.bug %] in the "Add [% terms.Bug %] URLs" - field to note that that [% terms.bug %] is related to this one. You can - enter multiple URLs at once by separating them with a comma.</p> +[% SET field_help_map = {} %] +[% FOREACH field = bug_fields.keys %] + [% SET field_desc = field_descs.$field %] + [% field_help_map.$field_desc = { help => help_html.$field, + field => field } %] +[% END %] - <p>You should normally use this field to refer to [% terms.bugs %] in - <em>other</em> installations. For [% terms.bugs %] in this - installation, it is better to use the "Depends On" and "Blocks" - fields.</p> +[%# These are fields that don't need to be documented, either because + # they have docs somewhere else in the UI, or they don't show up on bugs. + # %] +[% SET skip_fields = [ + 'days_elapsed', + 'everconfirmed', + 'reporter_accessible', + 'cclist_accessible', + 'bug_group', + 'commenter', + 'owner_idle_time', + 'bug_status', + 'resolution', +] %] + +<dl class="field_descriptions"> +[% FOREACH field_desc = field_help_map.keys.sort %] + [% SET field = field_help_map.${field_desc}.field %] + [% SET field_object = bug_fields.$field %] + + [% NEXT IF field_object.obsolete %] + [% NEXT IF !user.is_timetracker AND field_object.is_timetracking %] + + [% NEXT IF field == 'status_whiteboard' AND !Param('usestatuswhiteboard') %] + [% NEXT IF field == 'target_milestone' AND !Param('usetargetmilestone') %] + [% NEXT IF field == 'alias' AND !Param('usebugaliases') %] + + [%# For now we don't have help for attachment fields and so on. %] + [% NEXT IF field.match('\.') %] + + [% NEXT IF skip_fields.contains(field) %] + + <dt id="[% field FILTER html %]">[% field_desc FILTER html %]</dt> + <dd> + [% SET help_text = field_help_map.${field_desc}.help %] + [% help_text FILTER none %] + </dd> [% END %] +</dl> -[% INCLUDE global/footer.html.tmpl %] +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/pages/quicksearch.html.tmpl b/template/en/default/pages/quicksearch.html.tmpl index 1f2d21b..e6398ea 100644 --- a/template/en/default/pages/quicksearch.html.tmpl +++ b/template/en/default/pages/quicksearch.html.tmpl @@ -92,13 +92,13 @@ <p>You may also want to read up on the <a href="#advanced">Advanced Features</a>.</p> -<h2><a name="fields"></a>Fields You Can Search On</h2> +<h2 id="fields">Fields You Can Search On</h2> <p>You can specify any of these fields like <kbd>field:value</kbd> in the search box, to search on them. You can also abbreviate the field name, as long as your abbreviation matches only one field name. - So, for example, searching on <kbd>stat:NEW</kbd> will find all - [%+ terms.bugs %] in the <kbd>NEW</kbd> status. Some fields have + So, for example, searching on <kbd>stat:VERIFIED</kbd> will find all + [%+ terms.bugs %] in the <kbd>VERIFIED</kbd> status. Some fields have multiple names, and you can use any of those names to search for them.</p> [% IF Bugzilla.active_custom_fields.size %] @@ -143,7 +143,7 @@ </tbody> </table> -<h2><a name="advanced"></a>Advanced Features</h2> +<h2 id="advanced">Advanced Features</h2> <ul class="qs_help"> <li>If you want to search for a <strong>phrase</strong> or something that @@ -189,7 +189,7 @@ </li> </ul> -<h2><a name="shortcuts"></a>Advanced Shortcuts</h2> +<h2 id="shortcuts">Advanced Shortcuts</h2> <p>In addition to using <a href="#fields">field names</a> to search specific fields, there are certain characters or words that you can @@ -228,7 +228,7 @@ <td class="field_nickname">"<strong>P1</strong>" (as a word anywhere in the search) means "find [% terms.bugs %] with the highest priority. "P2" means the second-highest priority, and so on. - <p>Searching for "<strong>P1-P3</strong>" will find [% terms.bugs %] in + <p>Searching for "<strong>P1-3</strong>" will find [% terms.bugs %] in any of the three highest priorities, and so on.</p> </td> </tr> diff --git a/template/en/default/pages/release-notes.html.tmpl b/template/en/default/pages/release-notes.html.tmpl index 92357df..dda9ca5 100644 --- a/template/en/default/pages/release-notes.html.tmpl +++ b/template/en/default/pages/release-notes.html.tmpl @@ -18,12 +18,815 @@ #%] [% PROCESS global/variables.none.tmpl %] +[% SET title = "$terms.Bugzilla 4.0 Release Notes" %] [% INCLUDE global/header.html.tmpl - title = "$terms.Bugzilla 3.6 Release Notes" + title = title style_urls = ['skins/standard/page.css'] %] -<h2>Table of Contents</h2> +<h1>[% title FILTER html %]</h1> + +<ul class="bz_toc"> + <li><a href="#v40_introduction">Introduction</a></li> + <li><a href="#v40_point">Updates in this 4.0.x Release</a></li> + <li><a href="#v40_req">Minimum Requirements</a></li> + <li><a href="#v40_feat">New Features and Improvements</a></li> + <li><a href="#v40_issues">Outstanding Issues</a></li> + <li><a href="#v40_upgrading">Notes On Upgrading From a Previous Version</a></li> + <li><a href="#v40_code_changes">Code Changes Which May Affect + Customizations and Extensions</a></li> + <li><a href="#v40_previous">Release Notes for Previous Versions</a></li> +</ul> + +<h2 id="v40_introduction">Introduction</h2> + +<p>This is [% terms.Bugzilla %] 4.0! Since 3.6 (our previous major + release) we've come a long way, and we've come even further compared to + 3.0 in 2007! Since [% terms.Bugzilla %] 3.0, almost every major user + interface in [% terms.Bugzilla %] has been redesigned, the WebServices have + evolved enormously, there's a great new Extensions system, and there + are hundreds of other new features. With the major redesigns that come + particularly in this release compared to 3.6, we felt that it was time to + call this release 4.0.</p> + +<p>It's not just major WebService and UI enhancements that are new in + [%+ terms.Bugzilla %] 4.0—there are many other exciting new features, + including automatic duplicate detection, enhanced custom field + functionality, autocomplete for users, search improvements, and much + more. Overall, 4.0 is far and away the best version of [% terms.Bugzilla %] + we've ever released.</p> + +<p>If you're upgrading, make sure to read <a href="#v40_upgrading">Notes + On Upgrading From a Previous Version</a>. If you are upgrading from a release + before 3.6, make sure to read the release notes for all the + <a href="#v40_previous">previous versions</a> in between your version + and this one, <strong>particularly the Upgrading section of each + version's release notes</strong>.</p> + +<p>We would like to thank + <a href="http://www.itasoftware.com/">ITA Software</a>, + the <a href="http://www.ibm.com/linux/ltc/">IBM Linux Technology Center</a>, + and <a href="http://www.redhat.com/">Red Hat</a> for funding the development + of certain features and improvements in this release of + [%+ terms.Bugzilla %].</p> + +<h2 id="v40_point">Updates in this 4.0.x Release</h2> + +<h3>4.0.3</h3> + +<p>This release fixes two security issues. See the + <a href="http://www.bugzilla.org/security/3.4.12/">Security Advisory</a> + for details.</p> + +<p>In addition, the following important fixes/changes have been made in this + release:</p> + +<ul> + <li>It was impossible to install or upgrade [% terms.Bugzilla %] if <kdb>DBD::Pg</kdb> + is installed and your Perl installation has <kdb>version.pm</kdb> 0.92 or newer, + due to an incompatible change made in <kdb>version.pm</kdb> 0.92. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=678772">[% terms.Bug %] 678772</a>)</li> + <li>When reporting a new [% terms.bug %] using the Guided Form, groups configured + to be selected by default were ignored and the [% terms.bug %] was left publicly + visible, unless some mandatory groups applied. Now default groups are correctly + taken into account, and the [% terms.bug %] will be restricted to these groups. + New [% terms.bugs %] reported using the standard form are not affected by this + issue. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=460074">[% terms.Bug %] 460074</a>)</li> + <li>A new parameter named 'ajax_user_autocompletion' has been added to allow + administrators to disable auto-completion when typing characters in user fields. + This parameter should only be disabled if your installation is unable to support + the load generated by this feature. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=685552">[% terms.Bug %] 685552</a>)</li> + <li>Account lockout notifications were not sent to the maintainer of the [% terms.Bugzilla %] + installation. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=707594">[% terms.Bug %] 707594</a>)</li> + <li>Duplicate [% terms.bug %] detection, simple searches and quicksearches did not + work when using Oracle as the database. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=654496">[% terms.Bug %] 654496</a> + and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=582209">[% terms.bug %] 582209</a>)</li> + <li>If a product has no components defined, selecting a product in the Advanced Search + page was displaying the wrong list of components. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=622487">[% terms.Bug %] 622487</a>)</li> + <li>Custom field values whose visibility depends on another field value did not + remain selected after editing [% terms.abug %]. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=707428">[% terms.Bug %] 707428</a>)</li> + <li><kdb>importxml.pl</kdb> was unable to import [% terms.bugs %] anymore + (regressed in 4.0.1). + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=691845">[% terms.Bug %] 691845</a>)</li> + <li><kdb>migrate.pl</kdb> was unable to run (regressed in 4.0). + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=682203">[% terms.Bug %] 682203</a>)</li> + <li><kdb>whine.pl</kdb> was failing to execute if a saved search threw an error. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=277073">[% terms.Bug %] 277073</a>)</li> + <li>Emails sent by <kdb>whine.pl</kdb> had the address of the assignee either + truncated or missing completely (regressed in 3.4). The full email address + is now properly displayed. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=550299">[% terms.Bug %] 550299</a>)</li> +</ul> + +<h3>4.0.2</h3> + +<p>This release fixes several security issues. See the + <a href="http://www.bugzilla.org/security/3.4.11/">Security Advisory</a> + for details.</p> + +<p>In addition, the following important fixes/changes have been made in this + release:</p> + +<ul> + <li>The <kdb>B[% %]ug.create</kdb> WebService method now throws an error if you + pass a group name which doesn't exist. In [% terms.Bugzilla %] 4.0 and 4.0.1, + this group name was silently ignored, leaving your [% terms.bug %] unsecure + if no other group applied. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=653341">[% terms.Bug %] 653341</a>)</li> + <li>Moving several [% terms.bugs %] at once into another product displayed the + same confirmation page again and again, and changes were never committed + (regressed in 4.0). + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=663208">[% terms.Bug %] 663208</a>)</li> + <li>Marking [% terms.abug %] as a duplicate now works in Internet Explorer 9. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=656769">[% terms.Bug %] 656769</a>)</li> + <li><kdb>importxml.pl</kdb> no longer crashes when importing keywords (regressed + in 4.0). + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=657707">[% terms.Bug %] 657707</a>)</li> + <li>Data entered while reporting a new [% terms.bug %] could be lost if you had + to click the "Back" button of your web browser. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=652427">[% terms.Bug %] 652427</a>)</li> + <li>WebServices methods will return undefined [% terms.bug %] fields as undefined + instead of as an empty string. This change is consistent with how + [%+ terms.Bugzilla %] 4.2 behaves. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=657561">[% terms.Bug %] 657561</a>)</li> + <li>The XML-RPC interface now works with SOAP::Lite 0.711 and 0.712 under mod_perl. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=600810">[% terms.Bug %] 600810</a>)</li> + <li>LWP 6.00 and newer require Perl 5.8.8 and above. When installing this module + using <kdb>install-module.pl</kdb> on a Perl installation older than 5.8.8, + LWP 5.837 will be installed instead. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=655912">[% terms.Bug %] 655912</a>)</li> + <li>Viewing [% terms.abug %] report should be significantly faster when your + installation has many custom fields. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=634812">[% terms.Bug %] 634812</a>)</li> +</ul> + +<h3>4.0.1</h3> + +<ul> + <li>During installation, the CPAN module Math::Random::Secure would + sometimes fail to install properly and give an error about + <kbd>Math::Random::Secure::irand</kbd>. Now, when using + <kbd>install-module.pl</kbd> to install Math::Random::Secure, this + will no longer happen. If you are currently experiencing this b[% %]ug + and it prevented you from installing 4.0, remove Math::Random::Secure + from your <kbd>lib/</kbd> directory, like: + <p><kbd>rm -rf lib/Math/Random/Secure*</kbd></p> + <p>(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=646578">[% terms.Bug %] 646578</a>)</p></li> + <li>The "Remember values as bookmarkable template" button on the + [%+ terms.bug %] entry page will now work even when some required fields + are empty. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=640719">[% terms.Bug %] 640719</a>)</li> + <li>Email notifications about dependencies and flags had the wrong + timestamp. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=643910">[% terms.Bug %] 643910</a> + and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=652165">[% terms.bug %] 652165</a>)</li> + <li>You can now select "UTC" as a valid timezone in General Preferences. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=646209">[% terms.Bug %] 646209</a>)</li> + <li>Automatic duplicate detection now works on PostgreSQL (although + it is not as high-quality as on other DB platforms). + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=634144">[% terms.Bug %] 634144</a>)</li> + <li>Autcomplete for users now works even if you are using the + "emailsuffix" option. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=641519">[% terms.Bug %] 641519</a>)</li> + <li>Javascript errors during series creation in New Charts have been + fixed. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=644285">[% terms.Bug %] 644285</a>)</li> + <li>The "Show Votes" page now works, for installations using the Voting + extension. + (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=652381">[% terms.Bug %] 652381</a>)</li> +</ul> + +<h2 id="v40_req">Minimum Requirements</h2> + +<p>Any requirements that are new since 3.6.3 will look like + <span class="req_new">this</span>.</p> + +<ul> + <li><a href="#v40_req_perl">Perl</a></li> + <li><a href="#v40_req_mysql">For MySQL Users</a></li> + <li><a href="#v40_req_pg">For PostgreSQL Users</a></li> + <li><a href="#v40_req_oracle">For Oracle Users</a></li> + <li><a href="#v40_req_modules">Required Perl Modules</a></li> + <li><a href="#v40_req_optional_mod">Optional Perl Modules</a></li> + <li><a href="#v40_req_apache">Optional Apache Modules</a></li> +</ul> + + +<h3 id="v40_req_perl">Perl</h3> + +<p>Perl v5.8.1</p> + +[% INCLUDE db_req db='mysql' %] + +[% INCLUDE db_req db='pg' %] + +[% INCLUDE db_req db='oracle' %] + +<h3 id="v40_req_modules">Required Perl Modules</h3> + +[% INCLUDE req_table reqs = REQUIRED_MODULES + new = ['List-MoreUtils'] + updated = ['Email-MIME', 'CGI.pm', 'Apache-SizeLimit'] %] + +<h3 id="v40_req_optional_mod">Optional Perl Modules</h3> + +<p>The following perl modules, if installed, enable various + features of [% terms.Bugzilla %]:</p> + +[% INCLUDE req_table reqs = OPTIONAL_MODULES + new = ['JSON-XS', 'Win32-API', 'Math-Random-Secure'] + updated = ['Apache-SizeLimit', 'SOAP-Lite'] + include_feature = 1 %] + +<h3 id="v40_req_apache">Optional Apache Modules</h3> + +<p>If you are using Apache as your webserver, [% terms.Bugzilla %] can + now take advantage of some Apache features if you have the below Apache + modules installed and enabled. Currently, + <a href="#v40_feat_js_css_update">certain [% terms.Bugzilla %] features</a> + are enabled only if you have all of the following modules installed + and enabled:</p> + +<ul> + <li>mod_headers</li> + <li>mod_expires</li> + <li>mod_env</li> +</ul> + +<p>On most systems (but not on Windows), <kbd>checksetup.pl</kbd> is able to + tell whether or not you have these modules installed, and it will tell + you.</p> + +<h2 id="v40_feat">New Features and Improvements</h2> + +<ul> + <li><a href="#v40_feat_dup">Automatic Duplicate Detection When Filing + [%+ terms.Bugs %]</a></li> + <li><a href="#v40_feat_search_ui">New Advanced Search UI</a></li> + <li><a href="#v40_feat_attach_ui">New Attachment Details UI</a></li> + <li><a href="#v40_feat_autocomplete">Autocomplete for Users and + Keywords</a></li> + <li><a href="#v40_feat_ui">General Usability Improvements</a></li> + <li><a href="#v40_feat_workflow">New Default Status Workflow</a></li> + <li><a href="#v40_feat_lists">"Last Search" Now Remembers Multiple + Searches</a></li> + <li><a href="#v40_feat_jsonp">Cross-Domain WebServices with JSONP</a></li> + <li><a href="#v40_feat_ws">Major WebService Enhancements</a></li> + <li><a href="#v40_feat_mandatory">Mandatory Custom Fields</a></li> + <li><a href="#v40_feat_vot_ext">Voting Is Now An Extension</a></li> + <li><a href="#v40_feat_js_css_update">Users Get New CSS and Javascript + Automatically</a></li> + <li><a href="#v40_feat_hooks">Many New Hooks</a></li> + <li><a href="#v40_feat_apache_config">New Apache Configuration</a></li> + <li><a href="#v40_feat_other">Other Enhancements and Changes</a></li> +</ul> + +<h3 id="v40_feat_dup">Automatic Duplicate Detection When Filing + [%+ terms.Bugs %]</h3> + +<p>When filing [% terms.abug %], as soon as you start typing in the summary + field, [% terms.Bugzilla %] will suggest possible duplicates of the + [%+ terms.bug %] you are filing.</p> + +<p>In order for this feature to work, all pre-requisites for JSON-RPC + support must be installed on your [% terms.Bugzilla %]. It will be + much faster on installations that run under mod_perl than it will + be on other installations.</p> + +<h3 id="v40_feat_search_ui">New Advanced Search UI</h3> + +<p>Thanks to the UI work of <a href="http://guy-pyrzak.blogspot.com/">Guy + Pyrzak</a>, the Advanced Search UI has been completely redesigned. + It is now much simpler, and far more approachable for new users, while + still retaining all of the features that power users are used to.</p> + +<h3 id="v40_feat_attach_ui">New Attachment Details UI</h3> + +<p>The UI used for editing attachment details has been completely + redesigned, allowing for a normally-size comment box to be used + when commenting on attachments, and allowing nearly the entire screen + width to be used when doing code reviews or editing an attachment as + a comment.</p> + +<p>Thanks to <a href="http://guy-pyrzak.blogspot.com/">Guy Pyrzak</a> for + his excellent work on this UI redesign.</p> + +<h3 id="v40_feat_autocomplete">Autocomplete for Users and Keywords</h3> + +<p>Once you type at least three characters in any field that can contain a user + (including the [% field_descs.cc FILTER html %], + [%+ field_descs.qa_contact FILTER html %], or + [%+ field_descs.assigned_to FILTER html %] fields), a list will appear + containing all of the users whose real names or usernames match what you are + typing. Your [% terms.Bugzilla %] must have all of the optional Perl + modules required for JSON-RPC support installed, though, in order for + this feature to work. Also, this feature will be <strong>much</strong> + faster on installations that run under mod_perl than it will be on + other installations.</p> + +<p>There is also a similar autocomplete for the Keywords field. The + Keywords autocomplete does not require JSON-RPC.</p> + +<h3 id="v40_feat_ui">General Usability Improvements</h3> + +<p>In addition to the enhancements listed above, there have been + <strong>many</strong> improvements made across the [% terms.Bugzilla %] + user interface. For a list of specific enhancements that were significant, + see the <a href="#v40_feat_other">Other Enhancements and Changes</a> + section.</p> + +<h3 id="v40_feat_workflow">New Default Status Workflow</h3> + +<p>For new installations of [% terms.Bugzilla %], the default set of + statuses will now be:</p> + +<ul> + <li>UNCONFIRMED</li> + <li>CONFIRMED</li> + <li>IN_PROGRESS</li> + <li>RESOLVED</li> + <li>VERIFIED</li> +</ul> + +<p>And the UNCONFIRMED status will be enabled by default in all products.</p> + +<p>On upgrade, existing installations will not be affected--you will retain + your existing status workflow. However, we strongly recommend that you + update your existing workflow to the new one, using a special tool + we've included, <kbd>contrib/convert-workflow.pl</kbd>, which you + can run after you use <kbd>checksetup.pl</kbd> to upgrade. The + <kbd>whineatnews.pl</kbd> and <kbd>bugzilla-submit</kbd> scripts + will probably not work properly if you continue to use the old workflow + (though most other parts of [% terms.Bugzilla %] will still function + normally).</p> + +<p>For more information about the workflow and our rationale for changing + it, see the + <a href="http://bugzillaupdate.wordpress.com/2010/07/06/bugzilla-4-0-has-a-new-default-status-workflow/">blog + post about it</a> and the + <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=486292">[% terms.bug %] + where the change was made</a>.</p> + +<h3 id="v40_feat_lists">"Last Search" Now Remembers Multiple Searches</h3> + +<p>At the top of every [% terms.bug %] in [% terms.Bugzilla %], there are + links that look like: "First", "Last", "Prev", "Next", and + "Show last search results". In earlier versions of [% terms.Bugzilla %], + if you did two separate searches in separate windows, these links would + only work for the <em>last</em> search you did. Now, [% terms.Bugzilla %] + will "remember" which search result you came from and give you the right + "last search results" or "next [% terms.bug %]" from <em>that</em> list, + instead of always using your most recent search.</p> + +<p>There are still some situations where [% terms.Bugzilla %] will have to + "guess" which search you are trying to navigate through, but it does its + best to get it right.</p> + +<h3 id="v40_feat_jsonp">Cross-Domain WebServices with JSONP</h3> + +<p>[% terms.Bugzilla %] now supports making WebService calls from + another domain, inside of a web browser, thanks to support for + <a href="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/">JSONP</a>. + This will allow for web "mash-ups" to use [% terms.Bugzilla %] data. + When using JSONP, you may only call functions that <em>get</em> data, + you may not call functions that <em>change</em> data.</p> + +<p>For more details, see the + <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Server/JSONRPC.html#JSONP">JSONP + section</a> of the JSON-RPC WebService documentation.</p> + +<h3 id="v40_feat_ws">Major WebService Enhancements</h3> + +<p>The WebService has been expanded considerably. The WebService should now be + able to do everything with [% terms.bugs %] that you can do via the + web interface, including updating [% terms.bugs %], adding attachments, + and getting attachment data. For specifics, see the + <a href="#v40_feat_ws_changes">WebService Changes</a> section of these + release notes.</p> + +<h3 id="v40_feat_mandatory">Mandatory Custom Fields</h3> + +<p>You can now specify that certain custom fields are "mandatory", + meaning that they must have a value when [% terms.abug %] is filed, + and they can never be empty after that.</p> + +<h3 id="v40_feat_vot_ext">Voting Is Now An Extension</h3> + +<p>All of the code for voting in [% terms.Bugzilla %] has been moved + into an extension, called "Voting", in the <kbd>extensions/Voting/</kbd> + directory. To enable it, you must remove the <kbd>disabled</kbd> file + from that directory, and run <kbd>checksetup.pl</kbd>.</p> + +<p>In a future version of [% terms.Bugzilla %], the Voting extension will + be moved outside of the [% terms.Bugzilla %] core code, so we are looking + for somebody who has an interest in the Voting system and would like to + maintain it as a separate extension. There are many enhancement requests + that have been made against the Voting system, and the best way for those + to get addressed is for somebody to step up and offer to maintain the + system outside of [% terms.Bugzilla %]'s core code.</p> + +<h3 id="v40_feat_js_css_update">Users Get New CSS and Javascript + Automatically</h3> + +<p>In past versions of [% terms.Bugzilla %], if you changed + [%+ terms.Bugzilla %]'s CSS or Javascript files, then every user of + [%+ terms.Bugzilla %] would have to clear their cache in order to get + the updated files. Now, if you are using Apache as your webserver and + you have the <a href="#v40_req_apache">optional Apache modules</a> + installed and enabled, users will automatically get every new version of + [%+ terms.Bugzilla %]'s Javascript and CSS without having to clear + their caches.</p> + +<p>This feature also gives a slight performance speedup to + [%+ terms.Bugzilla %] in some cases, and so we recommend that all + administrators install and enable the optional Apache modules if possible.</p> + +<h3 id="v40_feat_hooks">Many New Hooks</h3> + +<p>Many new code hooks have been added for use by Extensions, + in [% terms.Bugzilla %] 4.0. Now Extensions can access and modify + nearly every part of [% terms.Bugzilla %].</p> + +<h3 id="v40_feat_apache_config">New Apache Configuration</h3> + +<p>If you run [% terms.Bugzilla %] under Apache (as most people do), + you most likely require a <strong>new Apache configuration</strong> + for this version of [% terms.Bugzilla %]. See the + <a href="#v40_upgrading">Notes On Upgrading From a Previous Version</a> + section for details.</p> + +<h3 id="v40_feat_other">Other Enhancements and Changes</h3> + +<h4>Enhancements for Users</h4> + +<ul> + <li>Now, everywhere in [% terms.Bugzilla %] where you can enter a date, + there is a Calendar widget where you can select the date on a + calendar.</li> + <li>The big icons on the front page have been replaced with much nicer + icons, thanks to Jon Pink of <a href="http://www.jpink.co.uk/">J. Pink Design</a>!</li> + <li><strong>[% terms.Bugs %]:</strong> When filing [% terms.bugs %], + you will now be warned if you forgot to fill in any mandatory fields, + <em>before</em> the page is submitted.</li> + <li><strong>[% terms.Bugs %]:</strong> When filing [% terms.abug %], + you can hover your mouse over any of the field labels on the page + to get a brief description of what that field is and what its purpose + is.</li> + <li><strong>[% terms.Bugs %]:</strong> When adding Hours Worked to [% terms.abug %], + you are no longer required to comment.</li> + <li><strong>[% terms.Bugs %]:</strong> There is now a user preference + for whether the comment box appears above or below the existing + comments.</li> + <li><strong>[% terms.Bugs %]:</strong> [% terms.Bugzilla %] will now + send an email for every comment that you mark or un-mark as being + private. (Previous versions of [% terms.Bugzilla %] did not send emails + to users about this change.) The state of comments being made private + is also now stored in [% terms.abug %]'s history.</li> + <li><strong>[% terms.Bugs %]:</strong> The box to "Add [% terms.Bug %] URLs" + in the See Also field is now hidden behind an "(add)" link that you + have to click to see the box.</li> + + <li><strong>Searches:</strong> You can now properly search for field values + that have commas in their name, when using the Advanced Search form.</li> + <li><strong>Searches:</strong> The "URL" field can now be shown as a column + in search results.</li> + <li><strong>Searches:</strong> When viewing a search result, you can now + click on the Summary of the [% terms.bug %] in order to go to the + [%+ terms.bug %]-view page, in addition to being able to click on the + [%+ terms.bug %] ID.</li> + <li><strong>Searches:</strong> When doing a search using the "quicksearch" + box in the header or footer, the box will still contain what you searched + for when viewing the search results page.</li> + <li><strong>Searches:</strong> Multi-select custom fields can now be + shown as columns in the search results.</li> + <li><strong>Searches:</strong> When using the Boolean Charts (now called + "Custom Search"), if you specify both a criterion for an attachment + and a criteron for a flag, then only [% terms.bugs %] that have + attachments with that flag will be found.</li> + <li><strong>Searches:</strong> If you hover your mouse over the field labels + on the Advanced Search page, you will get a description of what that + field is.</li> + <li><strong>Searches:</strong> When searching via a saved search, if you + accidentally click on "Forget Search", there is a link to undo it.</li> + <li><strong>Searches:</strong> When using the Boolean Charts (now called + "Custom Search"), you can search for values "greater than or equal to" + or "less than or equal to" some value.</li> + + <li><strong>Flags:</strong> If you hover your mouse over the name of + a flag setter when viewing [% terms.abug %], you can see that + flag setter's full name and complete username.</li> + <li><strong>Flags:</strong> When setting a flag on [% terms.abug %], + the box for entering a requestee does not appear until you set the flag + to "?", now.</li> + <li><strong>Flags:</strong> On the "My Requests" page, [% terms.bugs %] + that are restricted to certain groups now properly have the "padlock" + icon shown next to them to indicate that they may contain confidential + information.</li> + + <li>When using the Reports interface, you can now choose many more fields + as the X, Y, or Z axis of a report, including custom fields.</li> + <li>[% terms.Bugzilla %] now prevents + Internet Explorer 8 and later from attempting to render + <kbd>text/plain</kbd> attachments as HTML.</li> + <li>If you receive a Whine mail that is empty, there will now be a brief + message explaining that your search found no results.</li> + <li>The <a href="page.cgi?id=fields.html">Field Help Page</a> now + contains a description of every single field that can be on + [%+ terms.abug %] in [% terms.Bugzilla %].</li> +</ul> + +<h4>Enhancements for Administrators and Developers</h4> + +<ul> + <li>The system for moving [% terms.bugs %] between installations has been + moved into an extension called <kbd>OldBugMove</kbd>. This system was used + by very few [% terms.Bugzilla %] installations--if you aren't certain + whether or not you are using it, you're not using it. To enable the system, + you have to remove the file <kbd>extensions/OldBugMove/disabled</kbd> + and then run <kbd>checksetup.pl</kbd>. In a future version of [% terms.Bugzilla %], + this extension may be moved outside of the core [% terms.Bugzilla %] code, + so if you are interested in maintaining it, please let us know.</li> + <li><strong>Custom Fields: </strong> "[% terms.Bug %] ID" custom fields can + now represent relationships between [% terms.bugs %], similarly to how the + [%+ field_descs.blocked FILTER html %] and + [%+ field_descs.dependson FILTER html %] fields work now.</li> + <li><strong>Custom Fields:</strong> You can now restrict the visibility + of custom fields and their values to a specific Component or + Classification.</li> + <li>The "keyword cache" has been removed. When you edit keywords, you no + longer will have to "rebuild the keyword cache" after you are done.</li> + <li>Running <kbd>./collectstats.pl --regenerate</kbd> will now take + minutes or hours, instead of days.</li> + <li>When using <kbd>email_in.pl</kbd>, there are two new switches, + <kbd>--default</kbd> and <kbd>--override</kbd>, which allow you to + specify certain default values or override specified values for + <kbd>@field</kbd> values sent in emails. (This also allows you to specify + defaults for everything so that people do not have to specify any field + values when filing [% terms.abug %] via email.)</li> + <li><strong>Installation:</strong> If you are using a localized version of + [%+ terms.Bugzilla %] and your terminal does not understand Unicode, + <kbd>checksetup.pl</kbd> will now attempt to output its messages in your + terminal's character set.</li> + <li><strong>Installation:</strong> [% terms.Bugzilla %] no longer needs empty + "placeholder" CSS in the <kbd>skins/custom</kbd> directory and other + directories. When you update, <kbd>checksetup.pl</kbd> will remove these. + This also significantly reduces the number of HTTP requests required to + load a page for the first time in [% terms.Bugzilla %].</li> + <li><strong>Installation:</strong> For Windows users, [% terms.Bugzilla %] + now supports Strawberry Perl fully.</li> + <li><strong>Installation:</strong> Now, whenever <kbd>checksetup.pl</kbd> + throws an error, it will be printed in the color red, to make it + obvious that something is wrong.</li> + <li><strong>Installation:</strong> Some actions of <kbd>checksetup.pl</kbd> were + silent, in the past. Now, <kbd>checksetup.pl</kbd> will print a message for + almost anything it does.</li> + <li><strong>Installation:</strong> The process of adding foreign keys + to a table is now much faster. This will particularly improve the speed + of upgrading from [% terms.Bugzilla %] 3.4 or earlier.</li> + <li>If you are using <kbd>jobqueue.pl</kbd> and email gets heavily delayed + for some reason, those emails will now have a Date header reflecting the + time they were <em>supposed</em> to be sent, instead of when they actually + <em>were</em> sent.</li> + <li><kbd>./jobqueue.pl install</kbd> now works on SuSE Linux.</li> + <li>[% terms.Bugzilla %] now runs much better in Apache's suexec mode + than it used to. As part of this, <kbd>checksetup.pl</kbd> sets + much stricter permissions on all the files in [% terms.Bugzilla %] + than it used to. In particular, any files that [% terms.Bugzilla %] + does not know about will not be readable by the webserver.</li> + <li>The <kbd>sendmailnow</kbd> parameter has been removed, as it was + not necessary for any modern version of Sendmail or other Mail Transfer + Agent.</li> + <li>When editing a user via the Users administration panel, you can now + see if they are a Default CC on any component.</li> + <li>For new installations of [% terms.Bugzilla %], all users will be + able to see and use the Whining system by default.</li> + <li>When you are using SSL with [% terms.Bugzilla %], you can now + turn on the <kbd>strict_transport_security</kbd> parameter to + send the + <a href="https://developer.mozilla.org/en/Security/HTTP_Strict_Transport_Security">Strict-Transport-Security</a> + header with every HTTPS connection, for additional security.</li> + <li>New code hooks (see their documentation in + <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Hook.html">Bugzilla::Hook</a>): + bug_check_can_change_field, search_operator_field_override, + bugmail_relationships, object_columns, object_update_columns, + and object_validators. The colchange_columns hook has been removed, + as it is no longer necessary (buglist_columns will be used for data + about which columns can be on the [% terms.bug %] list).</li> + <li>When [% terms.Bugzilla %] throws certain types of errors, it will + now include a "traceback" of where exactly the error occurred in the + code, to help administrators and developers debug problems.</li> + <li>There is now a test, <kbd>xt/search.t</kbd>, that assures that all + of the functionality of <kbd>Bugzilla::Search</kbd> is working properly. + If you customize the search functionality of [% terms.Bugzilla %], + you may wish to run this test to assure that your changes are correct. + You can see more information about running this test by doing + <kbd>perldoc xt/search.t</kbd> at the command line.</li> + <li>[% terms.Bugzilla %] now sends the + <a href="https://developer.mozilla.org/en/the_x-frame-options_response_header"><code>X-Frame-Options: SAMEORIGIN</code></a> header + with every page request in order to prevent "clickjacking" attacks. Note + that this prevents other domains from displaying [% terms.Bugzilla %] + in an HTML frame.</li> +</ul> + +<h4 id="v40_feat_ws_changes">WebService Changes</h4> + +<ul> + <li>You can now call some JSON-RPC methods using HTTP GET, in addition to + using HTTP POST. See the + <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Server/JSONRPC.html#Connecting_via_GET">JSON-RPC + documentation</a> for details.</li> + <li>You can now update existing [% terms.bugs %] using the + <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#update">B[% %]ug.update</a> + function.</li> + <li>You can now add attachments to [% terms.bugs %] using the + <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#add_attachment">B[% %]ug.add_attachment</a> + function.</li> + <li>The <kbd>B[% %]ug.get</kbd> function now returns all of [% terms.abug %]'s + information other than comments and attachments.</li> + <li><kbd>B[% %]ug.get</kbd> no longer returns the <kbd>internals</kbd> hash.</li> + <li>The <kbd>B[% %]ug.attachments</kbd> function now also returns attachment + data.</li> + <li>The following functions now support the <kbd>include_fields</kbd> + and <kbd>exclude_fields</kbd> arguments: <kbd>B[% %]ug.get</kbd>, + <kbd>B[% %]ug.search</kbd>, and <kbd>B[% %]ug.attachments</kbd>. Also, + server-side performance of the WebService is actually increased when + using these arguments, now, as [% terms.Bugzilla %] will no longer + get data from the database for fields you haven't asked for.</li> + <li>You can now mark the initial description of [% terms.abug %] as + private when filing [% terms.abug %] via the <kbd>B[% %]ug.create</kbd> + function.</li> + <li>You can now specify groups to put [% terms.abug %] in, in the + <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#create">B[% %]ug.create</a> + function. (This also means that you can specify groups when filing + [%+ terms.abug %] via email_in.pl.)</li> + <li>The <kbd>User.get</kbd> function now accepts <kbd>groups</kbd> + and <kbd>group_ids</kbd> arguments, to limit the returned values to + only users in the specified groups.</li> + <li>There is a new, undocumented B[% %]ug.possible_duplicates + function that helps implement the automatic duplicate detection + system. Because this function is not documented, its API may change + between releases of [% terms.Bugzilla %].</li> + <li>You can no longer search using the <kbd>votes</kbd> argument in + <kbd>B[% %]ug.search</kbd>.</li> + <li><kbd>B[% %]ug.attachments</kbd> now returns the attachment's description + using the name "summary" instead of the name "description", to be + consistent with the fact that [% terms.bug %] summaries are called + "summary". The value is still <em>also</em> returned as "description", + for backwards compatibility, but this backwards compatibility will go + away in [% terms.Bugzilla %] 5.0.</li> + <li>In the return values of various <kbd>B[% %]ug</kbd> functions, the author + of comments, [% terms.bugs %], and attachments is now called "creator", + instead of sometimes being called "reporter", "author", or "attacher". + The old names are retained for backwards-compatibility, and will stay + around until [% terms.Bugzilla %] 5.0.</li> +</ul> + +<h2 id="v40_issues">Outstanding Issues</h2> + +<ul> + <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=423439"> + [%- terms.Bug %] 423439</a>: Tabs in comments will be converted + to four spaces, due to a b<!-- -->ug in Perl as of Perl 5.8.8.</li> + <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822"> + [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at + the same time, there is no "mid-air collision" protection.</li> + <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230"> + [%- terms.Bug %] 276230</a>: The support for restricting access to + particular Categories of New Charts is not complete. You should treat + the 'chartgroup' Param as the only access mechanism available.<br> + However, charts migrated from Old Charts will be restricted to + the groups that are marked MANDATORY for the corresponding Product. + There is currently no way to change this restriction, and the + groupings will not be updated if the group configuration + for the Product changes.</li> +</ul> + +<h2 id="v40_upgrading">Notes On Upgrading From a Previous Version</h2> + +<h3>IMPORTANT: Apache Configuration Change</h3> + +<h4>mod_cgi</h4> + +<p>If you run [% terms.Bugzilla %] under mod_cgi (this is the most common + configuration, involving a <Directory> block in your Apache config + file), you will need to update the configuration of Apache for + [%+ terms.Bugzilla %]. In particular, this line in the [% terms.Bugzilla %] + <kbd><Directory></kbd> block:</p> + +<blockquote><code>AllowOverride Limit</code></blockquote> + +<p>needs to become:</p> + +<blockquote><code>AllowOverride Limit FileInfo Indexes</code></blockquote> + +<p>For full details on how to configure Apache for [% terms.Bugzilla %], + see the + <a href="[% docs_urlbase FILTER html %]configuration.html#http-apache">Configuration</a> + section of the [% terms.Bugzilla %] Guide.</p> + +<h4>mod_perl</h4> + +<p>If your [% terms.Bugzilla %] runs under mod_perl, the required Apache + configuration is now simpler. The line that used to look like:</p> + +<blockquote><code>PerlSwitches -w -T -I/var/www/html/bugzilla + -I/var/www/html/bugzilla/lib</code></blockquote> + +<p>Now should be only:</p> + +<blockquote><code>PerlSwitches -w -T</code></blockquote> + +<p>The <code>PerlConfigRequire</code> line should stay the same, however.</p> + +<h3>New .htaccess file</h3> + +<p>In previous versions of [% terms.Bugzilla %], there was a file + in [% terms.Bugzilla %]'s root directory called ".htaccess" that was + generated by <kbd>checksetup.pl</kbd>. This file is now shipped with + [%+ terms.Bugzilla %] instead of being generated during installation.</p> + +<p>If you update via CVS or bzr, you will get a message that your existing + .htaccess file conflicts with the new one. You must + <strong>remove your existing .htaccess file</strong> and use the new one + instead. Continuing to use your old .htaccess file will cause certain new + features of [% terms.Bugzilla %] to not work properly, and may also lead + to security issues for your system in the future.</p> + +<h2 id="v40_code_changes">Code Changes Which May Affect Customizations and + Extensions</h2> + +<ul> + <li>In Extensions, if you want to serve files to the user via the web, + they must now be in a <kbd>web/</kbd> subdirectory of your Extension. + (For example, <kbd>extensions/Foo/web/</kbd>). <kbd>checksetup.pl</kbd> + sets permissions on extensions much more strictly now, and files in + other locations (such as your base <kbd>extensions/Foo/</kbd> directory) + will no longer be available to [% terms.Bugzilla %] users via the web + under certain configurations.</li> + <li>Previous versions of [% terms.Bugzilla %] used to allow putting a + single file into the "skins" directory and having that be an entire + skin. That is no longer allowed, and on upgrade, <kbd>checksetup.pl</kbd> + will convert any such skins into a directory with a single + <kbd>global.css</kbd> file in them.</li> + <li>When updating [% terms.bugs %], you should now use + <code>$bug->set_all</code> instead of using the individual + <kbd>set_</kbd> methods. In particular, <kbd>set_all</kbd> is now the + <em>only</em> way to set the product of [% terms.abug %]. See + <kbd>process_bug.cgi</kbd> for an example of how <kbd>set_all</kbd> + should be used.</li> + <li>You should not insert <script> tags and <link> CSS tags + into HTML anymore, in Extensions or in your customizations. Instead, + you should push new values into the <kbd>style_urls</kbd> or + <kbd>javascript_urls</kbd> parameters. If you have to insert manual + tags for some reason, be sure to call "FILTER mtime" on the URL. (Search + for other uses of "FILTER mtime" in the templates to see how it is + used.)</li> + <li>When calling <kbd>Bugzilla::BugMail::Send</kbd>, the "changer" + argument must now be a <kbd>Bugzilla::User</kbd> object, not just + a login name. The "owner" and "qacontact" arguments are still + just login names.</li> + <li>When creating a new subclass of Bugzilla::Object, you should no + longer use <kbd>UPDATE_VALIDATORS</kbd>. Also, in most cases you will + no longer need to override <kbd>run_create_validators</kbd>. Instead, + there is a new constant called + <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Object.html#VALIDATOR_DEPENDENCIES">VALIDATOR_DEPENDENCIES</a>, + that specifies that certain fields have to be validated before other fields. + Then, all validators receive each already-validated value in a hash + as their fourth argument, so each validator can know the other values + that were passed in, while an object is being created. For an example of + how to use <kbd>VALIDATOR_DEPENDENCIES</kbd>, see + <kbd>Bugzilla/Field.pm</kbd>.</li> + <li>In previous versions of [% terms.Bugzilla %], you had to call + <code>Bugzilla->template_inner("")</code> after any time + that you called <kbd>template_inner</kbd> for a specific language. + It is no longer necessary to do this second <kbd>template_inner</kbd> + call.</li> + <li><kbd>post_bug.cgi</kbd> and <kbd>Bugzilla::Bug->create</kbd> now take + the <em>names</em> of groups instead of group ids.</li> + <li>Bugzilla::Bugmail now uses Bugzilla::Bug objects internally instead of + a lot of direct SQL.</li> + <li>For sending changes about [% terms.bugs %], there is now a method + called <kbd>send_changes</kbd> that you can call on Bugzilla::Bug + objects. For an example of its use, see <kbd>process_bug.cgi</kbd>.</li> + <li>The <kbd>Bugzilla::Search</kbd> class has been refactored, and should + now be easier to customize.</li> + <li>The <kbd>Bugzilla::Util::lsearch</kbd> function is gone. Use + <kbd>firstidx</kbd> from <kbd>List::MoreUtils</kbd>, instead.</li> + <li>[% terms.Bugzilla %] now includes YUI 2.8.2.</li> + <li><kbd>long_list.cgi</kbd>, <kbd>showattachment.cgi</kbd> and + <kbd>xml.cgi</kbd> are deprecated scripts which are no longer actively + used since [% terms.Bugzilla %] 2.19. These scripts will be removed in + [%+ terms.Bugzilla %] 4.2.</li> +</ul> + + +<h1 id="v40_previous">[% terms.Bugzilla %] 3.6 Release Notes</h1> <ul class="bz_toc"> <li><a href="#v36_introduction">Introduction</a></li> @@ -76,7 +879,7 @@ sometimes occur. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=521416">[% terms.Bug %] 521416</a>) </li> - <li>Email notifications where missing the dates that comments were made. + <li>Email notifications were missing the dates that comments were made. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=578003">[% terms.Bug %] 578003</a>) </li> <li>Putting a phrase in quotes in the Quicksearch box now works properly, @@ -174,31 +977,268 @@ <li><a href="#v36_req_optional_mod">Optional Perl Modules</a></li> </ul> - -<h3 id="v36_req_perl">Perl</h3> - +<h3 id="v36_req_perl">Perl</h3> + <p>Perl v5.8.1</p> -[% INCLUDE db_req db='mysql' %] - -[% INCLUDE db_req db='pg' %] - -[% INCLUDE db_req db='oracle' %] - +<h3 id="v36_req_mysql">For MySQL Users</h3> + + <ul> + <li>MySQL + v4.1.2 + </li> + <li><strong>perl module:</strong> + DBD::mysql v4.00</li> + </ul> + +<h3 id="v36_req_pg">For PostgreSQL Users</h3> + + <ul> + <li>PostgreSQL + v8.00.0000 + </li> + <li><strong>perl module:</strong> + DBD::Pg v1.45</li> + </ul> +<h3 id="v36_req_oracle">For Oracle Users</h3> + + <ul> + <li>Oracle + v10.02.0 + </li> + <li><strong>perl module:</strong> + DBD::Oracle v1.19</li> + </ul> + <h3 id="v36_req_modules">Required Perl Modules</h3> -[% INCLUDE req_table reqs = REQUIRED_MODULES - new = [] updated = [] %] - -<h3 id="v36_req_optional_mod">Optional Perl Modules</h3> - +<table class="req_table" border="0" cellspacing="0" cellpadding="0"> + <tr> + <th>Module</th> <th>Version</th> + </tr> + <tr> + <td >CGI</td> + <td >3.21 + </td> + </tr> + <tr> + <td >Digest::SHA</td> + <td > + (Any) + </td> + </tr> + <tr> + <td >Date::Format</td> + <td >2.21 + </td> + </tr> + <tr> + <td >DateTime</td> + <td >0.28 + </td> + </tr> + <tr> + <td >DateTime::TimeZone</td> + <td >0.71 + </td> + </tr> + <tr> + <td >DBI</td> + <td >1.41 + </td> + </tr> + <tr> + <td >Template</td> + <td >2.22 + </td> + </tr> + <tr> + <td >Email::Send</td> + <td >2.00 + </td> + </tr> + <tr> + <td >Email::MIME</td> + <td >1.861 + </td> + </tr> + <tr> + <td >Email::MIME::Encodings</td> + <td >1.313 + </td> + </tr> + <tr> + <td >Email::MIME::Modifier</td> + <td >1.442 + </td> + </tr> + <tr> + <td >URI</td> + <td > + (Any) + </td> + </tr> +</table> + +<h3 id="v36_req_optional_mod">Optional Perl Modules</h3> + <p>The following perl modules, if installed, enable various features of [% terms.Bugzilla %]:</p> -[% INCLUDE req_table reqs = OPTIONAL_MODULES - new = ['JSON-RPC', 'Test-Taint'] - updated = ['Chart'] - include_feature = 1 %] +<table class="req_table" border="0" cellspacing="0" cellpadding="0"> + <tr> + <th>Module</th> <th>Version</th> + <th>Enables Feature</th> + </tr> + <tr> + <td >GD</td> + <td >1.20 + </td> + <td>Graphical Reports, New Charts, Old Charts</td> + </tr> + <tr> + <td >Chart::Lines</td> + <td class="req_new">2.1 + </td> + <td>New Charts, Old Charts</td> + </tr> + <tr> + <td >Template::Plugin::GD::Image</td> + <td > + (Any) + </td> + <td>Graphical Reports</td> + </tr> + <tr> + <td >GD::Text</td> + <td > + (Any) + </td> + <td>Graphical Reports</td> + </tr> + <tr> + <td >GD::Graph</td> + <td > + (Any) + </td> + <td>Graphical Reports</td> + </tr> + <tr> + <td >XML::Twig</td> + <td > + (Any) + </td> + <td>Move [% terms.Bugs %] Between Installations, + Automatic Update Notifications</td> + </tr> + <tr> + <td >MIME::Parser</td> + <td >5.406 + </td> + <td>Move [% terms.Bugs %] Between Installations</td> + </tr> + <tr> + <td >LWP::UserAgent</td> + <td > + (Any) + </td> + <td>Automatic Update Notifications</td> + </tr> + <tr> + <td >PatchReader</td> + <td >0.9.4 + </td> + <td>Patch Viewer</td> + </tr> + <tr> + <td >Net::LDAP</td> + <td > + (Any) + </td> + <td>LDAP Authentication</td> + </tr> + <tr> + <td >Authen::SASL</td> + <td > + (Any) + </td> + <td>SMTP Authentication</td> + </tr> + <tr> + <td >Authen::Radius</td> + <td > + (Any) + </td> + <td>RADIUS Authentication</td> + </tr> + <tr> + <td >SOAP::Lite</td> + <td >0.710.06 + </td> + <td>XML-RPC Interface</td> + </tr> + <tr> + <td class="req_new">JSON::RPC</td> + <td class="req_new"> + (Any) + </td> + <td>JSON-RPC Interface</td> + </tr> + <tr> + <td class="req_new">Test::Taint</td> + <td class="req_new"> + (Any) + </td> + <td>JSON-RPC Interface, XML-RPC Interface</td> + </tr> + <tr> + <td >HTML::Parser</td> + <td >3.40 + </td> + <td>More HTML in Product/Group Descriptions</td> + </tr> + <tr> + <td >HTML::Scrubber</td> + <td > + (Any) + </td> + <td>More HTML in Product/Group Descriptions</td> + </tr> + <tr> + <td >Email::MIME::Attachment::Stripper</td> + <td > + (Any) + </td> + <td>Inbound Email</td> + </tr> + <tr> + <td >Email::Reply</td> + <td > + (Any) + </td> + <td>Inbound Email</td> + </tr> + <tr> + <td >TheSchwartz</td> + <td > + (Any) + </td> + <td>Mail Queueing</td> + </tr> + <tr> + <td >Daemon::Generic</td> + <td > + (Any) + </td> + <td>Mail Queueing</td> + </tr> + <tr> + <td >mod_perl2</td> + <td >1.999022 + </td> + <td>mod_perl</td> + </tr> +</table> <h2 id="v36_feat">New Features and Improvements</h2> @@ -505,7 +1545,7 @@ are allowed to grant others membership in that group itself.</li> <li>The ability to compress BMP attachments to PNGs is now an Extension. To enable the feature, remove the file - <kbd>extensions/BmpConvert/disabled</kbd> and then run checksetup.pl.</li> + <kbd>extensions/BmpConvert/disabled</kbd> and then run <kbd>checksetup.pl</kbd>.</li> <li>The default list of values for the Priority field are now clear English words instead of P1, P2, etc.</li> <li>There is now a system in place so that all field values can be @@ -775,7 +1815,7 @@ word-wrapping happened between "[% terms.bug %]" and the number. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=514703">[% terms.Bug %] 514703</a>) </li> - <li>Running checksetup.pl on Windows will no longer pop up an error box + <li>Running <kbd>checksetup.pl</kbd> on Windows will no longer pop up an error box about OCI.dll. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480968">[% terms.Bug %] 480968</a>) </li> @@ -1570,7 +2610,7 @@ <li>Some versions of the SOAP::Lite Perl module had a b[% %]ug that caused [%+ terms.Bugzilla %]'s XML-RPC service to break. - <code>checksetup.pl</code> now checks for these bad versions and + <kbd>checksetup.pl</kbd> now checks for these bad versions and will reject them. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=468009">[% terms.Bug %] 468009</a>)</li> @@ -2258,7 +3298,7 @@ <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=413672">[% terms.Bug %] 413672</a>, and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=431721">[% terms.Bug %] 431721</a>)</li> - <li>checksetup.pl now handles UTF-8 conversion more reliably during upgrades. + <li><kbd>checksetup.pl</kbd> now handles UTF-8 conversion more reliably during upgrades. (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=374951">[% terms.Bug %] 374951</a>)</li> <li>Comments written in CJK languages are now correctly word-wrapped. @@ -3013,7 +4053,7 @@ will tell you when this is, and it will give you certain instructions at that time, that you have to follow before you can complete the upgrade. Don't do the conversion yourself manually--follow - the instructions of checksetup.pl.</li> + the instructions of <kbd>checksetup.pl</kbd>.</li> <li>If you ever ran 2.23.3, 2.23.4, or 3.0rc1, you will have to run <kbd>./collectstats.pl --regenerate</kbd> at the command line, because the data for your Old Charts is corrupted. This can take several days, @@ -3152,7 +4192,7 @@ sub y { $var++ }</pre> <h3 id="v30_code_other">Other Changes</h3> <ul> - <li><code>checksetup.pl</code> has been completely re-written, and most + <li><kbd>checksetup.pl</kbd> has been completely re-written, and most of its code moved into modules in the <kbd>Bugzilla::Install</kbd> namespace. See the <a href="[% docs_urlbase FILTER html %]api/checksetup.html">checksetup @@ -3196,7 +4236,7 @@ sub y { $var++ }</pre> [% BLOCK db_req %] [% SET m = DB_MODULE.$db %] - <h3 id="v36_req_[% db FILTER html %]">For [% m.name FILTER html %] Users</h3> + <h3 id="v40_req_[% db FILTER html %]">For [% m.name FILTER html %] Users</h3> <ul> <li>[% m.name FILTER html %] diff --git a/template/en/default/reports/components.html.tmpl b/template/en/default/reports/components.html.tmpl index 35f656a..2b7d151 100644 --- a/template/en/default/reports/components.html.tmpl +++ b/template/en/default/reports/components.html.tmpl @@ -80,10 +80,9 @@ [%############################################################################%] [% BLOCK describe_comp %] - <tr> + <tr id="[% comp.name FILTER html %]"> <td rowspan="2" class="component_name"> - <a name="[% comp.name FILTER html %]" - href="buglist.cgi?product= + <a href="buglist.cgi?product= [%- product.name FILTER url_quote %]&component= [%- comp.name FILTER url_quote %]&resolution=---"> [% comp.name FILTER html %]</a> diff --git a/template/en/default/reports/duplicates-simple.html.tmpl b/template/en/default/reports/duplicates-simple.html.tmpl index 62795af..a085227 100644 --- a/template/en/default/reports/duplicates-simple.html.tmpl +++ b/template/en/default/reports/duplicates-simple.html.tmpl @@ -39,6 +39,10 @@ <head> <title>[% title FILTER html %]</title> + <link href="[% 'skins/standard/global.css' FILTER mtime %]" + rel="stylesheet" type="text/css"> + <link href="[% 'skins/standard/duplicates.css' FILTER mtime %]" + rel="stylesheet" type="text/css"> </head> <body> diff --git a/template/en/default/reports/duplicates.html.tmpl b/template/en/default/reports/duplicates.html.tmpl index 6b49a23..ff1c271 100644 --- a/template/en/default/reports/duplicates.html.tmpl +++ b/template/en/default/reports/duplicates.html.tmpl @@ -58,7 +58,7 @@ [% bug_ids_string = bug_ids.join(',') %] -<h3><a name="params">Change Parameters</a></h3> +<h3 id="params">Change Parameters</h3> <form method="get" action="duplicates.cgi"> <input type="hidden" name="sortby" value="[% sortby FILTER html %]"> @@ -136,9 +136,9 @@ <hr> -<b> - <a name="explanation">What are "Most Frequently Reported [% terms.Bugs %]"?</a> -</b> +<h3 id="explanation"> + What are "Most Frequently Reported [% terms.Bugs %]"? +</h3> <p> The Most Frequent [% terms.Bugs %] page lists the known open diff --git a/template/en/default/reports/edit-series.html.tmpl b/template/en/default/reports/edit-series.html.tmpl index 214bbcd..527a84f 100644 --- a/template/en/default/reports/edit-series.html.tmpl +++ b/template/en/default/reports/edit-series.html.tmpl @@ -40,6 +40,8 @@ [% PROCESS reports/series.html.tmpl button_name = "Change Data Set" %] <input type="hidden" name="action" value="alter"> + <input type="hidden" name="token" + value="[% issue_hash_token([default.id, default.name]) FILTER html %]"> [% IF default.series_id %] <input type="hidden" name="series_id" value="[% default.series_id %]"> diff --git a/template/en/default/reports/keywords.html.tmpl b/template/en/default/reports/keywords.html.tmpl index 10e6573..d6fe034 100644 --- a/template/en/default/reports/keywords.html.tmpl +++ b/template/en/default/reports/keywords.html.tmpl @@ -49,10 +49,9 @@ </tr> [% END %] - <tr> + <tr id="[% keyword.name FILTER html %]"> <th> - <a name="[% keyword.name FILTER html %]"> - [% keyword.name FILTER html %]</a> + [% keyword.name FILTER html %] </th> <td>[% keyword.description FILTER html_light %]</td> <td align="center"> diff --git a/template/en/default/reports/old-charts.html.tmpl b/template/en/default/reports/old-charts.html.tmpl index ca3ba6c..4bdc0cf 100644 --- a/template/en/default/reports/old-charts.html.tmpl +++ b/template/en/default/reports/old-charts.html.tmpl @@ -51,7 +51,7 @@ [%# We cannot use translated statuses and resolutions from field-descs.none.html # because old charts do not distinguish statuses from resolutions. %] [% FOREACH dataset = datasets %] - <option value="[% dataset.value FILTER html %]:" + <option value="[% dataset.value FILTER html %]" [% " selected=\"selected\"" IF dataset.selected %]> [% dataset.value FILTER html %]</option> [% END %] diff --git a/template/en/default/request/email.txt.tmpl b/template/en/default/request/email.txt.tmpl index e48b2fc..b7a9932 100644 --- a/template/en/default/request/email.txt.tmpl +++ b/template/en/default/request/email.txt.tmpl @@ -50,7 +50,8 @@ From: [% Param('mailfrom') %] To: [% to %] Subject: [% flagtype_name %] [%+ subject_status %]: [[% terms.Bug %] [%+ bug.bug_id %]] [% bug.short_desc %] [%- IF attachment %] : - [Attachment [% attachment.id %]] [% attachment.description %][% END %] + [Attachment [% attachment.id %]] [% attachment.description FILTER clean_text %][% END %] +Date: [% date %] X-Bugzilla-Type: request [%+ threadingmarker %] diff --git a/template/en/default/request/queue.html.tmpl b/template/en/default/request/queue.html.tmpl index 471f9b9..d99dadc 100644 --- a/template/en/default/request/queue.html.tmpl +++ b/template/en/default/request/queue.html.tmpl @@ -31,6 +31,7 @@ " onload="var f = document.request_form; selectProduct(f.product, f.component, null, null, 'Any');" javascript_urls=["js/productform.js"] + style_urls = ['skins/standard/buglist.css'] %] <script type="text/javascript"> @@ -71,8 +72,16 @@ to some group are shown by default. <table id="filtering"> <tr> <th>Requester:</th> - <td><input type="text" name="requester" value="[% cgi.param('requester') FILTER html %]" size="20" - title="Requester's email address"></td> + <td> + [% INCLUDE global/userselect.html.tmpl + id => "requester" + name => "requester" + value => cgi.param('requester') + size => 20 + emptyok => 1 + field_title => "Requester's email address" + %] + </td> <th>Product:</th> <td> <select name="product" onchange="selectProduct(this, this.form.component, null, null, 'Any');"> @@ -120,8 +129,17 @@ to some group are shown by default. </tr> <tr> <th>Requestee:</th> - <td><input type="text" name="requestee" value="[% cgi.param('requestee') FILTER html %]" size="20" - title="Requestee's email address or "-" (hyphen) for requests with no requestee"></td> + <td> + [% INCLUDE global/userselect.html.tmpl + id => "requestee" + name => "requestee" + value => cgi.param('requestee') + size => 20 + emptyok => 1 + hyphenok => 1 + field_title => "Requestee's email address or \"-\" (hyphen) for requests with no requestee" + %] + </td> <th>Component:</th> <td> <select name="component"> @@ -182,7 +200,10 @@ to some group are shown by default. <tr> [% FOREACH column = display_columns %] [% NEXT IF column == group_field || excluded_columns.contains(column) %] - <td>[% PROCESS "display_$column" %]</td> + <td> + [% PROCESS "display_$column" %] + [% Hook.process('after_column') %] + </td> [% END %] </tr> [% END %] @@ -214,7 +235,8 @@ to some group are shown by default. [% END %] [% BLOCK display_bug %] - <a href="show_bug.cgi?id=[% request.bug_id %]"> + <a href="show_bug.cgi?id=[% request.bug_id %]" + [%- ' class="bz_secure"' IF request.restricted %]> [% request.bug_id %]: [%+ request.bug_summary FILTER html %]</a> [% END %] diff --git a/template/en/default/search/boolean-charts.html.tmpl b/template/en/default/search/boolean-charts.html.tmpl index 1b79a45..90b5c79 100644 --- a/template/en/default/search/boolean-charts.html.tmpl +++ b/template/en/default/search/boolean-charts.html.tmpl @@ -34,7 +34,9 @@ "regexp", "notregexp", "lessthan", + "lessthaneq", "greaterthan", + "greaterthaneq", "anywords", "allwords", "nowords", @@ -46,13 +48,18 @@ "matches", "notmatches", ] %] - - <p> - <strong> - <a name="chart">Advanced Searching Using Boolean Charts</a>: - </strong> - </p> - +<script type="text/javascript"> + TUI_alternates['custom_search_query'] = '►'; + TUI_hide_default('custom_search_query'); +</script> +<div class="bz_section_title" id="custom_search_filter"> + <div id="custom_search_query_controller" class="arrow">▼</div> + <a id="chart" href="javascript:TUI_toggle_class('custom_search_query')" > + Custom Search</a> <span class="section_help">Didn't find what + you're looking for above? This area allows for ANDs, ORs, + and other more complex searches.</span> + </div> + <div id="custom_search_filter_section" class="bz_search_section custom_search_query" > [%# Whoever wrote the original version of boolean charts had a seriously twisted mind %] [% jsmagic = "onclick=\"this.form.action='query.cgi#chart'; this.form.method='POST'; return 1;\"" %] @@ -87,9 +94,8 @@ [% INCLUDE "search/type-select.html.tmpl" name = "type${chartnum}-${rownum}-${colnum}", types = types, selected = col.type %] - <input name="[% "value${chartnum}-${rownum}-${colnum}" %]" - value="[% col.value FILTER html %]"> + value="[% col.value FILTER html %]"> </td> [% UNLESS loop.last %] @@ -132,5 +138,6 @@ [% END %] </table> - <hr> + [% "<hr>" IF NOT loop.last %] [% END %] +</div>
\ No newline at end of file diff --git a/template/en/default/search/field.html.tmpl b/template/en/default/search/field.html.tmpl new file mode 100644 index 0000000..defc94c --- /dev/null +++ b/template/en/default/search/field.html.tmpl @@ -0,0 +1,142 @@ +[%# 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 Guy Pyrzak + # Portions created by the Initial Developer are Copyright (C) 2010 the + # Initial Developer. All Rights Reserved. + # + # Contributor(s): Guy Pyrzak <guy.pyrzak@gmail.com> + # Reed Loden <reed@reedloden.com> + # + #%] +[%# INTERFACE: + # field: a Bugzilla::Field object + # value: the value or values that should be used to prepopulate the field + # accesskey: the access key used to access the field more quickly + # onchange: js to run when the change event fires on the field + # type_selected: used by the free text to indicate which type of text + # search was selected for a particular field + #%] + +[% SWITCH field.type %] + [% CASE [ constants.FIELD_TYPE_FREETEXT, + constants.FIELD_TYPE_TEXTAREA, + constants.FIELD_TYPE_UNKNOWN ] %] + [% INCLUDE "bug/field-label.html.tmpl" + field = field + tag_name = "span" + editable = 1 + %] + [% INCLUDE "search/type-select.html.tmpl" + name = field.name _ "_type", + types = types, + selected = type_selected + %] + <input name="[% field.name FILTER html %]" + id="[% field.name FILTER html %]" size="40" + [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %] + value="[% value FILTER html %]"> + [% CASE constants.FIELD_TYPE_KEYWORDS %] + [% INCLUDE "bug/field-label.html.tmpl" + field = field + tag_name = "span" + editable = 1 + %] + [% INCLUDE "search/type-select.html.tmpl" + name = field.name _ "_type", + types = types, + selected = type_selected + %] + <div id="keyword_container"> + <input name="[% field.name FILTER html %]" + id="[% field.name FILTER html %]" size="40" + [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %] + value="[% value FILTER html %]"> + <div id="keyword_autocomplete"></div> + </div> + <script type="text/javascript" defer="defer"> + YAHOO.bugzilla.keyword_array = [ + [%- FOREACH keyword = all_keywords %] + [%-# %]"[% keyword.name FILTER js %]" + [%- "," IF NOT loop.last %][% END %]]; + YAHOO.bugzilla.keywordAutocomplete.init('[% field.name FILTER js %]', + 'keyword_autocomplete'); + </script> + [% CASE constants.FIELD_TYPE_DATETIME %] + [% INCLUDE "bug/field-label.html.tmpl" + field = field + tag_name = "span" + editable = 1 + %] + from <input name="[% field.name FILTER html %]from" + id="[% field.name FILTER html %]" + size="10" maxlength="10" + value="[% value.0 FILTER html %]" + onchange="updateCalendarFromField(this);[% onchange FILTER html %]"> + <button type="button" class="calendar_button" + id="button_calendar_[% field.name FILTER html %]" + onclick="showCalendar('[% field.name FILTER js %]')"> + <span>Calendar</span> + </button> + <span id="con_calendar_[% field.name FILTER html %]"></span> + to <input name="[% field.name FILTER html %]to" + id="[% field.name FILTER html %]to" size="10" maxlength="10" + value="[% value.1 FILTER html %]" + onchange="updateCalendarFromField(this);[% onchange FILTER html %]"> + <button type="button" class="calendar_button" + id="button_calendar_[% field.name FILTER html %]to" + onclick="showCalendar('[% field.name FILTER js %]to')"> + <span>Calendar</span> + </button> + <small>(YYYY-MM-DD or relative dates)</small> + + <span id="con_calendar_[% field.name FILTER html %]to"></span> + <script type="text/javascript"> + createCalendar('[% field.name FILTER js %]'); + createCalendar('[% field.name FILTER js %]to'); + </script> + [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT, + constants.FIELD_TYPE_MULTI_SELECT ] %] + <div id="container_[% field.name FILTER html %]" class="search_field_grid"> + [% INCLUDE "bug/field-label.html.tmpl" + field = field + editable = 1 + tag_name = "span" + %] + <select name="[% field.name FILTER html%]" + id="[% field.name FILTER html %]" + [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %] + multiple="multiple" size="7"> + [% legal_values = ${field.name} %] + [% IF field.name == "component" %] + [% legal_values = ${"component_"} %] + [% END %] + [% FOREACH current_value = legal_values %] + [% IF current_value.id %] + [%# current_value is a hash instead of a value which + only applies for Resolution really, everywhere else current_value + is just the value %] + [% v = current_value.name OR '---' -%] + <option value="[% v FILTER html %]" + [% ' selected="selected"' IF value.contains( v ) %]> + [% display_value(field.name, current_value.name) FILTER html %] + </option> + [% ELSE %] + <option value="[% current_value OR '---' FILTER html %]" + [% ' selected="selected"' IF value.contains( current_value ) %]> + [% display_value(field.name, current_value) FILTER html %] + </option> + [% END %] + [% END %] + </select> + </div> + [% END %] diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl index 2e2ae73..f310420 100644 --- a/template/en/default/search/form.html.tmpl +++ b/template/en/default/search/form.html.tmpl @@ -18,6 +18,7 @@ # Contributor(s): Chris Lahey <clahey@ximian.com> [javascript fixes] # Christian Reis <kiko@async.com.br> [javascript rewrite] # Gervase Markham <gerv@gerv.net> + # Guy Pyrzak <guy.pyrzak@gmail.com> #%] [% PROCESS "global/field-descs.none.tmpl" %] @@ -103,6 +104,17 @@ function doOnSelectProduct(selectmode) { } } +// Hide the Advanced Fields by default, unless the user has a cookie +// that specifies otherwise. +// ▸ and ▾ are both utf8 escaped characters for right +// and down facing arrows respectivly. +TUI_alternates['history_query'] = '►'; +TUI_alternates['people_query'] = '►'; +TUI_alternates['information_query'] = '►'; + +TUI_hide_default('history_query'); +TUI_hide_default('people_query'); +TUI_hide_default('information_query'); </script> [% query_types = [ @@ -122,389 +134,202 @@ function doOnSelectProduct(selectmode) { [%# *** Summary *** %] -<table> - <tr> - <th align="right"> - <label for="short_desc" accesskey="s"><u>S</u>ummary</label>: - </th> - <td> - [% INCLUDE "search/type-select.html.tmpl" - name = "short_desc_type", - types = query_types, selected = default.short_desc_type.0 %] - </td> - <td> - <input name="short_desc" id="short_desc" size="40" - value="[% default.short_desc.0 FILTER html %]"> + <div class="search_field_row" id="summary_field"> + [% INCLUDE "search/field.html.tmpl" + field = bug_fields.short_desc + types = query_types + value = default.short_desc.0 + type_selected = default.short_desc_type.0 + accesskey = "s" + %] <script type="text/javascript"> <!-- document.forms[queryform].short_desc.focus(); // --> </script> - </td> - <td> + [% IF button_name %] <input type="submit" id="[% button_name FILTER css_class_quote %]_top" value="[% button_name FILTER html %]"> [% END %] - </td> - </tr> + </div> -[%# *** Classification Product Component Version Target *** %] - <tr> - <td colspan="4"> - <table> - <tr> - [% Hook.process('before_selects_top') %] - [% IF Param('useclassification') %] - <td valign="top"> - <table> - <tr valign="bottom"> - <th align="left"> - <label for="classification">Classification</label>: - </th> - </tr> - <tr valign="top"> - <td align="left"> - <select name="classification" multiple="multiple" size="5" id="classification" - onchange="doOnSelectProduct(1);"> - [% FOREACH cat = classification %] - <option value="[% cat.name FILTER html %]" - [% " selected" IF lsearch(default.classification, cat.name) != -1 %]> - [% cat.name FILTER html %] - </option> - [% END %] - </select> - </td> - </tr> - </table> - </td> - [% END %] - <td valign="top"> - <table> - <tr valign="bottom"> - <th align="left"> - <label for="product" accesskey="p"><u>P</u>roduct</label>: - </th> - </tr> - <tr valign="top"> - [%# Can't use the select block here because of the onChange %] - <td align="left"> - <select name="product" multiple="multiple" size="5" id="product" - onchange="doOnSelectProduct(2);"> - [% FOREACH p = product %] - [% IF p.components.size %] - <option value="[% p.name FILTER html %]" - [% " selected" IF lsearch(default.product, p.name) != -1 %]> - [% p.name FILTER html %]</option> - [% END %] - [% END %] - </select> - </td> - </tr> - </table> - </td> - <td valign="top"> - <table> - <tr valign="bottom"> - <th align="left"> - <label for="component" accesskey="m"><a href="describecomponents.cgi">Co<u>m</u>ponent</a></label>: - </th> - </tr> - <tr valign="top"> - [%# Can't use the select block here because 'component' is a toolkit - reserved word - we use 'component_' instead. %] - <td align="left"> - <select name="component" id="component" - multiple="multiple" size="5"> - [% FOREACH c = component_ %] - <option value="[% c FILTER html %]" - [% " selected" IF lsearch(default.component, c) != -1 %]> - [% c FILTER html %]</option> - [% END %] - </select> - </td> - </tr> - </table> - </td> - <td valign="top"> - <table> - <tr valign="bottom"> - <th align="left"> - <label for="version">Version</label>: - </th> - </tr> - <tr valign="top"> - [% PROCESS select sel = { name => 'version', - size => 5 } %] - </tr> - </table> - </td> - [% IF Param('usetargetmilestone') %] - <td valign="top"> - <table> - <tr valign="bottom"> - <th align="left"> - <label for="target_milestone">Target</label>: - </th> - </tr> - <tr valign="top"> - [% PROCESS select sel = { name => 'target_milestone', - size => 5 } %] - </tr> - </table> - </td> - [% END %] - [% Hook.process('after_selects_top') %] - </tr> - </table> - </td> - </tr> +[%# *** Classification Product Component *** %] + +[% Hook.process('before_selects_top') %] +[% IF Param('useclassification') %] + [% fake_classfication = { name => bug_fields.classification.name, + type => constants.FIELD_TYPE_SINGLE_SELECT } %] + [% INCLUDE "search/field.html.tmpl" + field => fake_classfication + accesskey => "c" + onchange => "doOnSelectProduct(1);" + value => default.classification + %] +[% END %] +[% INCLUDE "search/field.html.tmpl" + field => bug_fields.product + accesskey => "p" + onchange => "doOnSelectProduct(2);" + value => default.product +%] +[% INCLUDE "search/field.html.tmpl" + field => bug_fields.component + accesskey => "m" + value => default.component +%] +[% INCLUDE "search/field.html.tmpl" + field => bug_fields.bug_status + accesskey => "a" + value => default.bug_status +%] +[% INCLUDE "search/field.html.tmpl" + field => bug_fields.resolution + accesskey => "r" + value => default.resolution +%] + +[% Hook.process('after_selects_top') %] + +<div id="detailed_information" class="bz_section_title"> + <div id="information_query_controller" class="arrow">▼</div> + <a href="javascript:TUI_toggle_class('information_query')"> + Detailed [% terms.Bug %] Information + </a> + <span class="section_help">Narrow results by the following fields: + [%+ field_descs.longdesc FILTER html %]s, [%+ field_descs.bug_file_loc FILTER html %], + [% IF Param('usestatuswhiteboard') %] [%+ field_descs.status_whiteboard FILTER html %], [%+ END %] + [% IF use_keywords %] [%+ field_descs.keywords FILTER html %], [%+ END %] + [% IF user.is_timetracker %] [%+ field_descs.deadline FILTER html %], [%+ END %] + [% terms.Bug %] Numbers, [%+ field_descs.version FILTER html %], + [% IF Param('usetargetmilestone') %] [%+ field_descs.target_milestone FILTER html %], [%+ END %] + [% field_descs.bug_severity FILTER html %], [%+ field_descs.priority FILTER html %], [%+ field_descs.rep_platform FILTER html %], + [%+ field_descs.op_sys FILTER html %] + </span> +</div> [%# *** Comment URL Whiteboard Keywords *** %] - +<div id="detailed_information_section" class="bz_search_section information_query"> [% SET freetext_fields = [ - { name => "longdesc", description => "A <u>C</u>omment", - accesskey => 'c' }, - { name => "bug_file_loc", description => "The <u>U</u>RL", - accesskey => 'u' }, - { name => "status_whiteboard", description => "<u>W</u>hiteboard", - accesskey => 'w' } + { field => bug_fields.longdesc, accesskey => 'c' }, + { field => bug_fields.bug_file_loc, accesskey => 'u' }, + { field => bug_fields.status_whiteboard, accesskey => 'w' }, + { field => bug_fields.keywords, accesskey => 'k', + qtypes => ['allwords', 'anywords', 'nowords', 'regexp', 'notregexp'] } ] %] - [% Hook.process('before_freetext_fields') %] - [% FOREACH field = freetext_fields %] - [% NEXT IF field.name == 'status_whiteboard' + + [%# loop through a bunch of free text fields and print out their text stuff %] + [% FOREACH field_container = freetext_fields %] + [% NEXT IF field_container.field.name == 'status_whiteboard' AND NOT Param('usestatuswhiteboard') %] - <tr> - <th align="right"> - <label for="[% field.name %]" - accesskey="[% field.accesskey %]">[% field.description %]</label>: - </th> - <td> - [% type = field.name _ "_type" %] - [% INCLUDE "search/type-select.html.tmpl" - name = type, - types = query_types, selected = default.$type.0 %] - </td> - <td><input name="[% field.name %]" id="[% field.name %]" size="40" - value="[% default.${field.name}.0 FILTER html %]"> - </td> - <td></td> - </tr> - [% END %] - - [% IF use_keywords %] - <tr> - <th align="right"> - <label for="keywords" accesskey="k"><a href="describekeywords.cgi"><u>K</u>eywords</a></label>: - </th> - <td> - [% INCLUDE "search/type-select.html.tmpl" - name = "keywords_type", - types = ['allwords', 'anywords', 'nowords', 'regexp', 'notregexp'], - selected = default.keywords_type.0 %] - </td> - <td> - <input name="keywords" id="keywords" size="40" - value="[% default.keywords.0 FILTER html %]"> - </td> - </tr> + [% NEXT IF field_container.field.name == 'keywords' + AND NOT use_keywords + %] + <div class="search_field_row"> + [% type = field_container.field.name _ "_type" %] + [% INCLUDE "search/field.html.tmpl" + field => field_container.field + types => field_container.qtypes || query_types + accesskey => field_container.accesskey + value => default.${field_container.field.name}.0 + type_selected => default.$type.0 + %] + </div> [% END %] [%# Deadline %] [% IF user.is_timetracker %] - <tr> - <th align="right"> - <label for="deadlinefrom" accesskey="l">Dead<u>l</u>ine</label>: - </th> - <td> - from <input name="deadlinefrom" id="deadlinefrom" size="10" maxlength="10" - value="[% default.deadlinefrom.0 FILTER html %]"> - to <input name="deadlineto" size="10" maxlength="10" - value="[% default.deadlineto.0 FILTER html %]"> - </td> - <td> - <small>(YYYY-MM-DD or relative dates)</small> - </td> - </tr> + <div class="search_field_row"> + [% INCLUDE "search/field.html.tmpl" + field = bug_fields.deadline + accesskey = "l" + value = [ default.deadlinefrom.0, default.deadlineto.0 ] + %] + </div> [% END %] + <div class="search_field_row"> + <span class="field_label"><label for="bug_id">[% terms.Bugs %] numbered</label></span> + <div id="bug_id_container" > + <input type="text" name="bug_id" id="bug_id" + value="[% default.bug_id.0 FILTER html %]" size="20"> + <div class="field_help">(comma-separated list)</div> + </div> + should be + <select name="bug_id_type" id="bug_id_type"> + <option value="anyexact"[% " selected" IF default.bug_id_type.0 == "anyexact" %]>only included in</option> + <option value="nowords"[% " selected" IF default.bug_id_type.0 == "nowords" %]>excluded from</option> + </select> the results + </div> + [% Hook.process('after_freetext_fields') %] -</table> - -<hr> - -[%# *** Status Resolution Severity Priority Hardware OS *** %] - -<table> - <tr> + [%# *** Status Resolution Severity Priority Hardware OS *** %] + <div> [% Hook.process('before_selects_bottom') %] - <td> - <table> - <tr> - <th align="left"> - <label for="bug_status" accesskey="a">St<u>a</u>tus</label>: - </th> - </tr> - <tr valign="top"> - [% PROCESS select sel = { name => 'bug_status', - size => 7 } %] - </tr> - </table> - </td> - <td> - <table> - <tr> - <th align="left"> - <label for="resolution" accesskey="r"><u>R</u>esolution</label>: - </th> - </tr> - <tr valign="top"> - [% PROCESS select sel = { name => 'resolution', - size => 7 } %] - </tr> - </table> - </td> - <td> - <table> - <tr> - <th align="left"> - <label for="bug_severity">Severity</label>: - </th> - </tr> - <tr valign="top"> - [% PROCESS select sel = { name => 'bug_severity', - size => 7 }%] - </tr> - </table> - </td> - <td> - <table> - <tr> - <th align="left"> - <label for="priority" accesskey="i">Pr<u>i</u>ority</label>: - </th> - </tr> - <tr valign="top"> - [% PROCESS select sel = { name => 'priority', - size => 7 } %] - </tr> - </table> - </td> - <td> - <table> - <tr> - <th align="left"> - <label for="rep_platform" accesskey="h"><u>H</u>ardware</label>: - </th> - </tr> - <tr valign="top"> - [% PROCESS select sel = { name => 'rep_platform', - size => 7 } %] - </tr> - </table> - </td> - <td> - <table> - <tr> - <th align="left"> - <label for="op_sys" accesskey="o"><u>O</u>S</label>: - </th> - </tr> - <tr valign="top"> - [% PROCESS select sel = { name => 'op_sys', - size => 7 } %] - </tr> - </table> - </td> + [% fake_version_field = { name => bug_fields.version.name, + type => constants.FIELD_TYPE_SINGLE_SELECT }%] + [% INCLUDE "search/field.html.tmpl" + field => fake_version_field + value => default.version + %] + [% IF Param('usetargetmilestone') %] + [% fake_target_milestone_field = { name => bug_fields.target_milestone.name , + type => constants.FIELD_TYPE_SINGLE_SELECT } %] + [% INCLUDE "search/field.html.tmpl" + field => fake_target_milestone_field + value => default.target_milestone + %] + [% END %] + [% INCLUDE "search/field.html.tmpl" + field => bug_fields.bug_severity + accesskey=> "v" + value => default.bug_severity + %] + [% INCLUDE "search/field.html.tmpl" + field => bug_fields.priority + accesskey => "i" + value => default.priority + %] + [% INCLUDE "search/field.html.tmpl" + field => bug_fields.rep_platform + accesskey =>"h" + value => default.rep_platform + %] + [% INCLUDE "search/field.html.tmpl" + field => bug_fields.op_sys + accesskey =>"o" + value => default.op_sys + %] [% Hook.process('after_selects_bottom') %] - </tr> -</table> - -[%# *** Email Numbering Votes *** %] - -<table> - <tr> - <td> - <fieldset> - <legend> - <strong> - [% IF Param('usevotes') %] - Email Addresses, [% terms.Bug %] Numbers, and Votes - [% ELSE %] - Email Addresses and [% terms.Bug %] Numbers - [% END %] - </strong> - </legend> - - -<table> - <tr> - [% FOREACH n = [1, 2] %] - <td> - - -<table cellspacing="0" cellpadding="0"> - <tr> - <td> + </div> +</div> +[%# *** Email Numbering *** %] + <div class="bz_section_title" id="people_filter"> + <div id="people_query_controller" class="arrow">▼</div> + <a href="javascript:TUI_toggle_class('people_query')">Search By People</a> + <span>Narrow results to a role (i.e. [% field_descs.assigned_to FILTER html %], + [%+ field_descs.reporter FILTER html %], [% field_descs.commenter FILTER html %], + etc.) a person has on [% terms.abug %] + </span> + </div> + <div id="people_filter_section" class="bz_search_section people_query"> + [% FOREACH n = [1, 2, 3] %] + <div class="search_email_fields"> Any of: - </td> - </tr> - <tr> - <td> - <input type="checkbox" name="emailassigned_to[% n %]" - id="emailassigned_to[% n %]" value="1" - [% " checked" IF default.emailassigned_to.$n %]> - <label for="emailassigned_to[% n %]"> - the [% terms.bug %] assignee - </label> - </td> - </tr> - <tr> - <td> - <input type="checkbox" name="emailreporter[% n %]" - id="emailreporter[% n %]" value="1" - [% " checked" IF default.emailreporter.$n %]> - <label for="emailreporter[% n %]"> - the reporter - </label> - </td> - </tr> - [% IF Param('useqacontact') %] - <tr> - <td> - <input type="checkbox" name="emailqa_contact[% n %]" - id="emailqa_contact[% n %]" value="1" - [% " checked" IF default.emailqa_contact.$n %]> - <label for="emailqa_contact[% n %]"> - the QA contact - </label> - </td> - </tr> - [% END %] - <tr> - <td> - <input type="checkbox" name="emailcc[% n %]" - id="emailcc[% n %]" value="1" - [% " checked" IF default.emailcc.$n %]> - <label for="emailcc[% n %]"> - a CC list member - </label> - </td> - </tr> - <tr> - <td> - <input type="checkbox" name="emaillongdesc[% n %]" - id="emaillongdesc[% n %]" value="1" - [% " checked" IF default.emaillongdesc.$n %]> - <label for="emaillongdesc[% n %]"> - a commenter - </label> - </td> - </tr> - <tr> - <td> + [% PROCESS role_types field = { count => n, name => "emailassigned_to", + label=> "the ${terms.Bug} ${field_descs.assigned_to}" } %] + [% PROCESS role_types field = { count => n, name => "emailreporter", + label=> "the ${field_descs.reporter}" } %] + [% IF Param('useqacontact') %] + [% PROCESS role_types field = { count => n, name => "emailqa_contact", + label=> "the ${field_descs.qa_contact}" } %] + [% END %] + [% PROCESS role_types field = { count => n, name => "emailcc", + label=> "a ${field_descs.cc} list member" } %] + [% PROCESS role_types field = { count => n, name => "emaillongdesc", + label=> " a ${field_descs.commenter}" } %] <select name="emailtype[% n %]"> [% FOREACH qv = [ { name => "substring", description => "contains" }, @@ -512,132 +337,87 @@ function doOnSelectProduct(selectmode) { { name => "notequals", description => "is not" }, { name => "regexp", description => "matches regexp" }, { name => "notregexp", description => "doesn't match regexp" } ] %] - <option value="[% qv.name %]" [% " selected" IF default.emailtype.$n == qv.name %]>[% qv.description %]</option> [% END %] </select> - </td> - </tr> - <tr> - <td> - <input name="email[% n %]" size="25" value="[% default.email.$n FILTER html %]"> - </td> - </tr> -</table> - - - </td> - [% END %] - </tr> -</table> -<hr> -<table> - <tr> - <td> - <select name="bug_id_type"> - <option value="anyexact"[% " selected" IF default.bug_id_type.0 == "anyexact" %]>Only include</option> - <option value="nowords"[% " selected" IF default.bug_id_type.0 == "nowords" %]>Exclude</option> - </select> - <label for="bug_id">[% terms.bugs %] numbered</label>: - </td> - <td> - <input type="text" name="bug_id" id="bug_id" - value="[% default.bug_id.0 FILTER html %]" size="20"> - </td> - </tr> - <tr> - <td></td> - <td>(comma-separated list)</td> - </tr> - [% IF Param('usevotes') %] - <tr> - <td align="right"> - <label for="votes">Only [% terms.bugs %] with at least</label>: - </td> - <td> - <input name="votes" id="votes" size="3" - value="[% default.votes.0 FILTER html %]"> - votes - </td> - </tr> + [% IF feature_enabled('jsonrpc') %] + <div id="email[% n %]_autocomplete"> + [% END %] + <input name="email[% n %]" class="email" id="email[% n %]" + value="[% default.email.$n FILTER html %]"> + [% IF feature_enabled('jsonrpc') %] + <div id="email[% n %]_autocomplete_container"></div> + </div> + <script type="text/javascript"> + YAHOO.bugzilla.userAutocomplete.init( "email[% n %]", + "email[% n %]_autocomplete_container"); + </script> + [% END %] + </div> [% END %] -</table> - - - </fieldset> - </td> - + [% Hook.process('email_numbering_end') %] + </div> [%# *** Bug Changes *** %] - - <td valign="top"> - <fieldset> - <legend><strong>[% terms.Bug %] Changes</strong></legend> - - -<dl class="bug_changes"> - <dt> - <label for="chfieldfrom">Only [% terms.bugs %] changed between</label>: - </dt> - <dd> - <input name="chfieldfrom" id="chfieldfrom" - size="10" value="[% default.chfieldfrom.0 FILTER html %]"> - and <input name="chfieldto" size="10" value="[% default.chfieldto.0 FILTER html %]"> - <br>(YYYY-MM-DD or relative dates) - </dd> - <dt> - <label for="chfield">where one or more of the following changed</label>: - </dt> - <dd> +<div class="bz_section_title" id="history_filter"> + <div id="history_query_controller" class="arrow">▼</div> + <a href="javascript:TUI_toggle_class('history_query')" >Search By Change History</a> + <span>Narrow results to how fields have changed during a specific time period</span> +</div> +<ul class="bug_changes bz_search_section history_query" id="history_filter_section" > + <li> + <label for="chfield">where ANY of the fields:</label> [%# Create array, so we can sort it by description #%] [% chfields = [] %] [% FOREACH field = chfield %] [% chfields.push({value => field, desc => (field_descs.$field || field) }) %] [% END %] - <select name="chfield" id="chfield" multiple="multiple" size="4"> [% FOREACH field = chfields.sort('desc') %] <option value="[% field.value FILTER html %]" - [% " selected" IF lsearch(default.chfield, field.value) != -1 %]> + [% " selected" IF default.chfield.contains(field.value) %]> [% field.desc FILTER html %]</option> [% END %] </select> - </dd> - <dt>and <label for="chfieldvalue">the new value was</label>:</dt> - <dd> + </li> + <li> + <label for="chfieldvalue">[% search_descs.changedto FILTER html %]:</label> <input name="chfieldvalue" id="chfieldvalue" size="20" value="[% default.chfieldvalue.0 FILTER html %]"> - </dd> -</dl> - - </fieldset> - </td> - </tr> -</table> + </li> + <li> + <label for="chfieldfrom">between:</label> + <input name="chfieldfrom" id="chfieldfrom" size="10" + value="[% default.chfieldfrom.0 FILTER html %]" onchange="updateCalendarFromField(this)"> + <button type="button" class="calendar_button" + id="button_calendar_chfieldfrom" + onclick="showCalendar('chfieldfrom')"><span>Calendar</span></button> + and + <div id="con_calendar_chfieldfrom"></div> + <input name="chfieldto" size="10" id="chfieldto" + value="[% default.chfieldto.0 FILTER html %]" onchange="updateCalendarFromField(this)"> + <button type="button" class="calendar_button" + id="button_calendar_chfieldto" + onclick="showCalendar('chfieldto')"><span>Calendar</span></button> + <div id="con_calendar_chfieldto"></div> + (YYYY-MM-DD or relative dates) + <script type="text/javascript"> + createCalendar('chfieldfrom'); + createCalendar('chfieldto'); + </script> + </li> +</ul> [%############################################################################%] -[%# Block for SELECT fields #%] +[%# Block for email role type use to select which email to search through #%] [%############################################################################%] - -[% BLOCK select %] - <td align="left"> - <select name="[% sel.name %]" id="[% sel.name %]" - multiple="multiple" size="[% sel.size %]"> - [% FOREACH value = ${sel.name} %] - [% IF value.id %] - [%# This only applies for Resolution really %] - [% v = value.name OR '---' -%] - <option value="[% v FILTER html %]" - [% " selected" IF lsearch(default.${sel.name}, v) != -1 %]> - [% display_value(sel.name, value.name) FILTER html %] - </option> - [% ELSE %] - <option value="[% value OR '---' FILTER html %]" - [% " selected" IF lsearch(default.${sel.name}, value) != -1 %]> - [% display_value(sel.name, value) FILTER html %] - </option> - [% END %] - [% END %] - </select> - </td> +[% BLOCK role_types %] + <div class="role_type"> + <input type="checkbox" name="[% field.name _ field.count FILTER html %]" + id="[% field.name _ field.count FILTER html %]" value="1" + [% " checked" IF default.${field.name}.${field.count} %]> + <label for="[% field.name _ field.count FILTER html%]"> + [% field.label FILTER html%] + </label> + </div> [% END %] diff --git a/template/en/default/search/search-advanced.html.tmpl b/template/en/default/search/search-advanced.html.tmpl index cb0519a..ef7fa76 100644 --- a/template/en/default/search/search-advanced.html.tmpl +++ b/template/en/default/search/search-advanced.html.tmpl @@ -36,10 +36,11 @@ var queryform = "queryform" [% PROCESS global/header.html.tmpl title = "Search for $terms.bugs" - onload = "doOnSelectProduct(0); enableHelp();" + onload = "doOnSelectProduct(0);" javascript = js_data - javascript_urls = [ "js/productform.js" "js/util.js" "js/help.js" ] - style_urls = [ "skins/standard/help.css" ] + yui = [ 'autocomplete', 'calendar' ] + javascript_urls = [ "js/productform.js", "js/util.js", "js/TUI.js", "js/field.js"] + style_urls = [ "skins/standard/search_form.css" ] doc_section = "query.html" style = "dl.bug_changes dt { margin-top: 15px; @@ -50,30 +51,16 @@ var queryform = "queryform" [% button_name = "Search" %] -[%# The decent help requires Javascript %] -<script type="text/javascript"> <!-- -[% IF NOT cgi.param("help") %] - document.write("<p><a href='query.cgi?help=1&format=advanced'>Give me some help<\/a> (reloads page).<\/p>"); -[% ELSE %] - [% PROCESS "search/search-help.html.tmpl" %] - if (generateHelp()) - document.write("<p>For help, mouse over the page elements.<\/p>"); - else - document.write("<p>Help initialization failed, no help available.<\/p>"); -[% END %] -// --> -</script> +<p id="search_help">Hover your mouse over each field label to get help for that field.</p> -<form method="post" action="buglist.cgi" name="queryform"> +<form method="post" action="buglist.cgi" name="queryform" id="queryform"> [% PROCESS search/form.html.tmpl %] -[% PROCESS search/knob.html.tmpl %] - -<hr> - [% PROCESS "search/boolean-charts.html.tmpl" %] +[% PROCESS search/knob.html.tmpl %] + </form> diff --git a/template/en/default/search/search-create-series.html.tmpl b/template/en/default/search/search-create-series.html.tmpl index da1011e..c425fbd 100644 --- a/template/en/default/search/search-create-series.html.tmpl +++ b/template/en/default/search/search-create-series.html.tmpl @@ -33,8 +33,10 @@ [% PROCESS global/header.html.tmpl title = "Create New Data Set" onload = "doOnSelectProduct(0);" + yui = [ 'autocomplete', 'calendar' ] javascript = js_data - javascript_urls = [ "js/productform.js" ] + javascript_urls = [ "js/util.js", "js/productform.js", "js/TUI.js", "js/field.js" ] + style_urls = [ "skins/standard/search_form.css" ] doc_section = "reporting.html#charts-new-series" %] @@ -52,6 +54,7 @@ [% PROCESS reports/series.html.tmpl button_name = "Create Data Set" %] <input type="hidden" name="action" value="create"> + <input type="hidden" name="token" value="[% issue_hash_token(['create-series']) FILTER html %]"> <script type="text/javascript"> document.chartform.category[0].selected = true; diff --git a/template/en/default/search/search-report-graph.html.tmpl b/template/en/default/search/search-report-graph.html.tmpl index 61dd3b5..3c894cf 100644 --- a/template/en/default/search/search-report-graph.html.tmpl +++ b/template/en/default/search/search-report-graph.html.tmpl @@ -32,8 +32,10 @@ var queryform = "reportform" [% PROCESS global/header.html.tmpl title = "Generate Graphical Report" onload = "doOnSelectProduct(0); chartTypeChanged()" + yui = [ 'autocomplete', 'calendar' ] javascript = js_data - javascript_urls = [ "js/productform.js" ] + javascript_urls = [ "js/util.js", "js/productform.js", "js/TUI.js", "js/field.js" ] + style_urls = [ "skins/standard/search_form.css" ] doc_section = "reporting.html#reports" %] @@ -63,7 +65,7 @@ var queryform = "reportform" [% button_name = "Generate Report" %] -<form method="get" action="report.cgi" name="reportform"> +<form method="get" action="report.cgi" name="reportform" id="reportform"> <table align="center"> <tr> @@ -128,14 +130,13 @@ var queryform = "reportform" [% PROCESS search/form.html.tmpl %] -<br> -<input type="submit" id="[% button_name FILTER css_class_quote %]" - value="[% button_name FILTER html %]"> -<input type="hidden" name="action" value="wrap"> -<hr> - [% PROCESS "search/boolean-charts.html.tmpl" %] + <div id="knob"> + <input type="submit" id="[% button_name FILTER css_class_quote %]" + value="[% button_name FILTER html %]"> + <input type="hidden" name="action" value="wrap"> + </div> </form> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/search/search-report-select.html.tmpl b/template/en/default/search/search-report-select.html.tmpl index de64787..5e5db06 100644 --- a/template/en/default/search/search-report-select.html.tmpl +++ b/template/en/default/search/search-report-select.html.tmpl @@ -26,19 +26,15 @@ [% PROCESS "global/field-descs.none.tmpl" %] [% BLOCK select %] - [% rep_fields = ["classification", "product", "component", "version", "rep_platform", - "op_sys", "bug_status", "resolution", "bug_severity", - "priority", "target_milestone", "assigned_to", - "reporter", "qa_contact", "votes" ] %] + [% Hook.process('rep_fields', 'search/search-report-select.html.tmpl') %] <select name="[% name FILTER html %]"> <option value=""><none></option> - [% FOREACH field = rep_fields %] + [% FOREACH field = report_columns.keys.sort %] [% NEXT IF field == "classification" AND !Param('useclassification') %] [% NEXT IF field == "target_milestone" AND !Param('usetargetmilestone') %] [% NEXT IF field == "qa_contact" AND !Param('useqacontact') %] - [% NEXT IF field == "votes" AND !Param('usevotes') %] <option value="[% field FILTER html %]" [% " selected" IF default.$name.0 == field %]> [% field_descs.$field || field FILTER html %]</option> diff --git a/template/en/default/search/search-report-table.html.tmpl b/template/en/default/search/search-report-table.html.tmpl index 55d62a1..7e087e7 100644 --- a/template/en/default/search/search-report-table.html.tmpl +++ b/template/en/default/search/search-report-table.html.tmpl @@ -32,8 +32,10 @@ var queryform = "reportform" [% PROCESS global/header.html.tmpl title = "Generate Tabular Report" onload = "doOnSelectProduct(0)" + yui = [ 'autocomplete', 'calendar' ] javascript = js_data - javascript_urls = [ "js/productform.js" ] + javascript_urls = [ "js/util.js", "js/productform.js", "js/TUI.js", "js/field.js" ] + style_urls = [ "skins/standard/search_form.css" ] doc_section = "reporting.html#reports" %] @@ -46,7 +48,7 @@ var queryform = "reportform" [% button_name = "Generate Report" %] -<form method="get" action="report.cgi" name="reportform"> +<form method="get" action="report.cgi" name="reportform" id="reportform"> <table align="center"> <tr> @@ -78,17 +80,16 @@ var queryform = "reportform" <hr> -[% PROCESS search/form.html.tmpl %] + [% PROCESS search/form.html.tmpl %] -<br> -<input type="submit" id="[% button_name FILTER css_class_quote %]" - value="[% button_name FILTER html %]"> -<input type="hidden" name="format" value="table"> -<input type="hidden" name="action" value="wrap"> -<hr> - -[% PROCESS "search/boolean-charts.html.tmpl" %] + [% PROCESS "search/boolean-charts.html.tmpl" %] + <div id="knob"> + <input type="submit" id="[% button_name FILTER css_class_quote %]" + value="[% button_name FILTER html %]"> + <input type="hidden" name="format" value="table"> + <input type="hidden" name="action" value="wrap"> + </div> </form> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/setup/strings.txt.pl b/template/en/default/setup/strings.txt.pl index eec0bd9..5824f95 100644 --- a/template/en/default/setup/strings.txt.pl +++ b/template/en/default/setup/strings.txt.pl @@ -28,6 +28,11 @@ %strings = ( any => 'any', + apachectl_failed => <<END, +WARNING: We could not check the configuration of Apache. This sometimes +happens when you are not running checksetup.pl as ##root##. To see the +problem we ran into, run: ##command## +END blacklisted => '(blacklisted)', checking_for => 'Checking for', checking_dbd => 'Checking available perl DBD modules...', @@ -57,15 +62,19 @@ END feature_inbound_email => 'Inbound Email', feature_jobqueue => 'Mail Queueing', feature_jsonrpc => 'JSON-RPC Interface', + feature_jsonrpc_faster => 'Make JSON-RPC Faster', feature_new_charts => 'New Charts', feature_old_charts => 'Old Charts', feature_mod_perl => 'mod_perl', feature_moving => 'Move Bugs Between Installations', feature_patch_viewer => 'Patch Viewer', + feature_rand_security => 'Improve cookie and token security', feature_smtp_auth => 'SMTP Authentication', feature_updates => 'Automatic Update Notifications', feature_xmlrpc => 'XML-RPC Interface', + file_remove => 'Removing ##name##...', + file_rename => 'Renaming ##from## to ##to##...', header => "* This is Bugzilla ##bz_ver## on perl ##perl_ver##\n" . "* Running on ##os_name## ##os_ver##", install_all => <<EOT, @@ -96,6 +105,18 @@ EOT # Note: When translating these "modules" messages, don't change the formatting # if possible, because there is hardcoded formatting in # Bugzilla::Install::Requirements to match the box formatting. + modules_message_apache => <<END, +*********************************************************************** +* APACHE MODULES * +*********************************************************************** +* Normally, when Bugzilla is upgraded, all Bugzilla users have to * +* clear their browser cache or Bugzilla will break. If you enable * +* certain modules in your Apache configuration (usually called * +* httpd.conf or apache2.conf) then your users will not have to clear * +* their caches when you upgrade Bugzilla. The modules you need to * +* enable are: * +* * +END modules_message_db => <<EOT, *********************************************************************** * DATABASE ACCESS * @@ -130,6 +151,7 @@ EOT module_not_found => "not found", module_ok => 'ok', module_unknown_version => "found unknown version", + no_such_module => "There is no Perl module on CPAN named ##module##.", ppm_repo_add => <<EOT, *********************************************************************** * Note For Windows Users * diff --git a/template/en/default/sidebar.xul.tmpl b/template/en/default/sidebar.xul.tmpl index e03d7e5..b2fa092 100644 --- a/template/en/default/sidebar.xul.tmpl +++ b/template/en/default/sidebar.xul.tmpl @@ -64,7 +64,7 @@ function normal_keypress_handler( aEvent ) { <box orient="vertical" flex="1"> <text class="text-link" onclick="load_relative_url('query.cgi')" value="new search"/> <text class="text-link" onclick="load_relative_url('report.cgi')" value="reports"/> - <text class="text-link" onclick="load_relative_url('enter_bug.cgi?format=guided&classification=__all')" value="new [% terms.bug %]"/> + <text class="text-link" onclick="load_relative_url('enter_bug.cgi')" value="new [% terms.bug %]"/> <separator class="thin"/> [% IF user.id %] @@ -105,9 +105,6 @@ function normal_keypress_handler( aEvent ) { [% filtered_username = user.login FILTER url_quote %] <text class="text-link" onclick="load_relative_url('[% Param('mybugstemplate').replace('%userid%', filtered_username) FILTER js FILTER html %]')" value="my [% terms.bugs %]"/> [%- END %] - [%- IF Param('usevotes') %] - <text class="text-link" onclick="load_relative_url('votes.cgi?action=show_user')" value="my votes"/> - [%- END %] [%- FOREACH q = user.queries %] <text class="text-link" onclick="load_relative_url('buglist.cgi?cmdtype=runnamed&namedcmd=[% q.name FILTER url_quote %]')" value="[% q.name FILTER html %]"/> diff --git a/template/en/default/welcome-admin.html.tmpl b/template/en/default/welcome-admin.html.tmpl index 3c03fb2..289a6bd 100644 --- a/template/en/default/welcome-admin.html.tmpl +++ b/template/en/default/welcome-admin.html.tmpl @@ -41,15 +41,15 @@ parameters for this installation; among others:</p> <ul> - <li><a href="editparams.cgi?section=core#urlbase">urlbase</a>, which is the URL + <li><a href="editparams.cgi?section=core#urlbase_desc">urlbase</a>, which is the URL pointing to this installation and which will be used in emails (which is also the reason you see this page: as long as this parameter is not set, you will see this page again and again).</li> - <li><a href="editparams.cgi?section=core#cookiepath">cookiepath</a> is important + <li><a href="editparams.cgi?section=core#cookiepath_desc">cookiepath</a> is important for your browser to manage your cookies correctly.</li> - <li><a href="editparams.cgi?section=general#maintainer">maintainer</a>, + <li><a href="editparams.cgi?section=general#maintainer_desc">maintainer</a>, the person responsible for this installation if something is running wrongly.</li> </ul> @@ -57,12 +57,12 @@ <p>Also important are the following parameters:</p> <ul> - <li><a href="editparams.cgi?section=auth#requirelogin">requirelogin</a>, if turned + <li><a href="editparams.cgi?section=auth#requirelogin_desc">requirelogin</a>, if turned on, will protect your installation from users having no account on this installation. In other words, users who are not explicitly authenticated with a valid account cannot see any data. This is what you want if you want to keep your data private.</li> - <li><a href="editparams.cgi?section=auth#createemailregexp">createemailregexp</a> + <li><a href="editparams.cgi?section=auth#createemailregexp_desc">createemailregexp</a> defines which users are allowed to create an account on this installation. If set to ".*" (the default), everybody is free to create his own account. If set to "@mycompany.com$", only users having an account @mycompany.com will be allowed to @@ -71,7 +71,7 @@ installation, you must absolutely set this parameter to something different from the default.</li> - <li><a href="editparams.cgi?section=mta#mail_delivery_method">mail_delivery_method</a> + <li><a href="editparams.cgi?section=mta#mail_delivery_method_desc">mail_delivery_method</a> defines the method used to send emails, such as sendmail or SMTP. You have to set it correctly to send emails.</li> </ul> diff --git a/template/en/default/whine/mail.html.tmpl b/template/en/default/whine/mail.html.tmpl index a4f0ede..ae4f00c 100644 --- a/template/en/default/whine/mail.html.tmpl +++ b/template/en/default/whine/mail.html.tmpl @@ -53,39 +53,42 @@ [% END %] </p> +[% IF queries.size %] + [% FOREACH query=queries %] -[% FOREACH query=queries %] + <h2>[%+ query.title FILTER html %]</h2> - <h2>[%+ query.title FILTER html %]</h2> - - <table width="100%"> - <tr> - <th align="left">ID</th> - <th align="left">Sev</th> - <th align="left">Pri</th> - <th align="left">Plt</th> - <th align="left">Assignee</th> - <th align="left">Status</th> - <th align="left">Resolution</th> - <th align="left">Summary</th> - </tr> - - [% FOREACH bug=query.bugs %] + <table width="100%"> <tr> - <td align="left"><a href="[%+ urlbase FILTER html %]show_bug.cgi?id= - [%- bug.bug_id %]">[% bug.bug_id %]</a></td> - <td align="left">[% display_value("bug_severity", bug.bug_severity) FILTER html %]</td> - <td align="left">[% display_value("priority", bug.priority) FILTER html %]</td> - <td align="left">[% display_value("rep_platform", bug.rep_platform) FILTER html %]</td> - <td align="left">[% bug.assigned_to FILTER html %]</td> - <td align="left">[% display_value("bug_status", bug.bug_status) FILTER html %]</td> - <td align="left">[% display_value("resolution", bug.resolution) FILTER html %]</td> - <td align="left">[% bug.short_desc FILTER html %]</td> + <th align="left">ID</th> + <th align="left">Sev</th> + <th align="left">Pri</th> + <th align="left">Plt</th> + <th align="left">Assignee</th> + <th align="left">Status</th> + <th align="left">Resolution</th> + <th align="left">Summary</th> </tr> - [% END %] - </table> -[% END %] + [% FOREACH bug=query.bugs %] + <tr> + <td align="left"><a href="[%+ urlbase FILTER html %]show_bug.cgi?id= + [%- bug.bug_id %]">[% bug.bug_id %]</a></td> + <td align="left">[% display_value("bug_severity", bug.bug_severity) FILTER html %]</td> + <td align="left">[% display_value("priority", bug.priority) FILTER html %]</td> + <td align="left">[% display_value("rep_platform", bug.rep_platform) FILTER html %]</td> + <td align="left">[% bug.assigned_to FILTER html %]</td> + <td align="left">[% display_value("bug_status", bug.bug_status) FILTER html %]</td> + <td align="left">[% display_value("resolution", bug.resolution) FILTER html %]</td> + <td align="left">[% bug.short_desc FILTER html %]</td> + </tr> + [% END %] + </table> + [% END %] +[% ELSE %] + + <h3>No [% terms.bugs %] were found that matched the search criteria.</h3> +[% END %] </body> </html> diff --git a/template/en/default/whine/mail.txt.tmpl b/template/en/default/whine/mail.txt.tmpl index 862ae26..13216d8 100644 --- a/template/en/default/whine/mail.txt.tmpl +++ b/template/en/default/whine/mail.txt.tmpl @@ -40,13 +40,13 @@ This search was scheduled by [% author.login %]. [% END %] - -[% FOREACH query=queries %] +[% IF queries.size %] + [% FOREACH query=queries %] [%+ query.title +%] [%+ "-" FILTER repeat(query.title.length) %] - [% FOREACH bug=query.bugs %] + [% FOREACH bug=query.bugs %] [% terms.Bug +%] [%+ bug.bug_id %]: [%+ urlbase %]show_bug.cgi?id=[% bug.bug_id +%] Priority: [%+ display_value("priority", bug.priority) -%] @@ -55,11 +55,14 @@ Assignee: [%+ bug.assigned_to %] Status: [%+ display_value("bug_status", bug.bug_status) %] [%- IF bug.resolution -%] Resolution: [% display_value("resolution", bug.resolution) -%] - [%- END %] + [%- END %] Summary: [% bug.short_desc %] - [% END %] + [% END %] -[% END %] + [% END %] +[% ELSE %] + No [% terms.bugs %] were found that matched the search criteria. +[% END %] |