diff options
author | Christian Ruppert <idl0r@gentoo.org> | 2015-07-11 15:27:33 +0200 |
---|---|---|
committer | Christian Ruppert <idl0r@gentoo.org> | 2015-07-11 15:27:33 +0200 |
commit | 4b2ce2725e9a4525e273fb1b08243aad74770a3d (patch) | |
tree | c90fb0fef5c9ac923817f908f1c3586efa47ec59 /template/en/default | |
parent | Bumped version to 4.4.9 (diff) | |
download | bugzilla-4b2ce2725e9a4525e273fb1b08243aad74770a3d.tar.gz bugzilla-4b2ce2725e9a4525e273fb1b08243aad74770a3d.tar.bz2 bugzilla-4b2ce2725e9a4525e273fb1b08243aad74770a3d.zip |
Vanilla 4.4.9 to 5.0 without history due to massive merge conflicts
Diffstat (limited to 'template/en/default')
229 files changed, 4620 insertions, 9826 deletions
diff --git a/template/en/default/account/auth/login-small.html.tmpl b/template/en/default/account/auth/login-small.html.tmpl index 818aa6b72..790c135bf 100644 --- a/template/en/default/account/auth/login-small.html.tmpl +++ b/template/en/default/account/auth/login-small.html.tmpl @@ -9,6 +9,9 @@ [%# Use the current script name. If an empty name is returned, # then we are accessing the home page. %] +[% USE Bugzilla %] +[% cgi = Bugzilla.cgi %] + [% login_target = cgi.url("-relative" => 1, "-query" => 1) %] [% IF !login_target OR login_target.match("^token.cgi") %] [% login_target = "index.cgi" %] @@ -25,76 +28,31 @@ onclick="return show_mini_login_form('[% qs_suffix %]')">Log In</a> [% Hook.process('additional_methods') %] - - <form action="[% login_target FILTER html %]" method="POST" + + <form action="[% login_target FILTER html %]" method="POST" class="mini_login bz_default_hidden" - id="mini_login[% qs_suffix FILTER html %]" - onsubmit="return check_mini_login_fields( '[% qs_suffix FILTER html %]' );" - > - <input id="Bugzilla_login[% qs_suffix FILTER html %]" - class="bz_login" - name="Bugzilla_login" - title="Login" - onfocus="mini_login_on_focus('[% qs_suffix FILTER js %]')" - > - <input class="bz_password" - id="Bugzilla_password[% qs_suffix FILTER html %]" - name="Bugzilla_password" - type="password" - title="Password" - > - <input class="bz_password bz_default_hidden bz_mini_login_help" type="text" - id="Bugzilla_password_dummy[% qs_suffix %]" value="password" - title="Password" - onfocus="mini_login_on_focus('[% qs_suffix FILTER js %]')" - > + id="mini_login[% qs_suffix FILTER html %]"> + <input id="Bugzilla_login[% qs_suffix FILTER html %]" required + name="Bugzilla_login" class="bz_login" + [% IF Param('emailsuffix') %] + placeholder="Login" + [% ELSE %] + type="email" placeholder="Email Address" + [% END %]> + <input class="bz_password" name="Bugzilla_password" type="password" + id="Bugzilla_password[% qs_suffix FILTER html %]" required + placeholder="Password"> [% IF Param('rememberlogin') == 'defaulton' || - Param('rememberlogin') == 'defaultoff' - %] + Param('rememberlogin') == 'defaultoff' %] <input type="checkbox" id="Bugzilla_remember[% qs_suffix %]" name="Bugzilla_remember" value="on" class="bz_remember" - [%+ "checked" IF Param('rememberlogin') == "defaulton" %]> + [%+ "checked" IF Param('rememberlogin') == "defaulton" %]> <label for="Bugzilla_remember[% qs_suffix %]">Remember</label> [% END %] <input type="hidden" name="Bugzilla_login_token" value="[% get_login_request_token() FILTER html %]"> <input type="submit" name="GoAheadAndLogIn" value="Log in" id="log_in[% qs_suffix %]"> - <script type="text/javascript"> - mini_login_constants = { - "login" : "login", - "warning" : "You must set the login and password before logging in." - }; - [%# We need this event to fire after autocomplete, because it does - # something different depending on whether or not there's already - # data in the login and password box. - # However, autocomplete happens at all sorts of different times in - # different browsers (before or after onDOMReady, before or after - # window.onload, in almost all combinations you can imagine). - # The only good solution I found is to time the event 200 - # milliseconds after window.onload for WebKit (doing it immediately - # at onload works in Chrome but not in Safari, but I can't detect - # them separately using YUI), and right after onDOMReady in Gecko. - # The WebKit solution is also fairly guaranteed to work on any - # browser (it's just strange, since the fields only populate 200 ms - # after the page loads), so it's the default. IE doesn't even - # recognize our forms as login forms, so I made it use the Gecko - # method also (since it's nicer visually). Opera never autocompletes - # forms without user interaction, so it also uses the Gecko method. - #%] - if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) { - YAHOO.util.Event.onDOMReady(function() { - init_mini_login_form('[% qs_suffix FILTER html %]'); - }); - } - else { - YAHOO.util.Event.on(window, 'load', function () { - window.setTimeout(function() { - init_mini_login_form('[% qs_suffix FILTER html %]'); - }, 200); - }); - } - </script> <a href="#" onclick="return hide_mini_login_form('[% qs_suffix %]')">[x]</a> </form> </li> @@ -105,11 +63,17 @@ <form action="token.cgi" method="post" id="forgot_form[% qs_suffix %]" class="mini_forgot bz_default_hidden"> <label for="login[% qs_suffix FILTER html %]">Login:</label> - <input type="text" name="loginname" size="20" id="login[% qs_suffix FILTER html %]"> + <input name="loginname" size="20" id="login[% qs_suffix FILTER html %]" required + [% IF Param('emailsuffix') %] + placeholder="Your Login" + [% ELSE %] + type="email" placeholder="Your Email Address" + [% END %]> <input id="forgot_button[% qs_suffix %]" value="Reset Password" type="submit"> <input type="hidden" name="a" value="reqpw"> - <input type="hidden" id="token[% qs_suffix FILTER html %]" name="token" value="[% issue_hash_token(['reqpw']) FILTER html %]"> + <input type="hidden" id="token[% qs_suffix FILTER html %]" name="token" + value="[% issue_hash_token(['reqpw']) FILTER html %]"> <a href="#" onclick="return hide_forgot_form('[% qs_suffix %]')">[x]</a> </form> </li> diff --git a/template/en/default/account/auth/login.html.tmpl b/template/en/default/account/auth/login.html.tmpl index 77a1ba2d6..0af84542d 100644 --- a/template/en/default/account/auth/login.html.tmpl +++ b/template/en/default/account/auth/login.html.tmpl @@ -15,8 +15,7 @@ [% END %] [% PROCESS global/header.html.tmpl - title = "Log in to $terms.Bugzilla", - onload = "document.forms['login'].Bugzilla_login.focus()" + title = "Log in to $terms.Bugzilla" %] [% USE Bugzilla %] @@ -25,20 +24,29 @@ [% terms.Bugzilla %] needs a legitimate login and password to continue. </p> -<form name="login" action="[% target FILTER html %]" method="POST" +<form name="login" action="[% urlbase FILTER html %][% target FILTER html %]" method="POST" [%- IF Bugzilla.cgi.param("data") %] enctype="multipart/form-data"[% END %]> <table> <tr> - <th align="right"><label for="Bugzilla_login">Login:</label></th> + <th> + <label for="Bugzilla_login"> + [% IF Param('emailsuffix') %] + Login: + [% ELSE %] + Your Email Address: + [% END %] + </label> + </th> <td> - <input size="35" id="Bugzilla_login" name="Bugzilla_login"> + <input size="35" id="Bugzilla_login" name="Bugzilla_login" + [%- ' type="email"' UNLESS Param('emailsuffix') %] autofocus required> [% Param('emailsuffix') FILTER html %] </td> </tr> <tr> - <th align="right"><label for="Bugzilla_password">Password:</label></th> + <th><label for="Bugzilla_password">Password:</label></th> <td> - <input type="password" size="35" id="Bugzilla_password" name="Bugzilla_password"> + <input type="password" size="35" id="Bugzilla_password" name="Bugzilla_password" required> </td> </tr> @@ -91,7 +99,7 @@ If you don't have a [% terms.Bugzilla %] account, you can <a href="createaccount.cgi">create a new account</a>. [% IF Param("requirelogin") %] - A user account is required because this [% terms.Bugzilla %] + A user account is required because this Bugzilla installation is only accessible to authenticated users. [% ELSIF target.match("_bug\.cgi$") %] A user account is required to file a new [% terms.bug %] or to comment @@ -109,7 +117,7 @@ If you have an account, but have forgotten your password, enter your login name below and submit a request to change your password.<br> - <input size="35" name="loginname"> + <input size="35" name="loginname" required> <input type="hidden" id="token" name="token" value="[% issue_hash_token(['reqpw']) FILTER html %]"> <input type="submit" id="request" value="Reset Password"> </form> diff --git a/template/en/default/account/cancel-token.txt.tmpl b/template/en/default/account/cancel-token.txt.tmpl index b9a7dd82e..384f2cfe0 100644 --- a/template/en/default/account/cancel-token.txt.tmpl +++ b/template/en/default/account/cancel-token.txt.tmpl @@ -11,7 +11,7 @@ To: [% emailaddress %] Subject: [% PROCESS subject %] X-Bugzilla-Type: admin -A request was canceled from [% remoteaddress %]. +[% PROCESS subject %] from [% remoteaddress %]. If you did not request this, it could be either an honest mistake or someone attempting to break into your [% terms.Bugzilla %] account. @@ -81,7 +81,7 @@ Canceled Because: [% PROCESS cancelactionmessage %] [% ELSE %] [%# Give sensible error if the cancel-token function is used incorrectly. #%] - You are using [% terms.Bugzilla %]'s cancel-token function incorrectly. You + You are using Bugzilla's cancel-token function incorrectly. You passed in the string '[% cancelaction %]'. The correct use is to pass in a tag, and define that tag in the file <kbd>cancel-token.txt.tmpl</kbd>. diff --git a/template/en/default/account/create.html.tmpl b/template/en/default/account/create.html.tmpl index bf2cf31f0..5711a726f 100644 --- a/template/en/default/account/create.html.tmpl +++ b/template/en/default/account/create.html.tmpl @@ -13,13 +13,9 @@ # Param("emailsuffix") is used to pre-fill the email field. #%] -[% title = BLOCK %] - Create a new [% terms.Bugzilla %] account -[% END %] - [% PROCESS global/header.html.tmpl - title = title - onload = "document.forms['account_creation_form'].login.focus();" %] + title = "Create a new $terms.Bugzilla account" +%] <p> To create a [% terms.Bugzilla %] account, all you need to do is to enter @@ -32,16 +28,28 @@ You will receive an email at this address to confirm the creation of your account. <b>You will not be able to log in until you receive the email.</b> If it doesn't arrive within a reasonable amount of time, you may contact - the maintainer of this [% terms.Bugzilla %] installation + the maintainer of this Bugzilla installation at <a href="mailto:[% Param("maintainer") %]">[% Param("maintainer") %]</a>. </p> +[% IF Param('allowemailchange') %] +<p> + If you already have an account and want to change your + [% IF Param('emailsuffix') == '' %] + email address, + [% ELSE %] + login name, + [% END %] + you can change it from the Preferences page after logging in. +</p> +[% END %] + <p> A user account is required to report new [% terms.bugs %] or to comment into existing ones, as you may be contacted for more information if needed. This also lets other users clearly identify who is the author of comments or changes made into [% terms.bugs %]. <b>Note that your email address will - <u>never</u> be displayed to logged out users. Only registered users will be + <em>never</em> be displayed to logged out users. Only registered users will be able to see it.</b> </p> @@ -56,18 +64,16 @@ [% END %] <form id="account_creation_form" method="get" action="createaccount.cgi"> - <table> - <tr> - <td align="right"> - <b>Email address:</b> - </td> - <td> - <input size="35" id="login" name="login"> - [% Param('emailsuffix') FILTER html %] - </td> - </tr> - </table> - <br> + <span class="label"> + [% IF Param('emailsuffix') %] + Login: + [% ELSE %] + Email address: + [% END %] + </span> + <input size="35" id="login" name="login" autofocus + [%- ' type="email"' UNLESS Param('emailsuffix') %] required> + [% Param('emailsuffix') FILTER html %] <input type="hidden" id="token" name="token" value="[% issue_hash_token(['create_account']) FILTER html %]"> <input type="submit" id="send" value="Send"> </form> diff --git a/template/en/default/account/email/confirm-new.html.tmpl b/template/en/default/account/email/confirm-new.html.tmpl index 0fb9b7e7d..3b9866004 100644 --- a/template/en/default/account/email/confirm-new.html.tmpl +++ b/template/en/default/account/email/confirm-new.html.tmpl @@ -15,7 +15,9 @@ [% title = BLOCK %]Create a new user account for '[% email FILTER html %]'[% END %] [% PROCESS "global/header.html.tmpl" title = title - onload = "document.forms['confirm_account_form'].realname.focus();" %] +%] + +[% password_complexity = Param('password_complexity') %] <p> To create your account, you must enter a password in the form below. @@ -28,26 +30,34 @@ <input type="hidden" name="a" value="confirm_new_account"> <table> <tr> - <th align="right">Email Address:</th> + <th>Email Address:</th> <td>[% email FILTER html %]</td> </tr> <tr> - <th align="right"><small><i>(OPTIONAL)</i></small> <label for="realname">Real Name</label>:</th> - <td><input type="text" id="realname" name="realname" value=""></td> + <th><small><i>(OPTIONAL)</i></small> <label for="realname">Real Name</label>:</th> + <td><input id="realname" name="realname" autofocus></td> </tr> <tr> - <th align="right"><label for="passwd1">Type your password</label>:</th> + <th><label for="passwd1">Type your password</label>:</th> <td> - <input type="password" id="passwd1" name="passwd1" value=""> - (minimum [% constants.USER_PASSWORD_MIN_LENGTH FILTER none %] characters) + <input type="password" id="passwd1" name="passwd1" value="" required> + (Password should be a minimum of [% constants.USER_PASSWORD_MIN_LENGTH FILTER none %] characters long + [% IF password_complexity == "mixed_letters" %] + and must contain at least one UPPER and one lowercase letter + [% ELSIF password_complexity == "letters_numbers" %] + and must contain at least one UPPER and one lowercase letter and a number + [% ELSIF password_complexity == "letters_numbers_specialchars" %] + and must contain at least one letter, a number and a special character + [% END ~%] + .) </td> </tr> <tr> - <th align="right"><label for="passwd2">Confirm your password</label>:</th> - <td><input type="password" id="passwd2" name="passwd2" value=""></td> + <th><label for="passwd2">Confirm your password</label>:</th> + <td><input type="password" id="passwd2" name="passwd2" value="" required></td> </tr> <tr> - <th align="right"> </th> + <th> </th> <td><input type="submit" id="confirm" value="Create"></td> </tr> </table> @@ -55,7 +65,7 @@ <p> This account will not be created if this form is not completed by - <u>[% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z") %]</u>. + <b>[% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z") %]</b>. </p> <p> diff --git a/template/en/default/account/email/confirm.html.tmpl b/template/en/default/account/email/confirm.html.tmpl index 5b547782d..8edc7a9ba 100644 --- a/template/en/default/account/email/confirm.html.tmpl +++ b/template/en/default/account/email/confirm.html.tmpl @@ -22,11 +22,11 @@ <input type="hidden" name="a" value="chgem"> <table> <tr> - <th align="right">Password:</th> - <td><input type="password" name="password" size="36"></td> + <th>Password:</th> + <td><input type="password" name="password" size="36" required></td> </tr> <tr> - <th align="right"> </th> + <th> </th> <td><input type="submit" id="confirm" value="Submit"></td> </tr> </table> diff --git a/template/en/default/account/password/forgotten-password.txt.tmpl b/template/en/default/account/password/forgotten-password.txt.tmpl index 0c135a9ed..de2e79596 100644 --- a/template/en/default/account/password/forgotten-password.txt.tmpl +++ b/template/en/default/account/password/forgotten-password.txt.tmpl @@ -12,7 +12,9 @@ Subject: [% terms.Bugzilla %] Change Password Request X-Bugzilla-Type: admin You have (or someone impersonating you has) requested to change your -[%+ terms.Bugzilla %] password. To complete the change, visit the following link: +[%+ terms.Bugzilla %] password. The request originated from [% ip_addr %]. + +To complete the change, visit the following link: [%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=cfmpw @@ -24,3 +26,7 @@ this request, visit the following link: If you do nothing, the request will lapse after [% constants.MAX_TOKEN_AGE %] days (on [% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z", timezone) %]) or when you log in successfully. + +If you think someone tried to compromise your account, please inform +[%+ Param('maintainer') %] with the IP address reported above +and the exact time when you got this email. 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 95e4d3fcf..eca11174f 100644 --- a/template/en/default/account/password/set-forgotten-password.html.tmpl +++ b/template/en/default/account/password/set-forgotten-password.html.tmpl @@ -28,21 +28,21 @@ <input type="hidden" name="a" value="chgpw"> <table> <tr> - <th align="right">New Password:</th> + <th>New password:</th> <td> - <input type="password" name="password"> + <input type="password" name="password" required> </td> </tr> <tr> - <th align="right">New Password Again:</th> + <th>Confirm new password:</th> <td> - <input type="password" name="matchpassword"> + <input type="password" name="matchpassword" required> </td> </tr> - + <tr> - <th align="right"> </th> + <th> </th> <td> <input type="submit" id="update" value="Submit"> </td> diff --git a/template/en/default/account/prefs/account.html.tmpl b/template/en/default/account/prefs/account.html.tmpl index 59e4ab76a..af1df315e 100644 --- a/template/en/default/account/prefs/account.html.tmpl +++ b/template/en/default/account/prefs/account.html.tmpl @@ -21,7 +21,7 @@ </td> </tr> <tr> - <th align="right">Password:</th> + <th>Password:</th> <td> <input type="hidden" name="old_login" value="[% user.login FILTER html %]"> <input type="password" name="old_password"> @@ -34,22 +34,22 @@ [% IF user.authorizer.can_change_password %] <tr> - <th align="right">New password:</th> + <th>New password:</th> <td> <input type="password" name="new_password1"> </td> - </tr> + </tr> <tr> - <th align="right">Confirm new password:</th> + <th>Confirm new password:</th> <td> <input type="password" name="new_password2"> </td> - </tr> + </tr> [% END %] <tr> - <th align="right">Your real name (optional, but encouraged):</th> + <th>Your real name (optional, but encouraged):</th> <td> <input size="35" name="realname" value="[% realname FILTER html %]"> </td> @@ -59,28 +59,35 @@ [% IF login_change_date %] [% IF new_login_name %] <tr> - <th align="right">Pending email address:</th> + <th>Pending email address:</th> <td>[% new_login_name FILTER html %]</td> </tr> <tr> - <th align="right">Change request expires:</th> + <th>Change request expires:</th> <td>[% login_change_date FILTER time %]</td> </tr> [% ELSE %] <tr> - <th align="right">Confirmed email address:</th> + <th>Confirmed email address:</th> <td>[% user.login FILTER html %]</td> </tr> <tr> - <th align="right">Completion date:</th> + <th>Completion date:</th> <td>[% login_change_date FILTER time %]</td> </tr> [% END %] [% ELSE %] <tr> - <th align="right">New email address:</th> + <th> + [% IF Param('emailsuffix') %] + New login: + [% ELSE %] + New email address: + [% END %] + </th> <td> - <input size="35" name="new_login_name"> + <input size="35" id="new_login_name" name="new_login_name" + [%- ' type="email"' UNLESS Param('emailsuffix') %]> </td> </tr> [% END %] diff --git a/template/en/default/account/prefs/apikey.html.tmpl b/template/en/default/account/prefs/apikey.html.tmpl new file mode 100644 index 000000000..bed3f3809 --- /dev/null +++ b/template/en/default/account/prefs/apikey.html.tmpl @@ -0,0 +1,84 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # api_keys: array. Array of api keys this user has. + # any_revoked: boolean. True is any keys have been revoked. + #%] + +<p> + API keys are used to authenticate WebService API calls. You can create more than + one API key if required. Each API key has an optional description which can help + you record what each key is used for. Documentation on how to log in is + available from + <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService.html#LOGGING_IN">here</a>. +</p> + +<h3>Existing API keys</h3> + +<p>You can update the description, and revoke or unrevoke existing API keys +here.</p> + +<table id="email_prefs"> + <tr class="column_header"> + <th>API key</th> + <th>Description (optional)</th> + <th>Last used</th> + <th>Revoked</th> + </tr> + + [% FOREACH api_key IN api_keys %] + <tr[% IF api_key.revoked %] class="apikey_revoked"[% END %]> + <td>[% api_key.api_key FILTER html %]</td> + <td> + <input name="description_[% api_key.id FILTER html %]" + id="description_[% api_key.id FILTER html %]" + value="[% api_key.description FILTER html %]"> + </td> + [% IF api_key.last_used %] + <td>[% api_key.last_used FILTER time %]</td> + [% ELSE %] + <td class="center"><i>never used</i></td> + [% END %] + <td class="center"> + <input type="checkbox" value="1" + name="revoked_[% api_key.id FILTER html %]" + id="revoked_[% api_key.id FILTER html %]" + [% IF api_key.revoked %] checked="checked" [% END %]> + </td> + </tr> + [% END %] + [% UNLESS api_keys.size %] + <tr><td colspan="4">You don't have any API keys.</td></tr> + [% END %] +</table> + +[% IF any_revoked %] + <a id="apikey_revoked_controller" class="bz_default_hidden" + href="javascript:TUI_toggle_class('apikey_revoked')">Hide Revoked Keys</a> + [%# Show the link if the browser supports JS %] + <script type="text/javascript"> + TUI_hide_default('apikey_revoked'); + TUI_alternates['apikey_revoked'] = 'Show Revoked Keys'; + YAHOO.util.Dom.removeClass('apikey_revoked_controller', + 'bz_default_hidden'); + </script> +[% END %] + +<h3>New API key</h3> + +<p>You can generate a new API key by ticking the check box below and optionally +providing a description for the API key. The API key will be randomly +generated for you.</p> + +<p> + <input type="checkbox" name="new_key" id="new_key"> + Generate a new API key with optional description + <input name="new_description" id="new_description"> +</p> + diff --git a/template/en/default/account/prefs/email.html.tmpl b/template/en/default/account/prefs/email.html.tmpl index 57fa60f3b..052484174 100644 --- a/template/en/default/account/prefs/email.html.tmpl +++ b/template/en/default/account/prefs/email.html.tmpl @@ -47,7 +47,10 @@ function SetCheckboxes(setting) { for (var count = 0; count < document.userprefsform.elements.length; count++) { var theinput = document.userprefsform.elements[count]; - if (theinput.type == "checkbox" && !theinput.disabled) { + if (theinput.type == "checkbox" + && !theinput.disabled + && !theinput.name.match("remove_ignored_bug")) + { if (theinput.name.match("neg")) { theinput.checked = !setting; } @@ -57,61 +60,36 @@ function SetCheckboxes(setting) { } } } - -document.write('<input type="button" value="Enable All Mail" onclick="SetCheckboxes(true); return false;">\n'); -document.write('<input type="button" value="Disable All Mail" onclick="SetCheckboxes(false); return false;">\n'); // --> </script> +<input type="button" value="Enable All Mail" onclick="SetCheckboxes(true); return false;"> +<input type="button" value="Disable All Mail" onclick="SetCheckboxes(false); return false;"> + <hr> -<table> - <tr> - <td colspan="2"> - <b>Global options:</b> - </td> - </tr> +<h3>Global options</h3> + +[% prefname = "email-$constants.REL_ANY-$constants.EVT_FLAG_REQUESTED" %] +<input type="checkbox" name="[% prefname %]" id="[% prefname %]" value="1" + [%+ 'checked="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> +[% prefname = "email-$constants.REL_ANY-$constants.EVT_REQUESTED_FLAG" %] +<input type="checkbox" name="[% prefname %]" id="[% prefname %]" value="1" + [%+ 'checked="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> - <tr> - <td width="150"></td> - <td> - [% prefname = "email-$constants.REL_ANY-$constants.EVT_FLAG_REQUESTED" %] - <input type="checkbox" name="[% prefname %]" id="[% prefname %]" - value="1" - [% " 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> - </tr> - <tr> - <td width="150"></td> - <td> - [% prefname = "email-$constants.REL_ANY-$constants.EVT_REQUESTED_FLAG" %] - <input type="checkbox" name="[% prefname %]" id="[% prefname %]" - value="1" - [% " 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> - </tr> [% IF user.is_global_watcher %] - <tr> - <td width="150"></td> - <td> - You are watching all [% terms.bugs %]. To be removed from this role, - contact - <a href="mailto:[% Param("maintainer") %]">[% Param("maintainer") %]</a>. - </td> - </tr> + <p> + You are watching all [% terms.bugs %]. To be removed from this role, contact + <a href="mailto:[% Param("maintainer") %]">[% Param("maintainer") %]</a>. + </p> [% END %] -</table> <hr> -<b>Field/recipient specific options:</b> -<br> -<br> + +<h3>Field/recipient specific options</h3> [% events = [ { id = constants.EVT_ADDED_REMOVED, @@ -129,7 +107,7 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb { id = constants.EVT_ATTACHMENT, description = "New attachments are added" }, { id = constants.EVT_ATTACHMENT_DATA, - description = "Some attachment data changes" }, + description = "Attachment details changes" }, { id = constants.EVT_KEYWORD, description = "The keywords field changes" }, { id = constants.EVT_CC, @@ -169,40 +147,34 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb [% num_columns = relationships.size %] -<table class="bz_emailprefs" border="1"> - <tr> - <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%"> - <b>I want to receive mail when:</b> - </td> +<table id="email_prefs"> + <tr class="column_header"> + <th colspan="[% num_columns FILTER html %]"> + When my relationship to this [% terms.bug %] is: + </th> + <th>I want to receive mail when:</th> </tr> <tr> [% FOREACH relationship = relationships %] - <th align="center" width="9%"> - [% relationship.description FILTER html %] - </th> + <th class="role_header">[% relationship.description FILTER html %]</th> [% END %] </tr> - + [% FOREACH event = events %] [% count = loop.count() %] <tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]"> [% FOREACH relationship = relationships %] - <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 - no_added_removed.contains(relationship.id) - %] - disabled - [% ELSIF user.mail_settings.${relationship.id}.${event.id} %] - checked - [% END %]> + <td class="center"> + <input type="checkbox" value="1" + name="email-[% relationship.id %]-[% event.id %]" + [%# The combinations don't always make sense; disable a couple %] + [% IF event.id == constants.EVT_ADDED_REMOVED + AND no_added_removed.contains(relationship.id) %] + disabled="disabled" + [% ELSIF user.mail_settings.${relationship.id}.${event.id} %] + checked="checked" + [% END %]> </td> [% END %] <td> @@ -210,62 +182,54 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb </td> </tr> [% END %] - - <tr> - <td colspan="[% num_columns FILTER html %]" - align="center" width="50%"> - - </td> - <td width="40%"> - <b>but not when (overrides above):</b> - </td> + + <tr class="column_header"> + <th colspan="[% num_columns FILTER html %]"> </th> + <th>but not when (overrides above):</th> </tr> [% FOREACH event = neg_events %] [% count = loop.count() %] <tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]"> [% FOREACH relationship = relationships %] - <td align="center"> - <input type="checkbox" - name="neg-email-[% relationship.id %]-[% event.id %]" - value="1" - [% " checked" IF NOT user.mail_settings.${relationship.id}.${event.id} %]> + <td class="center"> + <input type="checkbox" value="1" + name="neg-email-[% relationship.id %]-[% event.id %]" + [%+ 'checked="checked"' IF NOT user.mail_settings.${relationship.id}.${event.id} %]> </td> [% END %] - <td> - [% event.description FILTER html %] - </td> + <td>[% event.description FILTER html %]</td> </tr> [% END %] - </table> <hr> -<b>User Watching</b> + +<h3>User Watching</h3> <p> If you watch a user, it is as if you are standing in their shoes for the -purposes of getting email. Email is sent or not according to <u>your</u> -preferences for <u>their</u> relationship to the [% terms.bug %] +purposes of getting email. Email is sent or not according to <em>your</em> +preferences for <em>their</em> relationship to the [% terms.bug %] (e.g. Assignee). </p> -<p> [% IF watchedusers.size %] -You are watching everyone in the following list: - </p> + <p>You are watching everyone in the following list:</p> <p> <select id="watched_by_you" name="watched_by_you" multiple="multiple" size="5"> [% FOREACH w = watchedusers %] <option value="[% w FILTER html %]">[% w FILTER html %]</option> [% END %] - </select> <br /> + </select> + <br> <input type="checkbox" id="remove_watched_users" name="remove_watched_users"> <label for="remove_watched_users">Remove selected users from my watch list</label> + </p> [% ELSE %] -You are currently not watching any users. + <p>You are currently not watching any users.</p> [% END %] -</p> + <p id="new_watched_by_you">Add users to my watch list (comma separated list): [% INCLUDE global/userselect.html.tmpl @@ -275,7 +239,7 @@ You are currently not watching any users. size => 60 multiple => 5 %] -</p> +</p> <p id="watching_you">Users watching you:<br> [% IF watchers.size %] @@ -289,4 +253,42 @@ You are currently not watching any users. <hr> -<br> +<h3>Ignore [% terms.Bugs %]</h3> + +<p> + You can specify a list of [% terms.bugs %] from which you never want to get + any email notification of any kind by adding their ID(s) as a comma-separated + list. Removing [% terms.abug %] by selecting it from the current ignored list + will re-enable email notifications for the [% terms.bug %]. +</p> +[% IF user.bugs_ignored.size %] + <p> + You are currently ignoring: + <table> + [% FOREACH bug = user.bugs_ignored %] + <tr> + <td> + <input type="checkbox" name="remove_ignored_bug_[% bug.id FILTER html %]" value="1"> + </td> + <td><a href="[% urlbase FILTER html %]show_bug.cgi?id=[% bug.id FILTER uri %]"> + [% bug.id FILTER html %]</a> + </td> + <td>[% bug.status FILTER html %]</td> + <td> + [% IF user.can_see_bug(bug.id) %] + - [% bug.summary FILTER html %] + [% ELSE %] + (private) + [% END %] + </td> + </tr> + [% END %] + </table> + </p> +[% END %] + +<p> + Add [% terms.bugs %]:<br> + <input type="text" id="add_ignored_bugs" + name="add_ignored_bugs" size="60"> +</p> diff --git a/template/en/default/account/prefs/permissions.html.tmpl b/template/en/default/account/prefs/permissions.html.tmpl index 450765afc..53583f35b 100644 --- a/template/en/default/account/prefs/permissions.html.tmpl +++ b/template/en/default/account/prefs/permissions.html.tmpl @@ -17,12 +17,11 @@ # other people. #%] -<table align="center"> - <tr> - <td> + <div id="permissions"> [% IF has_bits.size %] - You have the following permission bits set on your account: - <table align="center"> + <p>You have the following permission bits set on your account:</p> + + <table> [% FOREACH bit_description = has_bits %] <tr> <td>[% bit_description.name FILTER html %]</td> @@ -34,46 +33,47 @@ [% FOREACH privs = ["editcomponents", "canconfirm", "editbugs"] %] [% SET products = ${"local_$privs"} %] [% IF products && products.size %] - <br> <p> You also have local '[% privs FILTER html %]' privileges for the following products: </p> - <p> + <ul> [% FOREACH product = products %] - [% product.name FILTER html %]<br> + <li>[% product.name FILTER html %]</li> [% END %] - </p> + </ul> [% END %] [% END %] [% ELSE %] - There are no permission bits set on your account. + <p>There are no permission bits set on your account.</p> [% END %] [% IF user.in_group('editusers') %] - <br> - You have editusers privileges. You can turn on and off - all permissions for all users. + <p> + You have editusers privileges. You can turn on and off all + permissions for all users. + </p> [% ELSIF set_bits.size %] - <br> - And you can turn on or off the following bits for - <a href="editusers.cgi">other users</a>: - <table align="center"> + <p> + And you can turn on or off the following bits for + <a href="editusers.cgi">other users</a>: + </p> + + <table> [% FOREACH bit_description = set_bits %] <tr> <td>[% bit_description.name FILTER html %]</td> <td>[% bit_description.desc FILTER html_light %]</td> </tr> [% END %] - </table> + </table> [% END %] [% IF user.in_group('bz_sudoers') %] - <br> - You are a member of the <b>bz_sudoers</b> group, so you can - <a href="relogin.cgi?action=prepare-sudo">impersonate someone else</a>. + <p> + You are a member of the <b>bz_sudoers</b> group, so you can + <a href="relogin.cgi?action=prepare-sudo">impersonate someone else</a>. + </p> [% END %] - </td> - </tr> -</table> + </div> diff --git a/template/en/default/account/prefs/prefs.html.tmpl b/template/en/default/account/prefs/prefs.html.tmpl index 4416c95dd..8875eb26f 100644 --- a/template/en/default/account/prefs/prefs.html.tmpl +++ b/template/en/default/account/prefs/prefs.html.tmpl @@ -23,25 +23,25 @@ #%] [% filtered_login = user.login FILTER html %] -[% PROCESS global/header.html.tmpl - title = "User Preferences" - subheader = filtered_login - style_urls = ['skins/standard/admin.css'] - javascript_urls = ['js/util.js', 'js/field.js'] - doc_section = "userpreferences.html" - yui = ['autocomplete'] - %] [% tabs = [{ name => "settings", label => "General Preferences", - link => "userprefs.cgi?tab=settings", saveable => "1" }, - { name => "email", label => "Email Preferences", - link => "userprefs.cgi?tab=email", saveable => "1" }, - { name => "saved-searches", label => "Saved Searches", - link => "userprefs.cgi?tab=saved-searches", saveable => "1" }, + link => "userprefs.cgi?tab=settings", saveable => "1", + doc_section => "using/preferences.html#general-preferences" }, + { name => "email", label => "Email Preferences", + link => "userprefs.cgi?tab=email", saveable => "1", + doc_section => "using/preferences.html#email-preferences" }, + { name => "saved-searches", label => "Saved Searches", + link => "userprefs.cgi?tab=saved-searches", saveable => "1", + doc_section => "using/preferences.html#saved-searches" }, { name => "account", label => "Account Information", - link => "userprefs.cgi?tab=account", saveable => "1" }, - { name => "permissions", label => "Permissions", - link => "userprefs.cgi?tab=permissions", saveable => "0" } ] %] + link => "userprefs.cgi?tab=account", saveable => "1", + doc_section => "using/preferences.html#account-information" }, + { name => "apikey", label => "API Keys", + link => "userprefs.cgi?tab=apikey", saveable => "1", + doc_section => "using/preferences.html#api-keys" }, + { name => "permissions", label => "Permissions", + link => "userprefs.cgi?tab=permissions", saveable => "0", + doc_section => "using/preferences.html#permissions" } ] %] [% Hook.process('tabs') %] @@ -52,6 +52,16 @@ [% END %] [% END %] +[% PROCESS global/header.html.tmpl + title = current_tab.label + subheader = filtered_login + generate_api_token = 1 + style_urls = ['skins/standard/admin.css'] + javascript_urls = ['js/util.js', 'js/field.js', 'js/TUI.js'] + doc_section = current_tab.doc_section + yui = ['autocomplete'] + %] + [% WRAPPER global/tabs.html.tmpl tabs = tabs current_tab = current_tab @@ -63,8 +73,9 @@ [% IF email_changes_saved %] <p> - An email has been sent to both old and new email - addresses to confirm the change of email address. + In order to confirm your request, we have sent an email to your + new email address. As a precaution, an email has also been sent + to your old address allowing you to cancel this change if needed. </p> [% END %] </div> @@ -83,16 +94,10 @@ [% IF current_tab.saveable %] <input type="hidden" name="dosave" value="1"> - [% UNLESS dont_show_button %] - <table> - <tr> - <td width="150"> </td> - <td> - <input type="submit" id="update" value="Submit Changes"> - </td> - </tr> - </table> + <p> + <input type="submit" id="update" value="Submit Changes"> + </p> [% END %] </form> [% END %] diff --git a/template/en/default/account/prefs/saved-searches.html.tmpl b/template/en/default/account/prefs/saved-searches.html.tmpl index 11d7ef868..9b0447a83 100644 --- a/template/en/default/account/prefs/saved-searches.html.tmpl +++ b/template/en/default/account/prefs/saved-searches.html.tmpl @@ -30,58 +30,40 @@ <p>Your saved searches are as follows:</p> -<blockquote> - <table border="1" cellpadding="3"> - <tr> - <th> - Search - </th> - <th> - Run - </th> - <th> - Edit - </th> - <th> - Forget - </th> - <th> - Show in - Footer - </th> + <table id="saved_search_prefs"> + <tr class="column_header"> + <th>Search</th> + <th>Run</th> + <th>Edit</th> + <th>Forget</th> + <th>Show in Footer</th> [% may_share = user.in_group(Param('querysharegroup')) && queryshare_groups.size %] [% IF may_share %] - <th> - Share With a Group - </th> + <th>Share With a Group</th> [% END %] + [% Hook.process('saved-header') %] </tr> + <tr> <td>My [% terms.Bugs %]</td> <td> [% filtered_username = user.login FILTER uri %] <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">Run</a> </td> - <td> - - </td> - <td> - - </td> - <td align="center"> - <input type="checkbox" - name="showmybugslink" - value="1" - [% " checked" IF user.showmybugslink %]> + <td></td> + <td></td> + <td class="center"> + <input type="checkbox" name="showmybugslink" value="1" + [%+ 'checked="checked"' IF user.showmybugslink %]> </td> [% IF may_share %] - <td> - — - </td> + <td>—</td> [% END %] + [% Hook.process('saved-row') %] </tr> + [% FOREACH q = user.queries %] - <tr> + <tr [% 'class="shared_search"' IF q.shared_with_group.id %]> <td>[% q.name FILTER html %]</td> <td> <a href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd=[% q.name FILTER uri %] @@ -100,7 +82,7 @@ [% issue_hash_token([q.id, q.name]) FILTER uri %]">Forget</a> [% END %] </td> - <td align="center"> + <td class="center"> <input type="checkbox" name="link_in_footer_[% q.id FILTER html %]" value="1" @@ -119,6 +101,11 @@ >[% group.name FILTER html %]</option> [% END %] </select> + [% IF q.shared_with_group.id %] + (<a href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd= + [% q.name FILTER uri %]&sharer_id= + [% user.id FILTER uri %]">Link</a>) + [% END %] [% IF user.can_bless %] <span [% IF !bless_group_ids.grep("^$q.shared_with_group.id\$").0 %]class="bz_default_hidden"[% END %]> @@ -133,41 +120,30 @@ [% END %] </td> [% END %] + [% Hook.process('saved-row') %] </tr> [% END %] </table> + [% IF user.can_bless %] <p>Note that for every search that has the "Add to footer" selected, a link to the shared search is added to the footer of every user that is a direct member of the group at the time you click Submit Changes.</p> [% END %] -</blockquote> [% IF user.queries_available.size %] <p>You may use these searches saved and shared by others:</p> - <table border="1" cellpadding="3"> - <tr> - <th> - Search - </th> - <th> - Shared By - </th> - <th> - Shared To - </th> - <th> - Run - </th> - <th> - Edit - </th> - <th> - Show in - Footer - </th> + <table id="shared_search_prefs"> + <tr class="column_header"> + <th>Search</th> + <th>Shared By</th> + <th>Shared To</th> + <th>Run</th> + <th>Edit</th> + <th>Show in Footer</th> </tr> + [% FOREACH q = user.queries_available %] <tr> <td>[% q.name FILTER html %]</td> @@ -182,7 +158,7 @@ <a href="query.cgi?[% q.edit_link FILTER html %]&known_name= [% q.name FILTER uri %]">Edit</a> </td> - <td align="center"> + <td class="center"> <input type="checkbox" name="link_in_footer_[% q.id FILTER html %]" value="1" diff --git a/template/en/default/account/prefs/settings.html.tmpl b/template/en/default/account/prefs/settings.html.tmpl index 580795835..a7055c67f 100644 --- a/template/en/default/account/prefs/settings.html.tmpl +++ b/template/en/default/account/prefs/settings.html.tmpl @@ -29,12 +29,12 @@ </p> [% END %] - <table border="0" cellpadding="8"> + <table id="user_prefs"> [% FOREACH name = setting_names %] [% default_name = name _ '-isdefault' %] [% default_val = settings.${name}.default_value %] <tr> - <td align="right"> + <td class="right"> [% setting_descs.$name OR name FILTER html %] </td> <td> diff --git a/template/en/default/account/profile-activity.html.tmpl b/template/en/default/account/profile-activity.html.tmpl index 3f8030a0e..ff989c6a5 100644 --- a/template/en/default/account/profile-activity.html.tmpl +++ b/template/en/default/account/profile-activity.html.tmpl @@ -22,12 +22,13 @@ #%] [% title = BLOCK %] - Account History for '[% otheruser.login FILTER html %]' + Account History for '[% otheruser.identity FILTER html %]' [% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] %] [% PROCESS admin/users/listselectvars.html.tmpl diff --git a/template/en/default/admin/admin.html.tmpl b/template/en/default/admin/admin.html.tmpl index 38194e963..7e3e5a157 100644 --- a/template/en/default/admin/admin.html.tmpl +++ b/template/en/default/admin/admin.html.tmpl @@ -7,13 +7,13 @@ #%] [% title = BLOCK %] - Administer your installation ([% terms.Bugzilla %] + Administer your installation (Bugzilla [%+ constants.BUGZILLA_VERSION FILTER html %]) [% END %] [% PROCESS global/header.html.tmpl title = title style_urls = ['skins/standard/admin.css'] - doc_section = "administration.html" + doc_section = "administering/index.html" %] <div> @@ -44,7 +44,7 @@ <dt id="sanitycheck" class="[% class %]"><a href="sanitycheck.cgi">Sanity Check</a></dt> <dd class="[% class %]">Run sanity checks to locate problems in your database. This may take several tens of minutes depending on the size of your installation. - You can also automate this check by running <tt>sanitycheck.pl</tt> from a cron job. + You can also automate this check by running <kbd>sanitycheck.pl</kbd> from a cron job. A notification will be sent per email to the specified user if errors are detected.</dd> [% class = (user.in_group('editusers') || user.can_bless) ? "" : "forbidden" %] @@ -83,7 +83,7 @@ <dl> [% class = user.in_group('admin') ? "" : "forbidden" %] <dt id="custom_fields" class="[% class %]"><a href="editfields.cgi">Custom Fields</a></dt> - <dd class="[% class %]">[% terms.Bugzilla %] lets you define fields which are + <dd class="[% class %]">Bugzilla lets you define fields which are not implemented by default, based on your local and specific requirements. These fields can then be used as any other field, meaning that you can set them in [% terms.bugs %] and run any search involving them.<br> @@ -118,6 +118,16 @@ and time, and get the result of these queries directly per email. This is a good way to create reminders and to keep track of the activity in your installation.</dd> + [% IF Param('use_mailer_queue') %] + [% class = user.in_group('admin') ? "" : "forbidden" %] + <dt id="view_job_queue" class="[% class %]"><a href="view_job_queue.cgi">Job Queue</a></dt> + <dd class="[% class %]">View the queue of undelivered/deferred jobs/emails.</dd> + [% END %] + + <dt id="release_notes"> + <a href="page.cgi?id=release-notes.html">Release Notes</a></dt> + <dd>Detailed information related to this release of Bugzilla.</dd> + [% Hook.process('end_links_right') %] </dl> </td> diff --git a/template/en/default/admin/classifications/add.html.tmpl b/template/en/default/admin/classifications/add.html.tmpl index d818d3166..d56275aa2 100644 --- a/template/en/default/admin/classifications/add.html.tmpl +++ b/template/en/default/admin/classifications/add.html.tmpl @@ -8,10 +8,11 @@ [% PROCESS global/header.html.tmpl title = "Add new classification" + style_urls = ['skins/standard/admin.css'] %] <form method=post action="editclassifications.cgi"> - <table border=0 cellpadding=4 cellspacing=0> + <table id="admin_table_edit"> [% PROCESS "admin/classifications/edit-common.html.tmpl" %] diff --git a/template/en/default/admin/classifications/del.html.tmpl b/template/en/default/admin/classifications/del.html.tmpl index 215db848f..24a39b4b6 100644 --- a/template/en/default/admin/classifications/del.html.tmpl +++ b/template/en/default/admin/classifications/del.html.tmpl @@ -8,32 +8,32 @@ [% PROCESS global/header.html.tmpl title = "Delete classification" + style_urls = ['skins/standard/admin.css'] %] -<table border=1 cellpadding=4 cellspacing=0> -<tr bgcolor="#6666ff"> - <th valign="top" align="left">Part</th> - <th valign="top" align="left">Value</th> - -</tr><tr> - <td valign="top">Classification:</td> - <td valign="top">[% classification.name FILTER html %]</td> - -</tr><tr> - <td valign="top">Description:</td> - <td valign="top"> - [% IF classification.description %] - [% classification.description FILTER html_light %] - [% ELSE %] - <font color="red">description missing</font> - [% END %] - </td> - -</tr><tr> - <td valign="top">Sortkey:</td> - <td valign="top">[% classification.sortkey FILTER html %]</td> - -</tr> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> + </tr> + <tr> + <td>Classification</td> + <td>[% classification.name FILTER html %]</td> + </tr> + <tr> + <td>Description</td> + <td> + [% IF classification.description %] + [% classification.description FILTER html_light %] + [% ELSE %] + <span class="warning">description missing</span> + [% END %] + </td> + </tr> + <tr> + <td>Sortkey</td> + <td>[% classification.sortkey FILTER html %]</td> + </tr> </table> <h2>Confirmation</h2> diff --git a/template/en/default/admin/classifications/edit-common.html.tmpl b/template/en/default/admin/classifications/edit-common.html.tmpl index 6f038fceb..c2bae5c42 100644 --- a/template/en/default/admin/classifications/edit-common.html.tmpl +++ b/template/en/default/admin/classifications/edit-common.html.tmpl @@ -11,12 +11,12 @@ #%] <tr> - <th align="right">Classification:</th> + <th>Classification:</th> <td><input size=64 maxlength=64 name="classification" - value="[% classification.name FILTER html %]"></td> + value="[% classification.name FILTER html %]" required></td> </tr> <tr> - <th align="right">Description:</th> + <th>Description:</th> <td> [% INCLUDE global/textarea.html.tmpl name = 'description' @@ -27,7 +27,7 @@ </td> </tr> <tr> - <th align="right"><label for="sortkey">Sortkey:</label></th> + <th><label for="sortkey">Sortkey:</label></th> <td><input id="sortkey" size="20" maxlength="20" name="sortkey" value="[%- classification.sortkey FILTER html %]"></td> </tr> diff --git a/template/en/default/admin/classifications/edit.html.tmpl b/template/en/default/admin/classifications/edit.html.tmpl index 429eefc69..b1f6ce225 100644 --- a/template/en/default/admin/classifications/edit.html.tmpl +++ b/template/en/default/admin/classifications/edit.html.tmpl @@ -8,15 +8,16 @@ [% PROCESS global/header.html.tmpl title = "Edit classification" + style_urls = ['skins/standard/admin.css'] %] <form method=post action="editclassifications.cgi"> - <table border=0 cellpadding=4 cellspacing=0> + <table id="admin_table_edit"> [% PROCESS "admin/classifications/edit-common.html.tmpl" %] - <tr valign=top> - <th align="right"> + <tr> + <th> <a href="editproducts.cgi?classification=[% classification.name FILTER uri %]"> Edit Products</a>: </th> @@ -25,19 +26,13 @@ <table> [% FOREACH product = classification.products %] <tr> - <th align=right valign=top>[% product.name FILTER html %]</th> - <td valign=top> - [% IF product.description %] - [% product.description FILTER html_light %] - [% ELSE %] - <font color="red">description missing</font> - [% END %] - </td> + <th>[% product.name FILTER html %]</th> + <td>[% product.description FILTER html_light %]</td> </tr> [% END %] </table> [% ELSE %] - <font color="red">none</font> + <span class="warning">none</span> [% END %] </td> </tr> diff --git a/template/en/default/admin/classifications/reclassify.html.tmpl b/template/en/default/admin/classifications/reclassify.html.tmpl index 13fb3a3bf..b230d670c 100644 --- a/template/en/default/admin/classifications/reclassify.html.tmpl +++ b/template/en/default/admin/classifications/reclassify.html.tmpl @@ -8,38 +8,39 @@ [% PROCESS global/header.html.tmpl title = "Reclassify products" + style_urls = ['skins/standard/admin.css'] %] <form method=post action="editclassifications.cgi"> - <table border=0 cellpadding=4 cellspacing=0> + <table id="admin_table_edit"> <tr> - <th align="right">Classification:</th> - <td valign="top" colspan=3>[% classification.name FILTER html %]</td> - - </tr><tr> - <th align="right">Description:</th> - <td valign="top" colspan=3> + <th>Classification:</th> + <td colspan=3>[% classification.name FILTER html %]</td> + </tr> + <tr> + <th>Description:</th> + <td colspan=3> [% IF classification.description %] [% classification.description FILTER html_light %] [% ELSE %] - <font color="red">description missing</font> + <span class="warning">description missing</span> [% END %] </td> - - </tr><tr> - <th align="right">Sortkey:</th> - <td valign="top" colspan=3>[% classification.sortkey FILTER html %]</td> - - </tr><tr> - <th align="right">Products:</th> - <td valign="top">Other Classifications</td> + </tr> + <tr> + <th>Sortkey:</th> + <td colspan=3>[% classification.sortkey FILTER html %]</td> + </tr> + <tr> + <th>Products:</th> + <td>Other Classifications</td> <td></td> - <td valign="top">This Classification</td> - - </tr><tr> + <td>This Classification</td> + </tr> + <tr> <td></td> - <td valign="top"> - <select name="prodlist" id="prodlist" multiple="multiple" size="20"> + <td> + <select name="prodlist" id="prodlist" multiple="multiple" size="20"> [% FOREACH class = classifications %] [% IF class.id != classification.id %] [% FOREACH product = class.products %] @@ -49,21 +50,23 @@ [% END %] [% END %] [% END %] - </select></td> + </select> + </td> - <td align="center"> + <td> <input type=submit value=" Add >> " name="add_products"><br><br> <input type=submit value="<< Remove" name="remove_products"> </td> - <td valign="middle" rowspan=2> + <td rowspan=2 class="max-width"> <select name="myprodlist" id="myprodlist" multiple="multiple" size="20"> [% FOREACH product = classification.products %] <option value="[% product.name FILTER html %]"> [% product.name FILTER html %] </option> [% END %] - </select></td> + </select> + </td> </tr> </table> diff --git a/template/en/default/admin/classifications/select.html.tmpl b/template/en/default/admin/classifications/select.html.tmpl index 541ded918..ffe183cfa 100644 --- a/template/en/default/admin/classifications/select.html.tmpl +++ b/template/en/default/admin/classifications/select.html.tmpl @@ -8,39 +8,49 @@ [% PROCESS global/header.html.tmpl title = "Select classification" + style_urls = ['skins/standard/admin.css'] %] -<table border=1 cellpadding=4 cellspacing=0> - <tr bgcolor="#6666ff"> - <th align="left">Edit Classification ...</th> - <th align="left">Description</th> - <th align="left">Sortkey</th> - <th align="left">Products</th> - <th align="left">Action</th> +<table id="admin_table"> + <tr class="column_header"> + <th>Edit Classification...</th> + <th>Description</th> + <th>Sortkey</th> + <th>Products</th> + <th>Action</th> </tr> [% FOREACH cl = classifications %] <tr> - <td valign="top"><a href="editclassifications.cgi?action=edit&classification=[% cl.name FILTER uri %]"><b>[% cl.name FILTER html %]</b></a></td> - <td valign="top"> + <td> + <a href="editclassifications.cgi?action=edit&classification=[% cl.name FILTER uri %]"> + <b>[% cl.name FILTER html %]</b> + </a> + </td> + <td> [% IF cl.description %] [% cl.description FILTER html_light %] [% ELSE %] - <font color="red">none</font> + <span class="warning">none</span> [% END %] </td> - <td valign="top">[% cl.sortkey FILTER html %]</td> + <td>[% cl.sortkey FILTER html %]</td> [% IF (cl.id == 1) %] - <td valign="top">[% cl.product_count FILTER html %]</td> + <td>[% cl.product_count FILTER html %]</td> [% ELSE %] - <td valign="top"><a href="editclassifications.cgi?action=reclassify&classification=[% cl.name FILTER uri %]">reclassify ([% cl.product_count FILTER html %])</a></td> + <td> + <a href="editclassifications.cgi?action=reclassify&classification=[% cl.name FILTER uri %]"> + reclassify ([% cl.product_count FILTER html %])</a> + </td> [% END %] [%# don't allow user to delete the default id. %] [% IF (cl.id == 1) %] - <td valign="top"> </td> + <td></td> [% ELSE %] - <td valign="top"><a href="editclassifications.cgi?action=del&classification=[% cl.name FILTER uri %]">delete</a></td> + <td> + <a href="editclassifications.cgi?action=del&classification=[% cl.name FILTER uri %]">delete</a> + </td> [% END %] </tr> [% END %] diff --git a/template/en/default/admin/components/confirm-delete.html.tmpl b/template/en/default/admin/components/confirm-delete.html.tmpl index 82bf018b3..9018dcda2 100644 --- a/template/en/default/admin/components/confirm-delete.html.tmpl +++ b/template/en/default/admin/components/confirm-delete.html.tmpl @@ -22,101 +22,96 @@ from '[% product.name FILTER html %]' product style_urls = ['skins/standard/admin.css'] %] -<table border="1" cellpadding="4" cellspacing="0"> -<tr bgcolor="#6666FF"> - <th valign="top" align="left">Field</th> - <th valign="top" align="left">Value</th> -</tr> -<tr> - <td valign="top">Component:</td> - <td valign="top">[% comp.name FILTER html %]</td> -</tr> -<tr> - <td valign="top">Component Description:</td> - <td valign="top">[% comp.description FILTER html_light %]</td> -</tr> -<tr> - <td valign="top">Default assignee:</td> - <td valign="top">[% comp.default_assignee.login FILTER html %]</td> - -[% IF Param('useqacontact') %] -</tr> -<tr> - <td valign="top">Default QA contact:</td> - <td valign="top">[% comp.default_qa_contact.login FILTER html %]</td> -[% END %] - -</tr> -<tr> - <td valign="top">Component of Product:</td> - <td valign="top">[% product.name FILTER html %]</td> - -[% IF product.description %] -</tr> -<tr> - <td valign="top">Product Description:</td> - <td valign="top">[% product.description FILTER html_light %]</td> -[% END %] +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> + </tr> + <tr> + <td>Component</td> + <td>[% comp.name FILTER html %]</td> + </tr> + <tr> + <td>Component Description</td> + <td>[% comp.description FILTER html_light %]</td> + </tr> + <tr> + <td>Default assignee</td> + <td>[% comp.default_assignee.login FILTER html %]</td> + </tr> + + [% IF Param('useqacontact') %] + <tr> + <td>Default QA contact</td> + <td>[% comp.default_qa_contact.login FILTER html %]</td> + </tr> + [% END %] -[% IF Param('usetargetmilestone') %] -</tr> -<tr> - <td valign="top">Product Milestone URL:</td> - <td valign="top"> - <a href="[% product.milestone_url FILTER html %]"> - [% product.milestone_url FILTER html %] - </a> - </td> -[% END %] + <tr> + <td>Component of Product</td> + <td>[% product.name FILTER html %]</td> + </tr> -</tr> -<tr> - <TD VALIGN="top">Open for [% terms.bugs %]:</TD> - <TD VALIGN="top">[% IF product.is_active && comp.isactive %]Yes[% ELSE %]No[% END %]</td> -</tr> -<tr> - <td valign="top">[% terms.Bugs %]:</td> - <td valign="top"> -[% IF comp.bug_count %] - <a title="List of [% terms.bugs %] for component '[% comp.name FILTER html %]'" - href="buglist.cgi?component=[% comp.name FILTER uri %]&product= - [%- product.name FILTER uri %]">[% comp.bug_count %]</a> -[% ELSE %] - None -[% END %] - </td> -</tr> + [% IF product.description %] + <tr> + <td>Product Description</td> + <td>[% product.description FILTER html_light %]</td> + </tr> + [% END %] + + [% IF Param('usetargetmilestone') %] + <tr> + <td>Product Milestone URL</td> + <td> + <a href="[% product.milestone_url FILTER html %]"> + [% product.milestone_url FILTER html %]</a> + </td> + </tr> + [% END %] + + <tr> + <td>Open for [% terms.bugs %]</td> + <td>[% IF product.is_active && comp.isactive %]Yes[% ELSE %]No[% END %]</td> + </tr> + <tr> + <td>[% terms.Bugs %]</td> + <td> + [% IF comp.bug_count %] + <a title="List of [% terms.bugs %] for component '[% comp.name FILTER html %]'" + href="buglist.cgi?component=[% comp.name FILTER uri %]&product= + [%- product.name FILTER uri %]">[% comp.bug_count %]</a> + [% ELSE %] + None + [% END %] + </td> + </tr> </table> <h2>Confirmation</h2> - + [% IF comp.bug_count %] [% IF !Param("allowbugdeletion") %] - <p class="confirmation"> - Sorry, there - - [% IF comp.bug_count > 1 %] - are [% comp.bug_count %] [%+ terms.bugs %] - [% ELSE %] - is [% comp.bug_count %] [%+ terms.bug %] - [% END %] - - outstanding for this component. You must reassign - - [% IF comp.bug_count > 1 %] - those [% terms.bugs %] - [% ELSE %] - that [% terms.bug %] - [% END %] + <p class="confirmation"> + Sorry, there + [% IF comp.bug_count > 1 %] + are [% comp.bug_count %] [%+ terms.bugs %] + [% ELSE %] + is 1 [% terms.bug %] + [% END %] + outstanding for this component. You must reassign - to another component before you can delete this one. - </p> + [% IF comp.bug_count > 1 %] + those [% terms.bugs %] + [% ELSE %] + that [% terms.bug %] + [% END %] + to another component before you can delete this one. + </p> [% ELSE %] - - <table border="0" cellpadding="20" width="70%" bgcolor="red"><tr><td> - - There [% IF comp.bug_count > 1 %] + <p class="confirmation"> + There + [% IF comp.bug_count > 1 %] are [% comp.bug_count %] [%+ terms.bugs %] [% ELSE %] is 1 [% terms.bug %] @@ -124,8 +119,7 @@ from '[% product.name FILTER html %]' product entered for this component! When you delete this component, <b>ALL</b> stored [% terms.bugs %] and their history will be deleted too. - </td></tr></table> - + </p> [% END %] [% END %] diff --git a/template/en/default/admin/components/create.html.tmpl b/template/en/default/admin/components/create.html.tmpl index f281160c0..96c9ce384 100644 --- a/template/en/default/admin/components/create.html.tmpl +++ b/template/en/default/admin/components/create.html.tmpl @@ -10,21 +10,23 @@ # product: object; Bugzilla::Product object representing the product to # which the component belongs. #%] - + [% title = BLOCK %]Add component to the [% product.name FILTER html %] product[% END %] [% PROCESS global/header.html.tmpl + title = title + generate_api_token = 1 + style_urls = ['skins/standard/admin.css'] yui = [ 'autocomplete' ] javascript_urls = [ "js/field.js" ] - title = title %] <form method="post" action="editcomponents.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> [% PROCESS "admin/components/edit-common.html.tmpl" %] - + </table> - <hr> + <input type="submit" id="create" value="Add"> <input type="hidden" name="action" value="new"> <input type="hidden" name='product' value="[% product.name FILTER html %]"> diff --git a/template/en/default/admin/components/edit-common.html.tmpl b/template/en/default/admin/components/edit-common.html.tmpl index 6ff4e07e6..72300af79 100644 --- a/template/en/default/admin/components/edit-common.html.tmpl +++ b/template/en/default/admin/components/edit-common.html.tmpl @@ -15,12 +15,12 @@ [% DEFAULT desc_name = "description" %] <tr> - <th class="field_label"><label for="component">Component:</label></th> + <th><label for="component">Component:</label></th> <td><input size="64" maxlength="64" name="component" id="component" - value="[%- comp.name FILTER html %]"></td> + value="[%- comp.name FILTER html %]" required></td> </tr> <tr> - <th class="field_label"><label for="[% desc_name FILTER html %]">Component Description:</label></th> + <th><label for="[% desc_name FILTER html %]">Component Description:</label></th> <td> [% INCLUDE global/textarea.html.tmpl name = desc_name @@ -29,23 +29,25 @@ cols = 64 wrap = 'virtual' defaultcontent = comp.description + mandatory = 1 %] </td> </tr> <tr> - <th class="field_label"><label for="initialowner">Default Assignee:</label></th> + <th><label for="initialowner">Default Assignee:</label></th> <td> [% INCLUDE global/userselect.html.tmpl name => "initialowner" id => "initialowner" value => comp.default_assignee.login size => 64 + mandatory => 1 %] </td> </tr> [% IF Param('useqacontact') %] <tr> - <th class="field_label"><label for="initialqacontact">Default QA contact:</label></th> + <th><label for="initialqacontact">Default QA contact:</label></th> <td> [% INCLUDE global/userselect.html.tmpl name => "initialqacontact" @@ -58,7 +60,7 @@ </tr> [% END %] <tr> - <th class="field_label"><label for="initialcc">Default CC List:</label></th> + <th><label for="initialcc">Default CC List:</label></th> <td> [% INCLUDE global/userselect.html.tmpl name => "initialcc" @@ -69,7 +71,7 @@ %] <br> [% IF !Param("usemenuforusers") %] - <em>Enter user names for the CC list as a comma-separated list.</em> + <span class="bz_info">Enter user names for the CC list as a comma-separated list.</span> [% END %] </td> </tr> diff --git a/template/en/default/admin/components/edit.html.tmpl b/template/en/default/admin/components/edit.html.tmpl index 748175b75..c4da1181b 100644 --- a/template/en/default/admin/components/edit.html.tmpl +++ b/template/en/default/admin/components/edit.html.tmpl @@ -18,45 +18,45 @@ [% END %] [% PROCESS global/header.html.tmpl title = title + generate_api_token = 1 + style_urls = ['skins/standard/admin.css'] yui = [ 'autocomplete' ] javascript_urls = [ "js/field.js" ] %] <form method="post" action="editcomponents.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> [% PROCESS "admin/components/edit-common.html.tmpl" %] <tr> - <th class="field_label"><label for="isactive">Enabled For [% terms.Bugs %]:</label></th> + <th><label for="isactive">Enabled For [% terms.Bugs %]:</label></th> <td><input id="isactive" name="isactive" type="checkbox" value="1" [% 'checked="checked"' IF comp.isactive %]></td> </tr> <tr> - <th class="field_label">[% terms.Bugs %]:</th> + <th>[% terms.Bugs %]:</th> <td> -[% IF comp.bug_count > 0 %] - <a title="[% terms.Bugs %] in component '[% comp.name FILTER html %]'" - href="buglist.cgi?component= - [%- comp.name FILTER uri %]&product= - [%- product.name FILTER uri %]">[% comp.bug_count %]</a> -[% ELSE %] - None -[% END %] + [% IF comp.bug_count > 0 %] + <a title="[% terms.Bugs %] in component '[% comp.name FILTER html %]'" + href="buglist.cgi?component= + [%- comp.name FILTER uri %]&product= + [%- product.name FILTER uri %]">[% comp.bug_count %]</a> + [% ELSE %] + None + [% END %] </td> </tr> - </table> <input type="hidden" name="action" value="update"> <input type="hidden" name="componentold" value="[% comp.name FILTER html %]"> <input type="hidden" name="product" value="[% product.name FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> - <input type="submit" value="Save Changes" id="update"> or <a - href="editcomponents.cgi?action=del&product= - [%- product.name FILTER uri %]&component= - [%- comp.name FILTER uri %]">Delete</a> this component. - + <input type="submit" value="Save Changes" id="update"> or + <a href="editcomponents.cgi?action=del&product= + [%- product.name FILTER uri %]&component= + [%- comp.name FILTER uri %]">Delete</a> this component. </form> [% PROCESS admin/components/footer.html.tmpl diff --git a/template/en/default/admin/components/list.html.tmpl b/template/en/default/admin/components/list.html.tmpl index fc36bcdd2..91808fbae 100644 --- a/template/en/default/admin/components/list.html.tmpl +++ b/template/en/default/admin/components/list.html.tmpl @@ -16,6 +16,7 @@ '[% product.name FILTER html %]'[% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] %] [% edit_contentlink = BLOCK %]editcomponents.cgi?action=edit&product= @@ -68,7 +69,7 @@ [% columns.push({ name => 'bug_count' heading => "$terms.Bugs" - align => "right" + class => "right" contentlink => bug_count_contentlink }) %] diff --git a/template/en/default/admin/components/select-product.html.tmpl b/template/en/default/admin/components/select-product.html.tmpl index 55600d9cd..a152415c3 100644 --- a/template/en/default/admin/components/select-product.html.tmpl +++ b/template/en/default/admin/components/select-product.html.tmpl @@ -13,6 +13,7 @@ [% PROCESS global/header.html.tmpl title = "Edit components for which product?" + style_urls = ['skins/standard/admin.css'] %] [% columns = [ @@ -34,7 +35,7 @@ [% columns.push({ name => 'bug_count' heading => "$terms.Bugs" - align => "right" + class => "right" contentlink => "buglist.cgi?product=%%name%%" }) %] diff --git a/template/en/default/admin/confirm-action.html.tmpl b/template/en/default/admin/confirm-action.html.tmpl index e3b9ef5f7..6dda0d014 100644 --- a/template/en/default/admin/confirm-action.html.tmpl +++ b/template/en/default/admin/confirm-action.html.tmpl @@ -12,52 +12,43 @@ # expected_action: the action the user was going to do. # script_name: the script generating this warning. # alternate_script: the suggested script to redirect the user to - # if he declines submission. + # if they decline submission. #%] -[% PROCESS global/header.html.tmpl title = "Suspicious Action" - style_urls = ['skins/standard/global.css'] %] +[% PROCESS global/header.html.tmpl + title = "Suspicious Action" +%] [% IF abuser %] <div class="throw_error"> - <p>When you view an administrative form in [% terms.Bugzilla %], a token string + <p>When you view an administrative form in Bugzilla, a token string is randomly generated and stored both in the database and in the form you loaded, to make sure that the requested changes are being made as a result of submitting - a form generated by [% terms.Bugzilla %]. Unfortunately, the token used right now + a form generated by Bugzilla. Unfortunately, the token used right now is incorrect, meaning that it looks like you didn't come from the right page. The following token has been used :</p> - <table border="0" cellpadding="5" cellspacing="0"> - [% IF token_action != expected_action %] - <tr> - <th>Action stored:</th> - <td>[% token_action FILTER html %]</td> - </tr> - <tr> - <th> </th> - <td> - This action doesn't match the one expected ([% expected_action FILTER html %]). - </td> - </tr> - [% END %] + [% IF token_action != expected_action %] + <p> + <span class="label">Action stored:</span> + [%+ token_action FILTER html %] + <br> + This action doesn't match the one expected ([% expected_action FILTER html %]). + </p> + [% END %] - [% IF abuser != user.identity %] - <tr> - <th>Generated by:</th> - <td>[% abuser FILTER html %]</td> - </tr> - <tr> - <th> </th> - <td> - This token has not been generated by you. It is possible that someone - tried to trick you! - </td> - </tr> - [% END %] - </table> - - <p>Please report this problem to [%+ Param("maintainer") FILTER html %].</p> + [% IF abuser != user.identity %] + <p> + <span class="label">Generated by:</span> + [%+ abuser FILTER html %] + <br> + This token has not been generated by you. It is possible that someone + tried to trick you! + </p> + [% END %] </div> + + <p>Please report this problem to [% Param("maintainer") FILTER html %].</p> [% ELSE %] <div class="throw_error"> It looks like you didn't come from the right page (you have no valid token for diff --git a/template/en/default/admin/custom_fields/confirm-delete.html.tmpl b/template/en/default/admin/custom_fields/confirm-delete.html.tmpl index 85338c003..1d2348a0f 100644 --- a/template/en/default/admin/custom_fields/confirm-delete.html.tmpl +++ b/template/en/default/admin/custom_fields/confirm-delete.html.tmpl @@ -20,26 +20,26 @@ [% PROCESS global/header.html.tmpl title = title style_urls = ['skins/standard/admin.css'] - doc_section = "custom-fields.html#delete-custom-fields" + doc_section = "administering/custom-fields.html#deleting-custom-fields" %] -<table border="1" cellpadding="4" cellspacing="0"> -<tr bgcolor="#6666FF"> - <th valign="top" align="left">Field</th> - <th valign="top" align="left">Value</th> -</tr> -<tr> - <td valign="top">Custom Field:</td> - <td valign="top">[% field.name FILTER html %]</td> -</tr> -<tr> - <td valign="top">Description:</td> - <td valign="top">[% field.description FILTER html %]</td> -</tr> -<tr> - <td valign="top">Type:</td> - <td valign="top">[% field_types.${field.type} FILTER html %]</td> -</tr> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> + </tr> + <tr> + <td>Custom Field</td> + <td>[% field.name FILTER html %]</td> + </tr> + <tr> + <td>Description</td> + <td>[% field.description FILTER html %]</td> + </tr> + <tr> + <td>Type</td> + <td>[% field_types.${field.type} FILTER html %]</td> + </tr> </table> <h2>Confirmation</h2> diff --git a/template/en/default/admin/custom_fields/create.html.tmpl b/template/en/default/admin/custom_fields/create.html.tmpl index fb7f06f86..71ba08f46 100644 --- a/template/en/default/admin/custom_fields/create.html.tmpl +++ b/template/en/default/admin/custom_fields/create.html.tmpl @@ -10,8 +10,6 @@ # none #%] -[% PROCESS "global/field-descs.none.tmpl" %] - [% javascript = BLOCK %] [% INCLUDE "admin/custom_fields/cf-js.js.tmpl" %] [% END %] @@ -20,21 +18,21 @@ title = "Add a new Custom Field" onload = "document.getElementById('new_bugmail').disabled = true;" javascript_urls = [ 'js/util.js' ] - doc_section = "custom-fields.html#add-custom-fields" + doc_section = "administering/custom-fields.html#adding-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'))}); + 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 + Adding custom fields can make the interface of Bugzilla very + complicated. Many admins who are new to Bugzilla start off adding many custom fields, and then their users complain that the interface is "too complex". Please think carefully before adding any custom fields. - It may be the case that [% terms.Bugzilla %] already does what you need, + It may be the case that Bugzilla already does what you need, and you just haven't enabled the correct feature yet. </p> @@ -47,129 +45,11 @@ YAHOO.util.Event.onDOMReady(function() {onChangeType(document.getElementById('ty </ul> <form id="add_field" action="editfields.cgi" method="GET"> - <table border="0" cellspacing="0" cellpadding="5" id="edit_custom_field"> - <tr> - <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> - <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" - onchange="toggleCheckbox(this, 'new_bugmail');"> - </td> - </tr> - <tr> - <th class="narrow_label"><label for="desc">Description:</label></th> - <td><input type="text" id="desc" name="desc" value="" size="40"></td> - - <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 class="narrow_label"><label for="type">Type:</label></th> - <td> - <select id="type" name="type" onchange="onChangeType(this)"> - [% FOREACH type = field_types.keys %] - [% NEXT IF type == constants.FIELD_TYPE_UNKNOWN %] - <option value="[% type FILTER html %]">[% field_types.$type FILTER html %]</option> - [% END %] - </select> - </td> - - <th><label for="obsolete">Is obsolete:</label></th> - <td><input type="checkbox" id="obsolete" name="obsolete" value="1"></td> - </tr> - <tr> - <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"><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">Long Description:</th> - <td> - [% INCLUDE global/textarea.html.tmpl - name = 'long_desc' - id = 'long_desc' - minrows = 3 - maxrows = 5 - cols = 46 - defaultcontent = defaultcontent - %] - </td> - <th> - <label for="visibility_field_id">Field only appears when:</label> - </th> - <td> - <select name="visibility_field_id" id="visibility_field_id" - onchange="onChangeVisibilityField()"> - <option></option> - [% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %] - <option value="[% sel_field.id FILTER html %]"> - [% sel_field.description FILTER html %] - ([% sel_field.name FILTER html %]) - </option> - [% END %] - </select> - <label for="visibility_values"> - <strong>is set to any of:</strong> - </label> - <select multiple="multiple" size="5" name="visibility_values" - id="visibility_values" class="field_value"> - <option value=""></option> - </select> - </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="value_field_id"> - Field that controls the values<br> - that appear in this field: - </label> - </th> + [% PROCESS "admin/custom_fields/edit-common.html.tmpl" %] - <td> - <select disabled="disabled" name="value_field_id" id="value_field_id"> - <option></option> - [% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %] - <option value="[% sel_field.id FILTER html %]"> - [% sel_field.description FILTER html %] - ([% sel_field.name FILTER html %]) - </option> - [% END %] - </select> - </td> - </tr> - </table> - <p> - <input type="hidden" name="action" value="new"> - <input type="hidden" name="token" value="[% token FILTER html %]"> - <input type="submit" id="create" value="Create"> - </p> + <input type="hidden" name="action" value="new"> + <input type="hidden" name="token" value="[% token FILTER html %]"> + <input type="submit" id="create" value="Create"> </form> <p> diff --git a/template/en/default/admin/custom_fields/edit-common.html.tmpl b/template/en/default/admin/custom_fields/edit-common.html.tmpl new file mode 100644 index 000000000..6c22bb81f --- /dev/null +++ b/template/en/default/admin/custom_fields/edit-common.html.tmpl @@ -0,0 +1,193 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # field: Bugzila::Field; the current field being edited + #%] + +[% PROCESS "global/field-descs.none.tmpl" %] + +<table id="admin_table_edit"> + <tr> + <th><label for="name">Name:</label></th> + <td> + [% IF field %] + [% field.name FILTER html %] + [% ELSE %] + <input type="text" id="name" name="name" value="cf_" size="40" maxlength="64" required> + [% END %] + </td> + + <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" + [%- " checked" IF field.enter_bug %] + onchange="toggleCheckbox(this, 'new_bugmail');"> + </td> + </tr> + + <tr> + <th><label for="desc">Description:</label></th> + <td> + <input type="text" id="desc" name="desc" size="40" + value="[% field.description FILTER html %]" required> + </td> + + <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><label for="type">Type:</label></th> + <td> + [% IF field %] + [% field_types.${field.type} FILTER html %] + [% ELSE %] + <select id="type" name="type" onchange="onChangeType(this)"> + [% FOREACH type = field_types.keys %] + [% NEXT IF type == constants.FIELD_TYPE_UNKNOWN %] + <option value="[% type FILTER html %]">[% field_types.$type FILTER html %]</option> + [% END %] + </select> + [% END %] + </td> + + <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><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><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> + <th>Long Description:</th> + <td> + [% INCLUDE global/textarea.html.tmpl + name = 'long_desc' + id = 'long_desc' + minrows = 3 + maxrows = 5 + cols = 46 + defaultcontent = field.long_desc + %] + </td> + + <th> + <label for="visibility_field_id">Field only appears when:</label> + </th> + <td> + <select name="visibility_field_id" id="visibility_field_id" + onchange="onChangeVisibilityField()"> + <option></option> + [% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %] + [% NEXT IF field && sel_field.id == field.id %] + <option value="[% sel_field.id FILTER html %]" + [% ' selected="selected"' + IF field && sel_field.id == field.visibility_field.id %]> + [% sel_field.description FILTER html %] + ([% sel_field.name FILTER html %]) + </option> + [% END %] + </select> + <br> + <label for="visibility_values"> + <strong>is set to any of:</strong> + </label> + <br> + <select multiple="multiple" size="5" name="visibility_values" + id="visibility_values" class="field_value"> + [% IF field %] + [% FOREACH value = field.visibility_field.legal_values %] + <option value="[% value.id FILTER html %]" + [% " selected" IF field.visibility_values.contains(value) %]> + [% 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 %] + [% ELSE %] + <option value=""></option> + [% END %] + </select> + </td> + </tr> + + [% IF !field || field.is_select || field.type == constants.FIELD_TYPE_BUG_ID %] + <tr> + [% IF field.is_select %] + <th> </th> + <td> + <a href="editvalues.cgi?field=[% field.name FILTER uri %]">Edit legal values for this field</a>. + </td> + [% ELSE %] + <th> + <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 %]" + [% ' disabled="disabled"' IF !field %]> + <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> + [% END %] + + [% IF !field || field.is_select %] + <th> + <label for="value_field_id"> + Field that controls the values<br> + that appear in this field: + </label> + </th> + <td> + <select name="value_field_id" id="value_field_id" + [% ' disabled="disabled"' IF !field %]> + <option></option> + [% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %] + [% NEXT IF field && sel_field.id == field.id %] + <option value="[% sel_field.id FILTER html %]" + [% ' selected="selected"' IF field && sel_field.id == field.value_field.id %]> + [% sel_field.description FILTER html %] + ([% sel_field.name FILTER html %]) + </option> + [% END %] + </select> + </td> + [% ELSE %] + <th></th> + <td></td> + [% END %] + </tr> + [% END %] +</table> diff --git a/template/en/default/admin/custom_fields/edit.html.tmpl b/template/en/default/admin/custom_fields/edit.html.tmpl index a1d739365..6f7389d05 100644 --- a/template/en/default/admin/custom_fields/edit.html.tmpl +++ b/template/en/default/admin/custom_fields/edit.html.tmpl @@ -10,8 +10,6 @@ # field: Bugzila::Field; the current field being edited #%] -[% PROCESS "global/field-descs.none.tmpl" %] - [% title = BLOCK %] Edit the Custom Field '[% field.name FILTER html %]' ([% field.description FILTER html %]) [% END %] @@ -24,7 +22,7 @@ title = title onload = "toggleCheckbox(document.getElementById('enter_bug'), 'new_bugmail');" javascript_urls = [ 'js/util.js' ] - doc_section = "custom-fields.html#edit-custom-fields" + doc_section = "administering/custom-fields.html#editing-custom-fields" style_urls = ['skins/standard/admin.css'] %] @@ -34,145 +32,8 @@ </p> <form id="edit_field" action="editfields.cgi" method="GET"> - <table border="0" cellspacing="0" cellpadding="5" id="edit_custom_field"> - <tr> - <th class="narrow_label">Name:</th> - <td>[% field.name FILTER html %]</td> - - <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" - [%- " checked" IF field.enter_bug %] - onchange="toggleCheckbox(this, 'new_bugmail');"></td> - </tr> - <tr> - <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> - <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 class="narrow_label">Type:</th> - <td>[% field_types.${field.type} FILTER html %]</td> - - <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 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"><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> - <th class="narrow_label">Long Description:</th> - <td> - [% INCLUDE global/textarea.html.tmpl - name = 'long_desc' - id = 'long_desc' - minrows = 3 - maxrows = 5 - cols = 46 - defaultcontent = field.long_desc - %] - </td> - <th> - <label for="visibility_field_id">Field only appears when:</label> - </th> - <td> - <select name="visibility_field_id" id="visibility_field_id" - onchange="onChangeVisibilityField()"> - <option></option> - [% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %] - [% NEXT IF sel_field.id == field.id %] - <option value="[% sel_field.id FILTER html %]" - [% ' selected="selected"' - IF sel_field.id == field.visibility_field.id %]> - [% sel_field.description FILTER html %] - ([% sel_field.name FILTER html %]) - </option> - [% END %] - </select> - <label for="visibility_values"> - <strong>is set to any of:</strong> - </label> - <select multiple="multiple" size="5" name="visibility_values" - id="visibility_values" class="field_value"> - [% FOREACH value = field.visibility_field.legal_values %] - <option value="[% value.id FILTER html %]" - [% " selected" IF field.visibility_values.contains(value) %]> - [% 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> - </td> - </tr> - [% IF field.type == constants.FIELD_TYPE_BUG_ID %] - <tr> - <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> - <td colspan="2"> </td> - </tr> - [% END %] - [% IF field.is_select %] - <tr> - <th> </th> - <td> - <a href="editvalues.cgi?field=[% field.name FILTER uri %]">Edit - legal values for this field</a>. - </td> - - <th> - <label for="value_field_id"> - Field that controls the values<br> - that appear in this field: - </label> - </th> + [% PROCESS "admin/custom_fields/edit-common.html.tmpl" field = field %] - <td> - <select name="value_field_id" id="value_field_id"> - <option></option> - [% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %] - [% NEXT IF sel_field.id == field.id %] - <option value="[% sel_field.id FILTER html %]" - [% ' selected="selected"' - IF sel_field.id == field.value_field.id %]> - [% sel_field.description FILTER html %] - ([% sel_field.name FILTER html %]) - </option> - [% END %] - </select> - </td> - </tr> - [% END %] - </table> - <br> <input type="hidden" name="action" value="update"> <input type="hidden" name="name" value="[% field.name FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> diff --git a/template/en/default/admin/custom_fields/list.html.tmpl b/template/en/default/admin/custom_fields/list.html.tmpl index e6ec0c283..5e9183e56 100644 --- a/template/en/default/admin/custom_fields/list.html.tmpl +++ b/template/en/default/admin/custom_fields/list.html.tmpl @@ -14,7 +14,8 @@ [% PROCESS global/header.html.tmpl title = "Custom Fields" - doc_section = "custom-fields.html" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/custom-fields.html" %] [% delete_contentlink = BLOCK %]editfields.cgi?action=del&name=%%name%%[% END %] diff --git a/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl index 122df3612..579d07cdc 100644 --- a/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl +++ b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl @@ -22,34 +22,34 @@ style_urls = ['skins/standard/admin.css'] %] -<table border="1" cellpadding="4" cellspacing="0"> -<tr bgcolor="#6666FF"> - <th valign="top" align="left">Field</th> - <th valign="top" align="left">Value</th> -</tr> -<tr> - <td valign="top">Field Name:</td> - <td valign="top">[% field.description FILTER html %]</td> -</tr> -<tr> - <td valign="top">Field Value:</td> - <td valign="top">[% value.name FILTER html %]</td> -</tr> -<tr> - <td valign="top">[% terms.Bugs %]:</td> - <td valign="top"> -[% IF value.bug_count %] - <a title="List of [% terms.bugs %] where ' - [%- field.description FILTER html %]' is ' - [%- value.name FILTER html %]'" - href="buglist.cgi?[% field.name FILTER uri %]= - [%- value.name FILTER uri %]"> - [%- value.bug_count FILTER html %]</a> -[% ELSE %] - None -[% END %] - </td> -</tr> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> + </tr> + <tr> + <td>Field Name</td> + <td>[% field.description FILTER html %]</td> + </tr> + <tr> + <td>Field Value</td> + <td>[% value.name FILTER html %]</td> + </tr> + <tr> + <td>[% terms.Bugs %]</td> + <td> + [% IF value.bug_count %] + <a title="List of [% terms.bugs %] where ' + [%- field.description FILTER html %]' is ' + [%- value.name FILTER html %]'" + href="buglist.cgi?[% field.name FILTER uri %]= + [%- value.name FILTER uri %]"> + [%- value.bug_count FILTER html %]</a> + [% ELSE %] + None + [% END %] + </td> + </tr> </table> <h2>Confirmation</h2> @@ -149,6 +149,6 @@ [% PROCESS admin/fieldvalues/footer.html.tmpl no_edit_link = 1 - +%] +%] [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/fieldvalues/create.html.tmpl b/template/en/default/admin/fieldvalues/create.html.tmpl index f9f0f7e54..8d1dbc8b9 100644 --- a/template/en/default/admin/fieldvalues/create.html.tmpl +++ b/template/en/default/admin/fieldvalues/create.html.tmpl @@ -15,6 +15,7 @@ [% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] %] <p> @@ -23,21 +24,21 @@ </p> <form method="post" action="editvalues.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> <tr> - <th align="right"><label for="value">Value:</label></th> + <th><label for="value">Value:</label></th> <td> <input id="value" name="value" size="30" - maxlength="[% constants.MAX_FIELD_VALUE_SIZE FILTER none %]"> + maxlength="[% constants.MAX_FIELD_VALUE_SIZE FILTER none %]" required> </td> </tr> <tr> - <th align="right"><label for="sortkey">Sortkey:</label></th> + <th><label for="sortkey">Sortkey:</label></th> <td><input id="sortkey" name="sortkey" size="6" maxlength="6"></td> </tr> [% IF field.name == "bug_status" %] <tr> - <th align="right"><label for="is_open">Status Type:</label></th> + <th><label for="is_open">Status Type:</label></th> <td> <input type="radio" id="open_status" name="is_open" value="1" checked="checked"> @@ -56,7 +57,7 @@ [% END %] [% IF field.value_field %] <tr> - <th align="right"> + <th> <label for="visibility_value_id">Only appears when [%+ field.value_field.description FILTER html %] is set to: </label> @@ -74,7 +75,7 @@ </option> [% END %] </select> - <small>(Leave unset to have this value always appear.)</small> + <span class="bz_info">(Leave unset to have this value always appear.)</span> </td> </tr> [% END %] diff --git a/template/en/default/admin/fieldvalues/edit.html.tmpl b/template/en/default/admin/fieldvalues/edit.html.tmpl index ab6418552..2630fee92 100644 --- a/template/en/default/admin/fieldvalues/edit.html.tmpl +++ b/template/en/default/admin/fieldvalues/edit.html.tmpl @@ -17,15 +17,13 @@ [% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] %] <form method="post" action="editvalues.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> - + <table id="admin_table_edit"> <tr> - <th valign="top" align="right"> - <label for="value_new">Field Value:</label> - </th> + <th><label for="value_new">Field Value:</label></th> <td> [% IF value.is_static %] <input type="hidden" name="value_new" id="value_new" @@ -34,24 +32,24 @@ [% ELSE %] <input id="value_new" name="value_new" size="20" maxlength="[% constants.MAX_FIELD_VALUE_SIZE FILTER none %]" - value="[% value.name FILTER html %]"> + value="[% value.name FILTER html %]" required> [% END %] </td> </tr> <tr> - <th align="right"><label for="sortkey">Sortkey:</label></th> + <th><label for="sortkey">Sortkey:</label></th> <td><input id="sortkey" size="6" maxlength="6" name="sortkey" value="[%- value.sortkey FILTER html %]"></td> </tr> [% IF field.name == "bug_status" %] <tr> - <th align="right"><label for="is_open">Status Type:</label></th> + <th><label for="is_open">Status Type:</label></th> <td>[% IF value.is_open %]Open[% ELSE %]Closed[% END %]</td> </tr> [% END %] [% IF field.value_field %] <tr> - <th align="right"> + <th> <label for="visibility_value_id">Only appears when [%+ field.value_field.description FILTER html %] is set to: </label> @@ -71,12 +69,12 @@ </option> [% END %] </select> - <small>(Leave unset to have this value always appear.)</small> + <span class="bz_info">(Leave unset to have this value always appear.)</span> </td> </tr> [% END %] <tr> - <th align="right"><label for="is_active">Enabled for [% terms.bugs %]:</label></th> + <th><label for="is_active">Enabled for [% terms.bugs %]:</label></th> <td><input id="is_active" name="is_active" type="checkbox" value="1" [%+ 'checked="checked"' IF value.is_active %] [%+ 'disabled="disabled"' IF value.is_default OR value.is_static %]> diff --git a/template/en/default/admin/fieldvalues/list.html.tmpl b/template/en/default/admin/fieldvalues/list.html.tmpl index 01c5717b8..109665131 100644 --- a/template/en/default/admin/fieldvalues/list.html.tmpl +++ b/template/en/default/admin/fieldvalues/list.html.tmpl @@ -23,6 +23,7 @@ ([% field.name FILTER html %]) field[% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] %] [% edit_contentlink = BLOCK %]editvalues.cgi?action=edit&field= diff --git a/template/en/default/admin/fieldvalues/select-field.html.tmpl b/template/en/default/admin/fieldvalues/select-field.html.tmpl index 099eebab6..b3e1d97b6 100644 --- a/template/en/default/admin/fieldvalues/select-field.html.tmpl +++ b/template/en/default/admin/fieldvalues/select-field.html.tmpl @@ -17,6 +17,7 @@ [% PROCESS global/header.html.tmpl title = "Edit values for which field?" + style_urls = ['skins/standard/admin.css'] %] [% columns = [ diff --git a/template/en/default/admin/flag-type/confirm-delete.html.tmpl b/template/en/default/admin/flag-type/confirm-delete.html.tmpl index 70f5efb3d..a05e857d2 100644 --- a/template/en/default/admin/flag-type/confirm-delete.html.tmpl +++ b/template/en/default/admin/flag-type/confirm-delete.html.tmpl @@ -10,7 +10,8 @@ [% PROCESS global/header.html.tmpl title = title - doc_section = "flags-overview.html#flags-delete" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/flags.html#deleting-a-flag" %] <p> @@ -23,27 +24,17 @@ <a href="editflagtypes.cgi?action=deactivate&id=[% flag_type.id %]&token= [%- token FILTER html %]">deactivate it</a>, in which case the type [% IF flag_type.flag_count %] and its flags [% END %] will remain - in the database but will not appear in the [% terms.Bugzilla %] UI. + in the database but will not appear in the Bugzilla UI. </p> -<table> - <tr> - <td colspan="2"> - Do you really want to delete this type? - </td> - </tr> - <tr> - <td> - <a href="editflagtypes.cgi?action=delete&id=[% flag_type.id %]&token= - [%- token FILTER html %]">Yes, delete - </a> - </td> - <td align="right"> - <a href="editflagtypes.cgi"> - No, don't delete - </a> - </td> - </tr> -</table> +<p class="confirmation"> + Do you really want to delete this type? +</p> + +<p> + <a href="editflagtypes.cgi?action=delete&id=[% flag_type.id %]&token= + [%- token FILTER html %]">Yes, delete</a> - + <a href="editflagtypes.cgi">No, don't delete</a> +</p> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/flag-type/edit.html.tmpl b/template/en/default/admin/flag-type/edit.html.tmpl index ab70e232b..6c0e0cb78 100644 --- a/template/en/default/admin/flag-type/edit.html.tmpl +++ b/template/en/default/admin/flag-type/edit.html.tmpl @@ -15,22 +15,17 @@ Based on [% type.name FILTER html %] [% END %] [% END %] - [% doc_section = "flags-overview.html#flags-create" %] [% ELSE %] [% title = BLOCK %]Edit Flag Type [% type.name FILTER html %][% END %] - [% doc_section = "flags-overview.html#flags-edit" %] [% END %] [% PROCESS global/header.html.tmpl title = title - style = " - table#form th { text-align: right; vertical-align: baseline; white-space: nowrap; } - table#form td { text-align: left; vertical-align: baseline; } - " + style_urls = ['skins/standard/admin.css'] onload="var f = document.forms['flagtype_properties']; selectProduct(f.product, f.component, null, null, '__Any__');" javascript_urls=["js/productform.js"] - doc_section = doc_section + doc_section = "administering/flags.html" %] <form id="flagtype_properties" method="post" action="editflagtypes.cgi"> @@ -49,15 +44,15 @@ [%# Add a hidden button at the top of the form so that the user pressing "return" # really submit the form, as expected. %] - <input type="submit" id="commit" value="Submit" style="display: none;"> + <input type="submit" id="commit" value="Submit" class="bz_default_hidden"> - <table id="form" cellspacing="0" cellpadding="4" border="0"> + <table id="admin_table_edit"> <tr> <th>Name:</th> <td> a short name identifying this type.<br> <input type="text" name="name" value="[% type.name FILTER html %]" size="50" - maxlength="50" [%- ' disabled="disabled"' UNLESS can_fully_edit %]> + maxlength="50" [%- ' disabled="disabled"' UNLESS can_fully_edit %] required> </td> </tr> @@ -71,6 +66,7 @@ cols = 80 defaultcontent = type.description disabled = !can_fully_edit + mandatory = 1 %] </td> </tr> @@ -90,14 +86,15 @@ [% END %] <table> <tr> - <td style="vertical-align: top;"> - <b>Product/Component:</b><br> - <select name="product" onchange="selectProduct(this, this.form.component, null, null, '__Any__');"> - <option value="">__Any__</option> - [% FOREACH prod = products %] - <option value="[% prod.name FILTER html %]">[% prod.name FILTER html %]</option> - [% END %] - </select><br> + <th class="top left"> + Product/Component:<br> + [% INCLUDE "global/product-select.html.tmpl" + id => "product" + name => "product" + add => "__Any__" + onchange => "selectProduct(this, this.form.component, null, null, '__Any__');" + products => products + %]<br> <select name="component"> <option value="">__Any__</option> [% FOREACH comp = components %] @@ -108,19 +105,19 @@ name="categoryAction-include" value="Include"> <input type="submit" id="categoryAction-exclude" name="categoryAction-exclude" value="Exclude"> - </td> - <td style="vertical-align: top;"> - <b>Inclusions:</b><br> + </th> + <th class="top left"> + Inclusions:<br> [% PROCESS category_select name="inclusion_to_remove" categories = inclusions %]<br> <input type="submit" id="categoryAction-removeInclusion" name="categoryAction-removeInclusion" value="Remove Inclusion"> - </td> - <td style="vertical-align: top;"> - <b>Exclusions:</b><br> + </th> + <th class="top left"> + Exclusions:<br> [% PROCESS category_select name="exclusion_to_remove" categories = exclusions %]<br> <input type="submit" id="categoryAction-removeExclusion" name="categoryAction-removeExclusion" value="Remove Exclusion"> - </td> + </th> </tr> </table> </td> @@ -129,12 +126,12 @@ <tr> <th>Sort Key:</th> <td> - a number between 1 and [% constants.MAX_SMALLINT FILTER none %] by which + a number between 0 and [% constants.MAX_SMALLINT FILTER none %] by which this type will be sorted when displayed to users in a list; ignore if you don't care what order the types appear in or if you want them to appear in alphabetical order.<br> - <input type="text" name="sortkey" value="[% type.sortkey || 1 FILTER html %]" size="5" - maxlength="5" [% ' disabled="disabled"' UNLESS can_fully_edit %]> + <input type="text" name="sortkey" value="[% type.sortkey || 0 FILTER html %]" size="5" + maxlength="5" [% ' disabled="disabled"' UNLESS can_fully_edit %] required> </td> </tr> diff --git a/template/en/default/admin/flag-type/list.html.tmpl b/template/en/default/admin/flag-type/list.html.tmpl index 7a0293866..b91b49199 100644 --- a/template/en/default/admin/flag-type/list.html.tmpl +++ b/template/en/default/admin/flag-type/list.html.tmpl @@ -10,15 +10,10 @@ [% PROCESS global/header.html.tmpl title = 'Administer Flag Types' - style = " - table#flag_types_bugs tr th, - table#flag_types_attachments tr th { text-align: left; } - .inactive { color: #787878; } - .multiplicable { display: block; } - " + style_urls = ['skins/standard/admin.css'] onload="var f = document.flagtype_form; selectProduct(f.product, f.component, null, null, '__All__');" javascript_urls=["js/productform.js"] - doc_section = "flags-overview.html#flag-types" + doc_section = "administering/flags.html" %] <p> @@ -42,38 +37,36 @@ </p> <form id="flagtype_form" name="flagtype_form" action="editflagtypes.cgi" method="get"> - <table> - <tr> - <th><label for="product">Product:</label></th> - <td> - <select name="product" onchange="selectProduct(this, this.form.component, null, null, '__Any__');"> - <option value="">__Any__</option> - [% FOREACH prod = products %] - <option value="[% prod.name FILTER html %]" - [% " selected" IF selected_product == prod.name %]> - [% prod.name FILTER html %]</option> - [% END %] - </select> - </td> - <th><label for="component">Component:</label></th> - <td> - <select name="component"> - <option value="">__Any__</option> - [% FOREACH comp = components %] - <option value="[% comp FILTER html %]" - [% " selected" IF selected_component == comp %]> - [% comp FILTER html %]</option> - [% END %] - </select> - </td> - <td> - <input type="checkbox" id="show_flag_counts" name="show_flag_counts" value="1" - [%+ 'checked="checked"' IF show_flag_counts %]> - <label for="show_flag_counts">Show flag counts</label> - </td> - <td><input type="submit" id="submit" value="Filter"></td> - </tr> - </table> + <div class="inline"> + <label for="product">Product:</label> + [% INCLUDE "global/product-select.html.tmpl" + id => "product" + name => "product" + add => "__Any__" + onchange => "selectProduct(this, this.form.component, null, null, '__Any__');" + products => products + %] + </div> + + <div class="inline"> + <label for="component">Component:</label> + <select name="component"> + <option value="">__Any__</option> + [% FOREACH comp = components %] + <option value="[% comp FILTER html %]" + [%+ 'selected="selected"' IF selected_component == comp %]> + [%- comp FILTER html %]</option> + [% END %] + </select> + </div> + + <div class="inline"> + <input type="checkbox" id="show_flag_counts" name="show_flag_counts" value="1" + [%+ 'checked="checked"' IF show_flag_counts %]> + <label for="show_flag_counts">Show flag counts</label> + </div> + + <input type="submit" id="submit" value="Filter"> </form> <h3>Flag Types for [% terms.Bugs %]</h3> @@ -96,9 +89,9 @@ [% BLOCK display_flag_types %] - <table id="flag_types_[% types_id FILTER html %]" cellspacing="0" cellpadding="4" border="1"> + <table id="flag_types_[% types_id FILTER html %]"> - <tr> + <tr class="column_header"> <th>Edit name ...</th> <th>Description</th> <th>Sortkey</th> @@ -116,9 +109,11 @@ [% FOREACH type = types %] <tr class="[% IF type.is_active %]active[% ELSE %]inactive[% END %]"> - <td><a href="editflagtypes.cgi?action=edit&id=[% type.id %]">[% type.name FILTER html FILTER no_break %]</a></td> + <td class="nowrap"> + <a href="editflagtypes.cgi?action=edit&id=[% type.id %]">[% type.name FILTER html %]</a> + </td> <td>[% type.description FILTER html %]</td> - <td align="right">[% type.sortkey FILTER html %]</td> + <td class="right">[% type.sortkey FILTER html %]</td> <td> [% IF type.is_requestable %] <span class="requestable">requestable</span> diff --git a/template/en/default/admin/groups/confirm-remove.html.tmpl b/template/en/default/admin/groups/confirm-remove.html.tmpl index a9aa7e132..3249ee384 100644 --- a/template/en/default/admin/groups/confirm-remove.html.tmpl +++ b/template/en/default/admin/groups/confirm-remove.html.tmpl @@ -19,7 +19,7 @@ [% PROCESS global/header.html.tmpl title = title - doc_section = "groups.html" + doc_section = "administering/groups.html" %] [% IF regexp %] @@ -32,7 +32,7 @@ [% END %] <p>Generally, you will only need to do this when upgrading groups - created with [% terms.Bugzilla %] versions 2.16 and earlier. Use + created with Bugzilla versions 2.16 and earlier. Use this option with <b>extreme care</b> and consult the documentation for further information. </p> diff --git a/template/en/default/admin/groups/create.html.tmpl b/template/en/default/admin/groups/create.html.tmpl index db65629d0..3827fb0e3 100644 --- a/template/en/default/admin/groups/create.html.tmpl +++ b/template/en/default/admin/groups/create.html.tmpl @@ -13,30 +13,35 @@ [% PROCESS global/header.html.tmpl title = "Add group" subheader = "This page allows you to define a new user group." - doc_section = "groups.html#create-groups" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/groups.html#creating-groups" %] <form method="post" action="editgroups.cgi"> - <table border="1" cellpadding="4" cellspacing="0"><tr> - <th>New Name</th> - <th>New Description</th> - <th>New User RegExp</th> - <th>Use For [% terms.Bugs %]</th> - </tr><tr> - <td><input size="20" name="name"></td> - <td><input size="40" name="desc"></td> - <td><input size="30" name="regexp"></td> - <td><input type="checkbox" name="isactive" value="1" checked></td> - </tr> - <tr> - <th>Icon URL:</th> - <td colspan="3"><input type="text" size="70" maxlength="255" id="icon_url" name="icon_url"></td> - </tr> - [% Hook.process('field') %] + <table id="admin_table_edit"> + <tr> + <th>Group Name:</th> + <td><input size="60" maxlength="255" name="name" required></td> + </tr> + <tr> + <th>Description:</th> + <td><input size="60" name="desc" required></td> + </tr> + <tr> + <th>User Regexp:</th> + <td><input size="60" name="regexp"></td> + </tr> + <tr> + <th>Icon URL:</th> + <td><input type="text" size="60" id="icon_url" name="icon_url"></td> + </tr> + <tr> + <th>Use For [% terms.Bugs %]:</th> + <td><input type="checkbox" name="isactive" value="1" checked></td> + </tr> + [% Hook.process('field') %] </table> - <hr> - <input type="checkbox" id="insertnew" name="insertnew" value="1" [% IF Param("makeproductgroups") %] checked[% END %]> <label for="insertnew">Insert new group into all existing products.</label> @@ -46,7 +51,9 @@ <input type="hidden" name="token" value="[% token FILTER html %]"> </form> -<p><b>Name</b> is what is used with the B<!-- blah -->ugzilla->user->in_group() +<hr> + +<p><b>Group Name</b> is what is used with the B[%%]ugzilla->user->in_group() function in any customized cgi files you write that use a given group. It can also be used by people submitting [% terms.bugs %] by email to limit [% terms.abug %] to a certain set of groups.</p> @@ -55,15 +62,6 @@ limit [% terms.abug %] to a certain set of groups.</p> to members of the group where they can choose whether the [% terms.bug %] will be restricted to others in the same group.</p> -<p>The <b>Use For [% terms.Bugs %]</b> flag determines whether or not the -group is eligible to be used for [% terms.bugs %]. If you clear this, it will -no longer be possible for users to add [% terms.bugs %] to this group, -although [% terms.bugs %] already in the group will remain in the group. -Doing so is a much less drastic way to stop a group from growing -than deleting the group would be. <b>Note: If you are creating -a group, you probably want it to be usable for [% terms.bugs %], in which -case you should leave this checked.</b></p> - <p><b>User RegExp</b> is optional, and if filled in, will automatically grant membership to this group to anyone with an email address that matches this regular expression.</p> @@ -75,6 +73,15 @@ email address that matches this regular expression.</p> in comments in [% terms.bugs %] besides the name of the author of comments. </p> +<p>The <b>Use For [% terms.Bugs %]</b> flag determines whether or not the +group is eligible to be used for [% terms.bugs %]. If you clear this, it will +no longer be possible for users to add [% terms.bugs %] to this group, +although [% terms.bugs %] already in the group will remain in the group. +Doing so is a much less drastic way to stop a group from growing +than deleting the group would be. <b>Note: If you are creating +a group, you probably want it to be usable for [% terms.bugs %], in which +case you should leave this checked.</b></p> + [% IF Param("makeproductgroups") %] <p>By default, the new group will be associated with existing products. Unchecking the "Insert new group into all existing products" option will @@ -87,8 +94,6 @@ email address that matches this regular expression.</p> a product.</p> [% END %] -<p>Back to the <a href="./">main [% terms.bugs %] page</a> - -or to the <a href="editgroups.cgi">group list</a>. +<p>Back to the <a href="editgroups.cgi">group list</a>.</p> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/groups/delete.html.tmpl b/template/en/default/admin/groups/delete.html.tmpl index 5ae0ce92d..465860761 100644 --- a/template/en/default/admin/groups/delete.html.tmpl +++ b/template/en/default/admin/groups/delete.html.tmpl @@ -13,21 +13,28 @@ # group. #%] - +[% title = BLOCK %]Delete group '[% group.name FILTER html %]'[% END %] [% PROCESS global/header.html.tmpl - title = "Delete group" - doc_section = "groups.html" + title = title + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/groups.html" %] -<table border="1"> - <tr> - <th>Id</th> - <th>Name</th> - <th>Description</th> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> </tr> <tr> + <td>Id</td> <td>[% group.id FILTER html %]</td> + </tr> + <tr> + <td>Name</td> <td>[% group.name FILTER html %]</td> + </tr> + <tr> + <td>Description</td> <td>[% group.description FILTER html_light %]</td> </tr> </table> @@ -151,7 +158,9 @@ <h2>Confirmation</h2> - <p>Do you really want to delete this group?</p> + <p class="confirmation"> + Do you really want to delete this group? + </p> [% IF group.users.size || group.bugs.size || group.products.size || group.flags.size %] diff --git a/template/en/default/admin/groups/edit.html.tmpl b/template/en/default/admin/groups/edit.html.tmpl index 2f4101a13..3e64fa7c4 100644 --- a/template/en/default/admin/groups/edit.html.tmpl +++ b/template/en/default/admin/groups/edit.html.tmpl @@ -18,30 +18,21 @@ [% PROCESS global/header.html.tmpl title = title - doc_section = "groups.html#edit-groups" - style = " - .grant_table { border-collapse: collapse; } - .grant_table td, .grant_table th { - padding-left: .5em; - } - .grant_table td.one, .grant_table th.one { - border-right: 1px solid black; - padding-right: .5em; - } - " + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/groups.html#editing-groups-and-assigning-group-permissions" %] <form method="post" action="editgroups.cgi"> <input type="hidden" name="action" value="postchanges"> <input type="hidden" name="group_id" value="[% group.id FILTER html %]"> - <table border="1" cellpadding="4"> + <table id="admin_table_edit"> <tr> <th>Group:</th> <td> [% IF group.is_bug_group %] - <input type="text" name="name" size="60" - value="[% group.name FILTER html %]"> + <input type="text" name="name" size="60" maxlength="255" + value="[% group.name FILTER html %]" required> [% ELSE %] [% group.name FILTER html %] [% END %] @@ -52,8 +43,8 @@ <th>Description:</th> <td> [% IF group.is_bug_group %] - <input type="text" name="desc" size="70" - value="[% group.description FILTER html %]"> + <input type="text" name="desc" size="60" + value="[% group.description FILTER html %]" required> [% ELSE %] [% group.description FILTER html %] [% END %] @@ -63,7 +54,7 @@ <tr> <th>User Regexp:</th> <td> - <input type="text" name="regexp" size="40" + <input type="text" name="regexp" size="60" value="[% group.user_regexp FILTER html %]"> </td> </tr> @@ -76,7 +67,7 @@ [% END %] </th> <td> - <input type="text" name="icon_url" size="70" maxlength="255" + <input type="text" name="icon_url" size="60" value="[% group.icon_url FILTER html %]"> </td> </tr> @@ -95,78 +86,72 @@ <h4>Group Permissions</h4> - <table class="grant_table"> + <table id="grant_table"> <tr> - <th class="one">Groups That Are a Member of This Group<br> - ("Users in <var>X</var> are automatically in - [%+ group.name FILTER html %]")</th> - <th>Groups That This Group Is a Member Of<br> - ("If you are in [% group.name FILTER html %], you are - automatically also in...")</th> + <th colspan="2"> + Groups That Are a Member of This Group<br> + ("Users in <var>X</var> are automatically in [% group.name FILTER html %]") + </th> + <th colspan="2"> + Groups That This Group Is a Member Of<br> + ("If you are in [% group.name FILTER html %], you are automatically also in...") + </th> </tr> + <tr> - <td class="one"> - [% PROCESS select_pair name = "members" size = 10 - items_available = members_available - items_current = members_current %] - </td> - - <td>[% PROCESS select_pair name = "member_of" size = 10 - items_available = member_of_available - items_current = member_of_current %]</td> + [% PROCESS select_pair name = "members" size = 10 + items_available = members_available + items_current = members_current %] + + [% PROCESS select_pair name = "member_of" size = 10 + items_available = member_of_available + items_current = member_of_current %] </tr> - </table> - <table class="grant_table"> <tr> - <th class="one"> + <th colspan="2"> Groups That Can Grant Membership in This Group<br> - ("Users in <var>X</var> can add other users to - [%+ group.name FILTER html %]") - + ("Users in <var>X</var> can add other users to [% group.name FILTER html %]") + </th> + <th colspan="2"> + Groups That This Group Can Grant Membership In<br> + ("Users in [% group.name FILTER html %] can add users to...") </th> - <th>Groups That This Group Can Grant Membership In<br> - ("Users in [% group.name FILTER html %] can add users to...") - </th> </tr> + <tr> - <td class="one"> - [% PROCESS select_pair name = "bless_from" size = 10 - items_available = bless_from_available - items_current = bless_from_current %] - </td> - <td>[% PROCESS select_pair name = "bless_to" size = 10 - items_available = bless_to_available - items_current = bless_to_current %] - </td> + [% PROCESS select_pair name = "bless_from" size = 10 + items_available = bless_from_available + items_current = bless_from_current %] + + [% PROCESS select_pair name = "bless_to" size = 10 + items_available = bless_to_available + items_current = bless_to_current %] </tr> - </table> - [% IF Param('usevisibilitygroups') %] - <table class="grant_table"> + [% IF Param('usevisibilitygroups') %] <tr> - <th class="one"> + <th colspan="2"> Groups That Can See This Group<br> - ("Users in <var>X</var> can see users in - [%+ group.name FILTER html %]") + ("Users in <var>X</var> can see users in [% group.name FILTER html %]") + </th> + <th colspan="2"> + Groups That This Group Can See<br> + ("Users in [% group.name FILTER html %] can see users in...") </th> - <th>Groups That This Group Can See<br> - ("Users in [% group.name FILTER html %] can see users in...") - </th> </tr> + <tr> - <td class="one"> - [% PROCESS select_pair name = "visible_from" size = 10 - items_available = visible_from_available - items_current = visible_from_current %] - </td> - <td>[% PROCESS select_pair name = "visible_to_me" size = 10 - items_available = visible_to_me_available - items_current = visible_to_me_current %] - </td> + [% PROCESS select_pair name = "visible_from" size = 10 + items_available = visible_from_available + items_current = visible_from_current %] + + [% PROCESS select_pair name = "visible_to_me" size = 10 + items_available = visible_to_me_available + items_current = visible_to_me_current %] </tr> - </table> - [% END %] + [% END %] + </table> <input type="submit" id="update-group" value="Update Group"> <input type="hidden" name="token" value="[% token FILTER html %]"> @@ -175,12 +160,11 @@ <h4>Mass Remove</h4> <p>You can use this form to do mass-removal of users from groups. - This is often very useful if you upgraded from [% terms.Bugzilla %] + This is often very useful if you upgraded from Bugzilla 2.16.</p> -<table><tr><td> <form method="post" action="editgroups.cgi"> - <fieldset> + <fieldset id="mass-remove"> <legend>Remove all explicit memberships from users whose login names match the following regular expression:</legend> <input type="text" size="20" name="regexp"> @@ -193,41 +177,35 @@ <input type="hidden" name="group_id" value="[% group.id FILTER html %]"> </fieldset> </form> -</td></tr></table> - + <p>Back to the <a href="editgroups.cgi">group list</a>.</p> [% PROCESS global/footer.html.tmpl %] [% BLOCK select_pair %] - <table class="select_pair"> - <tr> - <th><label for="[% "${name}_add" FILTER html %]">Add<br> - (select to add)</label></th> - <th><label for="[% "${name}_remove" FILTER html %]">Current<br> - (select to remove)</label></th> - </tr> - <tr> - <td> - <select multiple="multiple" size="[% size FILTER html %]" - name="[% "${name}_add" FILTER html %]" - id="[% "${name}_add" FILTER html %]"> - [% FOREACH item = items_available %] - <option value="[% item.id FILTER html %]"> - [% item.name FILTER html %]</option> - [% END %] - </select> - </td> - <td> - <select multiple="multiple" size="[% size FILTER html %]" - name="[% "${name}_remove" FILTER html %]" - id="[% "${name}_remove" FILTER html %]"> - [% FOREACH item = items_current %] - <option value="[% item.id FILTER html %]"> - [% item.name FILTER html %]</option> - [% END %] - </select> - </td> - </tr> - </table> + <td> + <label for="[% "${name}_add" FILTER html %]">Add<br>(select to add)</label> + <br> + <select multiple="multiple" size="[% size FILTER html %]" + name="[% "${name}_add" FILTER html %]" + id="[% "${name}_add" FILTER html %]"> + [% FOREACH item = items_available %] + <option value="[% item.id FILTER html %]"> + [% item.name FILTER html %]</option> + [% END %] + </select> + </td> + + <td> + <label for="[% "${name}_remove" FILTER html %]">Current<br>(select to remove)</label> + <br> + <select multiple="multiple" size="[% size FILTER html %]" + name="[% "${name}_remove" FILTER html %]" + id="[% "${name}_remove" FILTER html %]"> + [% FOREACH item = items_current %] + <option value="[% item.id FILTER html %]"> + [% item.name FILTER html %]</option> + [% END %] + </select> + </td> [% END %] diff --git a/template/en/default/admin/groups/list.html.tmpl b/template/en/default/admin/groups/list.html.tmpl index 859f26205..673c053cb 100644 --- a/template/en/default/admin/groups/list.html.tmpl +++ b/template/en/default/admin/groups/list.html.tmpl @@ -19,7 +19,8 @@ [% PROCESS global/header.html.tmpl title = "Edit Groups" subheader = "This lets you edit the groups available to put users in." - doc_section = "groups.html" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/groups.html" %] [% edit_contentlink = "editgroups.cgi?action=changeform&group=%%id%%" %] @@ -74,8 +75,8 @@ } %] -[% FOREACH group IN ["chartgroup", "insidergroup", "timetrackinggroup", - "querysharegroup", "debug_group"] %] +[% FOREACH group IN ["chartgroup", "comment_taggers_group", "debug_group", + "insidergroup", "querysharegroup", "timetrackinggroup"] %] [% special_group = Param(group) %] [% IF special_group %] diff --git a/template/en/default/admin/keywords/confirm-delete.html.tmpl b/template/en/default/admin/keywords/confirm-delete.html.tmpl index 718a32ec5..9f59cc57f 100644 --- a/template/en/default/admin/keywords/confirm-delete.html.tmpl +++ b/template/en/default/admin/keywords/confirm-delete.html.tmpl @@ -12,26 +12,29 @@ [% PROCESS global/header.html.tmpl title = "Delete Keyword" + style_urls = ['skins/standard/admin.css'] %] -<p> +<h2>Confirmation</h2> + +<p class="confirmation"> [% IF keyword.bug_count == 1 %] - There is one [% terms.bug %] with this keyword set. + There is one [% terms.bug %] [% ELSIF keyword.bug_count > 1 %] - There are [% keyword.bug_count FILTER html %] [%+ terms.bugs %] with - this keyword set. + There are [% keyword.bug_count FILTER html %] [%+ terms.bugs %] [% END %] - - Are you <b>sure</b> you want to delete - the <code>[% keyword.name FILTER html %]</code> keyword? + with the <em>[% keyword.name FILTER html %]</em> keyword set. +</p> + +<p> + Do you really want to delete this keyword? </p> <form method="post" action="editkeywords.cgi"> <input type="hidden" name="id" value="[% keyword.id FILTER html %]"> <input type="hidden" name="action" value="delete"> <input type="hidden" name="token" value="[% token FILTER html %]"> - <input type="submit" id="delete" - value="Yes, really delete the keyword"> + <input type="submit" id="delete" value="Yes, delete"> </form> <p><a href="editkeywords.cgi">Edit other keywords</a>.</p> diff --git a/template/en/default/admin/keywords/create.html.tmpl b/template/en/default/admin/keywords/create.html.tmpl index e29db400c..21ecaf920 100644 --- a/template/en/default/admin/keywords/create.html.tmpl +++ b/template/en/default/admin/keywords/create.html.tmpl @@ -9,37 +9,41 @@ [%# INTERFACE: # none #%] - + [% PROCESS global/header.html.tmpl title = "Add keyword" subheader = "This page allows you to add a new keyword." + style_urls = ['skins/standard/admin.css'] %] <form method="post" action="editkeywords.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> <tr> - <th align="right">Name:</th> - <td><input size="64" maxlength="64" name="name" value=""></td> + <th>Name:</th> + <td><input size="64" maxlength="64" name="name" value="" required></td> </tr> <tr> - <th align="right">Description:</th> + <th>Description:</th> <td> [% INCLUDE global/textarea.html.tmpl name = 'description' minrows = 4 cols = 64 wrap = 'virtual' + mandatory = 1 %] </td> </tr> </table> - <hr> + <input type="hidden" name="id" value="-1"> <input type="submit" id="create" value="Add"> <input type="hidden" name="action" value="new"> <input type="hidden" name="token" value="[% token FILTER html %]"> </form> +<hr> + <p><a href="editkeywords.cgi">Edit other keywords</a>.</p> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/keywords/edit.html.tmpl b/template/en/default/admin/keywords/edit.html.tmpl index 07603e1de..23158d36f 100644 --- a/template/en/default/admin/keywords/edit.html.tmpl +++ b/template/en/default/admin/keywords/edit.html.tmpl @@ -12,17 +12,18 @@ [% PROCESS global/header.html.tmpl title = "Edit keyword" + style_urls = ['skins/standard/admin.css'] %] <form method="post" action="editkeywords.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> <tr> - <th align="right">Name:</th> + <th>Name:</th> <td><input size="64" maxlength="64" name="name" - value="[% keyword.name FILTER html %]"></td> + value="[% keyword.name FILTER html %]" required></td> </tr> <tr> - <th align="right">Description:</th> + <th>Description:</th> <td> [% INCLUDE global/textarea.html.tmpl name = 'description' @@ -30,11 +31,12 @@ cols = 64 wrap = 'virtual' defaultcontent = keyword.description + mandatory = 1 %] </td> </tr> <tr> - <th align="right">[% terms.Bugs %]:</th> + <th>[% terms.Bugs %]:</th> <td> [% IF keyword.bug_count > 0 %] <a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]"> diff --git a/template/en/default/admin/keywords/list.html.tmpl b/template/en/default/admin/keywords/list.html.tmpl index ea98ca773..c3f4a5292 100644 --- a/template/en/default/admin/keywords/list.html.tmpl +++ b/template/en/default/admin/keywords/list.html.tmpl @@ -16,6 +16,7 @@ [% PROCESS global/header.html.tmpl title = "Select keyword" + style_urls = ['skins/standard/admin.css'] %] [% columns = [ @@ -32,7 +33,7 @@ { name => "bug_count" heading => "$terms.Bugs" - align => "right" + class => "right" contentlink => "buglist.cgi?keywords=%%name%%" }, { diff --git a/template/en/default/admin/milestones/confirm-delete.html.tmpl b/template/en/default/admin/milestones/confirm-delete.html.tmpl index cc30f164f..bc8b4eee3 100644 --- a/template/en/default/admin/milestones/confirm-delete.html.tmpl +++ b/template/en/default/admin/milestones/confirm-delete.html.tmpl @@ -21,33 +21,33 @@ style_urls = ['skins/standard/admin.css'] %] -<table border="1" cellpadding="4" cellspacing="0"> -<tr bgcolor="#6666FF"> - <th valign="top" align="left">Field</th> - <th valign="top" align="left">Value</th> -</tr> -<tr> - <td valign="top">Milestone:</td> - <td valign="top">[% milestone.name FILTER html %]</td> -</tr> -<tr> - <td valign="top">Milestone of Product:</td> - <td valign="top">[% product.name FILTER html %]</td> -</tr> -<tr> - <td valign="top">[% terms.Bugs %]:</td> - <td valign="top"> -[% IF milestone.bug_count %] - <a title="List of [% terms.bugs %] targetted at milestone ' - [% milestone.name FILTER html %]'" - href="buglist.cgi?target_milestone=[% milestone.name FILTER uri %]&product= - [%- product.name FILTER uri %]"> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> + </tr> + <tr> + <td>Milestone</td> + <td>[% milestone.name FILTER html %]</td> + </tr> + <tr> + <td>Milestone of Product</td> + <td>[% product.name FILTER html %]</td> + </tr> + <tr> + <td>[% terms.Bugs %]</td> + <td> + [% IF milestone.bug_count %] + <a title="List of [% terms.bugs %] targetted at milestone ' + [%- milestone.name FILTER html %]'" + href="buglist.cgi?target_milestone=[% milestone.name FILTER uri %]&product= + [%- product.name FILTER uri %]"> [% milestone.bug_count FILTER none %]</a> -[% ELSE %] - None -[% END %] - </td> -</tr> + [% ELSE %] + None + [% END %] + </td> + </tr> </table> <h2>Confirmation</h2> diff --git a/template/en/default/admin/milestones/create.html.tmpl b/template/en/default/admin/milestones/create.html.tmpl index 8006c0cd0..4f1a24144 100644 --- a/template/en/default/admin/milestones/create.html.tmpl +++ b/template/en/default/admin/milestones/create.html.tmpl @@ -17,20 +17,19 @@ [% PROCESS global/header.html.tmpl title = title subheader = subheader - onload = "document.forms['f'].milestone.focus()" + style_urls = ['skins/standard/admin.css'] %] <form name="f" method="post" action="editmilestones.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> <tr> - <th align="right"><label for="milestone">Milestone:</label></th> + <th><label for="milestone">Milestone:</label></th> <td><input id="milestone" size="64" maxlength="64" name="milestone" - value=""></td> + autofocus required></td> </tr> <tr> - <th align="right"><label for="sortkey">Sortkey:</label></th> - <td><input id="sortkey" size="20" maxlength="20" name="sortkey" - value=""></td> + <th><label for="sortkey">Sortkey:</label></th> + <td><input id="sortkey" size="20" maxlength="20" name="sortkey"></td> </tr> </table> <input type="submit" id="create" value="Add"> diff --git a/template/en/default/admin/milestones/edit.html.tmpl b/template/en/default/admin/milestones/edit.html.tmpl index 759bd708a..cbc7330fe 100644 --- a/template/en/default/admin/milestones/edit.html.tmpl +++ b/template/en/default/admin/milestones/edit.html.tmpl @@ -17,24 +17,24 @@ [%- product.name FILTER html %]'[% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] onload = "document.forms['f'].milestone.select()" %] <form name="f" method="post" action="editmilestones.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> - + <table id="admin_table_edit"> <tr> - <th class="field_label"><label for="milestone">Milestone:</label></th> + <th><label for="milestone">Milestone:</label></th> <td><input id="milestone" size="64" maxlength="64" name="milestone" value=" - [%- milestone.name FILTER html %]"></td> + [%- milestone.name FILTER html %]" required></td> </tr> <tr> - <th class="field_label"><label for="sortkey">Sortkey:</label></th> + <th><label for="sortkey">Sortkey:</label></th> <td><input id="sortkey" size="20" maxlength="20" name="sortkey" value=" [%- milestone.sortkey FILTER html %]"></td> </tr> <tr> - <th class="field_label"><label for="isactive">Enabled For [% terms.Bugs %]:</label></th> + <th><label for="isactive">Enabled For [% terms.Bugs %]:</label></th> <td><input id="isactive" name="isactive" type="checkbox" value="1" [% 'checked="checked"' IF milestone.isactive %]></td> </tr> diff --git a/template/en/default/admin/milestones/list.html.tmpl b/template/en/default/admin/milestones/list.html.tmpl index 16382799f..aa377d88e 100644 --- a/template/en/default/admin/milestones/list.html.tmpl +++ b/template/en/default/admin/milestones/list.html.tmpl @@ -19,6 +19,7 @@ '[% product.name FILTER html %]'[% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] %] [% edit_contentlink = BLOCK %]editmilestones.cgi?action=edit&product= @@ -52,7 +53,7 @@ [% columns.push({ name => "bug_count" heading => "$terms.Bugs" - align => "right" + class => "right" contentlink => bug_count_contentlink }) %] diff --git a/template/en/default/admin/milestones/select-product.html.tmpl b/template/en/default/admin/milestones/select-product.html.tmpl index 18bb88c7e..e2784127e 100644 --- a/template/en/default/admin/milestones/select-product.html.tmpl +++ b/template/en/default/admin/milestones/select-product.html.tmpl @@ -13,6 +13,7 @@ [% PROCESS global/header.html.tmpl title = "Edit milestones for which product?" + style_urls = ['skins/standard/admin.css'] %] [% columns = [ @@ -34,7 +35,7 @@ [% columns.push({ name => 'bug_count' heading => "$terms.Bugs" - align => "right" + class => "right" contentlink => "buglist.cgi?product=%%name%%" }) %] diff --git a/template/en/default/admin/params/admin.html.tmpl b/template/en/default/admin/params/admin.html.tmpl index c63329cae..f172a6316 100644 --- a/template/en/default/admin/params/admin.html.tmpl +++ b/template/en/default/admin/params/admin.html.tmpl @@ -21,8 +21,11 @@ "switching this option on will not let users use an invalid address.", allowuserdeletion => "The user editing pages are capable of letting you delete user accounts. " _ - "$terms.Bugzilla will issue a warning in case you'd run into inconsistencies " _ + "Bugzilla will issue a warning in case you'd run into inconsistencies " _ "when you're about to do so, but such deletions remain kinda scary. " _ "So, you have to turn on this option before any such deletions " _ - "will ever happen." } + "will ever happen." + + last_visit_keep_days => "This option controls how many days $terms.Bugzilla will " _ + "remember when users visit specific ${terms.bugs}."} %] diff --git a/template/en/default/admin/params/advanced.html.tmpl b/template/en/default/admin/params/advanced.html.tmpl index 076d2dc7b..1f24c7d06 100644 --- a/template/en/default/admin/params/advanced.html.tmpl +++ b/template/en/default/admin/params/advanced.html.tmpl @@ -18,7 +18,7 @@ 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 + parameter turned on, 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. @@ -35,7 +35,7 @@ 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. + subdomain(s) under the main Bugzilla domain. </li> </ul> [% END %] @@ -44,22 +44,22 @@ cookiedomain => "If your website is at 'www.foo.com', setting this to" _ " '.foo.com' will also allow 'bar.foo.com' to access" - _ " $terms.Bugzilla cookies. This is useful if you have more than" + _ " Bugzilla cookies. This is useful if you have more than" _ " one hostname pointing at the same web server, and you" - _ " want them to share the $terms.Bugzilla cookie.", + _ " want them to share the Bugzilla cookie.", inbound_proxies => - "When inbound traffic to $terms.Bugzilla goes through a proxy," - _ " $terms.Bugzilla thinks that the IP address of every single" + "When inbound traffic to Bugzilla goes through a proxy," + _ " Bugzilla thinks that the IP address of every single" _ " user is the IP address of the proxy. If you enter a comma-separated" - _ " list of IPs in this parameter, then $terms.Bugzilla will trust any" + _ " list of IPs in this parameter, then Bugzilla will trust any" _ " <code>X-Forwarded-For</code> header sent from those IPs," _ " and use the value of that header as the end user's IP address.", proxy_url => - "$terms.Bugzilla may have to access the web to get notifications about" - _ " new releases (see the <tt>upgrade_notification</tt> parameter)." - _ " If your $terms.Bugzilla server is behind a proxy, it may be" + "Bugzilla may have to access the web to get notifications about" + _ " new releases (see the <var>upgrade_notification</var> parameter)." + _ " If your Bugzilla server is behind a proxy, it may be" _ " 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.", diff --git a/template/en/default/admin/params/attachment.html.tmpl b/template/en/default/admin/params/attachment.html.tmpl index c0c32a4d5..5efcc1106 100644 --- a/template/en/default/admin/params/attachment.html.tmpl +++ b/template/en/default/admin/params/attachment.html.tmpl @@ -19,44 +19,44 @@ _ "<p>This is a security restriction for installations where untrusted" _ " users may upload attachments that could be potentially damaging if" _ " viewed directly in the browser.</p>" - _ "<p>It is highly recommended that you set the <tt>attachment_base</tt>" + _ "<p>It is highly recommended that you set the <var>attachment_base</var>" _ " parameter if you turn this parameter on.", attachment_base => - "When the <tt>allow_attachment_display</tt> parameter is on, it is " + "When the <var>allow_attachment_display</var> parameter is on, it is " _ " possible for a malicious attachment to steal your cookies or" - _ " perform an attack on $terms.Bugzilla using your credentials." + _ " perform an attack on Bugzilla using your credentials." _ "<p>If you would like additional security on attachments to avoid" - _ " this, set this parameter to an alternate URL for your $terms.Bugzilla" - _ " that is not the same as <tt>urlbase</tt> or <tt>sslbase</tt>." + _ " this, set this parameter to an alternate URL for your Bugzilla" + _ " that is not the same as <var>urlbase</var> or <var>sslbase</var>." _ " That is, a different domain name that resolves to this exact" - _ " same $terms.Bugzilla installation.</p>" + _ " same Bugzilla installation.</p>" _ "<p>Note that if you have set the" - _ " <a href=\"editparams.cgi?section=advanced#cookiedomain_desc\"><tt>cookiedomain</tt>" - _" parameter</a>, you should set <tt>attachment_base</tt> to use a" + _ " <a href=\"editparams.cgi?section=advanced#cookiedomain_desc\"><var>cookiedomain</var>" + _" parameter</a>, you should set <var>attachment_base</var> to use a" _ " domain that would <em>not</em> be matched by" - _ " <tt>cookiedomain</tt>.</p>" - _ "<p>For added security, you can insert <tt>%bugid%</tt> into the URL," + _ " <var>cookiedomain</var>.</p>" + _ "<p>For added security, you can insert <var>%bugid%</var> into the URL," _ " which will be replaced with the ID of the current $terms.bug that" _ " the attachment is on, when you access an attachment. This will limit" _ " attachments to accessing only other attachments on the same" _ " ${terms.bug}. Remember, though, that all those possible domain names " - _ " (such as <tt>1234.your.domain.com</tt>) must point to this same" - _ " $terms.Bugzilla instance.", + _ " (such as <kbd>1234.your.domain.com</kbd>) must point to this same" + _ " Bugzilla instance.", allow_attachment_deletion => "If this option is on, administrators will be able to delete " _ "the content of attachments.", maxattachmentsize => "The maximum size (in kilobytes) of attachments to be stored " _ "in the database. If a file larger than this size is attached " _ - "to ${terms.abug}, $terms.Bugzilla will look at the " _ - "<a href=\"#maxlocalattachment\"><tt>maxlocalattachment</tt> parameter</a> " _ + "to ${terms.abug}, Bugzilla will look at the " _ + "<a href=\"#maxlocalattachment\"><var>maxlocalattachment</var> parameter</a> " _ "to determine if the file can be stored locally on the web server. " _ "If the file size exceeds both limits, then the attachment is rejected. " _ "Settings both parameters to 0 will prevent attaching files to ${terms.bugs}.", maxlocalattachment => "The maximum size (in megabytes) of attachments to be stored " _ "locally on the web server. If set to a value lower than the " _ - "<a href=\"#maxattachmentsize\"><tt>maxattachmentsize</tt> parameter</a>, " _ + "<a href=\"#maxattachmentsize\"><var>maxattachmentsize</var> parameter</a>, " _ "attachments will never be kept on the local filesystem." } %] diff --git a/template/en/default/admin/params/auth.html.tmpl b/template/en/default/admin/params/auth.html.tmpl index 0a72938ca..902d2fc82 100644 --- a/template/en/default/admin/params/auth.html.tmpl +++ b/template/en/default/admin/params/auth.html.tmpl @@ -50,13 +50,13 @@ <dl> <dt>DB</dt> <dd> - ${terms.Bugzilla}'s built-in authentication. This is the most common + Bugzilla's built-in authentication. This is the most common choice. </dd> <dt>RADIUS</dt> <dd> RADIUS authentication using a RADIUS server. - Please see the $terms.Bugzilla documentation for + Please see the Bugzilla documentation for more information. Using this method requires <a href=\"?section=radius\">additional @@ -65,7 +65,7 @@ <dt>LDAP</dt> <dd> LDAP authentication using an LDAP server. - Please see the $terms.Bugzilla documentation + Please see the Bugzilla documentation for more information. Using this method requires <a href=\"?section=ldap\">additional parameters</a> to be set. @@ -84,8 +84,8 @@ </li> <li> defaulton/defaultoff - Default behavior as described - above, but user can choose whether $terms.Bugzilla will remember his - login or not. + above, but user can choose whether Bugzilla will + remember their login or not. </li> </ul>", @@ -93,20 +93,27 @@ "front page will require a login. No anonymous users will " _ "be permitted.", + webservice_email_filter => + "Filter email addresses returned by the WebService API depending on " _ + "if the user is logged in or not. This works similarly to how the " _ + "web UI currently filters email addresses. If <var>requirelogin</var> " _ + "is enabled, then this parameter has no effect as users must be logged " _ + "in to use Bugzilla.", + emailregexp => "This defines the regular expression to use for legal email addresses. " _ "The default tries to match fully qualified email addresses. " _ - "Use <tt>.*</tt> to accept any email address following the " _ + "Use <kbd>.*</kbd> to accept any email address following the " _ "<a href=\"http://tools.ietf.org/html/rfc2822#section-3.4.1\">RFC 2822</a> " _ - "specification. Another popular value to put here is <tt>^[^@]+$</tt>, " _ + "specification. Another popular value to put here is <kbd>^[^@]+$</kbd>, " _ "which means 'local usernames, no @ allowed.'", - emailregexpdesc => "This describes in English words what kinds of legal addresses " _ - "are allowed by the <tt>emailregexp</tt> param.", + emailregexpdesc => "This description explains valid addresses that " _ + "are allowed by the <var>emailregexp</var> param.", emailsuffix => "This is a string to append to any email addresses when actually " _ "sending mail to that address. It is useful if you have changed " _ - "the <tt>emailregexp</tt> param to only allow local usernames, " _ + "the <var>emailregexp</var> param to only allow local usernames, " _ "but you want the mail to be delivered to username@my.local.hostname.", createemailregexp => "This defines the (case-insensitive) regexp to use for email addresses that are " _ @@ -126,5 +133,11 @@ "lower case letter and a number.</li>" _ "<li>letters_numbers_specialchars - Passwords must contain at least one " _ "letter, a number and a special character.</li></ul>" + + password_check_on_login => + "If set, $terms.Bugzilla will check that the password meets the current " _ + "complexity rules and minimum length requirements when the user logs " _ + "into the $terms.Bugzilla web interface. If it doesn't, the user would " _ + "not be able to log in, and recieve a message to reset their password." } %] diff --git a/template/en/default/admin/params/bugfields.html.tmpl b/template/en/default/admin/params/bugfields.html.tmpl index 07b200825..1f177067a 100644 --- a/template/en/default/admin/params/bugfields.html.tmpl +++ b/template/en/default/admin/params/bugfields.html.tmpl @@ -11,7 +11,7 @@ %] [% param_descs = { - useclassification => "If this is on, $terms.Bugzilla will associate each product with a " _ + useclassification => "If this is on, Bugzilla will associate each product with a " _ "specific classification. But you must have 'editclassification' " _ "permissions enabled in order to edit classifications.", @@ -34,12 +34,16 @@ defaultplatform => "This is the platform that is preselected on the $terms.bug " _ "entry form.<br> " _ "You can leave this empty: " _ - "$terms.Bugzilla will then use the platform that the browser " _ + "Bugzilla will then use the platform that the browser " _ "reports to be running on as the default.", defaultopsys => "This is the operating system that is preselected on the $terms.bug " _ "entry form.<br> " _ "You can leave this empty: " _ - "$terms.Bugzilla will then use the operating system that the browser " _ - "reports to be running on as the default." } + "Bugzilla will then use the operating system that the browser " _ + "reports to be running on as the default.", + + collapsed_comment_tags => "A comma separated list of tags which, when applied " _ + "to comments, will cause them to be collapsed by default", + } %] diff --git a/template/en/default/admin/params/common.html.tmpl b/template/en/default/admin/params/common.html.tmpl index bf2675b16..db3bde777 100644 --- a/template/en/default/admin/params/common.html.tmpl +++ b/template/en/default/admin/params/common.html.tmpl @@ -69,14 +69,14 @@ [% END %] </select> </td> - <td style="vertical-align: bottom"> + <td class="bottom"> <button type="button" onClick="sortedList_moveItem('[% param.name FILTER html %]', -1, '[% sortlist_separator %]');">↑</button> </td> </tr> <tr> - <td style="vertical-align: top"> + <td class="top"> <button type="button" onClick="sortedList_moveItem('[% param.name FILTER html %]', +1, '[% sortlist_separator %]');">↓</button> </td> @@ -107,10 +107,10 @@ [% END %] </select> [% ELSE %] - <font color="red"> + <span class="warning"> Unknown param type [% param.type FILTER html %]!!! - </font> - [% END %] + </span> + [% END %] </p> [% UNLESS param.no_reset %] <p> diff --git a/template/en/default/admin/params/core.html.tmpl b/template/en/default/admin/params/core.html.tmpl index fd839ed9b..d7703b5b8 100644 --- a/template/en/default/admin/params/core.html.tmpl +++ b/template/en/default/admin/params/core.html.tmpl @@ -8,7 +8,7 @@ [% title = "Required Settings" - desc = "Settings that are required for proper operation of $terms.Bugzilla" + desc = "Settings that are required for proper operation of Bugzilla" %] [% param_descs = { @@ -19,17 +19,17 @@ "(SSL) $terms.Bugzilla URLs.", ssl_redirect => - "When this is enabled, $terms.Bugzilla will ensure that every page is" + "When this is enabled, Bugzilla will ensure that every page is" _ " accessed over SSL, by redirecting any plain HTTP requests to HTTPS" - _ " using the <tt>sslbase</tt> parameter. Also, when this is enabled," - _ " $terms.Bugzilla will send out links using <tt>sslbase</tt> in emails" - _ " instead of <tt>urlbase</tt>.", + _ " using the <var>sslbase</var> parameter. Also, when this is enabled," + _ " Bugzilla will send out links using <var>sslbase</var> in emails" + _ " instead of <var>urlbase</var>.", cookiepath => "Path, relative to your web document root, to which to restrict " _ - "$terms.Bugzilla cookies. Normally this is the URI portion of your URL " _ + "Bugzilla cookies. Normally this is the URI portion of your URL " _ "base. Begin with a / (single slash mark). For instance, if " _ - "$terms.Bugzilla serves from 'http://www.somedomain.com/bugzilla/', set " _ + "Bugzilla serves from 'http://www.somedomain.com/bugzilla/', set " _ "this parameter to /bugzilla/. Setting it to / will allow " _ "all sites served by this web server or virtual host to read " _ - "$terms.Bugzilla cookies.", + "Bugzilla cookies.", } %] diff --git a/template/en/default/admin/params/dependencygraph.html.tmpl b/template/en/default/admin/params/dependencygraph.html.tmpl index e8baf4572..64a334a20 100644 --- a/template/en/default/admin/params/dependencygraph.html.tmpl +++ b/template/en/default/admin/params/dependencygraph.html.tmpl @@ -6,8 +6,8 @@ # defined by the Mozilla Public License, v. 2.0. #%] [% - title = "Dependency Graphs" - desc = "Optional setup for dependency graphing" + title = "Graphs" + desc = "Optional setup to generate graphs" %] [% param_descs = { @@ -32,5 +32,15 @@ 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 <kbd>checksetup.pl</kbd> - to recreate the .htaccess file if it has been lost."} + to recreate the .htaccess file if it has been lost.", + + font_file => "You can specify the full path to a TrueType font file which will be used " _ + "to display text (labels, legends, ...) in charts and graphical reports. " _ + "To support as many languages as possible, we recommend to specify a TrueType " _ + "font such as <a href=\"http://unifoundry.com/unifont.html\">Unifont</a> " _ + "which supports all printable characters in the Basic Multilingual Plane. " _ + "If you leave this parameter empty, a default font will be used, but " _ + "its support is limited to English characters only and so other characters " _ + "will be displayed incorrectly.", + } %] diff --git a/template/en/default/admin/params/editparams.html.tmpl b/template/en/default/admin/params/editparams.html.tmpl index 3febbaba4..4e1946dd8 100644 --- a/template/en/default/admin/params/editparams.html.tmpl +++ b/template/en/default/admin/params/editparams.html.tmpl @@ -35,14 +35,13 @@ [% PROCESS global/header.html.tmpl title = title message = message - style_urls = ['skins/standard/params.css'] + style_urls = ['skins/standard/admin.css'] javascript_urls = ['js/params.js', 'js/util.js'] - doc_section = "parameters.html" + doc_section = "administering/parameters.html" %] -<table border="0" width="100%"> - <tr> - <td> +<div class="table"> + <div class="cell"> [%# NAVIGATION BAR %] <table id="menu"> <tr> @@ -66,38 +65,37 @@ </tr> [% END %] </table> - </td> - <td> - [% IF curpanel == -1 %] - [% PROCESS admin/params/index.html.tmpl panels = panels %] - [% ELSE %] + </div> - <div class="contribute"><strong>Note:</strong> - B[% %]ugzilla is developed entirely by volunteers. - The best way to give back to the B[% %]ugzilla project is to - <a href="http://www.bugzilla.org/contribute/">contribute</a> - yourself! - You don't have to be a programmer to contribute, there are lots of - things that we need. - </div> + <div class="cell"> + <div id="contribute"> + <strong>Note:</strong> + Bugzilla is developed entirely by volunteers. + The best way to give back to the Bugzilla project is to + <a href="http://www.bugzilla.org/contribute/">contribute</a> yourself! + You don't have to be a programmer to contribute, there are lots of + things that we need. + </div> + [% IF curpanel == -1 %] + [% PROCESS admin/params/index.html.tmpl panels = panels %] + [% ELSE %] <p> - This lets you edit the basic operating parameters of [% terms.Bugzilla %]. + This lets you edit the basic operating parameters of Bugzilla. Be careful!<br> Any item you check "Reset" on will get reset to its default value. </p> [%# CONTENT PANEL %] - <form method="post" action="editparams.cgi"> + <form id="edit_params" method="post" action="editparams.cgi"> [% PROCESS admin/params/common.html.tmpl panel = current_panel %] <input type="hidden" name="section" value="[% current_panel.name FILTER html %]"> <input type="hidden" name="action" value="save"> <input type="hidden" name="token" value="[% token FILTER html %]"> <input type="submit" id="save-params" value="Save Changes"> </form> - [% END %] - </td> - </tr> -</table> + [% END %] + </div> +</div> [% INCLUDE global/footer.html.tmpl %] diff --git a/template/en/default/admin/params/general.html.tmpl b/template/en/default/admin/params/general.html.tmpl index daa1f359e..6ebef8ea2 100644 --- a/template/en/default/admin/params/general.html.tmpl +++ b/template/en/default/admin/params/general.html.tmpl @@ -14,15 +14,7 @@ [% param_descs = { maintainer => "The email address of the person who maintains this installation " - _ " of ${terms.Bugzilla}.", - - docs_urlbase => - "The URL that is the common initial leading part of all" - _ " $terms.Bugzilla documentation URLs. It may be an absolute URL," - _ " or a URL relative to the <tt>urlbase</tt> parameter. Leave this" - _ " empty to suppress links to the documentation." - _ "'%lang%' will be replaced by user's preferred language (if" - _ " documentation is available in that language).", + _ " of Bugzilla.", utf8 => "Use UTF-8 (Unicode) encoding for all text in ${terms.Bugzilla}. New" @@ -36,24 +28,23 @@ _ " afterward.</p>", shutdownhtml => - "If this field is non-empty, then $terms.Bugzilla will be completely" + "If this field is non-empty, then Bugzilla will be completely" _ " disabled and this text will be displayed instead of all the" _ " $terms.Bugzilla pages.", announcehtml => - "If this field is non-empty, then $terms.Bugzilla will" + "If this field is non-empty, then Bugzilla will" _ " display whatever is in this field at the top of every" _ " HTML page. The HTML you put in this field is not wrapped or" _ " enclosed in anything. You might want to wrap it inside a" - _ "<tt><div></tt>. Give the div <em>id=\"message\"</em> to get" + _ "<code><div></code>. Give the div <em>id=\"message\"</em> to get" _ " green text inside a red box, or <em>class=\"bz_private\"</em> for" _ " dark red on a red background. Anything defined in " - _ " <tt>skins/standard/global.css</tt> or <tt>skins/custom/global.css</tt>" - _ " will work. To get centered text, use <em>style=\"text-align: " - _ " center;\"</em>.", + _ " <code>skins/standard/global.css</code> or <code>skins/custom/global.css</code>" + _ " will work. To get centered text, use <em>class=\"center\"</em>.", upgrade_notification => - "$terms.Bugzilla can inform you when a new release is available." + "Bugzilla can inform you when a new release is available." _ " The notification will appear on the $terms.Bugzilla homepage," _ " for administrators only." _ " <ul><li>'development_snapshot' notifies you about the development " @@ -67,7 +58,7 @@ _ " for newer release candidates too.</li>" _ " <li>'disabled' will never notify you about new releases and no" _ " connection will be established to a remote server.</li></ul>" - _ " <p>Note that if your $terms.Bugzilla server requires a proxy to" - _ " access the Internet, you may also need to set the <tt>proxy_url</tt>" + _ " <p>Note that if your Bugzilla server requires a proxy to" + _ " access the Internet, you may also need to set the <var>proxy_url</var>" _ " parameter in the Advanced section.</p>", } %] diff --git a/template/en/default/admin/params/groupsecurity.html.tmpl b/template/en/default/admin/params/groupsecurity.html.tmpl index 7e30f0723..590f4da02 100644 --- a/template/en/default/admin/params/groupsecurity.html.tmpl +++ b/template/en/default/admin/params/groupsecurity.html.tmpl @@ -11,7 +11,7 @@ %] [% param_descs = { - makeproductgroups => "If this is on, $terms.Bugzilla will associate $terms.abug group " _ + makeproductgroups => "If this is on, Bugzilla will associate $terms.abug group " _ "with each product in the database, and use it for querying ${terms.bugs}.", chartgroup => "The name of the group of users who can use the 'New Charts' " _ @@ -29,18 +29,28 @@ querysharegroup => "The name of the group of users who can share their " _ "saved searches with others.", + comment_taggers_group => "The name of the group of users who can tag comment." _ + " Setting this to empty disables comment tagging.", + debug_group => "The name of the group of users who can view the actual " _ "SQL query generated when viewing $terms.bug lists and reports.", usevisibilitygroups => "Do you wish to restrict visibility of users to members of " _ "specific groups?", - + strict_isolation => "Don't allow users to be assigned to, " _ "be qa-contacts on, " _ "be added to CC list, " _ "or make or remove dependencies " _ "involving any bug that is in a product on which that " _ - "user is forbidden to edit.", - + "user is forbidden to edit.", + + or_groups => "Define the visibility of $terms.abug which is in multiple " _ + "groups. If this is on (recommended), a user only needs to " _ + "be a member of one of the $terms.bug's groups in order to " _ + "view it. If it is off, a user needs to be a member of all " _ + "the $terms.bug's groups. Note that in either case, if the " _ + "user has a role on the $terms.bug (e.g. reporter) that may " _ + "also affect their permissions." } %] diff --git a/template/en/default/admin/params/index.html.tmpl b/template/en/default/admin/params/index.html.tmpl index 65aa398eb..ee64eca9f 100644 --- a/template/en/default/admin/params/index.html.tmpl +++ b/template/en/default/admin/params/index.html.tmpl @@ -6,33 +6,23 @@ # defined by the Mozilla Public License, v. 2.0. #%] -<p> - All parameters are displayed below, per section. - If you cannot find one from here, then the parameter does not exist. -</p> +<div id="params_index"> + <p> + All parameters are displayed below, per section. + If you cannot find one from here, then the parameter does not exist. + </p> -<div align="center"> - <table> - <tr> - <th>Parameter</th> - <th>Section</th> - </tr> - [% FOREACH panel = panels %] + [% FOREACH panel = panels %] + <h3>[% panel.title FILTER html %]</h3> + + <ul> [% FOREACH param = panel.param_list.sort('name') %] - <tr> - <td> - <a href="editparams.cgi?section= - [%- panel.name FILTER uri %]#[% param.name FILTER uri %]_desc"> - [% param.name FILTER html %]</a> - </td> - <td> - [% panel.title FILTER html %] - </td> - </tr> + <li> + <a href="editparams.cgi?section= + [%- panel.name FILTER uri %]#[% param.name FILTER uri %]_desc"> + [% param.name FILTER html %]</a> + </li> [% END %] - <tr> - <td> </td><td> </td> - </tr> - [% END %] - </table> + </ul> + [% END %] </div> diff --git a/template/en/default/admin/params/ldap.html.tmpl b/template/en/default/admin/params/ldap.html.tmpl index 64b3dbd52..ab3521f27 100644 --- a/template/en/default/admin/params/ldap.html.tmpl +++ b/template/en/default/admin/params/ldap.html.tmpl @@ -35,11 +35,11 @@ LDAPmailattribute => "The name of the attribute of a user in your " _ "directory that contains the email address, to be " _ - "used as $terms.Bugzilla username. If this parameter " _ - "is empty, $terms.Bugzilla will use the LDAP username"_ - " as the $terms.Bugzilla username. You may also want" _ + "used as Bugzilla username. If this parameter " _ + "is empty, Bugzilla will use the LDAP username"_ + " as the Bugzilla username. You may also want" _ " to set the \"emailsuffix\" parameter, in this case.", - LDAPfilter => "LDAP filter to AND with the <tt>LDAPuidattribute</tt> for " _ + LDAPfilter => "LDAP filter to AND with the <var>LDAPuidattribute</var> for " _ "filtering the list of valid users." } %] diff --git a/template/en/default/admin/params/memcached.html.tmpl b/template/en/default/admin/params/memcached.html.tmpl new file mode 100644 index 000000000..50ec435fb --- /dev/null +++ b/template/en/default/admin/params/memcached.html.tmpl @@ -0,0 +1,22 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] +[% + title = "Memcached" + desc = "Set up Memcached integration" +%] + +[% param_descs = { + memcached_servers => + "If this option is set, Bugzilla will integrate with Memcached. " _ + "Specify one or more servers, separated by spaces, using hostname:port " _ + "notation (for example: 127.0.0.1:11211).", + + memcached_namespace => + "Specify a string to prefix to each key on Memcached.", + } +%] diff --git a/template/en/default/admin/params/mta.html.tmpl b/template/en/default/admin/params/mta.html.tmpl index f491a3035..bd93a3ee9 100644 --- a/template/en/default/admin/params/mta.html.tmpl +++ b/template/en/default/admin/params/mta.html.tmpl @@ -14,7 +14,12 @@ mail_delivery_method => "Defines how email is sent, or if it is sent at all.<br> <ul> <li> - 'Sendmail', 'SMTP' and 'Qmail' are all MTAs. + 'SMTP' means use the SMTP protocol to talk to a remote + mail server. + </li> + <li> + 'Sendmail' means use the sendmail-compatible MTA + installed on the Bugzilla machine. You need to install a third-party sendmail replacement if you want to use sendmail on Windows. </li> @@ -23,7 +28,7 @@ in 'data/mailer.testfile' instead of being sent. </li> <li> - 'none' will completely disable email. $terms.Bugzilla continues + 'None' will completely disable email. Bugzilla continues to act as though it is sending mail, but nothing is sent or stored. </li> @@ -32,17 +37,18 @@ mailfrom => "The email address of the $terms.Bugzilla mail daemon. Some email systems " _ "require this to be a valid email address.", - use_mailer_queue => "In a large $terms.Bugzilla installation, updating" - _ " $terms.bugs can be very slow, because $terms.Bugzilla sends all" - _ " email at once. If you enable this parameter, $terms.Bugzilla will" + use_mailer_queue => "In a large Bugzilla installation, updating" + _ " $terms.bugs can be very slow, because Bugzilla sends all" + _ " email at once. If you enable this parameter, Bugzilla will" _ " queue all mail and then send it in the background. This requires" _ " that you have installed certain Perl modules (as listed by" _ " <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," + _ " won't get sent). This affects all mail sent by Bugzilla," _ " not just $terms.bug updates.", - smtpserver => "The SMTP server address (if using SMTP for mail delivery).", + smtpserver => "The SMTP server address with optional port number (if using SMTP" _ + " for mail delivery). eg: example.com or example.com:1234", smtp_username => "The username to pass to the SMTP server for SMTP authentication. " _ "Leave this field empty if your SMTP server doesn't require authentication.", @@ -54,7 +60,7 @@ smtp_debug => "If enabled, this will print detailed information to your" _ " web server's error log about the communication between" _ - " $terms.Bugzilla and your SMTP server. You can use this to" _ + " 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 CONFIRMED " _ diff --git a/template/en/default/admin/params/patchviewer.html.tmpl b/template/en/default/admin/params/patchviewer.html.tmpl deleted file mode 100644 index 61d32a07b..000000000 --- a/template/en/default/admin/params/patchviewer.html.tmpl +++ /dev/null @@ -1,51 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] -[% - title = "Patch Viewer" - desc = "Set up third-party applications to run with PatchViewer" -%] - -[% param_descs = { - cvsroot => "The <a href=\"http://www.cvshome.org\">CVS</a> root that most " _ - "users of your system will be using for 'cvs diff'. Used in " _ - "Patch Viewer ('Diff' option on patches) to figure out where " _ - "patches are rooted even if users did the 'cvs diff' from " _ - "different places in the directory structure. (NOTE: if your " _ - "CVS repository is remote and requires a password, you must " _ - "either ensure the $terms.Bugzilla user has done a 'cvs login' or " _ - "specify the password " _ - "<a href=\"http://www.cvshome.org/docs/manual/cvs_2.html#SEC26\">as " _ - "part of the CVS root</a>.) Leave this blank if you have no " _ - "CVS repository.", - - cvsroot_get => "The CVS root $terms.Bugzilla will be using to get patches from. " _ - "Some installations may want to mirror their CVS repository on " _ - "the $terms.Bugzilla server or even have it on that same server, and " _ - "thus the repository can be the local file system (and much " _ - "faster). Make this the same as cvsroot if you don't " _ - "understand what this is (if cvsroot is blank, make this blank too).", - - bonsai_url => "The URL to a <a href=\"http://www.mozilla.org/bonsai.html\">Bonsai</a> " _ - "server containing information about your CVS repository. " _ - "Patch Viewer will use this information to create links to " _ - "bonsai's blame for each section of a patch (it will append " _ - "'/cvsblame.cgi?...' to this url). Leave this blank if you " _ - "don't understand what this is.", - - lxr_url => "The URL to an <a href=\"http://sourceforge.net/projects/lxr\">LXR</a> server " _ - "that indexes your CVS repository. Patch Viewer will use this " _ - "information to create links to LXR for each file in a patch. " _ - "Leave this blank if you don't understand what this is.", - - lxr_root => "Some LXR installations do not index the CVS repository from the root -- " _ - "<a href=\"http://lxr.mozilla.org/mozilla\">Mozilla's</a>, for " _ - "example, starts indexing under <code>mozilla/</code>. This " _ - "means URLs are relative to that extra path under the root. " _ - "Enter this if you have a similar situation. Leave it blank " _ - "if you don't know what this is." } -%] diff --git a/template/en/default/admin/params/query.html.tmpl b/template/en/default/admin/params/query.html.tmpl index 52a960b44..d8a510282 100644 --- a/template/en/default/admin/params/query.html.tmpl +++ b/template/en/default/admin/params/query.html.tmpl @@ -26,29 +26,24 @@ </li> </ul>", - mostfreqthreshold => "The minimum number of duplicates $terms.abug needs to show up on the " _ - "<a href=\"duplicates.cgi\">most frequently reported $terms.bugs page</a>. " _ - "If you have a large database and this page takes a long time to " _ - "load, try increasing this number.", - mybugstemplate => "This is the URL to use to bring up a simple 'all of my $terms.bugs' " _ - "list for a user. %userid% will get replaced with the login name of a user.", + "list for a user. %userid% will get replaced with the login name of a user. " _ + "Special characters must be URL-encoded.", defaultquery => "This is the default query that initially comes up when you " _ - "access the advanced query page. It's in URL parameter " _ - "format, which makes it hard to read. Sorry!", + "access the advanced query page. It's in URL parameter format.", search_allow_no_criteria => "Unless the code explicitly allows all $terms.bugs to be returned, this " _ "parameter permits to block the execution of queries with no criteria. " _ "When turned off, a query must have some criteria specified to limit " _ "the number of $terms.bugs returned to the user. When turned on, a user " _ - "is allowed to run a query with no criteria and get all $terms.bugs he can " _ - "see in his list. Turning this parameter on is not recommended on large " _ + "is allowed to run a query with no criteria and get all $terms.bugs they can " _ + "see in their list. Turning this parameter on is not recommended on large " _ "installations.", default_search_limit => - "By default, $terms.Bugzilla limits searches done in the web" + "By default, Bugzilla limits searches done in the web" _ " interface to returning only this many results, for performance" _ " reasons. (This only affects the HTML format of search results--CSV," _ " XML, and other formats are exempted.) Users can click a link on the" diff --git a/template/en/default/admin/params/shadowdb.html.tmpl b/template/en/default/admin/params/shadowdb.html.tmpl index 9f9f31491..2d5fced3b 100644 --- a/template/en/default/admin/params/shadowdb.html.tmpl +++ b/template/en/default/admin/params/shadowdb.html.tmpl @@ -14,7 +14,7 @@ shadowdbhost => "The host the shadow database is on.", shadowdbport => "The port the shadow database is on. Ignored if " _ - "<tt>shadowdbhost</tt> is blank. Note: if the host is the local " _ + "<var>shadowdbhost</var> is blank. Note: if the host is the local " _ "machine, then MySQL will ignore this setting, and you must " _ "specify a socket below.", @@ -23,14 +23,14 @@ "ignores the port specified by the client and connects using " _ "its compiled-in socket path (on unix machines) when connecting " _ "from a client to a local server. If you leave this blank, and " _ - "have the database on localhost, then the <tt>shadowdbport</tt> " _ + "have the database on localhost, then the <var>shadowdbport</var> " _ "will be ignored.", shadowdb => "If non-empty, then this is the name of another database in " _ - "which $terms.Bugzilla will use as a read-only copy of everything. " _ + "which Bugzilla will use as a read-only copy of everything. " _ "This is done so that long slow read-only operations can be used " _ "against this db, and not lock up things for everyone else. This " _ - "database is on the <tt>shadowdbhost</tt>, and must exist. " _ - "$terms.Bugzilla does not update it, if you use this parameter, then " _ + "database is on the <var>shadowdbhost</var>, and must exist. " _ + "Bugzilla does not update it, if you use this parameter, then " _ "you need to set up replication for your database." } %] diff --git a/template/en/default/admin/params/usermatch.html.tmpl b/template/en/default/admin/params/usermatch.html.tmpl index ebbc363b3..ad13f3864 100644 --- a/template/en/default/admin/params/usermatch.html.tmpl +++ b/template/en/default/admin/params/usermatch.html.tmpl @@ -11,7 +11,7 @@ %] [% param_descs = { - usemenuforusers => "If this option is set, $terms.Bugzilla will offer you a list " _ + usemenuforusers => "If this option is set, Bugzilla will offer you a list " _ "to select from (instead of a text entry field) where a user " _ "needs to be selected. This option should not be enabled on " _ "sites where there are a large number of users.", diff --git a/template/en/default/admin/products/confirm-delete.html.tmpl b/template/en/default/admin/products/confirm-delete.html.tmpl index eb1094fce..2e02068a4 100644 --- a/template/en/default/admin/products/confirm-delete.html.tmpl +++ b/template/en/default/admin/products/confirm-delete.html.tmpl @@ -24,53 +24,45 @@ style_urls = ['skins/standard/admin.css'] %] -<table border="1" cellpadding="4" cellspacing="0"> - <tr bgcolor="#6666FF"> - <th valign="top" align="left">Field</th> - <th valign="top" align="left">Value</th> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> </tr> [% IF Param('useclassification') %] <tr> - <td>Classification:</td> + <td>Classification</td> <td>[% classification.name FILTER html %]</td> </tr> <tr> - <td>Classification Description:</td> - [%# descriptions are intentionally not filtered to allow html content %] + <td>Classification Description</td> <td> [% IF classification.description %] [% classification.description FILTER html_light %] [% ELSE %] - <span style="color: red">missing</span> + <span class="warning">missing</span> [% END %] </td> </tr> [% END %] <tr> - <td valign="top">Product:</td> - <td valign="top"> + <td>Product</td> + <td> <a href="editproducts.cgi?product=[% product.name FILTER uri %]"> [% product.name FILTER html %] </a> </td> </tr> <tr> - <td valign="top">Description:</td> - [%# descriptions are intentionally not filtered to allow html content %] - <td valign="top"> - [% IF product.description %] - [% product.description FILTER html_light %] - [% ELSE %] - <span style="color: red">missing</span> - [% END %] - </td> + <td>Description</td> + <td>[% product.description FILTER html_light %]</td> </tr> [% IF Param('usetargetmilestone') %] <tr> - <td>Milestone URL:</td> + <td>Milestone URL</td> <td> [% IF product.milestone_url %] <a href="[% product.milestone_url FILTER html %]"> @@ -84,7 +76,7 @@ [% END %] <tr> - <td>Closed for [% terms.bugs %]:</td> + <td>Closed for [% terms.bugs %]</td> <td> [% IF product.is_active %] open @@ -99,26 +91,19 @@ [% IF product.components.size > 0 %] <a href="editcomponents.cgi?product=[% product.name FILTER uri %]" title="Edit components for product '[% product.name FILTER html %]'"> - Components: + Components </a> [% ELSE %] - Components: + Components [% END %] </td> <td> [% IF product.components.size > 0 %] - <table> + <table class="no-border"> [% FOREACH c = product.components %] <tr> - <th align="right">[% c.name FILTER html %]:</th> - [%# descriptions are intentionally not filtered to allow html content %] - <td> - [% IF c.description %] - [% c.description FILTER html_light %] - [% ELSE %] - <span style="color: red">missing</span> - [% END %] - </td> + <th>[% c.name FILTER html %]:</th> + <td>[% c.description FILTER html_light %]</td> </tr> [% END %] </table> @@ -132,17 +117,19 @@ <td> [% IF product.versions.size > 0 %] <a href="editversions.cgi?product=[%- product.name FILTER uri %]"> - Versions: + Versions </a> [% ELSE %] - Versions: + Versions [% END %] </td> <td> [% IF product.versions.size > 0 %] - [% FOREACH v = product.versions %] - [% v.name FILTER html %]<br> - [% END %] + <div class="multi-columns"> + [% FOREACH v = product.versions %] + [% v.name FILTER html %]<br> + [% END %] + </div> [% ELSE %] none [% END %] @@ -152,20 +139,22 @@ [% IF Param('usetargetmilestone') %] <tr> - <td valign="top"> + <td> [% IF product.milestones.size > 0 %] <a href="editmilestones.cgi?product=[%- product.name FILTER uri %]"> - Milestones: + Milestones </a> [% ELSE %] - Milestones: + Milestones [% END %] </td> <td> [% IF product.milestones.size > 0 %] - [% FOREACH m = product.milestones %] - [% m.name FILTER html %]<br> - [% END %] + <div class="multi-columns"> + [% FOREACH m = product.milestones %] + [% m.name FILTER html %]<br> + [% END %] + </div> [% ELSE %] none [% END %] @@ -174,7 +163,7 @@ [% END %] <tr> - <td>[% terms.Bugs %]:</td> + <td>[% terms.Bugs %]</td> <td> [% IF product.bug_count %] <a href="buglist.cgi?product=[% product.name FILTER uri %]" @@ -194,41 +183,34 @@ [% IF !Param("allowbugdeletion") %] - <p class="confirmation">Sorry, there - - [% IF product.bug_count > 1 %] - are [% product.bug_count FILTER html %] [%+ terms.bugs %] - [% ELSE %] - is 1 [% terms.bug %] - [% END %] - - outstanding for this product. You must reassign - - [% IF product.bug_count > 1 %] - those [% terms.bugs %] - [% ELSE %] - that [% terms.bug %] - [% END %] - - to another product before you can delete this one.</p> + <p class="confirmation"> + Sorry, there + [% IF product.bug_count > 1 %] + are [% product.bug_count FILTER html %] [%+ terms.bugs %] + [% ELSE %] + is 1 [% terms.bug %] + [% END %] + outstanding for this product. You must reassign + [% IF product.bug_count > 1 %] + those [% terms.bugs %] + [% ELSE %] + that [% terms.bug %] + [% END %] + to another product before you can delete this one. + </p> [% ELSE %] - <table border="0" cellpadding="20" width="70%" bgcolor="red"> - <tr> - <td> - There - [% IF product.bug_count > 1 %] - are [% product.bug_count FILTER html %] [%+ terms.bugs %] - [% ELSE %] - is 1 [% terms.bug %] - [% END %] - entered for this product! When you delete this - product, <b>ALL</b> stored [% terms.bugs %] and - their history will be deleted, too. - </td> - </tr> - </table> + <p class="confirmation"> + There + [% IF product.bug_count > 1 %] + are [% product.bug_count FILTER html %] [%+ terms.bugs %] + [% ELSE %] + is 1 [% terms.bug %] + [% END %] + entered for this product! When you delete this product, <b>ALL</b> + stored [% terms.bugs %] and their history will be deleted, too. + </p> [% END %] diff --git a/template/en/default/admin/products/create.html.tmpl b/template/en/default/admin/products/create.html.tmpl index 6d4009586..0dcfd7283 100644 --- a/template/en/default/admin/products/create.html.tmpl +++ b/template/en/default/admin/products/create.html.tmpl @@ -17,6 +17,7 @@ [% PROCESS global/header.html.tmpl title = title + generate_api_token = 1 style_urls = ['skins/standard/admin.css'] javascript_urls = ['js/util.js', 'js/field.js'] yui = [ 'autocomplete' ] @@ -30,18 +31,18 @@ %] <form method="post" action="editproducts.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> [% PROCESS "admin/products/edit-common.html.tmpl" %] <tr> - <th align="right">Version:</th> + <th>Version:</th> <td><input size="20" maxlength="64" name="version" - value="[% version FILTER html %]"> + value="[% version FILTER html %]" required> </td> </tr> <tr> - <th align="right">Create chart datasets for this product:</th> + <th>Create chart datasets for this product:</th> <td> <input type="checkbox" name="createseries" value="1" checked="checked"> </td> diff --git a/template/en/default/admin/products/edit-common.html.tmpl b/template/en/default/admin/products/edit-common.html.tmpl index 2b76c44ac..baf5015ae 100644 --- a/template/en/default/admin/products/edit-common.html.tmpl +++ b/template/en/default/admin/products/edit-common.html.tmpl @@ -14,32 +14,32 @@ [% IF Param('useclassification') %] <tr> - <th align="right">Classification:</th> + <th>Classification:</th> <td><b>[% classification.name FILTER html %]</b></td> </tr> [% END %] <tr> - <th align="right">Product:</th> + <th>Product:</th> <td><input size="64" maxlength="64" name="product" - value="[% product.name FILTER html %]"> + value="[% product.name FILTER html %]" required> </td> </tr> <tr> - <th align="right">Description:</th> - <td><textarea rows="4" cols="64" wrap="virtual" name="description"> + <th>Description:</th> + <td><textarea rows="4" cols="64" wrap="virtual" name="description" required> [% product.description FILTER html %]</textarea> </td> </tr> <tr> - <th align="right">Open for [% terms.bug %] entry:</th> + <th>Open for [% terms.bug %] entry:</th> <td><input type="checkbox" name="is_active" value="1" [% ' checked="checked"' IF product.is_active %]> </td> </tr> <tr> - <th align="right"> + <th> <label for="allows_unconfirmed">Enable the [%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %] status in this product:</label> @@ -51,7 +51,7 @@ [% IF Param('usetargetmilestone') -%] <tr> - <th align="right">Default milestone:</th> + <th>Default milestone:</th> <td> [% IF product.milestones.size %] <select name="defaultmilestone"> diff --git a/template/en/default/admin/products/edit.html.tmpl b/template/en/default/admin/products/edit.html.tmpl index a4fcd188f..8e1f5d87b 100644 --- a/template/en/default/admin/products/edit.html.tmpl +++ b/template/en/default/admin/products/edit.html.tmpl @@ -30,12 +30,12 @@ %] <form method="post" action="editproducts.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> [% PROCESS "admin/products/edit-common.html.tmpl" %] <tr> - <th align="right" valign="top"> + <th> <a href="editcomponents.cgi?product=[% product.name FILTER uri %]"> Edit components: </a> @@ -45,55 +45,52 @@ [% FOREACH comp = product.components %] <a href="editcomponents.cgi?action=edit&product= [%- product.name FILTER uri %]&component= - [%- comp.name FILTER uri %]">[% comp.name FILTER html %]</a>: - [% IF comp.description %] - [% comp.description FILTER html_light %] - [% ELSE %] - <font color="red">description missing</font> - [% END %] + [%- comp.name FILTER uri %]">[% comp.name FILTER html %]</a>: + [% comp.description FILTER html_light %] <br> [% END %] [% ELSE %] - <font color="red">missing</font> + <span class="warning">missing</span> [% END %] </td> </tr> <tr> - <th align="right" valign="top"> - <a href="editversions.cgi?product=[% product.name FILTER uri %]">Edit -versions:</a> + <th> + <a href="editversions.cgi?product=[% product.name FILTER uri %]">Edit versions:</a> </th> <td> [%- IF product.versions.size -%] - [% FOREACH v = product.versions %] - [% v.name FILTER html %] - <br> - [% END %] + <div class="multi-columns"> + [% FOREACH v = product.versions %] + [% v.name FILTER html %]<br> + [% END %] + </div> [% ELSE %] - <font color="red">missing</font> + <span class="warning">missing</span> [% END %] </td> </tr> [% IF Param('usetargetmilestone') %] <tr> - <th align="right" valign="top"> + <th> <a href="editmilestones.cgi?product=[% product.name FILTER uri %]"> Edit milestones:</a> </th> <td> [%- IF product.milestones.size -%] - [%- FOREACH m = product.milestones -%] - [% m.name FILTER html %] - <br> - [% END %] + <div class="multi-columns"> + [%- FOREACH m = product.milestones -%] + [% m.name FILTER html %]<br> + [% END %] + </div> [% ELSE %] - <font color="red">missing</font> + <span class="warning">missing</span> [% END %] </td> </tr> [% END %] <tr> - <th align="right" valign="top"> + <th> <a href="editproducts.cgi?action=editgroupcontrols&product= [%- product.name FILTER uri %]"> Edit Group Access Controls: @@ -102,7 +99,7 @@ versions:</a> <td> [% IF product.group_controls.size %] [% FOREACH g = product.group_controls.values.sort("name") %] - <b>[% g.group.name FILTER html %]:</b> + <b>[% g.group.name FILTER html %]:</b> [% IF g.group.isactive %] [% group_control.${g.membercontrol} FILTER html %]/ [% group_control.${g.othercontrol} FILTER html %] @@ -122,9 +119,11 @@ versions:</a> </td> </tr> <tr> - <th align="right">[% terms.Bugs %]:</th> - <td><a href="buglist.cgi?product=[% product.name FILTER uri %]"> - [% product.bug_count FILTER html %]</a></td> + <th>[% terms.Bugs %]:</th> + <td> + <a href="buglist.cgi?product=[% product.name FILTER uri %]"> + [% product.bug_count FILTER html %]</a> + </td> </tr> </table> diff --git a/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl index fc3ad9b82..354673c3d 100644 --- a/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl +++ b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl @@ -11,32 +11,41 @@ [% END %] [% PROCESS global/header.html.tmpl title = title %] + [% FOREACH group = mandatory_groups %] -<P> -group '[% group.name FILTER html %]' impacts [% group.count %] -[%+ terms.bugs %] for -which the group is newly mandatory and will be added. + <p> + Group '[% group.name FILTER html %]' impacts + [% IF group.count == 1 %] + one [%+ terms.bug %] + [% ELSE %] + [% group.count %] [%+ terms.bugs %] + [% END %] + for which this group is mandatory and will be added. + </p> [% END %] [% FOREACH group = na_groups %] -<P> -group '[% group.name FILTER html %]' impacts [% group.count %] -[% terms.bugs %] for which the group is no longer applicable and will -be removed.[% END %] -<form action="editproducts.cgi" method="post" > + <p> + Group '[% group.name FILTER html %]' impacts + [% IF group.count == 1 %] + one [%+ terms.bug %] + [% ELSE %] + [% group.count %] [%+ terms.bugs %] + [% END %] + for which this group is no longer applicable and will be removed. + </p> +[% END %] +<form action="editproducts.cgi" method="post" > [% PROCESS "global/hidden-fields.html.tmpl" exclude="^Bugzilla_(login|password)$" %] - - <br> - Click "Continue" to proceed with the change including the changes - indicated above. If you do not want these changes, use "back" to - return to the previous page. <p> - <input type="hidden" name="confirmed" value="confirmed"> - <input type="submit" id="update" value="Continue"> + <br> + Click "Continue" to proceed with the change including the changes + indicated above. If you do not want these changes, use "back" to + return to the previous page. </p> - + <input type="hidden" name="confirmed" value="confirmed"> + <input type="submit" id="update" value="Continue"> </form> - [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/products/groupcontrol/edit.html.tmpl b/template/en/default/admin/products/groupcontrol/edit.html.tmpl index 889647e7e..876d95f92 100644 --- a/template/en/default/admin/products/groupcontrol/edit.html.tmpl +++ b/template/en/default/admin/products/groupcontrol/edit.html.tmpl @@ -10,7 +10,8 @@ Edit Group Controls for [% product.name FILTER html %] [% END %] [% PROCESS global/header.html.tmpl - title = title + title = title + style_urls = ['skins/standard/admin.css'] %] [% display_headers = 1 %] @@ -23,8 +24,8 @@ <input type="hidden" name="product" value="[% product.name FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> - <table id="form" cellspacing="0" cellpadding="4" border="1"> - <tr bgcolor="#6666ff"> + <table id="admin_table"> + <tr class="column_header"> <th>Group</th> <th>Entry</th> <th>MemberControl</th> @@ -37,9 +38,9 @@ </tr> [% END %] [% IF !group.group.isactive %] - <tr bgcolor="#bbbbbb"> + <tr class="disabled"> <td>[% group.group.name FILTER html %]</td> - <td align="center" colspan="7">Disabled</td> + <td class="center" colspan="7">Disabled</td> <td>[% group.bug_count FILTER html %]</td> </tr> [% ELSE %] @@ -129,15 +130,17 @@ product. </p> <p> If any group has <b>Entry</b> selected, then this product will -restrict [% terms.bug %] entry to only those users who are members of all the -groups with entry selected. +restrict [% terms.bug %] entry to only those users who are members of +[%+ IF Param('or_groups') %]at least one of[% ELSE %]all[% END %] the groups +with entry selected. </p> <p> If any group has <b>Canedit</b> selected, then this product -will be read-only for any users who are not members of all of -the groups with Canedit selected. ONLY users who are members of -all the canedit groups will be able to edit. This is an additional -restriction that further restricts what can be edited by a user. +will be read-only for any users who are not members of +[%+ IF Param('or_groups') %]one[% ELSE %]all[% END %] of the groups with +Canedit selected. ONLY users who are members of +[%+ IF Param('or_groups') %]at least one of[% ELSE %]all[% END %] the canedit groups +will be able to edit. This is an additional restriction that further restricts what can be edited by a user. </p> <p> The following settings control let you choose privileges on a <b>per-product basis</b>. @@ -164,7 +167,7 @@ indicate which [% terms.bugs %] will be placed in this group according to the following definitions. </p> -<table border=1> +<table id="group_settings_desc"> <tr> <th> MemberControl diff --git a/template/en/default/admin/products/groupcontrol/updated.html.tmpl b/template/en/default/admin/products/groupcontrol/updated.html.tmpl index 5ee066c86..1294754fb 100644 --- a/template/en/default/admin/products/groupcontrol/updated.html.tmpl +++ b/template/en/default/admin/products/groupcontrol/updated.html.tmpl @@ -18,24 +18,36 @@ [% PROCESS global/header.html.tmpl title = title %] -<p> + [% IF changes._group_controls.now_na.size %] [% FOREACH g = changes._group_controls.now_na %] - Removing [% terms.bugs %] from group '[% g.name FILTER html %]' which - no longer applies to this product<p> - [% g.bug_count FILTER html %] [%+ terms.bugs %] removed<p> + <p> + Removing [% terms.bugs %] from group '[% g.name FILTER html %]' which is + no longer applicable to this product.<br> + [% IF g.bug_count == 1 %] + One [% terms.bug %] removed. + [% ELSE %] + [% g.bug_count FILTER html %] [%+ terms.bugs %] removed. + [% END %] + </p> [% END %] [% END %] [% IF changes._group_controls.now_mandatory.size %] [% FOREACH g = changes._group_controls.now_mandatory %] + <p> Adding [% terms.bugs %] to group '[% g.name FILTER html %]' which is - mandatory for this product<p> - [% g.bug_count FILTER html %] [%+ terms.bugs %] added<p> + now mandatory for this product.<br> + [% IF g.bug_count == 1 %] + One [% terms.bug %] added. + [% ELSE %] + [% g.bug_count FILTER html %] [%+ terms.bugs %] added. + [% END %] + </p> [% END %] [% END %] -Group control updates done<p> +<p>Group control updated.</p> [% PROCESS admin/products/footer.html.tmpl %] diff --git a/template/en/default/admin/products/list-classifications.html.tmpl b/template/en/default/admin/products/list-classifications.html.tmpl index ea32a0057..39f3ee1c1 100644 --- a/template/en/default/admin/products/list-classifications.html.tmpl +++ b/template/en/default/admin/products/list-classifications.html.tmpl @@ -16,6 +16,7 @@ [% PROCESS global/header.html.tmpl title = "Select Classification" + style_urls = ['skins/standard/admin.css'] %] [% columns = [ @@ -31,7 +32,7 @@ }, { name => "product_count" - align => "right" + class => "right" heading => "Product Count" } ] diff --git a/template/en/default/admin/products/list.html.tmpl b/template/en/default/admin/products/list.html.tmpl index a5126afc3..58edaa7bd 100644 --- a/template/en/default/admin/products/list.html.tmpl +++ b/template/en/default/admin/products/list.html.tmpl @@ -26,24 +26,31 @@ [% PROCESS global/header.html.tmpl title = "Select product $classification_title" + style_urls = ['skins/standard/admin.css'] %] [% columns = [ - { + { name => "name" heading => "Edit product..." contentlink => 'editproducts.cgi?action=edit&product=%%name%%' }, - { + { name => "description" heading => "Description" allow_html_content => 1 }, - { + { name => "is_active" heading => "Open For New $terms.Bugs" yesno_field => 1 }, + { + name => "allows_unconfirmed" + heading => "Allow " _ display_value('bug_status', 'UNCONFIRMED') _ + " " _ terms.Bugs + yesno_field => 1 + }, ] %] [% IF showbugcounts %] @@ -51,7 +58,7 @@ [% columns.push({ name => "bug_count" heading => "$terms.Bug Count" - align => 'right' + class => 'right' contentlink => 'buglist.cgi?product=%%name%%' }) %] diff --git a/template/en/default/admin/products/updated.html.tmpl b/template/en/default/admin/products/updated.html.tmpl index 4d2280163..cc0c9f8ea 100644 --- a/template/en/default/admin/products/updated.html.tmpl +++ b/template/en/default/admin/products/updated.html.tmpl @@ -39,7 +39,7 @@ <p> Updated description to: </p> - <p style="margin: 1em 3em 1em 3em">[% product.description FILTER html_light %]</p> + <p class="indented">[% product.description FILTER html_light %]</p> [% END %] [% IF changes.isactive.defined %] diff --git a/template/en/default/admin/sanitycheck/list.html.tmpl b/template/en/default/admin/sanitycheck/list.html.tmpl index 681466262..5da6b8735 100644 --- a/template/en/default/admin/sanitycheck/list.html.tmpl +++ b/template/en/default/admin/sanitycheck/list.html.tmpl @@ -11,7 +11,7 @@ <div> <p> - [% terms.Bugzilla %] is checking the referential integrity of your database. + Bugzilla is checking the referential integrity of your database. This may take several minutes to complete. </p> diff --git a/template/en/default/admin/settings/edit.html.tmpl b/template/en/default/admin/settings/edit.html.tmpl index 411c527a6..86fb79e7b 100644 --- a/template/en/default/admin/settings/edit.html.tmpl +++ b/template/en/default/admin/settings/edit.html.tmpl @@ -16,41 +16,38 @@ #%] [% PROCESS global/header.html.tmpl - title = "Default Preferences" - %] + title = "Default Preferences" + style_urls = ['skins/standard/admin.css'] +%] [% PROCESS "global/setting-descs.none.tmpl" %] <p> -This lets you edit the default preferences values. + This lets you edit the default preferences values. The Default Value displayed + for each preference will apply to all users who do not choose their own value, + and to anyone who is not logged in. </p> -<p> -The Default Value displayed for each preference will apply to all users who -do not choose their own value, and to anyone who is not logged in. -</p> -<p> -The 'Enabled' checkbox controls whether or not this preference is available -to users.<br> -If it is checked, users will see this preference on their User Preferences page, -and will be allowed to choose their own value if they desire.<br> -If it is not checked, this preference will not appear on the User Preference -page, and the Default Value will automatically apply to everyone. -</p> -<hr> -[% IF settings.size %] - <form name="adminsettingform" method="post" action="editsettings.cgi"> - <table border="1" cellpadding="4"> - <tr> - <th>Preference Text</th> - <th>Default Value</th> - <th>Enabled</th> - </tr> +<div> + The 'Enabled' checkbox controls whether or not this preference is available to users: + <ul> + <li>If it is checked, users will be allowed to choose their own value if they desire.</li> + <li>If it is not checked, the Default Value will automatically apply to everyone.</li> + </ul> +</div> + + <form id="settings" method="post" action="editsettings.cgi"> + <table id="admin_table"> + <tr class="column_header"> + <th>Preference Text</th> + <th>Default Value</th> + <th>Enabled</th> + </tr> - [% FOREACH name = settings.keys %] + [% FOREACH name = settings.keys %] [% checkbox_name = name _ '-enabled' %] <tr> - <td align="right"> + <td> [% setting_descs.$name OR name FILTER html %] </td> <td> @@ -63,31 +60,19 @@ page, and the Default Value will automatically apply to everyone. [% END %] </select> </td> - <td align="center"> + <td class="center"> <input type="checkbox" name="[% checkbox_name FILTER html %]" id="[% checkbox_name FILTER html %]" [% " checked=\"checked\"" IF settings.${name}.is_enabled %]> - <br> </td> </tr> - [% END %] + [% END %] </table> <input type="hidden" name="action" value="update"> <input type="hidden" name="token" value="[% token FILTER html %]"> - <table> - <tr> - <td width="150"></td> - <td> - <input type="submit" id="update" value="Submit Changes"> - </td> - </tr> - </table> - + <input type="submit" id="update" value="Submit Changes"> </form> -[% ELSE %] - There are no preferences to edit. -[% END %] [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/admin/sudo.html.tmpl b/template/en/default/admin/sudo.html.tmpl index 4d072f114..8cdfb5204 100644 --- a/template/en/default/admin/sudo.html.tmpl +++ b/template/en/default/admin/sudo.html.tmpl @@ -8,14 +8,15 @@ [% PROCESS global/header.html.tmpl title = "Begin sudo session" + generate_api_token = 1 style_urls = ['skins/standard/admin.css'] - doc_section = "useradmin.html#impersonatingusers" + doc_section = "administering/users.html#impersonating-users" %] [% DEFAULT target_login = "" %] <p> - The <b>sudo</b> feature of [% terms.Bugzilla %] allows you to impersonate a + The <b>sudo</b> feature of Bugzilla allows you to impersonate a user for a short time While an sudo session is in progress, every action you perform will be taking place as if you had logged in as the user whom will be impersonating. @@ -41,6 +42,7 @@ value => target_login_default accesskey => "u" size => 30 + mandatory => 1 %] </p> @@ -68,7 +70,7 @@ Finally, enter <label for="Bugzilla_password">your [% terms.Bugzilla %] password</label>: <input type="hidden" name="Bugzilla_login" value="[% user.login FILTER html %]"> - <input type="password" id="Bugzilla_password" name="Bugzilla_password" size="20"> + <input type="password" id="Bugzilla_password" name="Bugzilla_password" size="20" required> <input type="hidden" name="Bugzilla_login_token" value="[% login_request_token FILTER html %]"> <br> diff --git a/template/en/default/admin/table.html.tmpl b/template/en/default/admin/table.html.tmpl index 80f6417a3..993181c7f 100644 --- a/template/en/default/admin/table.html.tmpl +++ b/template/en/default/admin/table.html.tmpl @@ -25,8 +25,6 @@ # field_descs hash will be used instead of "content." # See fieldvalues/select-field for an example of use. # This content WILL be HTML-filtered in this case. - # align: left/center/right. Controls the horizontal alignment of the - # text in the column. # allow_html_content: if defined, then this column allows some html content # and so it will be only partially filtered. # yesno_field: Turn the data from 0/!0 into Yes/No @@ -67,11 +65,11 @@ [%################### TABLE HEADER ######################%] -<table id="admin_table" border="1" cellpadding="4" cellspacing="0"> - <tr bgcolor="#6666FF"> +<table id="admin_table"> + <tr class="column_header"> [% FOREACH c = columns %] [%# Default to align left for headers %] - <th align="[% (c.align || 'left') FILTER html %]"> + <th class="[% (c.align || 'left') FILTER css_class_quote %]"> [% c.heading FILTER html %] </th> [% END %] @@ -89,7 +87,6 @@ [% contentlink = c.contentlink content = c.content content_use_field = c.content_use_field - align = c.align class = c.class allow_html_content = c.allow_html_content yesno_field = c.yesno_field @@ -121,8 +118,7 @@ [% END %] [% END %] - <td [% IF align %] align="[% align FILTER html %]" [% END %] - [% IF class %] class="[% class FILTER html %]" [% END %]> + <td [% IF class %] class="[% class FILTER html %]"[% END %]> [% IF contentlink %] [% FOREACH m = contentlink.match('%%(.+?)%%', 1) %] @@ -155,7 +151,7 @@ [% END %] [% IF data.size == 0 %] - <tr><td colspan="[% columns.size %]" align="center"><i><none></i></td></tr> + <tr><td colspan="[% columns.size %]" class="center"><i><none></i></td></tr> [% END %] diff --git a/template/en/default/admin/users/confirm-delete.html.tmpl b/template/en/default/admin/users/confirm-delete.html.tmpl index 73a72d08d..4dab8b471 100644 --- a/template/en/default/admin/users/confirm-delete.html.tmpl +++ b/template/en/default/admin/users/confirm-delete.html.tmpl @@ -38,16 +38,19 @@ [% PROCESS global/header.html.tmpl title = title - style_urls = ['skins/standard/admin.css', - 'skins/standard/editusers.css'] - doc_section = "useradmin.html#user-account-deletion" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/users.html#deleting-users" %] [% PROCESS admin/users/listselectvars.html.tmpl listselectionvalues = listselectionvalues %] -<table class="main"> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> + </tr> <tr> <th>Login name:</th> <td>[% otheruser.login FILTER html %]</td> @@ -426,7 +429,7 @@ The user has performed audited administrative tasks that are logged in the database. If you delete this user account, the audit log entries - will no longer be indentifiable. + will no longer be identifiable. </li> [% END %] [% Hook.process('warn_safe') %] @@ -441,9 +444,9 @@ <form method="post" action="editusers.cgi"> <p> - <input type="submit" id="delete" value="Yes, delete"/> - <input type="hidden" name="action" value="delete" /> - <input type="hidden" name="userid" value="[% otheruser.id %]" /> + <input type="submit" id="delete" value="Yes, delete"> + <input type="hidden" name="action" value="delete"> + <input type="hidden" name="userid" value="[% otheruser.id %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> [% INCLUDE listselectionhiddenfields %] </p> diff --git a/template/en/default/admin/users/create.html.tmpl b/template/en/default/admin/users/create.html.tmpl index 354ba5f2d..6fbd1dc2f 100644 --- a/template/en/default/admin/users/create.html.tmpl +++ b/template/en/default/admin/users/create.html.tmpl @@ -14,29 +14,28 @@ [% PROCESS global/header.html.tmpl title = "Add user" - style_urls = ['skins/standard/editusers.css'] - onload = "document.forms['f'].login.focus()" - doc_section = "useradmin.html#createnewusers" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/users.html#creating-new-users" %] [% PROCESS admin/users/listselectvars.html.tmpl listselectionvalues = listselectionvalues %] -<form name="f" method="post" action="editusers.cgi"> -<table class="main"> - [% PROCESS admin/users/userdata.html.tmpl - editform = 0 - editusers = editusers - otheruser = [] - %] -</table> -<p> - <input type="submit" id="add" value="Add"/> - <input type="hidden" name="action" value="new" /> - <input type="hidden" name="token" value="[% token FILTER html %]"> - [% INCLUDE listselectionhiddenfields %] -</p> +<form method="post" action="editusers.cgi"> + <table id="admin_table_edit"> + [% PROCESS admin/users/userdata.html.tmpl + editform = 0 + editusers = editusers + otheruser = [] + %] + </table> + <p> + <input type="submit" id="add" value="Add"> + <input type="hidden" name="action" value="new"> + <input type="hidden" name="token" value="[% token FILTER html %]"> + [% INCLUDE listselectionhiddenfields %] + </p> </form> <p> diff --git a/template/en/default/admin/users/edit.html.tmpl b/template/en/default/admin/users/edit.html.tmpl index b75f8400d..2b28aa2d3 100644 --- a/template/en/default/admin/users/edit.html.tmpl +++ b/template/en/default/admin/users/edit.html.tmpl @@ -22,8 +22,8 @@ [% PROCESS global/header.html.tmpl title = title message = message - style_urls = ['skins/standard/admin.css', 'skins/standard/editusers.css'] - doc_section = "useradmin.html#modifyusers" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/users.html#modifying-users" javascript_urls = [ 'js/field.js' ] %] @@ -32,7 +32,7 @@ %] <form method="post" action="editusers.cgi"> -<table class="main"> +<table id="admin_table_edit"> [% PROCESS admin/users/userdata.html.tmpl editform = 1 editusers = editusers @@ -42,7 +42,7 @@ <tr> <th>Group access:</th> <td> - <table class="groups"> + <table id="group_membership"> <tr> [% IF editusers %] <th colspan="3"> @@ -52,7 +52,7 @@ </tr> <tr> [% IF editusers %] - <td style="text-align: center; font-weight: bold">|</td> + <th class="checkbox">|</th> [% END %] <th colspan="2">User is a member of these groups</th> </tr> @@ -65,7 +65,7 @@ [% %]<input type="checkbox" name="bless_[% group.id %]" value="1" - [% ' checked="checked"' IF perms.directbless %] /> + [% ' checked="checked"' IF perms.directbless %]> [% ']' IF perms.indirectbless %]</td> [% END %] <td class="checkbox"> @@ -75,7 +75,7 @@ id="group_[% group.id %]" name="group_[% group.id %]" value="1" - [% ' checked="checked"' IF perms.directmember %] /> + [% ' checked="checked"' IF perms.directmember %]> [% '*' IF perms.regexpmember %] [% ']' IF perms.derivedmember %]</td> <td class="groupname"> @@ -115,9 +115,9 @@ </table> <p> - <input type="submit" id="update" value="Save Changes" /> - <input type="hidden" name="userid" value="[% otheruser.id %]" /> - <input type="hidden" name="action" value="update" /> + <input type="submit" id="update" value="Save Changes"> + <input type="hidden" name="userid" value="[% otheruser.id %]"> + <input type="hidden" name="action" value="update"> <input type="hidden" name="token" value="[% token FILTER html %]"> [% INCLUDE listselectionhiddenfields %] @@ -127,7 +127,7 @@ </p> </form> <p> - User is a member of any groups shown with a check or grey bar. + User is a member of all groups shown with a check or grey bar. A grey bar indicates indirect membership, either derived from other groups (marked with square brackets) or via regular expression (marked with '*'). @@ -143,9 +143,9 @@ [% IF Param('allowuserdeletion') && editusers %] <form method="post" action="editusers.cgi"> <p> - <input type="submit" id="delete" value="Delete User" /> - <input type="hidden" name="action" value="del" /> - <input type="hidden" name="userid" value="[% otheruser.id %]" /> + <input type="submit" id="delete" value="Delete User"> + <input type="hidden" name="action" value="del"> + <input type="hidden" name="userid" value="[% otheruser.id %]"> [% INCLUDE listselectionhiddenfields %] </p> </form> diff --git a/template/en/default/admin/users/list.html.tmpl b/template/en/default/admin/users/list.html.tmpl index ff23b7727..f90996882 100644 --- a/template/en/default/admin/users/list.html.tmpl +++ b/template/en/default/admin/users/list.html.tmpl @@ -16,8 +16,8 @@ [% PROCESS global/header.html.tmpl title = "Select user" - style_urls = ['skins/standard/editusers.css'] - doc_section = "useradmin.html" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/users.html" %] [% PROCESS admin/users/listselectvars.html.tmpl @@ -65,11 +65,11 @@ [% FOREACH thisuser = users %] [% IF !thisuser.realname %] [%# We cannot pass one class now and one class later. %] - [% SET classes = (thisuser.is_enabled ? "missing" : "bz_inactive missing") %] + [% SET classes = (thisuser.is_enabled ? "warning" : "bz_inactive warning") %] [% overrides.realname.login_name.${thisuser.login_name} = { content => "missing" override_content => 1 - class => "$classes" + class => classes override_class => 1 } %] diff --git a/template/en/default/admin/users/listselectvars.html.tmpl b/template/en/default/admin/users/listselectvars.html.tmpl index bd03113d5..d738b254c 100644 --- a/template/en/default/admin/users/listselectvars.html.tmpl +++ b/template/en/default/admin/users/listselectvars.html.tmpl @@ -21,6 +21,6 @@ [% BLOCK listselectionhiddenfields %] [% FOREACH field = listselectionvalues.keys %] <input type="hidden" name="[% field FILTER html %]" - value="[% listselectionvalues.$field FILTER html %]" /> + value="[% listselectionvalues.$field FILTER html %]"> [% END %] [% END %] diff --git a/template/en/default/admin/users/responsibilities.html.tmpl b/template/en/default/admin/users/responsibilities.html.tmpl index 67ea7d294..defe47173 100644 --- a/template/en/default/admin/users/responsibilities.html.tmpl +++ b/template/en/default/admin/users/responsibilities.html.tmpl @@ -7,7 +7,7 @@ #%] [% hidden_products = 0 %] -<table id="user_responsibilities" border="0"> +<table id="user_responsibilities"> [% FOREACH item = otheruser.product_responsibilities %] [% IF !user.can_see_product(item.product.name) %] [% hidden_products = 1 %] @@ -15,7 +15,7 @@ [% END %] <tbody> <tr> - <th colspan="3" class="product">Product: [% item.product.name FILTER html %]</th> + <th colspan="4" class="product">Product: [% item.product.name FILTER html %]</th> </tr> <tr> <th>Component</th> diff --git a/template/en/default/admin/users/search.html.tmpl b/template/en/default/admin/users/search.html.tmpl index c66af4c5c..17477a012 100644 --- a/template/en/default/admin/users/search.html.tmpl +++ b/template/en/default/admin/users/search.html.tmpl @@ -17,9 +17,8 @@ [% PROCESS global/header.html.tmpl title = "Search users" - style_urls = ['skins/standard/editusers.css'] - onload = "document.forms['f'].matchstr.focus()" - doc_section = "useradmin.html#user-account-search" + style_urls = ['skins/standard/admin.css'] + doc_section = "administering/users.html" %] [% PROCESS admin/users/listselectvars.html.tmpl @@ -27,7 +26,7 @@ %] <form name="f" method="get" action="editusers.cgi"> -<input type="hidden" name="action" value="list" /> +<input type="hidden" name="action" value="list"> <p><label for="matchvalue">List users with</label> <select id="matchvalue" name="matchvalue"> <option value="login_name">login name</option> @@ -35,17 +34,18 @@ <option value="userid">user id</option> </select> <label for="matchstr">matching</label> -<input size="32" name="matchstr" id="matchstr" /> +<input size="32" name="matchstr" id="matchstr" autofocus> <select name="matchtype"> <option value="substr" selected="selected">case-insensitive substring</option> <option value="regexp">case-insensitive regexp</option> <option value="notregexp">not (case-insensitive regexp)</option> <option value="exact">exact (find this user)</option> </select> -<input type="submit" id="search" value="Search" /></p> +<input type="submit" id="search" value="Search"> +</p> [% IF restrictablegroups.size %] - <p><input type="checkbox" name="grouprestrict" value="1" id="grouprestrict" /> + <p><input type="checkbox" name="grouprestrict" value="1" id="grouprestrict"> <label for="grouprestrict">Restrict to users belonging to group</label> <select name="groupid" onchange="document.forms['f'].grouprestrict.checked=true"> @@ -56,9 +56,13 @@ [% END %] <p> - <input type="checkbox" name="enabled_only" value="1" id="enabled_only" - checked="checked"> - <label for="enabled_only">Enabled user accounts only</label> + Restrict search to + <select name="is_enabled"> + <option value="2">All</option> + <option value="1" selected>Enabled</option> + <option value="0">Disabled</option> + </select> + users. </p> [% Hook.process('end') %] diff --git a/template/en/default/admin/users/userdata.html.tmpl b/template/en/default/admin/users/userdata.html.tmpl index ae952d151..c08cd0018 100644 --- a/template/en/default/admin/users/userdata.html.tmpl +++ b/template/en/default/admin/users/userdata.html.tmpl @@ -21,11 +21,12 @@ <th><label for="login">Login name:</label></th> <td> [% IF editusers %] - <input size="64" maxlength="255" name="login" - id="login" value="[% otheruser.login FILTER html %]" /> + <input size="64" maxlength="255" id="login" name="login" + value="[% otheruser.login FILTER html %]" + [%- " autofocus" UNLESS editform %] required> [% IF editform %] [% IF !otheruser.in_group('bz_sudo_protect') %] - <br /> + <br> <a href="relogin.cgi?action=prepare-sudo&target_login= [%- otheruser.login FILTER uri %]">Impersonate this user</a> [% END %] @@ -52,9 +53,8 @@ <th><label for="name">Real name:</label></th> <td> [% IF editusers %] - <input size="64" maxlength="255" name="name" - autocomplete="off" - id="name" value="[% otheruser.name FILTER html %]" /> + <input size="64" maxlength="255" id="name" name="name" + autocomplete="off" value="[% otheruser.name FILTER html %]"> [% ELSE %] [% otheruser.name FILTER html %] [% END %] @@ -65,15 +65,22 @@ # if we ever have a login system that can create accounts through # createaccount.cgi but can't change passwords. #%] - + [% password_complexity = Param('password_complexity') %] [% IF editusers %] [% IF user.authorizer.can_change_password %] <tr> <th><label for="password">Password:</label></th> <td> <input type="password" size="16" name="password" id="password" - value="" autocomplete="off" /> - [% IF editform %]<br /> + value="" autocomplete="off" [% 'required' IF !editform %]> + [% IF password_complexity == "mixed_letters" %] + (Password must contain at least one UPPER and one lowercase letter.) + [% ELSIF password_complexity == "letters_numbers" %] + (Password must contain at least one UPPER and one lower case letter and a number.) + [% ELSIF password_complexity == "letters_numbers_specialchars" %] + (Password must contain at least one letter, a number and a special character.) + [% END %] + [% IF editform %]<br> (Enter new password to change.) [% END %] </td> @@ -107,3 +114,12 @@ </td> </tr> [% END %] +[% UNLESS editform %] + <tr> + <th><label for="notify_user">Notify User:</label></th> + <td> + <input type="checkbox" name="notify_user" id="notify_user" value="1"> + (Email this user their account information. The password will not be included.) + </td> + </tr> +[% END %] diff --git a/template/en/default/admin/versions/confirm-delete.html.tmpl b/template/en/default/admin/versions/confirm-delete.html.tmpl index e6f39226f..928170f50 100644 --- a/template/en/default/admin/versions/confirm-delete.html.tmpl +++ b/template/en/default/admin/versions/confirm-delete.html.tmpl @@ -21,33 +21,33 @@ style_urls = ['skins/standard/admin.css'] %] -<table border="1" cellpadding="4" cellspacing="0"> -<tr bgcolor="#6666FF"> - <th valign="top" align="left">Field</th> - <th valign="top" align="left">Value</th> -</tr> -<tr> - <td valign="top">Version:</td> - <td valign="top">[% version.name FILTER html %]</td> -</tr> -<tr> - <td valign="top">Version of Product:</td> - <td valign="top">[% product.name FILTER html %]</td> -</tr> -<tr> - <td valign="top">[% terms.Bugs %]:</td> - <td valign="top"> -[% IF version.bug_count %] - <a title="List of [% terms.bugs %] targetted at version ' - [%- version.name FILTER html %]'" - href="buglist.cgi?version=[% version.name FILTER uri %]&product= - [%- product.name FILTER uri %]"> - [%- version.bug_count FILTER none %]</a> -[% ELSE %] - None -[% END %] - </td> -</tr> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> + </tr> + <tr> + <td>Version</td> + <td>[% version.name FILTER html %]</td> + </tr> + <tr> + <td>Version of Product</td> + <td>[% product.name FILTER html %]</td> + </tr> + <tr> + <td>[% terms.Bugs %]</td> + <td> + [% IF version.bug_count %] + <a title="List of [% terms.bugs %] targetted at version ' + [%- version.name FILTER html %]'" + href="buglist.cgi?version=[% version.name FILTER uri %]&product= + [%- product.name FILTER uri %]"> + [%- version.bug_count FILTER none %]</a> + [% ELSE %] + None + [% END %] + </td> + </tr> </table> <h2>Confirmation</h2> diff --git a/template/en/default/admin/versions/create.html.tmpl b/template/en/default/admin/versions/create.html.tmpl index af7258238..648adcebd 100644 --- a/template/en/default/admin/versions/create.html.tmpl +++ b/template/en/default/admin/versions/create.html.tmpl @@ -17,14 +17,15 @@ [% PROCESS global/header.html.tmpl title = title subheader = subheader + style_urls = ['skins/standard/admin.css'] %] <form method="post" action="editversions.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> + <table id="admin_table_edit"> <tr> - <th align="right"><label for="version">Version:</label></th> + <th><label for="version">Version:</label></th> <td><input id="version" size="64" maxlength="64" name="version" - value=""></td> + value="" required></td> </tr> </table> <input type="submit" id="create" value="Add"> diff --git a/template/en/default/admin/versions/edit.html.tmpl b/template/en/default/admin/versions/edit.html.tmpl index 195a94c26..1ef0b2f66 100644 --- a/template/en/default/admin/versions/edit.html.tmpl +++ b/template/en/default/admin/versions/edit.html.tmpl @@ -17,20 +17,24 @@ [%- product.name FILTER html %]'[% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] %] <form method="post" action="editversions.cgi"> - <table border="0" cellpadding="4" cellspacing="0"> - + <table id="admin_table_edit"> <tr> - <th class="field_label"><label for="version">Version:</label></th> - <td><input id="version" size="64" maxlength="64" name="version" value=" - [%- version.name FILTER html %]"></td> + <th><label for="version">Version:</label></th> + <td> + <input id="version" size="64" maxlength="64" name="version" + value="[% version.name FILTER html %]" required> + </td> </tr> <tr> - <th class="field_label"><label for="isactive">Enabled For [% terms.Bugs %]:</label></th> - <td><input id="isactive" name="isactive" type="checkbox" value="1" - [% 'checked="checked"' IF version.isactive %]></td> + <th><label for="isactive">Enabled For [% terms.Bugs %]:</label></th> + <td> + <input id="isactive" name="isactive" type="checkbox" value="1" + [% 'checked="checked"' IF version.isactive %]> + </td> </tr> </table> diff --git a/template/en/default/admin/versions/list.html.tmpl b/template/en/default/admin/versions/list.html.tmpl index 1cf3e8643..43a14f9ee 100644 --- a/template/en/default/admin/versions/list.html.tmpl +++ b/template/en/default/admin/versions/list.html.tmpl @@ -15,6 +15,7 @@ '[% product.name FILTER html %]'[% END %] [% PROCESS global/header.html.tmpl title = title + style_urls = ['skins/standard/admin.css'] %] [% edit_contentlink = BLOCK %]editversions.cgi?action=edit&product= @@ -44,7 +45,7 @@ [% columns.push({ name => "bug_count" heading => "$terms.Bugs" - align => "right" + class => "right" contentlink => bug_count_contentlink }) %] diff --git a/template/en/default/admin/versions/select-product.html.tmpl b/template/en/default/admin/versions/select-product.html.tmpl index e40e4086c..119ec9a71 100644 --- a/template/en/default/admin/versions/select-product.html.tmpl +++ b/template/en/default/admin/versions/select-product.html.tmpl @@ -13,6 +13,7 @@ [% PROCESS global/header.html.tmpl title = "Edit versions for which product?" + style_urls = ['skins/standard/admin.css'] %] [% columns = [ @@ -34,7 +35,7 @@ [% columns.push({ name => 'bug_count' heading => "$terms.Bugs" - align => "right" + class => "right" contentlink => "buglist.cgi?product=%%name%%" }) %] diff --git a/template/en/default/admin/workflow/comment.html.tmpl b/template/en/default/admin/workflow/comment.html.tmpl index b5907d1d0..19762d154 100644 --- a/template/en/default/admin/workflow/comment.html.tmpl +++ b/template/en/default/admin/workflow/comment.html.tmpl @@ -15,9 +15,9 @@ <!-- function toggle_cell(cell) { if (cell.checked) - cell.parentNode.className = "checkbox-cell checked"; + cell.parentNode.className = "checked"; else - cell.parentNode.className = "checkbox-cell"; + cell.parentNode.className = ""; } //--> </script> @@ -28,7 +28,7 @@ </p> <form id="workflow_form" method="POST" action="editworkflow.cgi"> -<table> +<table id="workflow"> <tr> <th colspan="2"> </th> <th colspan="[% statuses.size FILTER html %]" class="title">To</th> @@ -38,7 +38,7 @@ <th rowspan="[% statuses.size + 2 FILTER html %]" class="title">From</th> <th> </th> [% FOREACH status = statuses %] - <th class="col-header[% status.is_open ? " open-status" : " closed-status" %]"> + <th class="[% status.is_open ? "open-status" : "closed-status" %] center"> [% display_value("bug_status", status.name) FILTER html %] </th> [% END %] @@ -48,28 +48,27 @@ [% p = [{id => 0, name => "{Start}", is_open => 1}] %] [% FOREACH status = p.merge(statuses) %] <tr class="highlight"> - <th align="right" class="[% status.is_open ? "open-status" : "closed-status" %]"> + <th class="[% status.is_open ? "open-status" : "closed-status" %]"> [% display_value("bug_status", status.name) FILTER html %] </th> [% FOREACH new_status = statuses %] [% IF workflow.${status.id}.${new_status.id}.defined %] - <td align="center" class="checkbox-cell - [% " checked" IF workflow.${status.id}.${new_status.id} %]" + <td class="[% "checked" IF workflow.${status.id}.${new_status.id} %]" title="From [% status.name FILTER html %] to [% new_status.name FILTER html %]"> <input type="checkbox" name="c_[% status.id %]_[% new_status.id %]" id="c_[% status.id %]_[% new_status.id %]" onclick="toggle_cell(this)" [% " checked='checked'" IF workflow.${status.id}.${new_status.id} %]> </td> [% ELSE %] - <td class="checkbox-cell forbidden"> </td> + <td class="forbidden"> </td> [% END %] [% END %] </tr> [% END %] </table> -<p align="center"> +<p class="center"> <input type="hidden" name="action" value="update_comment"> <input type="hidden" name="token" value="[% token FILTER html %]"> <input type="submit" id="update_comment" value="Commit Changes"> - diff --git a/template/en/default/admin/workflow/edit.html.tmpl b/template/en/default/admin/workflow/edit.html.tmpl index 403405b16..a85db2339 100644 --- a/template/en/default/admin/workflow/edit.html.tmpl +++ b/template/en/default/admin/workflow/edit.html.tmpl @@ -15,25 +15,25 @@ <!-- function toggle_cell(cell) { if (cell.checked) - cell.parentNode.className = "checkbox-cell checked"; + cell.parentNode.className = "checked"; else - cell.parentNode.className = "checkbox-cell"; + cell.parentNode.className = ""; } //--> </script> <p> This page allows you to define which status transitions are valid in your workflow. - For compatibility with older versions of [% terms.Bugzilla %], reopening [% terms.abug %] + For compatibility with older versions of Bugzilla, reopening [% terms.abug %] will only display either [% display_value("bug_status", "UNCONFIRMED") FILTER html %] or [%+ display_value("bug_status", "REOPENED") FILTER html %] (if allowed by your workflow) but not both. The decision depends on whether the [% terms.bug %] has ever been confirmed or not. - So it is a good idea to allow both transitions and let [% terms.Bugzilla %] select the + So it is a good idea to allow both transitions and let Bugzilla select the correct one. </p> <form id="workflow_form" method="POST" action="editworkflow.cgi"> -<table> +<table id="workflow"> <tr> <th colspan="2"> </th> <th colspan="[% statuses.size FILTER html %]" class="title">To</th> @@ -43,7 +43,7 @@ <th rowspan="[% statuses.size + 2 FILTER html %]" class="title">From</th> <th> </th> [% FOREACH status = statuses %] - <th class="col-header[% status.is_open ? " open-status" : " closed-status" %]"> + <th class="[% status.is_open ? "open-status" : "closed-status" %] center"> [% display_value("bug_status", status.name) FILTER html %] </th> [% END %] @@ -53,7 +53,7 @@ [% p = [{id => 0, name => "{Start}", is_open => 1}] %] [% FOREACH status = p.merge(statuses) %] <tr class="highlight"> - <th align="right" class="[% status.is_open ? "open-status" : "closed-status" %]"> + <th class="[% status.is_open ? "open-status" : "closed-status" %]"> [% display_value("bug_status", status.name) FILTER html %] </th> @@ -61,7 +61,7 @@ [% IF status.id != new_status.id %] [% checked = workflow.${status.id}.${new_status.id}.defined ? 1 : 0 %] [% mandatory = (status.id && new_status.name == Param("duplicate_or_move_bug_status")) ? 1 : 0 %] - <td align="center" class="checkbox-cell[% " checked" IF checked || mandatory %]" + <td class="[% "checked" IF checked || mandatory %]" title="From [% status.name FILTER html %] to [% new_status.name FILTER html %]"> <input type="checkbox" name="w_[% status.id %]_[% new_status.id %]" id="w_[% status.id %]_[% new_status.id %]" onclick="toggle_cell(this)" @@ -69,7 +69,7 @@ [%+ "disabled='disabled'" IF mandatory %]> </td> [% ELSE %] - <td class="checkbox-cell forbidden"> </td> + <td class="forbidden"> </td> [% END %] [% END %] </tr> @@ -87,7 +87,7 @@ page and editing the <i>duplicate_or_move_bug_status</i> parameter. </p> -<p align="center"> +<p class="center"> <input type="hidden" name="action" value="update"> <input type="hidden" name="token" value="[% token FILTER html %]"> <input type="submit" id="update_workflow" value="Commit Changes"> - diff --git a/template/en/default/attachment/choose.html.tmpl b/template/en/default/attachment/choose.html.tmpl index c6b94d792..f20facd90 100644 --- a/template/en/default/attachment/choose.html.tmpl +++ b/template/en/default/attachment/choose.html.tmpl @@ -7,23 +7,28 @@ #%] [% PROCESS global/header.html.tmpl - title = "Locate attachment", - onload = "document.forms['choose-id'].id.focus()" - %] + title = "Locate or Create Attachment" +%] <form name="choose-id" method="get" action="attachment.cgi"> <p>Access an attachment by entering its ID into the form below:</p> - <p>Attachment ID: <input name="id" size="6"> + <p>Attachment ID: <input name="id" size="6" autofocus required> <button name="action" value="edit" id="edit">Details</button> <button name="action" value="view" id="view">View</button> </p> </form> <form method="get" action="show_bug.cgi"> - <p>Or, access it from the list of attachments in its associated [% terms.bug %] report:</p> - <p>[% terms.Bug %] ID: <input name="id" size="6"> + <p>Or, Access it from the list of attachments in its associated [% terms.bug %] report:</p> + <p>[% terms.Bug %] ID: <input name="id" size="6" required> <input type="submit" name="action" value="View" id="action"> </p> </form> +<form method="get" action="attachment.cgi"> + <p>Or, Create a new attachment by entering its [% terms.bug %] Id below:</p> + <p>[% terms.Bug %] ID: <input name="bugid" size="6" required> + <button name="action" value="enter" id="action">New Attachment</button> + </p> +</form> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/attachment/confirm-delete.html.tmpl b/template/en/default/attachment/confirm-delete.html.tmpl index 4557af616..5108692a8 100644 --- a/template/en/default/attachment/confirm-delete.html.tmpl +++ b/template/en/default/attachment/confirm-delete.html.tmpl @@ -17,51 +17,48 @@ [% PROCESS global/header.html.tmpl title = title - doc_section = "attachments.html" + style_urls = ['skins/standard/admin.css'] + doc_section = "using/editing.html#attachments" %] -<table border="1" cellpadding="4" cellspacing="0"> - <tr bgcolor="#6666FF"> - <th valign="top" align="left">Field</th> - <th valign="top" align="left">Value</th> +<table id="admin_table"> + <tr class="column_header"> + <th>Field</th> + <th>Value</th> </tr> <tr> - <td valign="top">Attachment ID:</td> - <td valign="top"> + <td>Attachment ID</td> + <td> <a href="attachment.cgi?id=[% a.id FILTER html %]">[% a.id FILTER html %]</a> </td> </tr> <tr> - <td valign="top">File name:</td> - <td valign="top">[% a.filename FILTER html %]</td> + <td>File name</td> + <td>[% a.filename FILTER html %]</td> </tr> <tr> - <td valign="top">Description:</td> - <td valign="top">[% a.description FILTER html %]</td> + <td>Description</td> + <td>[% a.description FILTER html %]</td> </tr> <tr> - <td valign="top">Contained in [% terms.Bug %]:</td> - <td valign="top">[% a.bug_id FILTER bug_link(a.bug_id) FILTER none %]</td> + <td>Contained in [% terms.Bug %]</td> + <td>[% a.bug_id FILTER bug_link(a.bug_id) FILTER none %]</td> </tr> <tr> - <td valign="top">Creator:</td> - <td valign="top">[% a.attacher.identity FILTER html %]</td> + <td>Creator</td> + <td>[% a.attacher.identity FILTER html %]</td> </tr> <tr> - <td valign="top">Creation Date:</td> - <td valign="top">[% a.attached FILTER time %]</td> + <td>Creation Date</td> + <td>[% a.attached FILTER time %]</td> </tr> </table> <h2>Confirmation</h2> -<table border="0" cellpadding="20" width="70%" bgcolor="red"> - <tr> - <td> - The content of this attachment will be deleted in an <b>irreversible</b> way. - </td> - </tr> -</table> +<p class="confirmation"> + The content of this attachment will be deleted in an <b>irreversible</b> way. +</p> <p>Do you really want to delete this attachment?</p> diff --git a/template/en/default/attachment/create.html.tmpl b/template/en/default/attachment/create.html.tmpl index abc0f97bf..e566b428e 100644 --- a/template/en/default/attachment/create.html.tmpl +++ b/template/en/default/attachment/create.html.tmpl @@ -16,10 +16,11 @@ title = title header = header subheader = subheader - style_urls = [ 'skins/standard/attachment.css' ] + generate_api_token = 1 + style_urls = ['skins/standard/bug.css'] yui = [ 'autocomplete' ] javascript_urls = [ "js/attachment.js", 'js/field.js', "js/util.js", "js/TUI.js" ] - doc_section = "attachments.html" + doc_section = "using/editing.html#attachments" %] <script type="text/javascript"> @@ -84,13 +85,11 @@ TUI_hide_default('attachment_text_field'); <th><label for="comment">Comment:</label></th> <td> <em>(optional) Add a comment about this attachment to the [% terms.bug %].</em><br> - [% INCLUDE global/textarea.html.tmpl - name = 'comment' - id = 'comment' - minrows = 6 - maxrows = 15 - cols = constants.COMMENT_COLS - wrap = 'soft' + [% INCLUDE bug/comment.html.tmpl + minrows = 6 + maxrows = 15 + cols = constants.COMMENT_COLS + wrap = 'soft' %] [% IF NOT bug.cc.contains(user.login) %] <br> diff --git a/template/en/default/attachment/created.html.tmpl b/template/en/default/attachment/created.html.tmpl index cbfd260f8..98ede5b6f 100644 --- a/template/en/default/attachment/created.html.tmpl +++ b/template/en/default/attachment/created.html.tmpl @@ -28,13 +28,13 @@ [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = attachment.bug_id %] [% IF convertedbmp %] <p> - <b>Note:</b> [% terms.Bugzilla %] automatically converted your BMP image file to a + <b>Note:</b> Bugzilla automatically converted your BMP image file to a compressed PNG format. </p> [% END %] [% IF contenttypemethod == 'autodetect' %] <p> - <b>Note:</b> [% terms.Bugzilla %] automatically detected the content type + <b>Note:</b> Bugzilla automatically detected the content type <em>[% attachment.contenttype FILTER html %]</em> for this attachment. If this is incorrect, correct the value by editing the attachment's <a href="attachment.cgi?id=[% attachment.id %]&action=edit">details</a>. diff --git a/template/en/default/attachment/diff-file.html.tmpl b/template/en/default/attachment/diff-file.html.tmpl index 815b6de1b..af99761a6 100644 --- a/template/en/default/attachment/diff-file.html.tmpl +++ b/template/en/default/attachment/diff-file.html.tmpl @@ -14,12 +14,12 @@ # considers the first row to determine column widths. If a colspan is found, # it then share the width equally among all columns, which we don't want. #%] -<table class="file_table"><thead><tr><td class="num"></td><td></td><td class="num"></td><td></td></tr><tr><td class="file_head" colspan="4"><a href="#" onclick="return twisty_click(this)">[% collapsed ? '(+)' : '(-)' %]</a><input type="checkbox" name="[% file.filename FILTER html %]"[% collapsed ? '' : ' checked' %] style="display: none"> - [% IF lxr_prefix && !file.is_add %] - <a href="[% lxr_prefix %]">[% file.filename FILTER html %]</a> - [% ELSE %] - [% file.filename FILTER html %] - [% END %] +<table class="file_table"><thead><tr><td class="num"></td><td></td><td + class="num"></td><td></td></tr><tr><td class="file_head" colspan="4"><a href="#" + onclick="return twisty_click(this)">[% collapsed ? '(+)' : '(-)' %]</a><input + type="checkbox" name="[% file.filename FILTER html %]"[% collapsed ? '' : ' checked' %] + class="bz_default_hidden"> + [% file.filename FILTER html %] [% IF file.plus_lines %] [% IF file.minus_lines %] (-[% file.minus_lines %] / +[% file.plus_lines %] lines) @@ -39,36 +39,27 @@ incremental_restore() [% section_num = 0 %] [% FOREACH section = sections %] [% section_num = section_num + 1 %] - <tr><th colspan="4" class="section_head"> - <table id="[% file.filename FILTER html %]_sec[% section_num %]" cellpadding="0" cellspacing="0"> - <tr><th width="95%" align="left"> - [% IF file.is_add %] - Added - [% ELSIF file.is_remove %] - [% IF bonsai_prefix %] - <a href="[% bonsai_prefix %]">Removed</a> - [% ELSE %] - Removed - [% END %] - [% ELSE %] - [% IF bonsai_prefix %] - <a href="[% bonsai_prefix %]#[% section.old_start %]"> - [% END %] - [% IF section.old_lines > 1 %] - Lines [% section.old_start %]-[% section.old_start + - section.old_lines - 1 %] - [% ELSE %] - Line [% section.old_start %] - [% END %] - [% IF bonsai_prefix %] - </a> - [% END %] - [% section.func_info FILTER html IF section.func_info %] - [% END %] - </th><th> - <a href="#[% file.filename FILTER html %]_sec[% section_num %]">Link Here</a> - </th></tr></table> - </th></tr> + <tr> + <th colspan="4" class="section_head"> + <span id="[% file.filename FILTER html %]_sec[% section_num %]" class="lines_count"> + [% IF file.is_add %] + Added + [% ELSIF file.is_remove %] + Removed + [% ELSE %] + [% IF section.old_lines > 1 %] + Lines [% section.old_start %]-[% section.old_start + section.old_lines - 1 %] + [% ELSE %] + Line [% section.old_start %] + [% END %] + [%+ section.func_info FILTER html IF section.func_info %] + [% END %] + </span> + <span class="link_here"> + <a href="#[% file.filename FILTER html %]_sec[% section_num %]">Link Here</a> + </span> + </th> + </tr> [% current_line_old = section.old_start %] [% current_line_new = section.new_start %] [% FOREACH group = section.groups %] diff --git a/template/en/default/attachment/diff-header.html.tmpl b/template/en/default/attachment/diff-header.html.tmpl index ed4d44e25..2b3e0d75d 100644 --- a/template/en/default/attachment/diff-header.html.tmpl +++ b/template/en/default/attachment/diff-header.html.tmpl @@ -37,33 +37,36 @@ Interdiff of #[% oldid %] and #[% newid %] for [% terms.bug %] #[% bugid %] [% subheader = BLOCK %] [% bugsummary FILTER html %] [% END %] - [% PROCESS global/header.html.tmpl doc_section = "attachments.html#patchviewer" - javascript_urls = "js/attachment.js" - style_urls = ['skins/standard/attachment.css'] %] + [% PROCESS global/header.html.tmpl javascript_urls = [ "js/attachment.js" ] + style_urls = ['skins/standard/bug.css'] %] [% ELSE %] + <!DOCTYPE html> <html> - <head> - <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 %]"> + <head> + <link href="[% 'skins/standard/global.css' FILTER mtime %]" + rel="stylesheet" type="text/css"> + <link href="[% 'skins/standard/bug.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 %] - + [%# If we have attachid, we are in diff, otherwise we're in interdiff %] [% IF attachid %] [%# HEADER %] [% IF headers %] <a href="[% PROCESS viewurl id=attachid %]">View</a> | <a href="[% PROCESS editurl id=attachid %]">Details</a> - | <a href="[% PROCESS diffurl id=attachid %]&context=[% context FILTER uri %]&collapsed=[% collapsed FILTER uri %]&headers=[% headers FILTER uri %]&format=raw">Raw Unified</a> + | <a href="[% PROCESS diffurl id=attachid %]&collapsed=[% collapsed FILTER uri %]&headers=[% + headers FILTER uri %]&format=raw">Raw Unified</a> | Return to [% "$terms.bug $bugid" FILTER bug_link(bugid) FILTER none %] [% END %] [% IF other_patches.size > 0 %] [% IF headers %] |[%END%] Differences between - <form style="display: inline" action="attachment.cgi"> + <form class="inline" action="attachment.cgi"> <select name="oldid"> [% FOREACH patch = other_patches %] <option value="[% patch.id %]" @@ -97,37 +100,19 @@ Interdiff of #[% oldid %] and #[% newid %] for [% terms.bug %] #[% bugid %] onmouseout="window.status = lastStatus; return true" onclick="return expand_all()">Expand All</a> -[% IF do_context %] - [%# only happens for normal viewing, not interdiff %] - | <span style='font-weight: bold'>Context:</span> - [% IF context == "patch" %] - (<strong>Patch</strong> / - [% ELSE %] - (<a href="[% PROCESS diffurl id=attachid %]&headers=[% headers FILTER uri %]">Patch</a> / - [% END %] - [% IF context == "file" %] - <strong>File</strong> / - [% ELSE %] - <a href="[% PROCESS diffurl id=attachid %]&headers=[% headers FILTER uri %]&context=file">File</a> / - [% END %] - - [% IF context == "patch" || context == "file" %] - [% context = 3 %] - [% END %] - [%# textbox for context %] - <form style="display: inline" action="attachment.cgi"><input type="hidden" name="action" value="diff"><input type="hidden" name="id" value="[% attachid %]"><input type="hidden" name="collapsed" value="[% collapsed FILTER html %]"><input type="hidden" name="headers" value="[% headers FILTER html %]"><input type="text" name="context" value="[% context FILTER html %]" size="3"></form>) -[% END %] - [% IF warning %] -<h2 class="warning">Warning: +<h2 class="warning"> + Warning: [% IF warning == "interdiff1" %] - this difference between two patches may show things in the wrong places due - to a limitation in [% terms.Bugzilla %] when comparing patches with different - sets of files. - [% END %] - [% IF warning == "interdiff2" %] - this difference between two patches may be inaccurate due to a limitation in - [%+ terms.Bugzilla %] when comparing patches made against different revisions. + this difference between two patches may show things in the wrong places due + to a limitation in Bugzilla when comparing patches with + different sets of files. + [% ELSIF warning == "interdiff2" %] + this difference between two patches may be inaccurate due to a limitation + in Bugzilla when comparing patches made against different + revisions. + [% ELSIF warning == "interdiff3" %] + interdiff encountered errors while comparing these patches. [% END %] </h2> [% ELSE %] @@ -136,4 +121,4 @@ Interdiff of #[% oldid %] and #[% newid %] for [% terms.bug %] #[% bugid %] [%# Restore Stuff %] <form name="checkboxform" action="attachment.cgi"> -<input type="checkbox" name="restore_indicator" style="display: none"> +<input type="checkbox" name="restore_indicator" class="bz_default_hidden"> diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl index 518737788..184cdde05 100644 --- a/template/en/default/attachment/edit.html.tmpl +++ b/template/en/default/attachment/edit.html.tmpl @@ -9,6 +9,7 @@ [%# Define strings that will serve as the title and header of this page %] [% title = BLOCK %] Attachment [% attachment.id %] Details for [% terms.Bug %] [%+ attachment.bug_id %] + – [% attachment.description FILTER html %] [% END %] [% header = BLOCK %] Attachment [% attachment.id %] Details for @@ -20,15 +21,16 @@ title = title header = header subheader = subheader - doc_section = "attachments.html" + generate_api_token = 1 + doc_section = "using/editing.html#attachments" javascript_urls = ['js/attachment.js', 'js/field.js'] - style_urls = ['skins/standard/attachment.css'] + style_urls = ['skins/standard/bug.css'] yui = [ 'autocomplete' ] bodyclasses = "no_javascript" %] [%# No need to display the Diff button and iframe if the attachment is not a patch. %] -[% use_patchviewer = (feature_enabled('patch_viewer') && attachment.ispatch) %] +[% use_patchviewer = (feature_enabled('patch_viewer') && attachment.ispatch) ? 1 : 0 %] [% can_edit = attachment.validate_can_edit %] [% editable_or_hide = can_edit ? "" : " bz_hidden_option" %] @@ -197,35 +199,38 @@ readonly = 'readonly' %] [% ELSE %] - <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]"> + <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]" sandbox> <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> [% END %] + + [% IF use_patchviewer %] + <iframe id="viewDiffFrame" class="bz_default_hidden"></iframe> + [% END %] + + [% IF user.id %] + <button type="button" id="editButton" class="bz_default_hidden" + onclick="editAsComment([% use_patchviewer %]);">Edit Attachment As Comment</button> + <button type="button" id="undoEditButton" class="bz_default_hidden" + onclick="undoEditAsComment([% use_patchviewer %]);">Undo Edit As Comment</button> + <button type="button" id="redoEditButton" class="bz_default_hidden" + onclick="redoEditAsComment([% use_patchviewer %]);">Redo Edit As Comment</button> + [% END %] + + [% IF use_patchviewer %] + <button type="button" id="viewDiffButton" class="bz_default_hidden" + onclick="viewDiff([% attachment.id %], [% use_patchviewer %]);">View Attachment As Diff</button> + [% END %] + <button type="button" id="viewRawButton" class="bz_default_hidden" + onclick="viewRaw([% use_patchviewer %]);">View Attachment As Raw</button> + <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>'); - } - //--> + [% IF user.id %] + document.getElementById('editFrame').disabled = false; + YAHOO.util.Dom.removeClass("editButton", "bz_default_hidden"); + [% END %] + YAHOO.util.Dom.removeClass("viewDiffButton", "bz_default_hidden"); </script> </div> [% ELSE %] @@ -247,13 +252,12 @@ <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 = 10 - cols = 80 - wrap = 'soft' - classes = classNames + [% INCLUDE bug/comment.html.tmpl + bug = attachment.bug + minrows = 10 + cols = 80 + classes = classNames + wrap = 'soft' %] [% IF NOT attachment.bug.cc.contains(user.login) %] <input type="checkbox" id="addselfcc" name="addselfcc" @@ -263,6 +267,7 @@ && user.settings.state_addselfcc.value == 'cc_unless_role') %]> <label for="addselfcc">Add me to CC list</label> [% END %] + [% Hook.process('after_comment_textarea') %] </div> [% END %] <div id="attachment_flags"> diff --git a/template/en/default/attachment/list.html.tmpl b/template/en/default/attachment/list.html.tmpl index e30492c36..9676dd67b 100644 --- a/template/en/default/attachment/list.html.tmpl +++ b/template/en/default/attachment/list.html.tmpl @@ -42,9 +42,9 @@ function toggle_display(link) { </script> <br> -<table id="attachment_table" cellspacing="0" cellpadding="4"> +<table id="attachment_table"> <tr id="a0"> - <th colspan="[% show_attachment_flags ? 3 : 2 %]" align="left"> + <th colspan="[% show_attachment_flags ? 3 : 2 %]" class="left"> Attachments </th> </tr> @@ -65,7 +65,7 @@ function toggle_display(link) { [% " bz_private" IF attachment.isprivate %] [% " bz_tr_obsolete bz_default_hidden" IF attachment.isobsolete %]"> - <td valign="top"> + <td> [% IF attachment.datasize %] <a href="attachment.cgi?id=[% attachment.id %]" title="View the content of the attachment"> @@ -88,7 +88,7 @@ function toggle_display(link) { <br> <a href="#attach_[% attachment.id %]" title="Go to the comment associated with the attachment"> - [%- attachment.attached FILTER time %]</a>, + [%- attachment.attached FILTER time("%Y-%m-%d %H:%M %Z") %]</a>, [%# No need to recreate the exact same template if we already have it. %] [% attacher_id = attachment.attacher.id %] @@ -102,7 +102,7 @@ function toggle_display(link) { </td> [% IF show_attachment_flags %] - <td class="bz_attach_flags" valign="top"> + <td class="bz_attach_flags"> [% IF attachment.flags.size == 0 %] <i>no flags</i> [% ELSE %] @@ -114,7 +114,7 @@ function toggle_display(link) { [% ELSE %] [% flag.setter.nick FILTER html %]: [% END %] - [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %] + [%+ flag.type.name FILTER html %][% flag.status %] [%+ IF flag.status == "?" && flag.requestee %] [% IF user.id %] (<span title="[% flag.requestee.identity FILTER html %]">[% flag.requestee.nick FILTER html %]</span>) @@ -129,7 +129,7 @@ function toggle_display(link) { </td> [% END %] - <td valign="top"> + <td> <a href="attachment.cgi?id=[% attachment.id %]&action=edit">Details</a> [% IF attachment.ispatch && feature_enabled('patch_viewer') %] | <a href="attachment.cgi?id=[% attachment.id %]&action=diff">Diff</a> diff --git a/template/en/default/attachment/show-multiple.html.tmpl b/template/en/default/attachment/show-multiple.html.tmpl index 8791e0dfe..e2c95cb80 100644 --- a/template/en/default/attachment/show-multiple.html.tmpl +++ b/template/en/default/attachment/show-multiple.html.tmpl @@ -18,7 +18,7 @@ title = title header = header subheader = filtered_summary - style_urls = ['skins/standard/attachment.css'] + style_urls = ['skins/standard/bug.css'] %] [% IF hide_obsolete %] <div id="hidden_obsolete_message"> @@ -26,23 +26,17 @@ <a href="attachment.cgi?bugid=[% bug.id FILTER html %]&action=viewall">click here</a>. </div> [% END %] -<br> [% FOREACH a = attachments %] - - <div align="center"> - <table class="attachment_info" cellspacing="0" cellpadding="4" border="1" width="75%"> +<div class="viewall_frame_container"> + <table class="viewall_desc"> <tr> - <td valign="top" bgcolor="#cccccc" colspan="6"> - <big><b>Attachment #[% a.id %]</b></big> - </td> + <th colspan="6" class="bz_attach_footer">Attachment #[% a.id %]</th> </tr> <tr> - <td valign="top"> - [% a.description FILTER html FILTER obsolete(a.isobsolete) %] - </td> + <td>[% a.description FILTER html FILTER obsolete(a.isobsolete) %]</td> - <td valign="top"> + <td> [% IF a.ispatch %] <i>patch</i> [% ELSE %] @@ -50,10 +44,10 @@ [% END %] </td> - <td valign="top">[% a.attached FILTER time %]</td> - <td valign="top">[% a.datasize FILTER unitconvert %]</td> + <td>[% a.attached FILTER time %]</td> + <td>[% a.datasize FILTER unitconvert %]</td> - <td valign="top"> + <td> [% IF a.flags.size == 0 %] <i>no flags</i> [% ELSE %] @@ -68,9 +62,7 @@ [% END %] </td> - <td valign="top"> - <a href="attachment.cgi?id=[% a.id %]&action=edit">Details</a> - </td> + <td><a href="attachment.cgi?id=[% a.id %]&action=edit">Details</a></td> </tr> </table> @@ -86,7 +78,7 @@ classes = 'viewall_frame' %] [% ELSE %] - <iframe src="attachment.cgi?id=[% a.id %]" class="viewall_frame"> + <iframe src="attachment.cgi?id=[% a.id %]" class="viewall_frame" sandbox> <b>You cannot view the attachment on this page because your browser does not support IFRAMEs. <a href="attachment.cgi?id=[% a.id %]">View the attachment on a separate page</a>.</b> </iframe> @@ -97,10 +89,7 @@ <a href="attachment.cgi?id=[% a.id %]">Download the attachment instead</a>. </b></p> [% END %] - </div> - - <br><br> - +</div> [% END %] [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/bug/activity/show.html.tmpl b/template/en/default/bug/activity/show.html.tmpl index a442abd4b..0d4f06323 100644 --- a/template/en/default/bug/activity/show.html.tmpl +++ b/template/en/default/bug/activity/show.html.tmpl @@ -21,14 +21,14 @@ %] <p> - [% "Back to $terms.bug $bug.bug_id" FILTER bug_link(bug) FILTER none %] + Back to [% "$terms.bug $bug.bug_id" FILTER bug_link(bug) FILTER none %] </p> [% PROCESS bug/activity/table.html.tmpl %] [% IF operations.size > 0 %] <p> - [% "Back to $terms.bug $bug.bug_id" FILTER bug_link(bug) FILTER none %] + Back to [% "$terms.bug $bug.bug_id" FILTER bug_link(bug) FILTER none %] </p> [% END %] diff --git a/template/en/default/bug/activity/table.html.tmpl b/template/en/default/bug/activity/table.html.tmpl index 253d16109..8b371f0b5 100644 --- a/template/en/default/bug/activity/table.html.tmpl +++ b/template/en/default/bug/activity/table.html.tmpl @@ -33,8 +33,8 @@ [% END %] [% IF operations.size > 0 %] - <table border cellpadding="4"> - <tr> + <table id="bug_activity"> + <tr class="column_header"> <th>Who</th> <th>When</th> <th>What</th> @@ -44,10 +44,10 @@ [% FOREACH operation = operations %] <tr> - <td rowspan="[% operation.changes.size %]" valign="top"> + <td rowspan="[% operation.changes.size %]"> [% operation.who FILTER email FILTER html %] </td> - <td rowspan="[% operation.changes.size %]" valign="top"> + <td rowspan="[% operation.changes.size %]"> [% operation.when FILTER time %] </td> [% FOREACH change = operation.changes %] @@ -94,7 +94,7 @@ change.fieldname == 'flagtypes.name' %] [% display_value(change.fieldname, change_type) FILTER email FILTER html %] [% ELSE %] - [% display_value(change.fieldname, change_type) FILTER html %] + [% display_value(change.fieldname, change_type) FILTER html FILTER html_line_break %] [% END %] [% ELSE %] diff --git a/template/en/default/bug/comment.html.tmpl b/template/en/default/bug/comment.html.tmpl new file mode 100644 index 000000000..96cbb63ed --- /dev/null +++ b/template/en/default/bug/comment.html.tmpl @@ -0,0 +1,37 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # + # This template supports the same parameters as global/textarea.html.tmpl + # with the exception of "name" and "id", which will always be "comment". + #%] + +[% IF feature_enabled('jsonrpc') %] + <div id="comment_tabs" role="tablist"> + <div id="comment_tab" class="comment_tab active_comment_tab" + role="tab" aria-selected="true" + onclick="show_comment_edit()">Comment</div> + <div id="comment_preview_tab" class="comment_tab" + role="tab" aria-selected="false" + onclick="show_comment_preview([% bug.id FILTER none %])">Preview</div> + </div> +[% END %] + +[% INCLUDE global/textarea.html.tmpl + name = "comment" + id = "comment" +%] + +[% IF feature_enabled('jsonrpc') %] + <div id="comment_preview" class="bz_default_hidden bz_comment"> + <div id="comment_preview_loading" class="bz_default_hidden">Generating Preview...</div> + <div id="comment_preview_error" class="bz_default_hidden"></div> + <pre id="comment_preview_text" class="bz_comment_text"></pre> + </div> +[% END %] diff --git a/template/en/default/bug/comments.html.tmpl b/template/en/default/bug/comments.html.tmpl index 61d1c67e0..f4f79ec5c 100644 --- a/template/en/default/bug/comments.html.tmpl +++ b/template/en/default/bug/comments.html.tmpl @@ -13,7 +13,7 @@ <script type="text/javascript"> <!-- - /* Adds the reply text to the `comment' textarea */ + /* Adds the reply text to the 'comment' textarea */ function replyToComment(id, real_id, name) { var prefix = "(In reply to " + name + " from comment #" + id + ")\n"; var replytext = ""; @@ -44,27 +44,17 @@ //--> </script> -[% DEFAULT start_at = 0 mode = "show" %] -[% sort_order = user.settings.comment_sort_order.value %] +[% DEFAULT mode = "show" %] [% user_cache = template_cache.users %] - -[%# NOTE: (start_at > 0) means we came here from a midair collision, - # in which case we don't care what the user's preference is. - %] -[% IF (start_at > 0) %] - [% sort_order = "oldest_to_newest" %] -[% END %] +[% can_edit_comments = bug.check_can_change_field('longdesc', 0, 1) %] <!-- This auto-sizes the comments and positions the collapse/expand links to the right. --> -<table class="bz_comment_table" cellpadding="0" cellspacing="0"><tr> +<table class="bz_comment_table"> +<tr> <td> -[% FOREACH comment = comments %] - [% IF comment.count >= start_at %] - [% PROCESS a_comment %] - [% END %] -[% END %] +[% PROCESS display_comments %] [% IF mode == "edit" && user.id && user.settings.comment_box_position.value == "before_comments" %] @@ -84,15 +74,18 @@ <td> [% IF mode == "edit" %] <ul class="bz_collapse_expand_comments"> - <li><a href="#" onclick="toggle_all_comments('collapse'); + <li><a href="#" onclick="toggle_all_comments('collapse'); return false;">Collapse All Comments</a></li> <li><a href="#" onclick="toggle_all_comments('expand'); return false;">Expand All Comments</a></li> + [% IF Param('comment_taggers_group') %] + <li><div id="comment_tags_collapse_expand_container"></div></li> + [% END %] [% 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 %] + [% END %] </ul> [% END %] </td> @@ -102,12 +95,14 @@ [%# Block for individual comments #%] [%############################################################################%] -[% BLOCK a_comment %] - [% RETURN IF comment.is_private AND NOT (user.is_insider || user.id == comment.author.id) %] - [% comment_text = comment.body_full %] - [% RETURN IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %] +[% BLOCK display_comments %] + [% FOREACH comment = comments %] + [% NEXT IF comment.is_private AND NOT (user.is_insider || user.id == comment.author.id) %] + [% comment_text = comment.body_full %] + [% NEXT IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %] <div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %] + [% " bz_default_collapsed" IF comment.collapsed %] [% " bz_comment_hilite" IF marks.${comment.count} %] [% " bz_first_comment" IF comment.count == 0 %]"> [% IF comment.count == 0 %] @@ -119,23 +114,38 @@ [% END %] <div class="[% class_name FILTER html %]"> - [% IF mode == "edit" %] <span class="bz_comment_actions"> - [% IF bug.check_can_change_field('longdesc', 0, 1) %] + [% IF comment.collapsed %] + <span class="bz_collapsed_actions"> + [% END %] + [% IF can_edit_comments %] + [% IF user.can_tag_comments %] + [<a href="#" + onclick="YAHOO.bugzilla.commentTagging.toggle([% comment.id %], [% comment.count %]);return false">tag</a>] + [% END %] [<a class="bz_reply_link" href="#add_comment" [% IF user.settings.quote_replies.value != 'off' %] onclick="replyToComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;" [% END %] >reply</a>] [% END %] - <script type="text/javascript"><!-- - addCollapseLink([% comment.count %], 'Toggle comment display'); // --> + [% IF comment.collapsed %] + </span> + [% END %] + <script type="text/javascript"> + addCollapseLink([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display'); + </script> + </span> + [% ELSIF comment.collapsed %] + <span class="bz_comment_actions"> + <script type="text/javascript"> + addCollapseLink([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display'); </script> </span> [% END %] - [% IF mode == "edit" && user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %] + [% IF mode == "edit" && can_edit_comments && user.is_insider %] <div class="bz_private_checkbox"> <input type="hidden" value="1" name="defined_isprivate_[% comment.id %]"> @@ -176,6 +186,14 @@ <span class="bz_comment_time"> [%+ comment.creation_ts FILTER time %] </span> + + [% IF comment.collapsed %] + <span id="cr[% comment.count %]" class="bz_comment_collapse_reason" + title="[% comment.author.name || comment.author.login FILTER html %] + [%~ %] [[% comment.creation_ts FILTER time %]]"> + Comment hidden ([% comment.tags.join(', ') FILTER html %]) + </span> + [% END %] </div> [% IF user.is_timetracker && @@ -185,12 +203,35 @@ [% PROCESS formattimeunit time_unit=comment.work_time %] [% END %] + [% IF user.id && Param('comment_taggers_group') %] + <div id="comment_tag_[% comment.count FILTER html %]" + class="bz_comment_tags"> + <span id="ct_[% comment.count %]" + class="[% 'bz_default_hidden' UNLESS comment.tags.size %]"> + [% IF comment.tags.size %] + <script> + YAHOO.bugzilla.commentTagging.showTags([% comment.id FILTER none %], + [% comment.count FILTER none %], [ + [% FOREACH tag = comment.tags %] + [%~%]'[% tag FILTER js %]'[% "," UNLESS loop.last %] + [% END %] + [%~%]]); + </script> + [% END %] + </span> + </div> + [% END %] + [%# Don't indent the <pre> block, since then the spaces are displayed in the # generated HTML #%] -<pre class="bz_comment_text" - [% ' id="comment_text_' _ comment.count _ '"' IF mode == "edit" %]> +<pre class="bz_comment_text[% " collapsed" IF comment.collapsed %]" + [% IF mode == "edit" || comment.collapsed %] + id="comment_text_[% comment.count FILTER none %]" + [% END %]> [%- comment_text FILTER quoteUrls(bug, comment) -%] </pre> + [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %] </div> + [% END %] [% END %] diff --git a/template/en/default/bug/create/create-guided.html.tmpl b/template/en/default/bug/create/create-guided.html.tmpl index e7de84799..1adae4588 100644 --- a/template/en/default/bug/create/create-guided.html.tmpl +++ b/template/en/default/bug/create/create-guided.html.tmpl @@ -16,25 +16,9 @@ [% PROCESS global/header.html.tmpl title = "Enter $terms.ABug" onload = "PutDescription()" - style = "#somebugs { width: 100%; height: 500px }" + style_urls = ['skins/standard/bug.css'] %] -[% 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" %] - [%# This script displays the descriptions for selected components. %] <script type="text/javascript"> var descriptions = [ @@ -45,50 +29,41 @@ var descriptions = [ ]; function PutDescription() { - if ((document.getElementById) && (document.body.innerHTML)) { - var componentIndex = document.getElementById('component').selectedIndex; - if (componentIndex != -1) { - var description = document.getElementById('description'); - description.innerHTML = descriptions[componentIndex]; - } - } + var description = document.getElementById('description'); + var componentIndex = document.getElementById('component').selectedIndex; + YAHOO.util.Dom.removeClass("description", "bz_default_hidden"); + if (componentIndex != -1) { + description.innerHTML = descriptions[componentIndex]; + } } </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 class="warning"> + Please don't skip this step - half of all [% terms.bugs %] filed are + reported already. </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 uri %][% END %] -[% END %] +<p>Check the two lists of frequently-reported [% terms.bugs %]:</p> <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> + <a href="duplicates.cgi?product=[% product.name FILTER uri %]&format=simple" + target="somebugs">All-time Top 100</a> (loaded initially) | + <a href="duplicates.cgi?product=[% product.name FILTER uri %]&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"> + src="duplicates.cgi?product=[% product.name FILTER uri %]&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>. + For example: <kbd><b>pop3 mail</b></kbd> or <kbd><b>copy paste</b></kbd>. The results will appear above. - </p> +</p> [%# All bugs opened inside the past six months %] <form action="buglist.cgi" method="get" target="somebugs"> @@ -96,16 +71,6 @@ function PutDescription() { <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]"> @@ -115,7 +80,7 @@ function PutDescription() { <p> Look through the search results. If you get the - <tt><b>[% terms.zeroSearchResults %]</b></tt> message, [% terms.Bugzilla %] + <kbd><b>[% terms.zeroSearchResults %]</b></kbd> 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 @@ -130,7 +95,7 @@ function PutDescription() { there, tell us all about it. </p> -<form method="post" action="post_bug.cgi"> +<form id="guided_form" method="post" action="post_bug.cgi"> <input type="hidden" name="format" value="guided"> <input type="hidden" name="assigned_to" value=""> <input type="hidden" name="priority" @@ -139,107 +104,74 @@ function PutDescription() { value="[% default.version FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> -<table valign="top" cellpadding="5" cellspacing="5" border="0"> - - <tr bgcolor="[% tablecolour %]"> - <td align="right" valign="top"> - <b>Product</b> - </td> - <td valign="top"> +<table> + <tr class="guided_form_field"> + <th>Product</th> + <td> <input type="hidden" name="product" value="[% product.name FILTER html %]"> [% product.name FILTER html %] </td> </tr> <tr> - <td align="right" valign="top"> - <b>Component</b> - </td> - <td valign="top"> - <table border="0" cellpadding="0" cellspacing="0"> - <tr> - <td valign="top"> - <select name="component" id="component" - size="5" onchange="PutDescription()"> - [% IF NOT default.component_ %] - [%# Various b.m.o. products have a "General" component, - which is a useful default. %] - [% default.component_ = "General" %] - [% END %] - [% FOREACH c = product.components %] - [% NEXT IF NOT c.is_active %] - <option value="[% c.name FILTER html %]" - [% " selected=\"selected\"" IF c.name == default.component_ %]> - [% c.name FILTER html %] - </option> - [% END %] - </select> - </td> - <td valign="top" width="100%"> - <div id="description" style="color: green; margin-left: 10px; - height: 5em; overflow: auto;"> - <script type="text/javascript"> - if ((document.getElementById) && (document.body.innerHTML)) { - document.write("\ - Select a component to see its description here."); - } - </script> - </div> - </td> - </tr> - </table> - + <th>Component</th> + <td> + <select name="component" id="component" size="5" onchange="PutDescription()"> + [% IF NOT default.component_ %] + [% default.component_ = "General" %] + [% END %] + [% FOREACH c = product.components %] + [% NEXT IF NOT c.is_active %] + <option value="[% c.name FILTER html %]" + [%+ 'selected="selected"' IF c.name == default.component_ %]> + [% c.name FILTER html %] + </option> + [% END %] + </select> + + <div id="description" class="comment bz_default_hidden"> + Select a component to see its description here. + </div> + <p> The area where the problem occurs. To pick the right component, you could use the same one as similar [% terms.bugs %] you found in your search, or read the full list of - <a target="_blank" href="describecomponents.cgi?product= - [% product.name FILTER uri %]">component - descriptions</a> (opens in new window) if you need more help. + <a href="describecomponents.cgi?product=[% product.name FILTER uri %]" + target="_blank" >component descriptions</a> (opens in new window) if + you need more help. </p> </td> </tr> - [%# We override rep_platform and op_sys for simplicity. The values chosen - are based on which are most common in the b.m.o database %] + [%# We override rep_platform and op_sys for simplicity. %] [% rep_platform = [ "PC", "Macintosh", "All", "Other" ] %] - <tr bgcolor="[% tablecolour %]"> - <td align="right" valign="top"> - <b>[% field_descs.rep_platform FILTER html %]</b> - </td> - <td valign="top"> + <tr class="guided_form_field"> + <th>[% field_descs.rep_platform FILTER html %]</th> + <td> [% PROCESS select sel = 'rep_platform' %] </td> </tr> - [% op_sys = [ "Windows 2000", "Windows XP", "Windows Vista", "Windows 7", + [% op_sys = [ "Windows XP", "Windows Vista", "Windows 7", "Windows 8", "Mac OS X", "Linux", "All", "Other" ] %] <tr> - <td align="right" valign="top"> - <b>Operating System</b> - </td> - <td valign="top"> + <th>Operating System</th> + <td> [% 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"> + <tr class="guided_form_field"> + <th>Build Identifier</th> + <td> <input type="text" size="80" name="buildid" value="[% buildid FILTER html %]"> <p> This should identify the exact version of the product you were using. @@ -253,25 +185,18 @@ function PutDescription() { </tr> <tr> - <td align="right" valign="top"> - <b>URL</b> - </td> - <td valign="top"> + <th>URL</th> + <td> <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 seeing (optional). </p> </td> </tr> - <tr bgcolor="[% tablecolour %]"> - <td align="right" valign="top"> - <b>Summary</b> - </td> - <td valign="top"> + <tr class="guided_form_field"> + <th>Summary</th> + <td> <input type="text" size="80" name="short_desc" id="short_desc" maxlength="255" spellcheck="true"> <p> @@ -279,53 +204,50 @@ function PutDescription() { Please be descriptive and use lots of keywords. </p> <p> - <tt> - <font color="#990000">Bad example</font>: mail crashed - </tt> + <kbd> + <span class="bad">Bad example</span>: mail crashed + </kbd> <br> - <tt> - <font color="#009900">Good example</font>: + <kbd> + <span class="good">Good example</span>: crash if I close the mail window while checking for new POP mail - </tt> + </kbd> </p> </td> </tr> <tr> - <td align="right" valign="top"> - <b>Details</b> - </td> - <td valign="top"> + <th>Details</th> + <td> [% INCLUDE global/textarea.html.tmpl - name = 'comment' - minrows = 6 - cols = constants.COMMENT_COLS + name = 'comment' + minrows = 6 + cols = constants.COMMENT_COLS + mandatory = 1 %] <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. + <kbd> + <span class="bad">Bad example</span>: Mozilla crashed. You suck! - </tt> + </kbd> <br> - <tt> - <font color="#009900">Good example</font>: After a crash which + <kbd> + <span class="good">Good example</span>: After a crash which happened when I was sorting in the Bookmark Manager,<br> all of my top-level bookmark folders beginning with the letters Q to Z are no longer present. - </tt> + </kbd> </p> </td> </tr> - <tr bgcolor="[% tablecolour %]"> - <td align="right" valign="top"> - <b>Reproducibility</b> - </td> - <td valign="top"> + <tr class="guided_form_field"> + <th>Reproducibility</th> + <td> <select name="reproducible"> <option name="AlwaysReproducible" value="Always"> Happens every time. @@ -344,10 +266,8 @@ function PutDescription() { </tr> <tr> - <td align="right" valign="top"> - <b>Steps to Reproduce</b> - </td> - <td valign="top"> + <th>Steps to Reproduce</th> + <td> [% INCLUDE global/textarea.html.tmpl name = 'reproduce_steps' minrows = 4 @@ -361,11 +281,9 @@ function PutDescription() { </td> </tr> - <tr bgcolor="[% tablecolour %]"> - <td valign="top" align="right"> - <b>Actual Results</b> - </td> - <td valign="top"> + <tr class="guided_form_field"> + <th>Actual Results</th> + <td> [% INCLUDE global/textarea.html.tmpl name = 'actual_results' minrows = 4 @@ -378,10 +296,8 @@ function PutDescription() { </tr> <tr> - <td valign="top" align="right"> - <b>Expected Results</b> - </td> - <td valign="top"> + <th>Expected Results</th> + <td> [% INCLUDE global/textarea.html.tmpl name = 'expected_results' minrows = 4 @@ -393,11 +309,9 @@ function PutDescription() { </td> </tr> - <tr bgcolor="[% tablecolour %]"> - <td valign="top" align="right"> - <b>Additional Information</b> - </td> - <td valign="top"> + <tr class="guided_form_field"> + <th>Additional Information</th> + <td> [% INCLUDE global/textarea.html.tmpl name = 'additional_info' minrows = 8 @@ -407,29 +321,26 @@ function PutDescription() { 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 + with the default theme?), 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> + your build configuration, obtained by typing <kbd>about:buildconfig</kbd> 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>). + which the software crashed (e.g., <kbd>Application Violation in + gkhtml.dll</kbd>). </p> </td> </tr> <tr> - <td valign="top" align="right"> - <b>[% field_descs.bug_severity FILTER html %]</b> - </td> - <td valign="top"> + <th>[% field_descs.bug_severity FILTER html %]</th> + <td> <select name="bug_severity"> <option name="critical" value="critical"> Critical: The software crashes, hangs, or causes you to @@ -466,11 +377,7 @@ function PutDescription() { <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 == '') - { alert('Please enter some details about this [% terms.bug %].'); - this.form.comment.focus(); - return false; } return true;"> + <input type="submit" id="report" value="Submit [% terms.Bug %] Report"> </p> <p> diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl index c3e18adfd..61faf1c1a 100644 --- a/template/en/default/bug/create/create.html.tmpl +++ b/template/en/default/bug/create/create.html.tmpl @@ -7,15 +7,16 @@ #%] [% title = BLOCK %]Enter [% terms.Bug %]: [% product.name FILTER html %][% END %] +[% use_qa_contact = Param("useqacontact") %] [% PROCESS global/header.html.tmpl title = title + generate_api_token = 1 yui = [ 'autocomplete', 'calendar', 'datatable', 'button' ] - style_urls = [ 'skins/standard/attachment.css', - 'skins/standard/enter_bug.css' ] + style_urls = ['skins/standard/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'); + onload = "set_assign_to($use_qa_contact); hideElementById('attachment_true'); showElementById('attachment_false'); showElementById('btn_no_attachment');" %] @@ -61,77 +62,6 @@ var flags = new Array([% product.components.size %]); [% count = count + 1 %] [%- END %] -function set_assign_to() { - // Based on the selected component, fill the "Assign To:" field - // with the default component owner, and the "QA Contact:" field - // with the default QA Contact. It also selectively enables flags. - var form = document.Create; - var assigned_to = form.assigned_to.value; - -[% IF Param("useqacontact") %] - var qa_contact = form.qa_contact.value; -[% END %] - - var index = -1; - if (form.component.type == 'select-one') { - index = form.component.selectedIndex; - } else if (form.component.type == 'hidden') { - // Assume there is only one component in the list - index = 0; - } - if (index != -1) { - var owner = initialowners[index]; - var component = components[index]; - if (assigned_to == last_initialowner - || assigned_to == owner - || assigned_to == '') { - form.assigned_to.value = owner; - last_initialowner = owner; - } - - document.getElementById('initial_cc').innerHTML = initialccs[index]; - document.getElementById('comp_desc').innerHTML = comp_desc[index]; - - [% IF Param("useqacontact") %] - var contact = initialqacontacts[index]; - if (qa_contact == last_initialqacontact - || qa_contact == contact - || qa_contact == '') { - form.qa_contact.value = contact; - last_initialqacontact = contact; - } - [% END %] - - // We show or hide the available flags depending on the selected component. - var flag_rows = YAHOO.util.Dom.getElementsByClassName('bz_flag_type', 'tbody'); - for (var i = 0; i < flag_rows.length; i++) { - // Each flag table row should have one flag form select element - // We get the flag type id from the id attribute of the select. - var flag_select = YAHOO.util.Dom.getElementsByClassName('flag_select', - 'select', - flag_rows[i])[0]; - var type_id = flag_select.id.split('-')[1]; - var can_set = flag_select.options.length > 1 ? 1 : 0; - var show = 0; - // Loop through the allowed flag ids for the selected component - // and if we match, then show the row, otherwise hide the row. - for (var j = 0; j < flags[index].length; j++) { - if (flags[index][j] == type_id) { - show = 1; - break; - } - } - if (show && can_set) { - flag_select.disabled = false; - YAHOO.util.Dom.removeClass(flag_rows[i], 'bz_default_hidden'); - } else { - flag_select.disabled = true; - YAHOO.util.Dom.addClass(flag_rows[i], 'bz_default_hidden'); - } - } - } -} - var status_comment_required = new Array(); [% FOREACH status = bug_status %] status_comment_required['[% status.name FILTER js %]'] = @@ -200,7 +130,7 @@ TUI_hide_default('attachment_text_field'); desc_url = component_desc_url %] <td id="field_container_component"> - <select name="component" id="component" onchange="set_assign_to();" + <select name="component" id="component" onchange="set_assign_to([% Param("useqacontact") %]);" size="7" aria-required="true" class="required"> [%# Build the lists of assignees and QA contacts if "usemenuforusers" is enabled. %] [% IF Param("usemenuforusers") %] @@ -212,7 +142,7 @@ TUI_hide_default('attachment_text_field'); [% NEXT IF NOT c.is_active %] <option value="[% c.name FILTER html %]" id="v[% c.id FILTER html %]_component" - [% IF c.name == default.component_ %] + [% IF c.name.lower == default.component_.lower %] [%# This is for bug/field.html.tmpl, for visibility-related # controls. %] [% default.component_id = c.id %] @@ -255,9 +185,9 @@ TUI_hide_default('attachment_text_field'); <tr> [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.version editable = 1 rowspan = 3 + field = bug_fields.version editable = 1 rowspan = 4 %] - <td rowspan="3"> + <td rowspan="4"> <select name="version" id="version" size="5" aria-required="true" class="required"> [%- FOREACH v = version %] @@ -274,6 +204,16 @@ TUI_hide_default('attachment_text_field'); value = default.bug_severity %] </tr> + <tr class="expert_fields"> + [% IF Param('letsubmitterchoosepriority') %] + [% INCLUDE bug/field.html.tmpl + bug = default, field = bug_fields.priority, editable = 1, + value = default.priority %] + [% ELSE %] + <td colspan="2"> </td> + [% END %] + </tr> + <tr> [% INCLUDE bug/field.html.tmpl bug = default, field = bug_fields.rep_platform, editable = 1, @@ -287,7 +227,8 @@ TUI_hide_default('attachment_text_field'); </tr> [% IF (!Param('defaultplatform') || !Param('defaultopsys')) && !cloned_bug_id %] <tr> - <th colspan="3"> </th> + <td colspan="2" class="expert_fields"> </td> + <td> </td> <td id="os_guess_note" class="comment"> <div>We've made a guess at your [% IF Param('defaultplatform') %] @@ -311,13 +252,7 @@ TUI_hide_default('attachment_text_field'); <td colspan="2"> </td> [% END %] - [% IF Param('letsubmitterchoosepriority') %] - [% INCLUDE bug/field.html.tmpl - bug = default, field = bug_fields.priority, editable = 1, - value = default.priority %] - [% ELSE %] - <td colspan="2"> </td> - [% END %] + <td colspan="2"> </td> </tr> </tbody> @@ -334,7 +269,7 @@ TUI_hide_default('attachment_text_field'); <td> </td> [%# Calculate the number of rows we can use for flags %] - [% num_rows = 7 + (Param("useqacontact") ? 1 : 0) + + [% num_rows = 6 + (Param("useqacontact") ? 1 : 0) + (user.is_timetracker ? 3 : 0) %] @@ -458,7 +393,7 @@ TUI_hide_default('attachment_text_field'); [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.bug_file_loc editable = 1 %] - <td colspan="2" class="field_value"> + <td colspan="3" class="field_value"> <input name="bug_file_loc" id="bug_file_loc" class="text_input" size="40" value="[% bug_file_loc FILTER html %]"> </td> @@ -492,7 +427,8 @@ TUI_hide_default('attachment_text_field'); </td> </tr> - [% IF feature_enabled('jsonrpc') AND !cloned_bug_id %] + [% IF feature_enabled('jsonrpc') AND !cloned_bug_id + AND user.settings.possible_duplicates.value == 'on' %] <tr id="possible_duplicates_container" class="bz_default_hidden"> <th>Possible<br>Duplicates:</th> <td colspan="3"> @@ -541,9 +477,7 @@ TUI_hide_default('attachment_text_field'); # by global/textarea.html.tmpl. So we must not escape the comment here. %] [% comment FILTER none %] [%- END %] - [% INCLUDE global/textarea.html.tmpl - name = 'comment' - id = 'comment' + [% INCLUDE bug/comment.html.tmpl minrows = 10 maxrows = 25 cols = constants.COMMENT_COLS @@ -565,11 +499,11 @@ TUI_hide_default('attachment_text_field'); Make description and any new attachment private (visible only to members of the <strong>[% Param('insidergroup') FILTER html %]</strong> group) </label> - <script> - updateCommentTagControl(document.getElementById('comment_is_private'), 'comment'); - </script> </td> </tr> + <script> + updateCommentTagControl(document.getElementById('comment_is_private'), 'comment'); + </script> [% END %] [% IF Param("maxattachmentsize") || Param("maxlocalattachment") %] @@ -599,17 +533,17 @@ TUI_hide_default('attachment_text_field'); </tbody> <tbody class="expert_fields"> + [% IF use_keywords %] + <tr> + [% INCLUDE bug/field.html.tmpl + bug = default, field = bug_fields.keywords, editable = 1, + value = keywords, possible_values = all_keywords, + desc_url = "describekeywords.cgi", value_span = 3 + %] + </tr> + [% END %] + [% IF user.in_group('editbugs', product.id) %] - [% IF use_keywords %] - <tr> - [% INCLUDE bug/field.html.tmpl - bug = default, field = bug_fields.keywords, editable = 1, - value = keywords, possible_values = all_keywords, - desc_url = "describekeywords.cgi", value_span = 2 - %] - </tr> - [% END %] - <tr> [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.dependson editable = 1 @@ -627,6 +561,17 @@ TUI_hide_default('attachment_text_field'); </td> </tr> [% END %] + + [% IF Param('use_see_also') %] + <tr> + [% INCLUDE bug/field.html.tmpl + bug = default + field = bug_fields.see_also + editable = 1 + value = see_also + %] + </tr> + [% END %] </tbody> <tbody class="expert_fields"> @@ -636,13 +581,13 @@ TUI_hide_default('attachment_text_field'); <td colspan="3"> <br> <strong> - Only users in all of the selected groups can view this + Only users in [%+ IF Param('or_groups') %]at least one[% ELSE %]all[% END %] of the selected groups can view this [%+ terms.bug %]: </strong> <br> - <font size="-1"> + <span class="bz_info"> (Leave all boxes unchecked to make this a public [% terms.bug %].) - </font> + </span> <br> <br> diff --git a/template/en/default/bug/create/make-template.html.tmpl b/template/en/default/bug/create/make-template.html.tmpl index 4b1b0c084..31f255f81 100644 --- a/template/en/default/bug/create/make-template.html.tmpl +++ b/template/en/default/bug/create/make-template.html.tmpl @@ -12,7 +12,7 @@ #%] [% PROCESS global/header.html.tmpl - title = "Bookmarks are your friend" + title = "Bookmark For $terms.Bug Entry" header = "Template constructed" %] diff --git a/template/en/default/bug/dependency-graph.html.tmpl b/template/en/default/bug/dependency-graph.html.tmpl index 153cebdfa..69afa2ddf 100644 --- a/template/en/default/bug/dependency-graph.html.tmpl +++ b/template/en/default/bug/dependency-graph.html.tmpl @@ -51,7 +51,7 @@ <form action="showdependencygraph.cgi" method="GET"> <table> <tr> - <th align="left"><label for="id">[% terms.Bug %] numbers</label>:</th> + <th><label for="id">[% terms.Bug %] numbers</label>:</th> <td><input id="id" name="id" value="[% bug_id %]"></td> <td> <input type="checkbox" id="showsummary" name="showsummary" [% " checked" IF showsummary %]> @@ -60,7 +60,7 @@ </tr> <tr> - <th align="left"><label for="display">Display:</label></th> + <th><label for="display">Display:</label></th> <td colspan="2"> <select id="display" name="display"> <option value="tree"[% 'selected="selected"' IF (!display || display == "tree") %]> @@ -72,7 +72,7 @@ </tr> <tr> - <th align="left"><label for="rankdir">Orientation:</label></th> + <th><label for="rankdir">Orientation:</label></th> <td colspan="2"> <select id="rankdir" name="rankdir"> <option value="TB"[% " selected" IF rankdir == "TB" %]>Top to bottom</option> diff --git a/template/en/default/bug/dependency-tree.html.tmpl b/template/en/default/bug/dependency-tree.html.tmpl index f53663685..606ab78f7 100644 --- a/template/en/default/bug/dependency-tree.html.tmpl +++ b/template/en/default/bug/dependency-tree.html.tmpl @@ -12,9 +12,9 @@ header = "Dependency tree for <a href=\"show_bug.cgi?id=$bugid\">$terms.Bug $bugid</a>" javascript_urls = ["js/expanding-tree.js"] - style_urls = ["skins/standard/dependency-tree.css"] - subheader = filtered_desc - doc_section = "hintsandtips.html#dependencytree" + style_urls = ['skins/standard/bug.css'] + subheader = filtered_desc + doc_section = "using/understanding.html" %] [% PROCESS depthControlToolbar %] @@ -165,13 +165,12 @@ [%###########################################################################%] [% BLOCK depthControlToolbar %] - <table cellpadding="3" border="0" cellspacing="0" bgcolor="#e0e0e0"> + <table class="dependency_tree_controls"> <tr> [%# Hide/show resolved button Swaps text depending on the state of hide_resolved %] - <td align="center"> - <form method="get" action="showdependencytree.cgi" - style="display: inline; margin: 0px;"> + <td> + <form method="get" action="showdependencytree.cgi"> <input name="id" type="hidden" value="[% bugid %]"> [% IF maxdepth %] <input name="maxdepth" type="hidden" value="[% maxdepth %]"> @@ -191,11 +190,9 @@ </td> <td> - <form method="get" action="showdependencytree.cgi" - style="display: inline; margin: 0px;"> + <form method="get" action="showdependencytree.cgi"> [%# set to one form %] - <input type="submit" id="change_maxdepth" - value=" 1 " + <input type="submit" id="change_maxdepth" value="1" [% "disabled" IF realdepth < 2 || maxdepth == 1 %]> <input name="id" type="hidden" value="[% bugid %]"> <input name="maxdepth" type="hidden" value="1"> @@ -204,8 +201,7 @@ </td> <td> - <form method="get" action="showdependencytree.cgi" - style="display: inline; margin: 0px;"> + <form method="get" action="showdependencytree.cgi"> [%# Minus one form Allow subtracting only when realdepth and maxdepth > 1 %] <input name="id" type="hidden" value="[% bugid %]"> @@ -214,14 +210,13 @@ : ( maxdepth ? maxdepth - 1 : realdepth - 1 ) %]"> <input name="hide_resolved" type="hidden" value="[% hide_resolved %]"> - <input type="submit" id="decrease_depth" value=" < " + <input type="submit" id="decrease_depth" value="<" [% "disabled" IF realdepth < 2 || ( maxdepth && maxdepth < 2 ) %]> </form> </td> <td> - <form method="get" action="showdependencytree.cgi" - style="display: inline; margin: 0px;"> + <form method="get" action="showdependencytree.cgi"> [%# Limit entry form: the button cannot do anything when total depth is less than two, so disable it %] <input name="maxdepth" size="4" maxlength="4" value="[% @@ -237,8 +232,7 @@ </td> <td> - <form method="get" action="showdependencytree.cgi" - style="display: inline; margin: 0px;"> + <form method="get" action="showdependencytree.cgi"> [%# plus one form Disable button if total depth < 2, or if depth set to unlimited %] <input name="id" type="hidden" value="[% bugid %]"> @@ -246,19 +240,18 @@ <input name="maxdepth" type="hidden" value="[% maxdepth + 1 %]"> [% END %] <input name="hide_resolved" type="hidden" value="[% hide_resolved %]"> - <input type="submit" id="increase_depth" value=" > " + <input type="submit" id="increase_depth" value=">" [% "disabled" IF realdepth < 2 || !maxdepth || maxdepth >= realdepth %]> </form> </td> <td> - <form method="get" action="showdependencytree.cgi" - style="display: inline; margin: 0px;"> + <form method="get" action="showdependencytree.cgi"> [%# Unlimited button %] <input name="id" type="hidden" value="[% bugid %]"> <input name="hide_resolved" type="hidden" value="[% hide_resolved %]"> <input type="submit" id="remove_limit" - value=" Unlimited " + value="Unlimited" [% "disabled" IF maxdepth == 0 || maxdepth == realdepth %]> </form> </td> diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl index 7b7c0dfc5..90151161e 100644 --- a/template/en/default/bug/edit.html.tmpl +++ b/template/en/default/bug/edit.html.tmpl @@ -8,26 +8,42 @@ [% PROCESS bug/time.html.tmpl %] +[% IF Param('comment_taggers_group') %] + [% IF user.can_tag_comments %] + <div id="bz_ctag_div" class="bz_default_hidden"> + <a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideInput()">x</a> + <div> + <input id="bz_ctag_add" size="10" placeholder="add tag" + maxlength="[% constants.MAX_COMMENT_TAG_LENGTH FILTER html %]"> + <span id="bz_ctag_autocomp"></span> + </div> + + </div> + <div id="bz_ctag_error" class="bz_default_hidden"> + <a href="javascript:void(0)" onclick="YAHOO.bugzilla.commentTagging.hideError()">x</a> + <span id="bz_ctag_error_msg"></span> + </div> + [% END %] + [% IF user.id %] + <script type="text/javascript"> + YAHOO.bugzilla.commentTagging.init([% user.can_tag_comments ? 'true' : 'false' %]); + YAHOO.bugzilla.commentTagging.min_len = [% constants.MIN_COMMENT_TAG_LENGTH FILTER js %]; + YAHOO.bugzilla.commentTagging.max_len = [% constants.MAX_COMMENT_TAG_LENGTH FILTER js %]; + YAHOO.bugzilla.commentTagging.label = 'Comment Tags:'; + YAHOO.bugzilla.commentTagging.min_len_error = + 'Comment tags must be at least + [%~ " " _ constants.MIN_COMMENT_TAG_LENGTH FILTER js %] characters.'; + YAHOO.bugzilla.commentTagging.max_len_error = + 'Comment tags cannot be longer than + [%~ " " _ constants.MAX_COMMENT_TAG_LENGTH FILTER js %] characters.'; + </script> + [% END %] +[% END %] + <script type="text/javascript"> <!-- [% IF user.is_timetracker %] - var fRemainingTime = [% bug.remaining_time %]; // holds the original value - function adjustRemainingTime() { - // subtracts time spent from remaining time - var new_time; - - // prevent negative values if work_time > fRemainingTime - new_time = - Math.max(fRemainingTime - document.changeform.work_time.value, 0.0); - // get upto 2 decimal places - document.changeform.remaining_time.value = - Math.round(new_time * 100)/100; - } - - function updateRemainingTime() { - // if the remaining time is changed manually, update fRemainingTime - fRemainingTime = document.changeform.remaining_time.value; - } + var bz_remaining_time = [% bug.remaining_time %]; [% END %] [% IF user.id %] @@ -46,7 +62,6 @@ <form name="changeform" id="changeform" method="post" action="process_bug.cgi"> <input type="hidden" name="delta_ts" value="[% bug.delta_ts %]"> - <input type="hidden" name="longdesclength" value="[% bug.comments.size %]"> <input type="hidden" name="id" value="[% bug.bug_id %]"> <input type="hidden" name="token" value="[% issue_hash_token([bug.id, bug.delta_ts]) FILTER html %]"> @@ -58,15 +73,19 @@ <table> [%# *** ID, product, component, status, resolution, Hardware, and OS *** %] [% PROCESS section_status %] - + [% PROCESS section_spacer %] - + + [% PROCESS section_aliases %] + + [% PROCESS section_spacer %] + [% PROCESS section_details1 %] [% PROCESS section_spacer %] - [%# *** severity, priority, version and milestone *** %] - [% PROCESS section_details2 %] + [%# *** severity, priority, version, milestone, and deadline *** %] + [% PROCESS section_details2 %] [%# *** assigned to and qa contact *** %] [% PROCESS section_people %] @@ -89,22 +108,24 @@ </td> [%# 2nd Column %] <td id="bz_show_bug_column_2" class="bz_show_bug_column"> - <table cellpadding="3" cellspacing="1"> + <table> [%# *** Reported and modified dates *** %] [% PROCESS section_dates %] - + [% PROCESS section_cclist %] - + + [% PROCESS section_bug_ignored %] + [% PROCESS section_spacer %] [% PROCESS section_see_also %] - + [% PROCESS section_customfields %] - + [% PROCESS section_spacer %] - + [% Hook.process("after_custom_fields") %] - + [% PROCESS section_flags %] </table> @@ -117,7 +138,8 @@ </tr> </table> - <table id="bz_big_form_parts" cellspacing="0" cellpadding="0"><tr> + <table id="bz_big_form_parts"> + <tr> <td> [% IF user.is_timetracker %] [% PROCESS section_timetracking %] @@ -162,61 +184,38 @@ [% BLOCK section_title %] [%# That's the main table, which contains all editable fields. %] - <div class="bz_alias_short_desc_container edit_form"> + <div class="bz_short_desc_container edit_form"> [% PROCESS commit_button id="_top"%] <a href="show_bug.cgi?id=[% bug.bug_id %]"> [%-# %]<b>[% terms.Bug %] [% bug.bug_id FILTER html %]</b> - [%-# %]</a> -<span id="summary_alias_container" class="bz_default_hidden"> - [% IF bug.alias != "" %] - (<span id="alias_nonedit_display">[% bug.alias FILTER html %]</span>) + [%-# %]</a> <span id="summary_container" class="bz_default_hidden"> + [% IF bug.alias.size > 0 %] + (<span id="alias_nonedit_display">[% bug.alias.join(', ') FILTER html %]</span>) [% END %] - <span id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) %]</span> - [% IF bug.check_can_change_field('short_desc', 0, 1) || - bug.check_can_change_field('alias', 0, 1) %] - <small class="editme">(<a href="#" id="editme_action">edit</a>)</small> + - <span id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) %]</span> + [% can_edit_short_desc = bug.check_can_change_field('short_desc', 0, 1) %] + [% IF can_edit_short_desc %] + <small>(<a href="#" id="summary_edit_action">edit</a>)</small> [% END %] </span> - - - <div id="summary_alias_input"> - <table id="summary"> - <tr> - [% IF bug.check_can_change_field('alias', 0, 1) %] - [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.alias - editable = 1 - %] - <td> - [% ELSIF bug.alias %] - <td colspan="2">( - [% ELSE %] - <td colspan="2"> - [% END %] - [% PROCESS input inputname => "alias" - size => "20" - maxlength => "20" - no_td => 1 - %][% ")" IF NOT bug.check_can_change_field('alias', 0, 1) - && bug.alias %] - </td> - </tr> - [%# *** Summary *** %] - <tr> - [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.short_desc - editable = 1 - accesskey = "s" - %] - <td> - [% PROCESS input inputname => "short_desc" size => "80" colspan => 2 - maxlength => 255 spellcheck => "true" no_td => 1 %] - </td> - </tr> - </table> + + <div id="summary_input"> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.short_desc + editable = can_edit_short_desc + accesskey = "s" + tag_name = 'span' + %] + [% PROCESS input inputname => "short_desc" size => "80" + maxlength => 255 spellcheck => "true" no_td => 1 %] </div> </div> <script type="text/javascript"> - hideAliasAndSummary('[% bug.short_desc FILTER js %]', '[% bug.alias FILTER js %]'); + hideEditableField('summary_container', + 'summary_input', + 'summary_edit_action', + 'short_desc', + '[% bug.short_desc FILTER js %]' ); </script> [% END %] @@ -230,11 +229,20 @@ [%# PRODUCT #%] [%#############%] <tr> - [% INCLUDE bug/field.html.tmpl - bug = bug, field = bug_fields.product, - override_legal_values = bug.choices.product - desc_url = 'describecomponents.cgi', value = bug.product - editable = bug.check_can_change_field('product', 0, 1) %] + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.product + desc_url = 'describecomponents.cgi' + value = bug.product + %] + <td class="field_value" id="field_container_product"> + [% INCLUDE "global/product-select.html.tmpl" + id => "product" + name => "product" + value => bug.product + products => bug.choices.product + isselect => bug.check_can_change_field('product', 0, 1) + %] + </td> </tr> [%# Classification is here so that it can be used in value controllers @@ -262,22 +270,26 @@ </tr> <tr> [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.version editable = 1 %] - + field = bug_fields.version + editable = bug.check_can_change_field('version', 0, 1) %] + [% PROCESS select selname => "version" %] </tr> [%############%] [%# PLATFORM #%] [%############%] <tr> + [% can_edit_rep_platform = bug.check_can_change_field('rep_platform', 0, 1) %] [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.rep_platform, editable = 1, accesskey = "h" %] + field = bug_fields.rep_platform, + editable = can_edit_rep_platform, + accesskey = "h" %] <td class="field_value"> - [% INCLUDE bug/field.html.tmpl + [% INCLUDE bug/field.html.tmpl bug = bug, field = bug_fields.rep_platform, no_tds = 1, value = bug.rep_platform - editable = bug.check_can_change_field('rep_platform', 0, 1) %] - [%+ INCLUDE bug/field.html.tmpl + editable = can_edit_rep_platform %] + [%+ INCLUDE bug/field.html.tmpl bug = bug, field = bug_fields.op_sys, no_tds = 1, value = bug.op_sys editable = bug.check_can_change_field('op_sys', 0, 1) %] @@ -326,14 +338,15 @@ [%###############################################################%] <tr> <th class="field_label"> - <label for="priority" accesskey="i"> + [% can_edit_priority = bug.check_can_change_field('priority', 0, 1) %] + <label [% IF can_edit_priority %]for="priority"[% END %] accesskey="i"> <a href="page.cgi?id=fields.html#importance"><u>I</u>mportance</a></label>: </th> <td> [% INCLUDE bug/field.html.tmpl bug = bug, field = bug_fields.priority, no_tds = 1, value = bug.priority - editable = bug.check_can_change_field('priority', 0, 1) %] + editable = can_edit_priority %] [%+ INCLUDE bug/field.html.tmpl bug = bug, field = bug_fields.bug_severity, no_tds = 1, value = bug.bug_severity @@ -344,15 +357,22 @@ [% IF Param("usetargetmilestone") && bug.target_milestone %] <tr> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.target_milestone + editable = bug.check_can_change_field('target_milestone', 0, 1) + %] + [% PROCESS select selname = "target_milestone" %] + </tr> + [% END %] + + [% IF Param("timetrackinggroup") && bug.deadline %] + <tr> <th class="field_label"> - <label for="target_milestone"> - <a href="page.cgi?id=fields.html#target_milestone"> - Target Milestone</a></label>: + <a href="page.cgi?id=fields.html#deadline">Deadline</a>: </th> - [% PROCESS select selname = "target_milestone" %] + <td>[% bug.deadline FILTER html %]</td> </tr> [% END %] - [% END %] [%############################################################################%] @@ -362,11 +382,13 @@ [% BLOCK section_people %] <tr> - <th class="field_label"> - <a href="page.cgi?id=fields.html#assigned_to">Assigned To</a>: - </th> + [% can_edit_assigned_to = bug.check_can_change_field("assigned_to", 0, 1) %] + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.assigned_to + editable = can_edit_assigned_to + %] <td> - [% IF bug.check_can_change_field("assigned_to", 0, 1) %] + [% IF can_edit_assigned_to %] <div id="bz_assignee_edit_container" class="bz_default_hidden"> <span> [% INCLUDE global/user.html.tmpl who = bug.assigned_to %] @@ -411,13 +433,14 @@ [% IF Param('useqacontact') %] <tr> + [% can_edit_qa_contact = bug.check_can_change_field("qa_contact", 0, 1) %] [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.qa_contact - editable = 1 + editable = can_edit_qa_contact accesskey = "q" %] <td> - [% IF bug.check_can_change_field("qa_contact", 0, 1) %] + [% IF can_edit_qa_contact %] <div id="bz_qa_contact_edit_container" class="bz_default_hidden"> <span> [% INCLUDE global/user.html.tmpl who = bug.qa_contact %] @@ -473,17 +496,18 @@ [%############################################################################%] [% BLOCK section_url_keyword_whiteboard %] <tr> + [% can_edit_bug_file_loc = bug.check_can_change_field("bug_file_loc", 0, 1) %] [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.bug_file_loc - editable = 1 + editable = can_edit_bug_file_loc accesskey = "u" %] <td> - [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %] + [% IF can_edit_bug_file_loc %] <span id="bz_url_edit_container" class="bz_default_hidden"> [% IF is_safe_url(bug.bug_file_loc) %] <a href="[% bug.bug_file_loc FILTER html %]" target="_blank" - title="[% bug.bug_file_loc FILTER html %]"> + rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]"> [% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a> [% ELSE %] [% bug.bug_file_loc FILTER html %] @@ -491,10 +515,11 @@ (<a href="#" id="bz_url_edit_action">edit</a>)</span> [% END %] <span id="bz_url_input_area"> - [% url_output = PROCESS input no_td=1 inputname => "bug_file_loc" size => "40" colspan => 2 %] + [% url_output = INCLUDE input no_td = 1 inputname = "bug_file_loc" size = 40 %] [% 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> + <a href="[% bug.bug_file_loc FILTER html %]" + rel="noreferrer">[% url_output FILTER none %]</a> [% ELSE %] [% url_output FILTER none %] [% END %] @@ -510,31 +535,25 @@ [% END %] </td> </tr> - + [% IF Param('usestatuswhiteboard') %] <tr> [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.status_whiteboard - editable = 1 + editable = bug.check_can_change_field("status_whiteboard", 0, 1) accesskey = "w" %] - [% PROCESS input inputname => "status_whiteboard" size => "40" colspan => 2 %] + [% INCLUDE input inputname = "status_whiteboard" size = 40 %] </tr> [% END %] - + [% IF use_keywords %] <tr> - <th class="field_label"> - <label for="keywords" accesskey="k"> - <a href="describekeywords.cgi"><u>K</u>eywords</a></label>: - </th> - <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, possible_values = all_keywords + bug = bug, field = bug_fields.keywords, value = bug.keywords + editable = bug.check_can_change_field("keywords", 0, 1), + desc_url = "describekeywords.cgi", possible_values = all_keywords %] - </td> </tr> [% END %] @@ -556,12 +575,12 @@ [% RETURN UNLESS bug.duplicates.size %] <tr> <th class="field_label"> - <label for="duplicates">Duplicates</label>: + <label>Duplicates ([% bug.duplicates.size %])</label>: </th> - <td class="field_value" colspan="2"> + <td class="field_value"> <span id="duplicates"> [% FOREACH dupe = bug.duplicates %] - [% dupe.id FILTER bug_link(dupe, use_alias => 1) FILTER none %][% " " %] + [% INCLUDE bug/link.html.tmpl bug = dupe, link_text = dupe.id, use_alias = 1 %][% " " %] [% END %] </span> (<a href="buglist.cgi?bug_id=[% bug.duplicate_ids.join(",") FILTER html %]"> @@ -584,18 +603,20 @@ [% INCLUDE dependencies field = bug_fields.blocked deps = bug.blocks_obj %] </tr> - - <tr> - <th> </th> - - <td colspan="2" align="left" id="show_dependency_tree_or_graph"> - Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&hide_resolved=1">tree</a> - - [% IF Param('webdotbase') %] - / <a href="showdependencygraph.cgi?id=[% bug.bug_id %]">graph</a> - [% END %] - </td> - </tr> + + [% IF bug.dependson.size || bug.blocked.size %] + <tr> + <th> </th> + + <td id="show_dependency_tree_or_graph"> + Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&hide_resolved=1">tree</a> + + [% IF Param('webdotbase') %] + / <a href="showdependencygraph.cgi?id=[% bug.bug_id %]">graph</a> + [% END %] + </td> + </tr> + [% END %] [% END %] @@ -620,8 +641,9 @@ [% IF NOT emitted_description %] [% emitted_description = 1 %] <div id="bz_restrict_group_visibility_help"> - <b>Only users in all of the selected groups can view this - [%+ terms.bug %]:</b> + <b>Only users in + [%+ IF Param('or_groups') %]at least one[% ELSE %]all[% END %] + of the selected groups can view this [% terms.bug %]:</b> <p class="instructions"> Unchecking all boxes makes this a more public [% terms.bug %]. </p> @@ -705,7 +727,7 @@ Reported: </th> <td> - [% bug.creation_ts FILTER time %] by [% INCLUDE global/user.html.tmpl who = bug.reporter %] + [% bug.creation_ts FILTER time("%Y-%m-%d %H:%M %Z") %] by [% INCLUDE global/user.html.tmpl who = bug.reporter %] </td> </tr> @@ -714,7 +736,7 @@ Modified: </th> <td> - [% bug.delta_ts FILTER time FILTER replace(':\d\d$', '') FILTER replace(':\d\d ', ' ')%] + [% bug.delta_ts FILTER time("%Y-%m-%d %H:%M %Z") %] (<a href="show_activity.cgi?id=[% bug.bug_id %]">[%# terms.Bug %]History</a>) </td> @@ -727,7 +749,9 @@ [% BLOCK section_cclist %] <tr> <th class="field_label"> - <label for="newcc" accesskey="a">CC List:</label> + <label [% IF user.id %]for="newcc"[% END %] accesskey="a"> + CC List: + </label> </th> <td> [% IF user.id %] @@ -773,8 +797,7 @@ </div> [% END %] [% IF bug.cc.size %] - <select id="cc" multiple="multiple" size="5" - [% IF bug.user.canedit %]name="cc"[% END %]> + <select id="cc" multiple="multiple" size="5" [% 'name="cc"' IF bug.user.canedit %]> [% FOREACH c = bug.cc %] <option value="[% c FILTER email FILTER html %]"> [% c FILTER email FILTER html %]</option> @@ -811,6 +834,29 @@ [% END %] [%############################################################################%] +[%# Block for Bug Ignored #%] +[%############################################################################%] +[% BLOCK section_bug_ignored %] + [% IF user.id %] + <tr> + <th class="field_label"> + <label for="bug_ignored" title="Ignore all email for this [% terms.bug %]"> + Ignore [% terms.Bug %] Mail: + </label> + </th> + <td> + <input type="hidden" name="defined_bug_ignored" value="1"> + <span title="You will still receive emails for flag requests directed at you."> + <input type="checkbox" name="bug_ignored" id="bug_ignored" value="1" + [% ' checked="checked"' IF user.is_bug_ignored(bug.id) %]> + (never email me about this [% terms.bug %]) + </span> + </td> + </tr> + [% END %] +[% END %] + +[%############################################################################%] [%# Block for See Also #%] [%############################################################################%] [% BLOCK section_see_also %] @@ -825,6 +871,50 @@ [% END %] [% END %] +[% BLOCK section_aliases %] + <tr> + [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.alias %] + <td> + [% IF bug.alias.size %] + [% bug.alias.join(', ') FILTER html %] + [% ELSE %] + None + [% END %] + [% IF bug.check_can_change_field('alias', 0, 1) %] + <span id="alias_edit_area_showhide_container" class="bz_default_hidden"> + (<a href="#" id="alias_edit_area_showhide">edit</a>) + </span> + <br> + <div id="alias_edit_area"> + <div> + <label for="newalias" class="field_label">Add</label> + <br> + <input name="newalias" id="newalias" size="20"> + </div> + [% IF bug.alias.size %] + <select id="alias" name="alias" multiple="multiple" size="5"> + [% FOREACH a = bug.alias %] + <option value="[% a FILTER html %]">[% a FILTER html %]</option> + [% END %] + </select> + <br> + + <input type="checkbox" id="removealias" name="removealias"> + <label for="removealias">Remove selected aliases</label> + [% END %] + </div> + <script type="text/javascript"> + hideEditableField( 'alias_edit_area_showhide_container', + 'alias_edit_area', + 'alias_edit_area_showhide', + '', + ''); + </script> + [% END %] + </td> + </tr> +[% END %] + [%############################################################################%] [%# Block for FLAGS #%] [%############################################################################%] @@ -892,9 +982,10 @@ [% USE Bugzilla %] [% FOREACH field = Bugzilla.active_custom_fields %] <tr> + [%# Use PROCESS instead of INCLUDE, because extra_field_item is defined + # in the template and must be returned back. INCLUDE cannot do that. %] [% PROCESS bug/field.html.tmpl value = bug.${field.name} - editable = bug.check_can_change_field(field.name, 0, 1) - value_span = 2 %] + editable = bug.check_can_change_field(field.name, 0, 1) %] </tr> [% IF extra_field_item %] <tr> @@ -934,10 +1025,9 @@ value="[% bug.${field.name}.join(', ') FILTER html %]"> [% END %] </span> - + [% FOREACH dep_bug = deps %] - [% dep_bug.id FILTER bug_link(dep_bug, use_alias => 1) - FILTER none %][% " " %] + [% INCLUDE bug/link.html.tmpl bug = dep_bug, link_text = dep_bug.id, use_alias = 1 %][% " " %] [% END %] [% IF bug.check_can_change_field(field.name, 0, 1) %] <span id="[% field.name FILTER html %]_edit_container" @@ -976,7 +1066,7 @@ field = bug_fields.remaining_time, editable = 1 %] [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.percentage_complete, editable = 1 + field = bug_fields.percentage_complete %] <th> Gain: @@ -1054,9 +1144,7 @@ <!-- This table keeps the submit button aligned with the box. --> <table><tr><td> [% IF bug.check_can_change_field('longdesc', 0, 1) %] - [% INCLUDE global/textarea.html.tmpl - name = 'comment' - id = 'comment' + [% INCLUDE bug/comment.html.tmpl minrows = 10 maxrows = 25 cols = constants.COMMENT_COLS @@ -1073,8 +1161,9 @@ <br> [% PROCESS commit_button id=""%] - <table id="bug_status_bottom" - class="status" cellspacing="0" cellpadding="0"> + [% Hook.process("after_comment_commit_button", 'bug/edit.html.tmpl') %] + + <table id="bug_status_bottom" class="status"> <tr> <th class="field_label"> <a href="page.cgi?id=fields.html#bug_status">Status</a>: @@ -1116,7 +1205,6 @@ <input type="hidden" id="[% selname %]_dirty"> <select id="[% selname %]" name="[% selname %]"> [% FOREACH x = bug.choices.${selname} %] - [% NEXT IF NOT x.is_active AND x.name != bug.${selname} %] <option value="[% x.name FILTER html %]" [% " selected" IF x.name == bug.${selname} %]> [%- x.name FILTER html %] diff --git a/template/en/default/bug/field-help.none.tmpl b/template/en/default/bug/field-help.none.tmpl index c07ee5792..2b6096547 100644 --- a/template/en/default/bug/field-help.none.tmpl +++ b/template/en/default/bug/field-help.none.tmpl @@ -23,7 +23,7 @@ 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}.", + looking it up and referring to it in other places in Bugzilla.", assigned_to => "The person in charge of resolving the ${terms.bug}.", @@ -38,7 +38,7 @@ bug_file_loc => bug_id => "The numeric id of $terms.abug, unique within this entire installation" - _ " of ${terms.Bugzilla}.", + _ " of Bugzilla.", bug_severity => "How severe the $terms.bug is, or whether it's an enhancement.", @@ -85,7 +85,7 @@ keywords => _ " to easily identify and group them.", longdesc => - "$terms.Bugs have comments added to them by $terms.Bugzilla users." + "$terms.Bugs have comments added to them by Bugzilla users." _ " You can search for some text in those comments.", op_sys => @@ -126,7 +126,7 @@ 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. + enter multiple URLs at once by separating them with whitespace. <p>You should normally use this field to refer to $terms.bugs in <em>other</em> installations. For $terms.bugs in this @@ -227,7 +227,7 @@ email1 => [%- END %] [% vars.help_html.${help_field} = "A custom $field_type_desc field in this installation" - _ " of ${terms.Bugzilla}." %] + _ " of Bugzilla." %] [% END %] [% END %] diff --git a/template/en/default/bug/field-label.html.tmpl b/template/en/default/bug/field-label.html.tmpl index 95ac28acb..94e2728fc 100644 --- a/template/en/default/bug/field-label.html.tmpl +++ b/template/en/default/bug/field-label.html.tmpl @@ -8,6 +8,7 @@ [%# INTERFACE: # field: a Bugzilla::Field object + # editable: if true, a label pointing to the editable field will be added. # 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>. diff --git a/template/en/default/bug/field.html.tmpl b/template/en/default/bug/field.html.tmpl index e05bcede8..f1ddf633f 100644 --- a/template/en/default/bug/field.html.tmpl +++ b/template/en/default/bug/field.html.tmpl @@ -9,6 +9,7 @@ [%# INTERFACE: # field: a Bugzilla::Field object # value: The value of the field for this bug. + # field_hidden (optional): boolean; if true, the field is hidden by default. # override_legal_values (optional): The list of legal values, for select fields. # editable: Whether the field should be displayed as an editable # <input> or as just the plain text of its value. @@ -35,17 +36,20 @@ [% Hook.process('start_field_column') %] [% IF editable %] [% SWITCH field.type %] - [% CASE constants.FIELD_TYPE_FREETEXT %] + [% CASE [ constants.FIELD_TYPE_FREETEXT + constants.FIELD_TYPE_INTEGER ] %] <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 %]" - [% ' aria-required="true"' IF field.is_mandatory %]> - [% CASE constants.FIELD_TYPE_DATETIME %] - <input name="[% field.name FILTER html %]" size="20" + [% IF field.type == constants.FIELD_TYPE_INTEGER %] pattern="\d+[% IF dontchange %]|[% dontchange FILTER html %][% END %]" [% END %] + [% ' aria-required="true" required' IF field.is_mandatory %]> + [% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %] + [% size = (field.type == constants.FIELD_TYPE_DATE) ? 10 : 20 %] + <input name="[% field.name FILTER html %]" size="[% size FILTER none %]" id="[% field.name FILTER html %]" value="[% value FILTER html %]" - [% ' aria-required="true"' IF field.is_mandatory %] + [% ' aria-required="true" required' IF field.is_mandatory %] onchange="updateCalendarFromField(this)"> <button type="button" class="calendar_button" id="button_calendar_[% field.name FILTER html %]" @@ -63,7 +67,7 @@ <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" - [% ' aria-required="true"' IF field.is_mandatory %]> + [% ' aria-required="true" required' IF field.is_mandatory %]> </span> @@ -91,7 +95,7 @@ [% SET field_size = field.legal_values.size %] [% END %] size="[% field_size FILTER html %]" multiple="multiple" - [% ' aria-required="true"' IF field.is_mandatory %] + [% ' aria-required="true" required' IF field.is_mandatory %] [% END %] > [% IF allow_dont_change %] @@ -141,36 +145,56 @@ </script> [% CASE constants.FIELD_TYPE_TEXTAREA %] - [% INCLUDE global/textarea.html.tmpl - id = field.name name = field.name minrows = 4 maxrows = 8 - cols = 60 defaultcontent = value mandatory = field.is_mandatory %] + <div id="[% field.name FILTER html %]_edit_container" class="bz_default_hidden"> + <div> + (<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>) + </div> + [% IF value %] + <pre class="field_textarea_readonly">[% value FILTER html %]</pre> + [% END %] + </div> + <div id="[% field.name FILTER html %]_input"> + [% INCLUDE global/textarea.html.tmpl + id = field.name name = field.name minrows = 4 maxrows = 8 + cols = 60 defaultcontent = value mandatory = field.is_mandatory %] + </div> + <script type="text/javascript"> + hideEditableField('[% field.name FILTER js %]_edit_container', + '[% field.name FILTER js %]_input', + '[% field.name FILTER js %]_edit_action', + '[% field.name FILTER js %]', + '[% value FILTER js %]', + '', + true); + </script> [% CASE constants.FIELD_TYPE_BUG_URLS %] - [% '<ul class="bug_urls">' IF value.size %] - [% FOREACH bug_url = value %] - <li> - [% PROCESS bug_url_link bug_url = bug_url %] - <label><input type="checkbox" value="[% bug_url.name FILTER html %]" - name="remove_[% field.name FILTER html %]"> - Remove</label> - </li> + [% IF bug.id && value.size %] + <ul class="bug_urls"> + [% FOREACH bug_url = value %] + <li> + [% PROCESS bug_url_link bug_url = bug_url %] + <label><input type="checkbox" value="[% bug_url.name FILTER html %]" + name="remove_[% field.name FILTER html %]"> + Remove</label> + </li> + [% END %] + </ul> [% END %] - [% '</ul>' IF value.size %] - [% IF Param('use_see_also') %] <span id="container_showhide_[% field.name FILTER html %]" class="bz_default_hidden"> (<a href="#" id="showhide_[% field.name FILTER html %]">add</a>) </span> <div id="container_[% field.name FILTER html %]"> - <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 %]"> + class="text_input" name="[% field.name FILTER html %]" + [% IF !bug.id %]value="[% value FILTER html %]"[% END %]> </div> - <script type="text/javascript"> + [% IF bug.id %] + <script type="text/javascript"> setupEditLink('[% field.name FILTER js %]'); - </script> + </script> + [% END %] [% END %] [% CASE constants.FIELD_TYPE_KEYWORDS %] <div id="[% field.name FILTER html %]_container"> @@ -179,7 +203,7 @@ value="[% value FILTER html %]"> <div id="[% field.name FILTER html %]_autocomplete"></div> </div> - <script type="text/javascript" defer="defer"> + <script type="text/javascript"> if (typeof YAHOO.bugzilla.field_array === "undefined") YAHOO.bugzilla.field_array = []; YAHOO.bugzilla.field_array["[% field.name FILTER js %]"] = [ @@ -216,6 +240,12 @@ [% value.join(', ') FILTER html %] [% END %] [% END %] + +[% IF bug && field.name == 'component' %] + (<a href="buglist.cgi?component=[% bug.component FILTER uri %]&product=[% bug.product FILTER uri %]&bug_status=__open__" + target="_blank">show other [% terms.bugs %]</a>) +[% END %] + [% Hook.process('end_field_column') %] [% '</td>' IF NOT no_tds %] diff --git a/template/en/default/bug/link.html.tmpl b/template/en/default/bug/link.html.tmpl index 40031e16f..f1e8d041a 100644 --- a/template/en/default/bug/link.html.tmpl +++ b/template/en/default/bug/link.html.tmpl @@ -8,6 +8,8 @@ [%# INTERFACE: # bug: a Bugzilla::Bug object + # user: the Bugzilla::User object to which this template is addressed. + # If not set, the currently logged in user object is used. # link_text: the text that we're highlighting. # use_alias: boolean; If true, we display the bug's alias as the link # text instead of link_text. @@ -32,8 +34,8 @@ [% IF user.can_see_bug(bug) %] [% link_title = link_title _ ' - ' _ bug.short_desc %] - [% IF use_alias && bug.alias %] - [% link_text = bug.alias %] + [% IF use_alias && bug.alias.size %] + [% link_text = bug.alias.join(', ') %] [% END %] [% END %] diff --git a/template/en/default/bug/navigate.html.tmpl b/template/en/default/bug/navigate.html.tmpl index 22d8c4799..b5e3ba7a2 100644 --- a/template/en/default/bug/navigate.html.tmpl +++ b/template/en/default/bug/navigate.html.tmpl @@ -21,24 +21,32 @@ [% Hook.process("links") %] <li> - <a href="#">Top of page </a></li> </ul> -[% END %] - +[% END %] -<div class="navigation"> [% SET my_search = user.recent_search_for(bug) %] [% IF my_search %] + <div class="navigation"> [% SET last_bug_list = my_search.bug_list %] [% SET this_bug_idx = lsearch(last_bug_list, bug.id) %] <b>[% terms.Bug %] List:</b> ([% this_bug_idx + 1 %] of [% last_bug_list.size %]) - <a href="show_bug.cgi?id= - [%- last_bug_list.first FILTER uri %]&list_id= - [%- my_search.id FILTER uri %]">First</a> - <a href="show_bug.cgi?id= - [%- last_bug_list.last FILTER uri %]&list_id= - [%- my_search.id FILTER uri %]">Last</a> + [% IF this_bug_idx > 0 %] + <a href="show_bug.cgi?id= + [%- last_bug_list.first FILTER uri %]&list_id= + [%- my_search.id FILTER uri %]">First</a> + [% ELSE %] + <span class="navigation_link">First</span> + [% END %] + + [% IF this_bug_idx + 1 < last_bug_list.size %] + <a href="show_bug.cgi?id= + [%- last_bug_list.last FILTER uri %]&list_id= + [%- my_search.id FILTER uri %]">Last</a> + [% ELSE %] + <span class="navigation_link">Last</span> + [% END %] [% IF this_bug_idx > 0 %] [% prev_bug = this_bug_idx - 1 %] @@ -46,7 +54,7 @@ [%- last_bug_list.$prev_bug FILTER uri %]&list_id= [%- my_search.id FILTER uri %]">Prev</a> [% ELSE %] - <i><font color="#777777">Prev</font></i> + <span class="navigation_link">Prev</span> [% END %] [% IF this_bug_idx + 1 < last_bug_list.size %] @@ -55,19 +63,10 @@ [%- last_bug_list.$next_bug FILTER uri %]&list_id= [%- my_search.id FILTER uri %]">Next</a> [% ELSE %] - <i><font color="#777777">Next</font></i> + <span class="navigation_link">Next</span> [% END %] <a href="buglist.cgi?regetlastlist= [%- my_search.id FILTER uri %]">Show last search results</a> -[% ELSE %] - [%# With no list, don't show link to search results %] - <i><font color="#777777">First</font></i> - <i><font color="#777777">Last</font></i> - <i><font color="#777777">Prev</font></i> - <i><font color="#777777">Next</font></i> - - <i><font color="#777777">This [% terms.bug %] is not in your last - search results.</font></i> + </div> [% END %] -</div> diff --git a/template/en/default/bug/process/bugmail.html.tmpl b/template/en/default/bug/process/bugmail.html.tmpl index b1c38da96..0d77e6f66 100644 --- a/template/en/default/bug/process/bugmail.html.tmpl +++ b/template/en/default/bug/process/bugmail.html.tmpl @@ -12,27 +12,11 @@ #%] <dl> -[% PROCESS emails - description = "Email sent to" - names = sent_bugmail.sent -%] - -[% PROCESS emails - description = "Excluding" - names = sent_bugmail.excluded -%] -</dl> - -[%############################################################################%] -[%# Block for a set of email addresses #%] -[%############################################################################%] - -[% BLOCK emails %] - <dt>[% description FILTER html %]:</dt> + <dt>Email sent to:</dt> <dd> [% IF user.can_see_bug(mailing_bugid) %] - [% IF names.size > 0 %] - [%+ FOREACH name = names %] + [% IF sent_bugmail.sent.size %] + [% FOREACH name = sent_bugmail.sent %] <code>[% name FILTER html %]</code>[% ", " UNLESS loop.last() %] [% END %] [% ELSE %] @@ -42,4 +26,4 @@ (list of e-mails not available) [% END %] </dd> -[% END %] +</dl> diff --git a/template/en/default/bug/process/confirm-duplicate.html.tmpl b/template/en/default/bug/process/confirm-duplicate.html.tmpl index da1580ed1..c6161d824 100644 --- a/template/en/default/bug/process/confirm-duplicate.html.tmpl +++ b/template/en/default/bug/process/confirm-duplicate.html.tmpl @@ -33,7 +33,7 @@ [% ELSE %] might, in the future, [% END %] - allow him/her access to view this [% terms.bug %].</b> + allow them access to view this [% terms.bug %].</b> Do you wish to do this? </p> diff --git a/template/en/default/bug/process/header.html.tmpl b/template/en/default/bug/process/header.html.tmpl index f7f61a737..55de0c324 100644 --- a/template/en/default/bug/process/header.html.tmpl +++ b/template/en/default/bug/process/header.html.tmpl @@ -17,7 +17,7 @@ [% IF title_tag == "bug_processed" %] [% title = BLOCK %] [% IF Bugzilla.cgi.param('id') %] - [% terms.Bug %] [%+ id FILTER html %] + [%+ id FILTER html %] [% ELSE %] [% terms.Bugs %] [% END %] diff --git a/template/en/default/bug/process/midair.html.tmpl b/template/en/default/bug/process/midair.html.tmpl index 684b99639..17025fee7 100644 --- a/template/en/default/bug/process/midair.html.tmpl +++ b/template/en/default/bug/process/midair.html.tmpl @@ -11,10 +11,6 @@ # used by bug/activity/table.html.tmpl to display recent changes that will # be overwritten if the user submits these changes. See that template # for further documentation. - # start_at: number; the comment at which show/comments.tmpl should begin - # displaying comments, either the index of the last comment (if the user - # entered a comment along with their change) or a number less than that - # (if they didn't), in which case no comments are displayed. # comments: array; all the comments on the bug. # bug: Bugzilla::Bug; the bug being changed. #%] @@ -40,7 +36,7 @@ [% PROCESS "bug/activity/table.html.tmpl" incomplete_data=0 %] </p> -[% IF comments.size > start_at %] +[% IF comments.size %] <p> Added the comment(s): <blockquote> @@ -71,7 +67,7 @@ You have the following choices: exclude="^Bugzilla_login|Bugzilla_password|delta_ts$" %] <input type="submit" id="process" value="Submit my changes anyway"> This will cause all of the above changes to be overwritten - [% ", except for the added comment(s)" IF comments.size > start_at %]. + [% ", except for the added comment(s)" IF comments.size %]. </form> </li> [% IF cgi.param("comment") %] @@ -82,7 +78,6 @@ You have the following choices: <input type="hidden" name="comment" value="[% cgi.param("comment") 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 cdebfed5e..c5c451907 100644 --- a/template/en/default/bug/process/results.html.tmpl +++ b/template/en/default/bug/process/results.html.tmpl @@ -20,23 +20,22 @@ [% DEFAULT type="bug" %] -[% Link = BLOCK %][% "$terms.Bug $id" FILTER bug_link(id) %][% END %] -[% link = BLOCK %][% "$terms.bug $id" FILTER bug_link(id) %][% END %] +[% link = BLOCK %][% terms.bug %] [%+ id FILTER bug_link(id) FILTER none %][% END %] [% title = { 'bug' => "Changes submitted for $link" , 'dupe' => "Duplicate notation added to $link" , 'dep' => "Checking for dependency changes on $link" , - 'created' => "$Link has been added to the database" , - 'move' => "$Link has been moved to another database" , + 'created' => "$link has been successfully created" , + 'move' => "$link has been moved to another database" , } %] [% Hook.process('title') %] <dl> - <dt>[% title.$type %]</dt> + <dt>[% title.$type.ucfirst %]</dt> <dd> [% PROCESS "bug/process/bugmail.html.tmpl" mailing_bugid = id %] [%# Links to more information about the changed bug. %] 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 a1a9539f2..c562bf54d 100644 --- a/template/en/default/bug/process/verify-new-product.html.tmpl +++ b/template/en/default/bug/process/verify-new-product.html.tmpl @@ -18,7 +18,9 @@ #%] [% PROCESS global/header.html.tmpl - title = 'Verify New Product Details...' %] + title = 'Verify New Product Details...' + style_urls = ['skins/standard/buglist.css'] +%] <form action="process_bug.cgi" method="post"> @@ -150,23 +152,23 @@ } </script> - <table border="1"> + <table id="groups_edit_multiple"> <tr> - <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> + <th class="narrow_column">Remove [% terms.bugs %] from this group</th> + <th class="narrow_column">Add [% terms.bugs %] to this group</th> + <th>Group Name</th> </tr> [% FOREACH group = optional_groups %] <tr> - <td align="center"> + <td class="center"> <input type="checkbox" name="defined_groups" id="defined_group_[% group.group.id FILTER html %]" value="[% group.group.name FILTER html %]" [% IF cgi.param("defined_groups").contains(group.group.name) %] checked="checked"[% END %] onchange="turn_off(this, 'group_[% group.group.id FILTER html %]')"> </td> - <td align="center"> + <td class="center"> <input type="checkbox" name="groups" id="group_[% group.group.id FILTER html %]" value="[% group.group.name FILTER html %]" diff --git a/template/en/default/bug/show-header.html.tmpl b/template/en/default/bug/show-header.html.tmpl index a1eebe017..583708492 100644 --- a/template/en/default/bug/show-header.html.tmpl +++ b/template/en/default/bug/show-header.html.tmpl @@ -13,21 +13,36 @@ # be overridden by the calling templates. #%] +[% filtered_alias = bug.alias.join(', ') FILTER html %] [% filtered_desc = bug.short_desc FILTER html %] -[% subheader = filtered_desc %] [% filtered_timestamp = bug.delta_ts FILTER time %] -[% title = "$terms.Bug $bug.bug_id – $filtered_desc" %] + +[% subheader = filtered_desc %] +[% title = "$bug.bug_id – " %] +[% IF bug.alias.size %] + [% title = title _ "($filtered_alias) " %] +[% END %] +[% title = title _ filtered_desc %] +[% generate_api_token = 1 %] [% yui = ['autocomplete', 'calendar'] %] +[% yui.push('container') IF user.can_tag_comments %] [% javascript_urls = [ "js/util.js", "js/field.js" ] %] +[% javascript_urls.push("js/bug.js") IF user.id %] +[% javascript_urls.push('js/comment-tagging.js') + IF user.id && Param('comment_taggers_group') %] [% IF bug.defined %] [% header = "$terms.Bug $bug.bug_id" %] [% header_addl_info = "Last modified: $filtered_timestamp" %] - [% unfiltered_title = "$terms.Bug $bug.bug_id – $bug.short_desc" %] + [% unfiltered_title = "$bug.bug_id – " %] + [% IF bug.alias.size %] + [% unfiltered_title = unfiltered_title _ "(" _ bug.alias.join(', ') _ ") " %] + [% END %] + [% unfiltered_title = unfiltered_title _ bug.short_desc %] [% javascript = BLOCK %] if (history && history.replaceState) { if(!document.location.href.match(/show_bug\.cgi/)) { - history.replaceState( null, - "[% unfiltered_title FILTER js %]", + history.replaceState( null, + "[% unfiltered_title FILTER js %]", "show_bug.cgi?id=[% bug.bug_id FILTER js %]" ); document.title = "[% unfiltered_title FILTER js %]"; } @@ -39,12 +54,16 @@ } YAHOO.util.Event.onDOMReady(function() { initDirtyFieldTracking(); + + [% IF user.id AND user.is_involved_in_bug(bug) %] + YAHOO.bugzilla.bugUserLastVisit.update([% bug.bug_id FILTER none %]); + [% END %] }); [% javascript FILTER none %] [% END %] [% END %] -[% style_urls = [ "skins/standard/show_bug.css" ] %] -[% doc_section = "bug_page.html" %] +[% style_urls = ['skins/standard/bug.css'] %] +[% doc_section = "using/understanding.html" %] [% bodyclasses = ['bz_bug', "bz_status_$bug.bug_status", "bz_product_$bug.product", diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl index fb11bf010..8babdf04a 100644 --- a/template/en/default/bug/show-multiple.html.tmpl +++ b/template/en/default/bug/show-multiple.html.tmpl @@ -9,10 +9,12 @@ [% PROCESS global/header.html.tmpl title = "Full Text $terms.Bug Listing" h1 = "" - style_urls = ["skins/standard/show_multiple.css", - "skins/standard/buglist.css"] - doc_section = "bug_page.html" + style_urls = ['skins/standard/buglist.css'] + doc_section = "using/understanding.html" %] + +[% USE Bugzilla %] + [% PROCESS bug/time.html.tmpl %] [% IF bugs.first %] [% ids = [] %] @@ -46,16 +48,17 @@ <h1> [% terms.Bug %] <a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">[% bug.bug_id FILTER html %]</a> - [% IF bug.alias AND NOT bug.error %] - (<a href="show_bug.cgi?id=[% bug.alias FILTER uri %]"> - [% bug.alias FILTER html %]</a>) + [% IF bug.alias.size AND NOT bug.error %] ( + [%- FOREACH alias IN bug.alias %]<a href="show_bug.cgi?id=[% alias FILTER uri %]"> + [% alias FILTER html %]</a>[% UNLESS loop.last %], [% END %] + [%- END %]) [% END %] </h1> <table class="bugfields"> [% IF bug.error %] <tr> - <td class="error"> + <td class="warning"> [% IF bug.error == "InvalidBugId" %] '[%+ bug.bug_id FILTER html %]' is not a valid [% terms.bug %] number nor a known [% terms.bug %] alias. @@ -145,7 +148,7 @@ <th>[% field_descs.bug_file_loc FILTER html %]:</th> <td colspan="3"> [% IF is_safe_url(bug.bug_file_loc) %] - <a href="[% bug.bug_file_loc FILTER html %]"> + <a href="[% bug.bug_file_loc FILTER html %]" rel="noreferrer"> [% bug.bug_file_loc FILTER html %]</a> [% ELSE %] [% bug.bug_file_loc FILTER html %] @@ -170,7 +173,6 @@ [% PROCESS row cell = "status_whiteboard" fullrow = 1 %] [% END %] - [% USE Bugzilla %] [% field_counter = 0 %] [% FOREACH field = Bugzilla.active_custom_fields %] [% field_counter = field_counter + 1 %] @@ -233,6 +235,8 @@ </table> </td> </tr> + [% END %] + [% IF Param("timetrackinggroup") && bug.deadline %] [% PROCESS row cell="deadline" %] [% END %] @@ -259,7 +263,7 @@ [% ELSE %] [% FOREACH flag = attachment.flags %] [% flag.setter.nick FILTER html %]: - [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %] + <span class="nowrap">[%+ flag.type.name FILTER html %][% flag.status %]</span> [% IF flag.status == "?" && flag.requestee %] ([% flag.requestee.nick FILTER html %]) [% END %][% ", " IF not loop.last() %] @@ -348,7 +352,7 @@ [% FOREACH type = bug.flag_types %] [% FOREACH flag = type.flags %] [% flag.setter.nick FILTER html %]: - [%+ flag.type.name FILTER html FILTER no_break %][% flag.status %] + <span class="nowrap">[%+ flag.type.name FILTER html %][% flag.status %]</span> [%+ IF flag.status == "?" && flag.requestee %] ([% flag.requestee.nick FILTER html %]) [% END %]<br> diff --git a/template/en/default/bug/summarize-time.html.tmpl b/template/en/default/bug/summarize-time.html.tmpl index 932a6e3f4..8bfe3c1c6 100644 --- a/template/en/default/bug/summarize-time.html.tmpl +++ b/template/en/default/bug/summarize-time.html.tmpl @@ -18,10 +18,10 @@ [% END %] [% PROCESS global/header.html.tmpl - title = title - header = header - style_urls = ["skins/standard/summarize-time.css"] - doc_section = "timetracking.html" + title = title + header = header + style_urls = ['skins/standard/buglist.css'] + doc_section = "using/editing.html#time-tracking" yui = ['calendar'] javascript_urls = [ "js/util.js", "js/field.js" ] %] @@ -35,15 +35,13 @@ [% FOREACH workdata = part_list %] [%# parts contains date ranges (from, to). %] [% part = parts.shift %] - <div align="right"> - <h4 style="padding-right: 2em; margin: 0;"> - [% IF part.0 or part.1 %] - [% part.0 OR "Up" FILTER html %] to [% part.1 OR "now" FILTER html %] - [% ELSE %] - Full summary (no period specified) - [% END %] - </h4> - </div> + <h4> + [% IF part.0 or part.1 %] + [% part.0 OR "Up" FILTER html %] to [% part.1 OR "now" FILTER html %] + [% ELSE %] + Full summary (no period specified) + [% END %] + </h4> [% IF group_by == "number" %] [% INCLUDE number_report %] [% ELSE %] @@ -52,7 +50,7 @@ [% END %] [% IF detailed %] - <h4 style="margin: 0"> + <h4> Total of [% global.remaining FILTER format("%.2f") %]h remains from original estimate of [% global.estimated FILTER format("%.2f") %]h [% IF global.deadline %] @@ -62,13 +60,13 @@ [% END %] [% IF monthly %] - <h4 style="margin: 0">Total of [% global.grand_total FILTER format("%.2f") %] hours worked</h4> - <hr noshade size="1"> + <h4>Total of [% global.grand_total FILTER format("%.2f") %] hours worked</h4> + <hr> [% END %] [% IF null.size > 0 %] [% INCLUDE inactive_report %] - <h4 style="margin: 0">Total of [% null.size %] inactive [% terms.bugs %]</h4> + <h4>Total of [% null.size %] inactive [% terms.bugs %]</h4> [% END %] [% END %] @@ -83,7 +81,7 @@ [% BLOCK owner_report %] [% global.total = 0 global.bug_count = {} global.owner_count = {} %] - <table cellpadding="4" cellspacing="0" width="90%" class="realitems owner"> + <table class="realitems owner"> [% FOREACH owner = workdata.keys.sort %] [% INCLUDE do_one_owner owner=owner ownerdata=workdata.$owner detailed=detailed %] @@ -112,11 +110,10 @@ [% subtotal = subtotal + bugdata.total_time %] [% END %] <tr> - <td colspan="4" align="right"><b>Total</b>:</td> - <td align="right" class="subtotal" width="100"> - <b>[% subtotal FILTER format("%.2f") %]</b></td> - [% global.total = global.total + subtotal %] + <th colspan="4" class="right">Total:</th> + <td class="subtotal">[% subtotal FILTER format("%.2f") %]</td> </tr> + [% global.total = global.total + subtotal %] [% END %] [%# @@ -128,7 +125,7 @@ [% BLOCK number_report %] [% global.total = 0 global.owner_count = {} global.bug_count = {} %] - <table cellpadding="4" cellspacing="0" width="90%" class="realitems number"> + <table class="realitems number"> [% FOREACH bug = workdata.keys.nsort %] [% INCLUDE do_one_bug id=bug bugdata=workdata.$bug detailed=detailed %] @@ -156,51 +153,42 @@ <tr class="owner_header[% 2 FILTER none IF cid % 2 %]"> <td> </td> <td colspan="2"><b>[% login_name FILTER html %]</b></td> - <td align="right"> + <td class="right"> [% work_time FILTER format("%.2f") %]</td> </tr> [% END %] [% END %] <tr> - <td colspan="2"> </td> - <td align="right"> - <b>Total</b>: - </td> - <td align="right" class="subtotal" width="100"> - <b>[% subtotal FILTER format("%.2f") %]</b> - </td> + <th colspan="3" class="right">Total:</th> + <td class="subtotal">[% subtotal FILTER format("%.2f") %]</td> </tr> [% global.total = global.total + subtotal %] [% END %] [% BLOCK bug_header %] <tr class="bug_header[% '2' IF cid % 2 %]"> - <td width="80" valign="top"> - <b>[% "$terms.Bug $id" FILTER bug_link(id) FILTER none %]</b> - </td> - <td width="100"><b>[% display_value("bug_status", bugs.$id.bug_status) FILTER html %]</b></td> + <th class="bug_id">[% "$terms.Bug $id" FILTER bug_link(id) FILTER none %]</th> + <th class="bug_status"> + [% display_value("bug_status", bugs.$id.bug_status) FILTER html %] + </th> <td colspan="2">[% bugs.$id.short_desc FILTER html %]</td> [% IF extra %] - <td align="right" valign="top">[% bugdata.total_time FILTER html %]</td> + <td class="right">[% bugdata.total_time FILTER html %]</td> [% END %] </tr> [% IF detailed %] <tr class="bug_header[% '2' IF cid % 2 %]"> <td> </td> <td colspan="3"> - <table width="100%" cellpadding="0" cellspacing="0"> - <tr> - <td width="33%"> - Estimated: [% bugs.$id.estimated_time FILTER format("%.2f") %]h - </td> - <td width="33%"> - Remaining: [% bugs.$id.remaining_time FILTER format("%.2f") %]h - </td> - <td width="33%"> - Deadline: [% bugs.$id.deadline || "<b>Not set</b>" %] - </td> - </tr> - </table> + <span class="time_info"> + Estimated: [% bugs.$id.estimated_time FILTER format("%.2f") %]h + </span> + <span class="time_info"> + Remaining: [% bugs.$id.remaining_time FILTER format("%.2f") %]h + </span> + <span class="time_info"> + Deadline: [% bugs.$id.deadline || "<b>Not set</b>" %] + </span> </td> [% IF extra %] <td> </td> @@ -222,7 +210,7 @@ [% BLOCK inactive_report %] <h3>Inactive [% terms.bugs %]</h3> - <table cellpadding="4" cellspacing="0" width="90%" class="zeroitems"> + <table class="zeroitems"> [% cid = 0 %] [% FOREACH bug_id = null.nsort %] [% INCLUDE bug_header id=bug_id cid=cid %] @@ -236,8 +224,8 @@ [% IF global.total > 0 %] <tr class="section_total"> <td><b>Totals</b></td> - <td colspan="[% colspan FILTER html %]" align="right"><b>[% additional FILTER html %]</b></td> - <td align="right"><b>[% global.total FILTER format("%.2f") %]</b></td> + <th colspan="[% colspan FILTER html %]" class="right">[% additional FILTER html %]</th> + <th class="right">[% global.total FILTER format("%.2f") %]</th> </tr> [% ELSE %] <tr> @@ -254,88 +242,88 @@ #%] [% BLOCK query_form %] -<hr noshade size=1> -<form method="post" name="summary" style="display: inline" action="summarize_time.cgi"> +<hr> +<form method="post" name="summary" action="summarize_time.cgi"> <input type="hidden" name="do_depends" value="[% do_depends FILTER html %]"> <input type="hidden" name="id" value="[% ids.join(",") FILTER html %]"> <input type="hidden" name="do_report" value="1"> [% IF warn_swap_dates %] - <h4 style="border: 1px solid red; margin: 1em; padding: 0.5em">The - end date specified occurs before the start date, which doesn't - make sense; the dates below have therefore been swapped.</h4> + <p class="warning_swapped_data"> + The end date specified occurs before the start date, which doesn't + make sense; the dates below have therefore been swapped. + </p> [% END %] <table> -<tr> -<td align="right"> - <b><label accesskey="s" - for="start_date">Period <u>s</u>tarting</label></b>: -</td><td colspan="3"> - <input type="text" id="start_date" name="start_date" size="11" - align="right" value="[% start_date FILTER html %]" maxlength="10" - 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" - 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> -<tr> -<td> </td><td colspan="4"> - <small>(Dates are optional, and in YYYY-MM-DD format)</small> -</td> -<tr><td align="right"> - <b>Group by</b>: -</td><td colspan="2"> - <input type="radio" name="group_by" id="number" value="number" [%+ - 'checked="checked"' IF group_by == "number" - %]><label - for="number" accesskey="n">[% terms.Bug %] <u>N</u>umber</label> - <input type="radio" name="group_by" id="owner" value="owner" [%+ - 'checked="checked"' IF group_by == "owner" - %]><label - for="owner" accesskey="d"><u>D</u>eveloper</label> -</td><td colspan="2"> - <label for="ctype"><b>Format</b></label>: <select name="ctype" id="ctype"> - <option value="html">HTML Report</option> - </select> -</td></tr><tr> -<td> </td><td colspan="4"> - <input type="checkbox" name="monthly" [% 'checked="checked"' IF - monthly %] id="monthly"> - <label for="monthly" accesskey="m">Split by <u>m</u>onth</label> - [%# XXX: allow splitting by other intervals %] - - <input type="checkbox" name="detailed" [% 'checked="checked"' IF - detailed %] id="detailed"> - <label for="detailed" accesskey="t">De<u>t</u>ailed summaries</label> - - <input type="checkbox" name="inactive" [% 'checked="checked"' IF - inactive %] id="inactive"> - <label for="inactive" accesskey="i">Also show <u>i</u>nactive - [%+ terms.bugs %]</label> -</td> -</tr></table> + <tr> + <th> + <label accesskey="s" for="start_date">Period <u>s</u>tarting</label>: + </th> + <td> + <input id="start_date" name="start_date" size="10" autofocus + 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> + <span class="label"> + and <label accesskey="e" for="end_date"><u>e</u>nding</label>: + </span> + <input type="text" name="end_date" size="10" id="end_date" + 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> + <br> + <span class="bz_info">(Dates are optional, and in YYYY-MM-DD format)</span> + </td> + <th><input type="submit" id="summarize" value="Summarize"></th> + </tr> + + <tr> + <th>Group by:</th> + <td> + <input type="radio" name="group_by" id="number" value="number" + [% 'checked="checked"' IF group_by == "number" %]> + <label for="number" accesskey="n">[% terms.Bug %] <u>N</u>umber</label> + <input type="radio" name="group_by" id="owner" value="owner" + [% 'checked="checked"' IF group_by == "owner" %]> + <label for="owner" accesskey="d"><u>D</u>eveloper</label> + </td> + <th> + <label for="ctype">Format</label>: + <select name="ctype" id="ctype"> + <option value="html">HTML Report</option> + </select> + </th> + </tr> + + <tr> + <th> </th> + <td colspan="2"> + <input type="checkbox" name="monthly" id="monthly" + [% 'checked="checked"' IF monthly %]> + <label for="monthly" accesskey="m">Split by <u>m</u>onth</label> + [%# XXX: allow splitting by other intervals %] + <input type="checkbox" name="detailed" id="detailed" + [% 'checked="checked"' IF detailed %]> + <label for="detailed" accesskey="t">De<u>t</u>ailed summaries</label> + <input type="checkbox" name="inactive" id="inactive" + [% 'checked="checked"' IF inactive %]> + <label for="inactive" accesskey="i">Also show <u>i</u>nactive + [%+ terms.bugs %]</label> + </td> + </tr> +</table> </form> <script type="text/javascript"> <!-- [%+ PROCESS "global/calendar.js.tmpl" id = 'start_date' %] [% PROCESS "global/calendar.js.tmpl" id = 'end_date' %] - document.forms['summary'].start_date.focus(); - //--></script> -<hr noshade size=1> + //--> +</script> +<hr> [% END %] diff --git a/template/en/default/bug/time.html.tmpl b/template/en/default/bug/time.html.tmpl index 370aad679..317c19cde 100644 --- a/template/en/default/bug/time.html.tmpl +++ b/template/en/default/bug/time.html.tmpl @@ -5,7 +5,7 @@ # This Source Code Form is "Incompatible With Secondary Licenses", as # defined by the Mozilla Public License, v. 2.0. #%] - + [% BLOCK formattimeunit %] [%# INTERFACE: # time_unit: the number converting, converts to 2 decimal places @@ -13,11 +13,7 @@ # 1 decimal place #%] [% time_unit = time_unit FILTER format('%.2f') %] - [% IF time_unit.match('0\Z') %] - [% time_unit FILTER format('%.1f') %] - [% ELSE %] - [% time_unit FILTER format('%.2f') %] - [% END %] + [% time_unit.replace('0\Z', '') %] [% END %] [% BLOCK calculatepercentage %] diff --git a/template/en/default/email/bugmail-header.txt.tmpl b/template/en/default/email/bugmail-header.txt.tmpl index c754f6a42..286c70bcd 100644 --- a/template/en/default/email/bugmail-header.txt.tmpl +++ b/template/en/default/email/bugmail-header.txt.tmpl @@ -16,21 +16,8 @@ To: [% to_user.email %] Subject: [[% terms.Bug %] [%+ bug.id %]] [% 'New: ' IF show_new %][%+ bug.short_desc %] Date: [% date %] X-Bugzilla-Reason: [% reasonsheader %] -X-Bugzilla-Type: [% isnew ? 'new' : 'changed' %] +X-Bugzilla-Type: [% bugmailtype %] X-Bugzilla-Watch-Reason: [% reasonswatchheader %] -[% IF Param('useclassification') %] -X-Bugzilla-Classification: [% bug.classification %] -[% END %] -X-Bugzilla-Product: [% bug.product %] -X-Bugzilla-Component: [% bug.component %] -X-Bugzilla-Version: [% bug.version %] -X-Bugzilla-Keywords: [% bug.keywords %] -X-Bugzilla-Severity: [% bug.bug_severity %] -X-Bugzilla-Who: [% changer.login %] -X-Bugzilla-Status: [% bug.bug_status %] -X-Bugzilla-Priority: [% bug.priority %] -X-Bugzilla-Assigned-To: [% bug.assigned_to.login %] -X-Bugzilla-Target-Milestone: [% bug.target_milestone %] -X-Bugzilla-Flags:[% FOREACH flag = bug.flags %] [%+ flag.name %][% flag.status %][% END %] +[%+ INCLUDE "email/header-common.txt.tmpl" %] X-Bugzilla-Changed-Fields: [% changedfields.join(" ") %] [%+ threadingmarker %] diff --git a/template/en/default/email/bugmail.html.tmpl b/template/en/default/email/bugmail.html.tmpl index b361b0889..fd348a656 100644 --- a/template/en/default/email/bugmail.html.tmpl +++ b/template/en/default/email/bugmail.html.tmpl @@ -11,7 +11,7 @@ [% isnew = bug.lastdiffed ? 0 : 1 %] <html> <head> - <base href="[% urlbase FILTER html %]" /> + <base href="[% urlbase FILTER html %]"> </head> <body> [% Hook.process('start') %] @@ -20,18 +20,36 @@ [% FOREACH comment = new_comments.reverse %] <div> [% IF comment.count %] - <b>[% "Comment # ${comment.count}" FILTER bug_link(bug, - {comment_num => comment.count, full_url => 1, user => to_user}) FILTER none %] - on [% "$terms.bug $bug.id" FILTER bug_link(bug, { full_url => 1, user => to_user }) FILTER none %] - from [% INCLUDE global/user.html.tmpl who = comment.author %]</b> + <b>[% INCLUDE bug/link.html.tmpl bug = bug, link_text = "Comment # ${comment.count}", + comment_num = comment.count, full_url = 1, user = to_user %] + on [% INCLUDE bug/link.html.tmpl bug = bug, link_text = "$terms.bug $bug.id", + full_url = 1, user = to_user %] + from [% INCLUDE global/user.html.tmpl user = to_user, who = comment.author %]</b> [% END %] <pre>[% comment.body_full({ wrap => 1 }) FILTER quoteUrls(bug, comment, to_user) %]</pre> </div> [% END %] </p> + + [% IF referenced_bugs.size %] + <div id="referenced"> + <hr style="border: 1px dashed #969696"> + <b>Referenced [% terms.Bugs %]:</b> + <ul> + [% FOREACH ref_bug = referenced_bugs %] + <li> + [[% "${terms.Bug} ${ref_bug.id}" FILTER bug_link(ref_bug, {full_url => 1, user => to_user}) FILTER none %]] + [% ref_bug.short_desc FILTER html %] + </li> + [% END %] + </ul> + </div> + <br> + [% END %] + <hr> <span>You are receiving this mail because:</span> - + <ul> [% FOREACH reason = reasons %] [% IF reason_descs.$reason %] @@ -58,14 +76,14 @@ [% SET in_table = 0 %] [% END %] [% IF change.blocker %] - [% "${terms.Bug} ${bug.id}" FILTER bug_link(bug, {full_url => 1, user => to_user}) FILTER none %] - depends on - [%+ "${terms.bug} ${change.blocker.id}" - FILTER bug_link(change.blocker, {full_url => 1, user => to_user}) FILTER none %], - which changed state. + [% INCLUDE bug/link.html.tmpl bug = bug, link_text = "$terms.Bug $bug.id", full_url = 1, user = to_user %] + depends on + [%+ INCLUDE bug/link.html.tmpl bug = change.blocker, link_text = "$terms.bug $change.blocker.id", + full_url = 1, user = to_user %], + which changed state. [% ELSE %] - [% INCLUDE global/user.html.tmpl who = change.who %] changed - [%+ "${terms.bug} ${bug.id}" FILTER bug_link(bug, {full_url => 1, user => to_user}) FILTER none %] + [% INCLUDE global/user.html.tmpl user = to_user, who = change.who %] changed + [%+ INCLUDE bug/link.html.tmpl bug = bug, link_text = "$terms.bug $bug.id", full_url = 1, user = to_user %] [% END %] <br> [% IF in_table == 0 %] @@ -89,7 +107,7 @@ <th>[% field_label FILTER html %]</th> <td> [% IF change.field_name == "bug_id" %] - [% new_value FILTER bug_link(bug, {full_url => 1, user => to_user}) FILTER none %] + [% INCLUDE bug/link.html.tmpl bug = bug, link_text = new_value, full_url = 1, user = to_user %] [% ELSE %] [% new_value FILTER html %] [% END %] diff --git a/template/en/default/email/bugmail.txt.tmpl b/template/en/default/email/bugmail.txt.tmpl index b3c652fcc..1f04db7b1 100644 --- a/template/en/default/email/bugmail.txt.tmpl +++ b/template/en/default/email/bugmail.txt.tmpl @@ -22,6 +22,15 @@ [%+ comment.body_full({ is_bugmail => 1, wrap => 1 }) FILTER strip_control_chars %] [% END %] +[% IF referenced_bugs.size %] + +Referenced [% terms.Bugs %]: + +[% FOREACH ref_bug = referenced_bugs %] +[%+ urlbase %]show_bug.cgi?id=[% ref_bug.id %] +[%+ "[" _ terms.Bug _ " " _ ref_bug.id _ "] " _ ref_bug.short_desc FILTER wrap_comment %] +[% END %] +[% END %] -- [%# Protect the trailing space of the signature marker %] You are receiving this mail because: [% SET reason_lines = [] %] diff --git a/template/en/default/email/flagmail.txt.tmpl b/template/en/default/email/flagmail.txt.tmpl index 037673dfc..cf64d9661 100644 --- a/template/en/default/email/flagmail.txt.tmpl +++ b/template/en/default/email/flagmail.txt.tmpl @@ -27,6 +27,9 @@ [% ELSE %] [% IF old_flag && old_flag.status == '?' %] [% to_identity = old_flag.setter.identity _ "'s request for" %] + [% IF old_flag.requestee.defined %] + [% requestee_identity = old_flag.requestee.identity _ "'s" %] + [% END %] [% END %] [% subject_status = statuses.$action %] [% END %] @@ -37,16 +40,17 @@ Subject: [% flagtype_name %] [%+ subject_status %]: [[% terms.Bug %] [%+ bug.bug [Attachment [% attachment.id %]] [% attachment.description FILTER clean_text %][% END %] Date: [% date %] X-Bugzilla-Type: request +[%+ INCLUDE "email/header-common.txt.tmpl" %] [%+ threadingmarker %] [%+ USE wrap -%] [%- FILTER bullet = wrap(80) -%] [% IF on_behalf_of %] -[% user.identity %] has reassigned [% flag.setter.identity %]'s request for [% flagtype_name %] +[% user.identity %] has reassigned [% flag.setter.identity %]'s request for [% IF requestee_identity %] [%+ requestee_identity %] [% END %] [% flagtype_name %] [% to_identity %]: [% ELSE %] -[% user.identity %] has [% statuses.$action %] [%+ to_identity %] [%+ flagtype_name %]: +[% user.identity %] has [% statuses.$action %] [%+ to_identity %] [% IF requestee_identity %] [%+ requestee_identity %] [% END %] [%+ flagtype_name %]: [% END %] [% terms.Bug %] [%+ bugidsummary %] diff --git a/template/en/default/email/header-common.txt.tmpl b/template/en/default/email/header-common.txt.tmpl new file mode 100644 index 000000000..02bd38e13 --- /dev/null +++ b/template/en/default/email/header-common.txt.tmpl @@ -0,0 +1,24 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] +[% IF Param('useclassification') %] +X-Bugzilla-Classification: [% bug.classification %] +[% END %] +X-Bugzilla-Product: [% bug.product %] +X-Bugzilla-Component: [% bug.component %] +X-Bugzilla-Version: [% bug.version %] +X-Bugzilla-Keywords: [% bug.keywords %] +X-Bugzilla-Severity: [% bug.bug_severity %] +X-Bugzilla-Who: [% changer.login %] +X-Bugzilla-Status: [% bug.bug_status %] +X-Bugzilla-Resolution: [% bug.resolution %] +X-Bugzilla-Priority: [% bug.priority %] +X-Bugzilla-Assigned-To: [% bug.assigned_to.login %] +[% IF Param('usetargetmilestone') %] +X-Bugzilla-Target-Milestone: [% bug.target_milestone %] +[% END %] +X-Bugzilla-Flags:[% FOREACH flag = bug.flags %] [%+ flag.name %][% flag.status %][% END %] diff --git a/template/en/default/email/new-api-key.txt.tmpl b/template/en/default/email/new-api-key.txt.tmpl new file mode 100644 index 000000000..cfccefdcc --- /dev/null +++ b/template/en/default/email/new-api-key.txt.tmpl @@ -0,0 +1,33 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # user: The Bugzilla::User object of the user being created + # new_key: The API key created + #%] + +From: [% Param('mailfrom') %] +To: [% user.email %] +Subject: [% terms.Bugzilla %]: New API key created +X-Bugzilla-Type: admin + +[This e-mail has been automatically generated] + +A new [% terms.Bugzilla %] API key[% IF new_key.description %], with the +description '[% new_key.description %]'[% END %] has been created. You can view +or update the key at the following URL: + +[%+ urlbase %]userprefs.cgi?tab=apikey + +IMPORTANT: If you did not request a new key, your [% terms.Bugzilla %] account +may have been compromised. In this case, please disable the key at the above +URL, and change your password immediately. + +For security reasons, we have not included your new key in this e-mail. + +If you have any issues regarding your account, please contact [% Param('maintainer') %]. diff --git a/template/en/default/email/new-user-details.txt.tmpl b/template/en/default/email/new-user-details.txt.tmpl new file mode 100644 index 000000000..b1b43caf2 --- /dev/null +++ b/template/en/default/email/new-user-details.txt.tmpl @@ -0,0 +1,31 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # new_user: The Bugzilla::User object of the user being created + #%] + +From: [% Param('mailfrom') %] +To: [% new_user.email %] +Subject: [% terms.Bugzilla %]: New account created +X-Bugzilla-Type: admin + +[This e-mail has been automatically generated] + +A new [% terms.Bugzilla %] user account has been created at [% urlbase %]: + +Login: [% new_user.login %] +[% IF new_user.realname %] +Real name: [% new_user.realname %] +[% END %] + +For security reasons, we have not included your new password in this e-mail. +If you have not being given it via other means, you can use the 'Forgot +Password' link to set a new password. + +If you have any issues regarding your account, please contact [% Param('maintainer') %]. diff --git a/template/en/default/extensions/config.pm.tmpl b/template/en/default/extensions/config.pm.tmpl index cb7195767..68ed260c1 100644 --- a/template/en/default/extensions/config.pm.tmpl +++ b/template/en/default/extensions/config.pm.tmpl @@ -12,8 +12,11 @@ [% PROCESS extensions/license.txt.tmpl %] -package B[% %]ugzilla::Extension::[% name %]; +package Bugzilla::Extension::[% name %]; + +use 5.10.1; use strict; +use warnings; use constant NAME => '[% name %]'; diff --git a/template/en/default/extensions/extension.pm.tmpl b/template/en/default/extensions/extension.pm.tmpl index 206ea88f4..823440421 100644 --- a/template/en/default/extensions/extension.pm.tmpl +++ b/template/en/default/extensions/extension.pm.tmpl @@ -12,16 +12,20 @@ [% PROCESS extensions/license.txt.tmpl %] -package B[% %]ugzilla::Extension::[% name %]; +package Bugzilla::Extension::[% name %]; + +use 5.10.1; use strict; -use base qw(B[% %]ugzilla::Extension); +use warnings; + +use parent qw(Bugzilla::Extension); # This code for this is in [% path %]/lib/Util.pm -use B[% %]ugzilla::Extension::[% name %]::Util; +use Bugzilla::Extension::[% name %]::Util; our $VERSION = '0.01'; -# See the documentation of B[% %]ugzilla::Hook ("perldoc B[% %]ugzilla::Hook" +# See the documentation of Bugzilla::Hook ("perldoc Bugzilla::Hook" # in the bugzilla directory) for a list of all available hooks. sub install_update_db { my ($self, $args) = @_; diff --git a/template/en/default/extensions/hook-readme.txt.tmpl b/template/en/default/extensions/hook-readme.txt.tmpl index 63e09e419..86ace3f51 100644 --- a/template/en/default/extensions/hook-readme.txt.tmpl +++ b/template/en/default/extensions/hook-readme.txt.tmpl @@ -7,7 +7,7 @@ #%] Template hooks go in this directory. Template hooks are called in normal -[%+ terms.Bugzilla %] templates like [[% '%' %] Hook.process('some-hook') %]. +Bugzilla templates like [[% '%' %] Hook.process('some-hook') %]. More information about them can be found in the documentation of -B[% %]ugzilla::Extension. (Do "perldoc B[% %]ugzilla::Extension" from the main -[%+ terms.Bugzilla %] directory to see that documentation.) +Bugzilla::Extension. (Do "perldoc Bugzilla::Extension" from the main +Bugzilla directory to see that documentation.) diff --git a/template/en/default/extensions/index-admin.rst.tmpl b/template/en/default/extensions/index-admin.rst.tmpl new file mode 100644 index 000000000..508937710 --- /dev/null +++ b/template/en/default/extensions/index-admin.rst.tmpl @@ -0,0 +1,23 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # name: string; the name of the extension. + #%] + +[% USE String('#') %] +[% name %] +[%+ String.repeat(name.length) %] + +This is a sample Adminstrator documentation file for the [% name %] extension. +Like all of the Bugzilla docs, it's written in +`reStructured Text (reST) format <http://sphinx-doc.org/latest/rest.html>`_ +and will be compiled by `Sphinx <http://sphinx-doc.org/>`_. + +If you build the docs yourself using :file:`makedocs.pl`, this file will get +incorporated into the Installed Extensions chapter of the Administration Guide. diff --git a/template/en/default/extensions/index-user.rst.tmpl b/template/en/default/extensions/index-user.rst.tmpl new file mode 100644 index 000000000..b09fc1cd1 --- /dev/null +++ b/template/en/default/extensions/index-user.rst.tmpl @@ -0,0 +1,23 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # name: string; the name of the extension. + #%] + +[% USE String('#') %] +[% name %] +[%+ String.repeat(name.length) %] + +This is a sample User documentation file for the [% name %] extension. +Like all of the Bugzilla docs, it's written in +`reStructured Text (reST) format <http://sphinx-doc.org/latest/rest.html>`_ +and will be compiled by `Sphinx <http://sphinx-doc.org/>`_. + +If you build the docs yourself using :file:`makedocs.pl`, this file will get +incorporated into the Installed Extensions chapter of the User Guide. diff --git a/template/en/default/extensions/name-readme.txt.tmpl b/template/en/default/extensions/name-readme.txt.tmpl index 22fbad4df..e792512b5 100644 --- a/template/en/default/extensions/name-readme.txt.tmpl +++ b/template/en/default/extensions/name-readme.txt.tmpl @@ -9,8 +9,8 @@ Normal templates go in this directory. You can load them in your code like this: -use B[% %]ugzilla::Error; -my $template = B[% %]ugzilla->template; +use Bugzilla::Error; +my $template = Bugzilla->template; $template->process('[% name FILTER lower %]/some-template.html.tmpl') or ThrowTemplateError($template->error()); @@ -18,7 +18,7 @@ That would be how to load a file called <kbd>some-template.html.tmpl</kbd> that was in this directory. Note that you have to be careful that the full path of your template -never conflicts with a template that exists in [% terms.Bugzilla %] or in +never conflicts with a template that exists in Bugzilla or in another extension, or your template might override that template. That's why we created this directory called '[% name FILTER lower %]' for you, so you can put your templates in here to help avoid conflicts. diff --git a/template/en/default/extensions/util.pm.tmpl b/template/en/default/extensions/util.pm.tmpl index 6c9fe3795..3baab57fd 100644 --- a/template/en/default/extensions/util.pm.tmpl +++ b/template/en/default/extensions/util.pm.tmpl @@ -12,15 +12,19 @@ [% PROCESS extensions/license.txt.tmpl %] -package B[% %]ugzilla::Extension::[% name %]::Util; +package Bugzilla::Extension::[% name %]::Util; + +use 5.10.1; use strict; -use base qw(Exporter); +use warnings; + +use parent qw(Exporter); our @EXPORT = qw( ); # This file can be loaded by your extension via -# "use B[% %]ugzilla::Extension::[% name %]::Util". You can put functions +# "use Bugzilla::Extension::[% name %]::Util". You can put functions # used by your extension in here. (Make sure you also list them in # @EXPORT.) diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl index e37fec1a7..6adbbcb95 100644 --- a/template/en/default/filterexceptions.pl +++ b/template/en/default/filterexceptions.pl @@ -78,9 +78,6 @@ 'classes.$row_idx.$col_idx', 'urlbase', 'data.$tbl.$col.$row', - 'row_total', - 'col_totals.$col', - 'grand_total', ], 'reports/report.html.tmpl' => [ @@ -192,10 +189,6 @@ 'script', ], -'global/site-navigation.html.tmpl' => [ - 'bug.bug_id', -], - 'bug/comments.html.tmpl' => [ 'comment.id', 'comment.count', @@ -261,16 +254,13 @@ 'bug/time.html.tmpl' => [ - 'time_unit FILTER format(\'%.1f\')', - 'time_unit FILTER format(\'%.2f\')', + "time_unit.replace('0\\Z', '')", '(act / (act + rem)) * 100 FILTER format("%d")', ], 'bug/process/results.html.tmpl' => [ - 'title.$type', - '"$terms.Bug $id" FILTER bug_link(id)', - '"$terms.bug $id" FILTER bug_link(id)', + 'title.$type.ucfirst', ], 'bug/create/create.html.tmpl' => [ @@ -278,9 +268,7 @@ ], 'bug/create/create-guided.html.tmpl' => [ - 'tablecolour', 'sel', - 'productstring', ], 'bug/activity/table.html.tmpl' => [ @@ -301,6 +289,7 @@ 'attachment.id', 'attachment.bug_id', 'editable_or_hide', + 'use_patchviewer', ], 'attachment/list.html.tmpl' => [ @@ -333,10 +322,8 @@ ], 'attachment/diff-file.html.tmpl' => [ - 'lxr_prefix', 'file.minus_lines', 'file.plus_lines', - 'bonsai_prefix', 'section.old_start', 'section_num', 'current_line_old', diff --git a/template/en/default/flag/list.html.tmpl b/template/en/default/flag/list.html.tmpl index 4d7eefb48..169cf8a51 100644 --- a/template/en/default/flag/list.html.tmpl +++ b/template/en/default/flag/list.html.tmpl @@ -6,7 +6,7 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[% IF user.id && !read_only_flags && (!bug || bug.check_can_change_field('flagtypes.name', 0, 1)) %] +[% IF user.id && (!bug || bug.check_can_change_field('flagtypes.name', 0, 1)) %] [%# We list flags by looping twice over the flag types relevant for the bug. # In the first loop, we display existing flags and then, for active types, @@ -23,13 +23,12 @@ <table id="[% flag_table_id FILTER html %]"> [% UNLESS flag_no_header %] <tr> - <th colspan="3"> - Flags: - </th> + <th colspan="3">Flags:</th> [% IF any_flags_requesteeble %] - <th> - Requestee: - </th> + <th>Requestee:</th> + [% END %] + [% IF edit_multiple_bugs %] + <th> </th> [% END %] </tr> [% END %] @@ -41,7 +40,9 @@ [% FOREACH flag = type.flags %] [% PROCESS flag_row flag = flag type = type %] [% END -%] + [% SET flag = "" %] + [% NEXT IF read_only_flags %] [%-# Step 1b: Display UI for setting flag. %] [% IF (!type.flags || type.flags.size == 0) && type.is_active %] @@ -49,16 +50,21 @@ [% END %] [% END %] - [%# Step 2: Display flag type again (if type is multiplicable). %] - [% FOREACH type = flag_types %] - [% NEXT UNLESS type.flags && type.flags.size > 0 && type.is_multiplicable && type.is_active %] - [% IF !separator_displayed %] - <tbody class="bz_flag_type"> - <tr><td colspan="3"><hr></td></tr> - </tbody> - [% separator_displayed = 1 %] + [% IF !read_only_flags %] + [%# Step 2: Display flag type again (if type is multiplicable). %] + [% FOREACH type = flag_types %] + [% NEXT UNLESS type.flags && type.flags.size > 0 && type.is_multiplicable && type.is_active %] + [% IF !separator_displayed %] + <tbody class="bz_flag_type"> + [% sep_length = 3 + (any_flags_requesteeble ? 1 : 0) + (edit_multiple_bugs ? 1 : 0) %] + <tr> + <td colspan="[% sep_length FILTER html %]"><hr></td> + </tr> + </tbody> + [% separator_displayed = 1 %] + [% END %] + [% PROCESS flag_row type = type addl_text = "addl." %] [% END %] - [% PROCESS flag_row type = type addl_text = "addl." %] [% END %] </table> @@ -76,7 +82,7 @@ [% ELSE %] [% flag.setter.nick FILTER html %]: [% END %] - [%+ type.name FILTER html FILTER no_break %][% flag.status %] + <span class="nowrap">[%+ type.name FILTER html %][% flag.status %]</span> [% IF flag.requestee %] [% IF flag.requestee.name %] (<span title="[% flag.requestee.name FILTER html %]">[% flag.requestee.nick FILTER html %]</span>) @@ -93,6 +99,7 @@ [% BLOCK flag_row %] [% RETURN IF !flag && !((type.is_requestable && user.can_request_flag(type)) || user.can_set_flag(type)) %] [% SET fid = flag ? "flag-$flag.id" : "flag_type-$type.id" %] + [% can_edit_flag = (!read_only_flags || (flag && (flag.setter_id == user.id || (flag.requestee_id && flag.requestee_id == user.id)))) ? 1 : 0 %] <tbody[% ' class="bz_flag_type"' IF !flag %]> <tr> <td> @@ -102,21 +109,25 @@ [% addl_text FILTER html %] [% END %] </td> - <td> + <td class="nowrap"> <label title="[% type.description FILTER html %]" for="[% fid FILTER html %]"> - [%- type.name FILTER html FILTER no_break -%]</label> + [%- type.name FILTER html %]</label> </td> <td> <input type="hidden" id="[% fid FILTER html %]_dirty"> <select id="[% fid FILTER html %]" name="[% fid FILTER html %]" title="[% type.description FILTER html %]" onchange="toggleRequesteeField(this);" - class="flag_select flag_type-[% type.id %]"> + class="flag_select flag_type-[% type.id %]" + [% IF !can_edit_flag %] disabled="disabled"[% END %]> [%# Only display statuses the user is allowed to set. %] - [% IF !flag || user.can_request_flag(type) || flag.setter_id == user.id %] - <option value="X"></option> + [% IF edit_multiple_bugs %] + <option value="--do_not_change--">--do_not_change--</option> + [% END %] + [% IF !flag || (can_edit_flag && user.can_request_flag(type)) || flag.setter_id == user.id %] + <option value="X" label="X"></option> [% END %] - [% IF type.is_active %] + [% IF type.is_active && can_edit_flag %] [% IF (type.is_requestable && user.can_request_flag(type)) || (flag && flag.status == "?") %] <option value="?" [% "selected" IF flag && flag.status == "?" %]>?</option> [% END %] @@ -132,17 +143,17 @@ </select> </td> [% IF any_flags_requesteeble %] - <td> + <td class="bz_flags"> [% IF (type.is_active && type.is_requestable && type.is_requesteeble) || (flag && flag.requestee) %] - <span style="white-space: nowrap;"> [% SET grant_list = [] %] [% IF Param('usemenuforusers') %] - [% grant_list = type.grant_list %] - [% IF flag && !(type.is_active && type.is_requestable && type.is_requesteeble) %] + [% IF !can_edit_flag || (flag && !(type.is_active && type.is_requestable && type.is_requesteeble)) %] [%# We are here only because there was already a requestee. In this case, the only valid action is to remove the requestee or leave it alone; nothing else. %] [% grant_list = [flag.requestee] %] + [% ELSE %] + [% grant_list = type.grant_list %] [% END %] [% END %] [% SET flag_name = flag ? "requestee-$flag.id" : "requestee_type-$type.id" %] @@ -157,11 +168,24 @@ emptyok => flag_empty_ok classes => ["requestee"] custom_userlist => grant_list + disabled => !can_edit_flag %] - </span> [% END %] </td> [% END %] + [% IF edit_multiple_bugs %] + <td> + [% IF type.is_multiplicable %] + <input type="checkbox" name="flags_add-[% type.id %]" + id="flags_add-[% type.id %]" value="1"> + <label for="flags_add-[% type.id %]" + title="If ticked, always create a new flag. Leaving it unchecked will + update existing flag(s) and add a new flag if it does not exist"> + Always add + </label> + [% END %] + </td> + [% END %] </tr> </tbody> [% END %] diff --git a/template/en/default/global/choose-classification.html.tmpl b/template/en/default/global/choose-classification.html.tmpl index 76789a2fc..8433380ea 100644 --- a/template/en/default/global/choose-classification.html.tmpl +++ b/template/en/default/global/choose-classification.html.tmpl @@ -12,23 +12,26 @@ #%] [% IF target == "enter_bug.cgi" %] - [% title = "Select Classification" %] - [% subheader = "Please select the classification." %] + [% title = "Enter $terms.Bug" %] + [% subheader = "Select Classification" %] [% END %] [% DEFAULT title = "Choose the classification" %] [% PROCESS global/header.html.tmpl %] -<table> +[% USE Bugzilla %] +[% previous_params = Bugzilla.cgi.canonicalise_query('classification') %] + +<h2>First, you must pick a classification on which to enter [% terms.abug %]:</h2> +<table id="choose_classification"> <tr> - <th align="right"> + <th class="right"> <a href="[% target FILTER uri %]?classification=__all - [% IF cloned_bug_id %]&cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%] - [%- IF format %]&format=[% format FILTER uri %][% END %]"> + [%- IF previous_params %]&[% previous_params FILTER none %][% END -%]"> All</a>: </th> - <td valign="top"> Show all products</td> + <td>Show all products</td> </tr> <tr> <th colspan="2"> </th> @@ -36,15 +39,14 @@ [% FOREACH class = classifications %] <tr> - <th align="right"> + <th class="right"> <a href="[% target FILTER uri %]?classification=[% class.name FILTER uri -%] - [%- IF cloned_bug_id %]&cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%] - [%- IF format %]&format=[% format FILTER uri %][% END %]"> + [%- IF previous_params %]&[% previous_params FILTER none %][% END -%]"> [% class.name FILTER html %]</a>: </th> [% IF class.description %] - <td valign="top"> [% class.description FILTER html_light %]</td> + <td>[% class.description FILTER html_light %]</td> [% END %] </tr> [% END %] diff --git a/template/en/default/global/choose-product.html.tmpl b/template/en/default/global/choose-product.html.tmpl index dfa0b002a..a1582532a 100644 --- a/template/en/default/global/choose-product.html.tmpl +++ b/template/en/default/global/choose-product.html.tmpl @@ -11,13 +11,15 @@ # classification object and 'products' the list of # product objects the user can enter bugs into. # target: the script that displays this template. - # cloned_bug_id: ID of the bug being cloned. - # format: the desired format to display the target. #%] [% IF target == "enter_bug.cgi" %] [% title = "Enter $terms.Bug" %] - [% h2 = BLOCK %]First, you must pick a product on which to enter [% terms.abug %]: [% END %] + [% subheader = "Select Product" %] + [% h2 = BLOCK %] + [% IF Param('useclassification') %]Next[% ELSE %]First[% END %], + you must pick a product on which to enter [% terms.abug %]: + [% END %] [% ELSIF target == "describecomponents.cgi" %] [% title = "Browse" %] [% h2 = "Select a product category to browse:" %] @@ -26,28 +28,30 @@ [% DEFAULT title = "Choose a Product" %] [% PROCESS global/header.html.tmpl %] +[% USE Bugzilla %] +[% previous_params = Bugzilla.cgi.canonicalise_query('classification', 'product') %] + <h2>[% h2 FILTER html %]</h2> -<table> +<table id="choose_product"> [% FOREACH c = classifications %] [% IF c.object %] <tr> - <th colspan="2" align="left">[% c.object.name FILTER html %]: + <th colspan="2" class="left">[% c.object.name FILTER html %]: [%+ c.object.description FILTER html_light %]</th> </tr> [% END %] [% FOREACH p = c.products %] <tr> - <th align="right" valign="top"> + <th class="right nowrap"> <a href="[% target %]?product=[% p.name FILTER uri -%] - [%- IF cloned_bug_id %]&cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%] - [%- IF format %]&format=[% format FILTER uri %][% END %]"> - [% p.name FILTER html FILTER no_break %]</a>: + [%- IF previous_params %]&[% previous_params FILTER none %][% END -%]"> + [% p.name FILTER html %]</a>: </th> - <td valign="top">[% p.description FILTER html_light %]</td> + <td>[% p.description FILTER html_light %]</td> </tr> [% END %] diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl index e4416326b..d73d75e13 100644 --- a/template/en/default/global/code-error.html.tmpl +++ b/template/en/default/global/code-error.html.tmpl @@ -50,8 +50,8 @@ [% ELSIF error == "chart_data_not_generated" %] [% admindocslinks = {'extraconfig.html' => 'Setting up Charting'} %] - [% IF product %] - Charts for the <em>[% product FILTER html %]</em> product are not + [% IF product.id %] + Charts for the <em>[% product.name FILTER html %]</em> product are not available yet because no charting data has been collected for it since it was created. [% ELSE %] @@ -64,13 +64,13 @@ [% ELSIF error == "chart_datafile_corrupt" %] The chart data file [% file FILTER html %] is corrupt. - + [% ELSIF error == "chart_dir_nonexistent" %] - One of the directories <tt>[% dir FILTER html %]</tt> and - <tt>[% graph_dir FILTER html %]</tt> does not exist. - + One of the directories <kbd>[% dir FILTER html %]</kbd> and + <kbd>[% graph_dir FILTER html %]</kbd> does not exist. + [% ELSIF error == "chart_file_open_fail" %] - Unable to open the chart datafile <tt>[% filename FILTER html %]</tt>. + Unable to open the chart datafile <kbd>[% filename FILTER html %]</kbd>. [% ELSIF error == "column_alter_nonexistent_fk" %] You attempted to modify the foreign key for @@ -112,7 +112,7 @@ Every cookie must have a value. [% ELSIF error == "env_no_email" %] - [% terms.Bugzilla %] did not receive an email address from the + Bugzilla did not receive an email address from the environment. [% IF Param("auth_env_email") %] This means that the '[% Param("auth_env_email") FILTER html %]' @@ -386,7 +386,7 @@ [% ELSIF error == "search_field_operator_unsupported" %] [% title = "Invalid Search Type" %] - [% terms.Bugzilla %] does not support the search type + Bugzilla does not support the search type "[% operator.truncate(30, "...") FILTER html %]". [% ELSE %] @@ -394,7 +394,7 @@ [% error_message = Hook.process("errors") %] [% IF NOT error_message %] [% title = "Internal error" %] - An internal error has occurred, but [% terms.Bugzilla %] doesn't know + An internal error has occurred, but Bugzilla doesn't know what <code>[% error FILTER html %]</code> means. If you are a [% terms.Bugzilla %] end-user seeing this message, please save @@ -432,25 +432,18 @@ with details of what you were doing at the time this message appeared. </p> -<tt> - <script type="text/javascript"> <!-- - document.write("<p>URL: " + - document.location.href.replace(/&/g,"&") - .replace(/</g,"<") - .replace(/>/g,">") + "</p>"); - // --> - </script> -</tt> - -<table cellpadding="20"> - <tr> - <td id="error_msg" class="throw_error"> - [% error_message FILTER none %] - </td> - </tr> -</table> +<p> + <samp>URL: [% Bugzilla.cgi.self_url FILTER html %]</samp> +</p> + +<div id="error_msg" class="throw_error"> + [% error_message FILTER none %] +</div> + +<p id="post_err_msg"> + Traceback: +</p> -<p>Traceback:</p> <pre>[% traceback FILTER html %]</pre> [% IF variables %] diff --git a/template/en/default/global/common-links.html.tmpl b/template/en/default/global/common-links.html.tmpl index 800fd5932..78b4eb80a 100644 --- a/template/en/default/global/common-links.html.tmpl +++ b/template/en/default/global/common-links.html.tmpl @@ -49,13 +49,11 @@ [% END %] [%-# Work around FF bug: keep this on one line %]</li> + [% Hook.process('action-links') %] + [% IF user.login %] <li><span class="separator">| </span><a href="userprefs.cgi">Preferences</a></li> - [% IF user.in_group('tweakparams') || user.in_group('editusers') || user.can_bless - || (Param('useclassification') && user.in_group('editclassifications')) - || user.in_group('editcomponents') || user.in_group('admin') || user.in_group('creategroups') - || user.in_group('editkeywords') || user.in_group('bz_canusewhines') - || user.get_products_by_permission("editcomponents").size %] + [% IF user.can_administer %] <li><span class="separator">| </span><a href="admin.cgi">Administration</a></li> [% END %] @@ -102,7 +100,7 @@ [% Hook.process("link-row") %] [% BLOCK link_to_documentation %] - [% IF doc_section && Param('docs_urlbase') %] + [% IF doc_section %] <li> <span class="separator">| </span> <a href="[% docs_urlbase _ doc_section FILTER html %]" target="_blank">Help</a> diff --git a/template/en/default/global/confirm-user-match.html.tmpl b/template/en/default/global/confirm-user-match.html.tmpl index c31567a9c..613f097e1 100644 --- a/template/en/default/global/confirm-user-match.html.tmpl +++ b/template/en/default/global/confirm-user-match.html.tmpl @@ -54,7 +54,7 @@ <p> [% IF matchmultiple %] - [% terms.Bugzilla %] cannot make a conclusive match for one or more + Bugzilla cannot make a conclusive match for one or more of the names and/or email addresses you entered on the previous page. <br>Please examine the lists of potential matches below and select the ones you want, @@ -69,7 +69,7 @@ [% ELSE %] [% PROCESS global/header.html.tmpl title="Match Failed" %] <p> - [% terms.Bugzilla %] was unable to make any match at all for one or more of + Bugzilla was unable to make any match at all for one or more of the names and/or email addresses you entered on the previous page. [% IF !user.id %] <b>Note: You are currently logged out. Only exact matches against e-mail @@ -79,30 +79,22 @@ <p>Please go back and try other names or email addresses.</p> [% END %] - <table border="0"> - <tr> - <td colspan="2"> - <hr width="100%" size="1"> - </td> - </tr> - - [%# this is messy to allow later expansion %] - +<table id="user_match_table"> [% FOREACH field = matches %] <tr> - <td align="left" valign="top"> + <td> [% PROCESS field_names field_name=field.key %]: </td> - <td align="left" valign="top"> + <td> [% FOREACH query = field.value %] <div class="user_match"> <b>[% query.key FILTER html %]</b> [% IF query.value.users.size %] [% IF query.value.users.size > 1 %] [% IF query.value.status == 'fail' %] - <font color="#FF0000"> + <span class="warning"> matches multiple users. - </font> + </span> Please go back and try again with a more specific name/address. [% ELSE %] @@ -136,31 +128,26 @@ <b>[% query.value.users.0.identity FILTER html %]</b> [% END %] [% ELSE %] + <span class="warning"> [% IF query.key.length < 3 %] - <font color="#FF0000">was too short for substring match - (minimum 3 characters)</font> + was too short for substring match (minimum 3 characters) [% ELSE %] - <font color="#FF0000">did not match anything</font> + did not match anything [% END %] + </span> [% END %] </div> [% END %] </td> </tr> - <tr> - <td colspan="2"> - <hr width="100%" size="1"> - </td> - </tr> [% END %] - - </table> +</table> [% IF matchsuccess == 1 %] [% SET exclude_these = ['Bugzilla_login', 'Bugzilla_password'] %] [% FOREACH key IN matches.keys %] - [% exclude_these.push(key) IF cgi.param(key) == '' %] + [% exclude_these.push(key) IF Bugzilla.cgi.param(key) == '' %] [% END %] [% SET exclude = '^' _ exclude_these.join('|') _ '$' %] [% PROCESS "global/hidden-fields.html.tmpl" exclude = exclude %] diff --git a/template/en/default/global/docslinks.html.tmpl b/template/en/default/global/docslinks.html.tmpl index c2cc830fa..e33aa3b17 100644 --- a/template/en/default/global/docslinks.html.tmpl +++ b/template/en/default/global/docslinks.html.tmpl @@ -22,8 +22,7 @@ # members of the admin group. #%] -[% IF Param('docs_urlbase') && - docslinks.keys.size || (admindocslinks.keys.size && user.in_group('admin')) %] +[% IF docslinks.keys.size || (admindocslinks.keys.size && user.in_group('admin')) %] <div id="docslinks"> <h2>Related documentation</h2> <ul> diff --git a/template/en/default/global/field-descs.none.tmpl b/template/en/default/global/field-descs.none.tmpl index f1e0747da..f4e17c3f8 100644 --- a/template/en/default/global/field-descs.none.tmpl +++ b/template/en/default/global/field-descs.none.tmpl @@ -34,15 +34,19 @@ "changedto" => "changed to", "changedby" => "changed by", "matches" => "matches", - "notmatches" => "does not match", + "notmatches" => "does not match", + "isempty" => "is empty", + "isnotempty" => "is not empty", } %] [% field_types = { ${constants.FIELD_TYPE_UNKNOWN} => "Unknown Type", ${constants.FIELD_TYPE_FREETEXT} => "Free Text", + ${constants.FIELD_TYPE_INTEGER} => "Integer", ${constants.FIELD_TYPE_SINGLE_SELECT} => "Drop Down", ${constants.FIELD_TYPE_MULTI_SELECT} => "Multiple-Selection Box", ${constants.FIELD_TYPE_TEXTAREA} => "Large Text Box", ${constants.FIELD_TYPE_DATETIME} => "Date/Time", + ${constants.FIELD_TYPE_DATE} => "Date", ${constants.FIELD_TYPE_BUG_ID} => "$terms.Bug ID", } %] @@ -92,6 +96,7 @@ "everconfirmed" => "Ever confirmed", "flagtypes.name" => "Flags", "keywords" => "Keywords", + "last_visit_ts" => "Last Visit", "longdesc" => "Comment", "longdescs.count" => "Number of Comments", "longdescs.isprivate" => "Comment is private", @@ -119,7 +124,7 @@ "short_desc" => "Summary", "short_short_desc" => "Summary", "status_whiteboard" => "Whiteboard", - "tag" => "Tags", + "tag" => "Personal Tags", "target_milestone" => "Target Milestone", "version" => "Version", "work_time" => "Hours Worked", diff --git a/template/en/default/global/footer.html.tmpl b/template/en/default/global/footer.html.tmpl index e161a061c..7cc5e1b44 100644 --- a/template/en/default/global/footer.html.tmpl +++ b/template/en/default/global/footer.html.tmpl @@ -11,26 +11,17 @@ # global/useful-links.html.tmpl. #%] - [% Hook.process('main-end') %] -</div> + [% Hook.process('main-end') %] + </div> -[%# Migration note: below this point, this file corresponds to the old Param - # 'footerhtml' - #%] - -<div id="footer"> - <div class="intro">[% Hook.process('intro') %]</div> - -[%# Migration note: the old param 'blurbhtml' goes here %] - -[%# Migration note: useful-links.html.tmpl corresponds to %commandmenu% %] - - [% PROCESS "global/useful-links.html.tmpl" %] + <div id="footer"> + <div class="intro">[% Hook.process('intro') %]</div> - <div class="outro">[% Hook.process('outro') %]</div> -</div> + [% PROCESS "global/useful-links.html.tmpl" %] -[% Hook.process("end") %] + <div class="outro">[% Hook.process('outro') %]</div> + </div> -</body> + [% Hook.process("end") %] + </body> </html> diff --git a/template/en/default/global/header.html.tmpl b/template/en/default/global/header.html.tmpl index dceb44db9..e461e3746 100644 --- a/template/en/default/global/header.html.tmpl +++ b/template/en/default/global/header.html.tmpl @@ -20,6 +20,7 @@ # style_urls: list. List of URLs to CSS style sheets. # message: string. A message to display to the user. May contain HTML. # atomlink: Atom link URL, May contain HTML + # generate_api_token: generate a token which can be used to make authenticated webservice calls #%] [% IF message %] @@ -32,6 +33,7 @@ onload = "" style_urls = [] yui = [] + generate_api_token = 0 %] [% SET yui_css = { @@ -75,8 +77,7 @@ # set header's default value here only if it is undefined. %] [% IF !header.defined %][% header = title %][% END %] -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> +<!DOCTYPE html> <html lang="en"> <head> [% Hook.process("start") %] @@ -86,42 +87,34 @@ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> [% END %] -[%# Migration note: contents of the old Param 'headerhtml' would go here %] - - [% PROCESS "global/site-navigation.html.tmpl" %] - - [% PROCESS 'global/setting-descs.none.tmpl' %] - [% SET yui = yui_resolve_deps(yui, yui_deps) %] - [% SET css_sets = css_files(style_urls, yui, yui_css) %] - [%# CSS cascade, parts 1 & 2: YUI & Standard Bugzilla stylesheet set (persistent). - # Always present. %] - <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 %] - - [%# CSS cascade, part 3: Third-party stylesheet set, per user prefs. %] - [% FOREACH style_url = css_sets.skin %] - [% PROCESS format_css_link css_set_name = user.settings.skin.value %] + [% SET css_sets = css_files(style_urls, yui, yui_css) %] + [% IF constants.CONCATENATE_ASSETS %] + [% PROCESS format_css_link asset_url = css_sets.unified_standard_skin %] + [% ELSE %] + [% FOREACH asset_url = css_sets.standard %] + [% PROCESS format_css_link %] + [% END %] + [% FOREACH asset_url = css_sets.skin %] + [% PROCESS format_css_link %] + [% END %] [% END %] - [%# CSS cascade, part 4: page-specific styles. %] [% IF style %] <style type="text/css"> [% style %] </style> [% END %] - [%# CSS cascade, part 5: Custom Bugzilla stylesheet set (persistent). - # Always present. Site administrators may override all other style - # definitions, including skins, using custom stylesheets. - #%] - [% FOREACH style_url = css_sets.custom %] - [% PROCESS format_css_link css_set_name = 'standard' %] + [% IF css_sets.unified_custom %] + [% IF constants.CONCATENATE_ASSETS %] + [% PROCESS format_css_link asset_url = css_sets.unified_custom %] + [% ELSE %] + [% FOREACH asset_url = css_sets.custom %] + [% PROCESS format_css_link %] + [% END %] + [% END %] [% END %] [%# YUI Scripts %] @@ -130,7 +123,7 @@ [% END %] [% starting_js_urls.push('js/global.js') %] - [% FOREACH javascript_url = starting_js_urls %] + [% FOREACH asset_url = concatenate_js(starting_js_urls) %] [% PROCESS format_js_link %] [% END %] @@ -174,16 +167,19 @@ [%# 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 %].', + "You must select a Component for this [% terms.bug %].", description_required: - 'You must enter a Description for this [% terms.bug %].', + "You must enter a Description for this [% terms.bug %].", short_desc_required: - 'You must enter a Summary for this [% terms.bug %].', + "You must enter a Summary for this [% terms.bug %].", version_required: - 'You must select a Version for this [% terms.bug %].' + "You must select a Version for this [% terms.bug %]." } + [% IF generate_api_token %] + , api_token: '[% get_api_token FILTER js FILTER html %]' + [% END %] }; [% FOREACH yui_name = yui %] @@ -197,7 +193,7 @@ // --> </script> - [% FOREACH javascript_url = javascript_urls %] + [% FOREACH asset_url = concatenate_js(javascript_urls) %] [% PROCESS format_js_link %] [% END %] @@ -215,99 +211,64 @@ [% Hook.process("additional_header") %] </head> -[%# Migration note: contents of the old Param 'bodyhtml' go in the body tag, - # but set the onload attribute in the DEFAULT directive above. - #%] - - <body onload="[% onload %]" + <body [% IF onload %] onload="[% onload %]"[% END %] class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') FILTER css_class_quote %] [% FOREACH class = bodyclasses %] - [% ' ' %][% class FILTER css_class_quote %] + [%+ class FILTER css_class_quote %] [% END %] yui-skin-sam"> -[%# Migration note: the following file corresponds to the old Param - # 'bannerhtml' - #%] - -<div id="header"> - -[% INCLUDE global/banner.html.tmpl %] - -<table border="0" cellspacing="0" cellpadding="0" id="titles"> -<tr> - <td id="title"> - <p>[% terms.Bugzilla %] - [% " – $header" IF header %]</p> - </td> - - [% IF subheader %] - <td id="subtitle"> - <p class="subheader">[% subheader %]</p> - </td> - [% END %] - - [% IF header_addl_info %] - <td id="information"> - <p class="header_addl_info">[% header_addl_info %]</p> - </td> - [% END %] -</tr> -</table> - -<table id="lang_links_container" cellpadding="0" cellspacing="0" - class="bz_default_hidden"><tr><td> -[% IF Bugzilla.languages.size > 1 %] - <ul class="links"> - [% FOREACH lang = Bugzilla.languages.sort %] - <li>[% IF NOT loop.first %]<span class="separator"> | </span>[% END %] - [% IF lang == current_language %] - <span class="lang_current">[% lang FILTER html FILTER upper %]</span> - [% ELSE %] - <a href="#" onclick="set_language('[% lang FILTER none %]');"> - [%- lang FILTER html FILTER upper %]</a> + <div id="header"> + [% INCLUDE global/banner.html.tmpl %] + + <div id="titles"> + <span id="title">[% terms.Bugzilla %][% " – $header" IF header %]</span> + + [% IF subheader %] + <span id="subtitle" class="subheader">[% subheader %]</span> + [% END %] + + [% IF header_addl_info %] + <span id="information" class="header_addl_info">[% header_addl_info %]</span> + [% END %] + </div> + + [% USE Bugzilla %] + [% IF Bugzilla.languages.size > 1 %] + <div id="lang_links_container" class="bz_default_hidden"> + <ul class="links"> + [% FOREACH lang = Bugzilla.languages.sort %] + <li> + [% IF NOT loop.first %]<span class="separator"> | </span>[% END %] + [% IF lang == current_language %] + <span class="lang_current">[% lang FILTER html FILTER upper %]</span> + [% ELSE %] + <a href="#" onclick="set_language('[% lang FILTER none %]');"> + [%- lang FILTER html FILTER upper %]</a> + [% END %] + </li> + [% END %] + </ul> + </div> [% END %] - </li> - [% END %] - </ul> -[% END %] -</td></tr></table> - -[% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %] -</div> [%# header %] - -<div id="bugzilla-body"> - -[% IF Param('announcehtml') %] -[% Param('announcehtml') FILTER none %] -[% END %] -[% IF message %] - <div id="message">[% message %]</div> -[% END %] + <div id="common_links"> + [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %] + </div> + </div> -[% 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' %] - [% SET css_title_link = '' %] - [% ELSE %] - [% css_title_link = BLOCK ~%] - title="[% setting_descs.${user.settings.skin.value} || user.settings.skin.value FILTER html %]" + <div id="bugzilla-body"> + [% IF Param('announcehtml') %] + [% Param('announcehtml') FILTER none %] [% END %] - [% END %] - <link href="[% style_url FILTER html %]" rel="stylesheet" - type="text/css" [% css_title_link FILTER none %]> + [% IF message %] + <div id="message">[% message %]</div> + [% END %] - [% '<![endif]-->' IF style_url.match('/IE-fixes\.css') %] +[% BLOCK format_css_link %] + <link href="[% asset_url FILTER html %]" rel="stylesheet" type="text/css"> [% END %] [% BLOCK format_js_link %] - <script type="text/javascript" src="[% javascript_url FILTER mtime FILTER html %]"></script> + <script type="text/javascript" src="[% asset_url FILTER mtime FILTER html %]"></script> [% END %] diff --git a/template/en/default/global/messages.html.tmpl b/template/en/default/global/messages.html.tmpl index ba961c392..3a8aa1ada 100644 --- a/template/en/default/global/messages.html.tmpl +++ b/template/en/default/global/messages.html.tmpl @@ -26,14 +26,12 @@ canceled. [% ELSIF message_tag == "account_updated" %] - [% IF changed_fields.size - + groups_added_to.size + groups_removed_from.size - + groups_granted_rights_to_bless.size + groups_denied_rights_to_bless.size %] + [% IF changes.size %] [% title = "User $loginold updated" %] The following changes have been made to the user account [%+ loginold FILTER html %]: <ul> - [% FOREACH field = changed_fields %] + [% FOREACH field = changes.keys %] <li> [% IF field == 'login_name' %] The login is now [% otheruser.login FILTER html %]. @@ -53,35 +51,31 @@ [% ELSE %] [% terms.Bug %]mail has been enabled. [% END %] + [% ELSIF field == 'groups' %] + [% IF changes.groups.1.size %] + The account has been added to the + [%+ changes.groups.1.join(', ') FILTER html %] + group[% 's' IF changes.groups.1.size > 1 %]. + [% END %] + [% IF changes.groups.0.size %] + The account has been removed from the + [%+ changes.groups.0.join(', ') FILTER html %] + group[% 's' IF changes.groups.0.size > 1 %]. + [% END %] + [% ELSIF field == 'bless_groups' %] + [% IF changes.bless_groups.1.size %] + The account has been granted rights to bless the + [%+ changes.bless_groups.1.join(', ') FILTER html %] + group[% 's' IF changes.bless_groups.1.size > 1 %]. + [% END %] + [% IF changes.bless_groups.0.size %] + The account has been denied rights to bless the + [%+ changes.bless_groups.0.join(', ') FILTER html %] + group[% 's' IF changes.bless_groups.0.size > 1 %]. + [% END %] [% END %] </li> [% END %] - [% IF groups_added_to.size %] - <li> - The account has been added to the following group[% 's' IF groups_added_to.size > 1 %]: - [%+ groups_added_to.join(', ') FILTER html %] - </li> - [% END %] - [% IF groups_removed_from.size %] - <li> - The account has been removed from the following group[% 's' IF groups_removed_from.size > 1 %]: - [%+ groups_removed_from.join(', ') FILTER html %] - </li> - [% END %] - [% IF groups_granted_rights_to_bless.size %] - <li> - The account has been granted rights to bless the - [%+ groups_granted_rights_to_bless.join(', ') FILTER html %] - group[% 's' IF groups_granted_rights_to_bless.size > 1 %]. - </li> - [% END %] - [% IF groups_denied_rights_to_bless.size %] - <li> - The account has been denied rights to bless the - [%+ groups_denied_rights_to_bless.join(', ') FILTER html %] - group[% 's' IF groups_denied_rights_to_bless.size > 1 %]. - </li> - [% END %] </ul> [% ELSE %] [% title = "User $otheruser.login not changed" %] @@ -569,7 +563,8 @@ [% ELSIF message_tag == "password_change_request" %] [% title = "Request to Change Password" %] - A token for changing your password has been emailed to you. + A token for changing your password has been emailed to + <em>[% login_name FILTER html %]</em>. Follow the instructions in that email to change your password. [% ELSIF message_tag == "password_changed" %] @@ -733,7 +728,7 @@ Renaming the '[% old FILTER html %]' table to '[% new FILTER html %]'... [% ELSIF message_tag == "install_urlbase_default" %] - Now that you have installed [% terms.Bugzilla %], you should visit the + Now that you have installed Bugzilla, you should visit the 'Parameters' page (linked in the footer of the Administrator account) to ensure it is set up as you wish - this includes setting the 'urlbase' option to the correct URL. @@ -752,7 +747,7 @@ other files (including the localconfig file which stores your database password) must be world readable. This means that _anyone_ who can obtain local access to this machine can do whatever they want to your - [%+ terms.Bugzilla %] installation, and is probably also able to run + Bugzilla installation, and is probably also able to run arbitrary Perl code as the user that the web server runs as. You really, really, really need to change this setting. @@ -762,7 +757,7 @@ Warning: you have entered a value for the "webservergroup" parameter in localconfig, but you are not either a) running this script as [% constants.ROOT_USER FILTER html %]; or b) a member of this group. This can cause permissions problems and - decreased security. If you experience problems running [% terms.Bugzilla %] + decreased security. If you experience problems running Bugzilla scripts, log in as [% constants.ROOT_USER FILTER html %] and re-run this script, become a member of the group, or remove the value of the "webservergroup" parameter. @@ -770,7 +765,7 @@ Warning: You have set webservergroup in [% constants.bz_locations.localconfig FILTER html %] Please understand that this does not bring you any security when running under Windows. - Verify that the file permissions in your [% terms.Bugzilla %] directory are + Verify that the file permissions in your Bugzilla directory are suitable for your system. Avoid unnecessary write access. [% ELSIF message_tag == "install_workflow_init" %] @@ -795,6 +790,30 @@ or you don't have access to it. The following is a list of the products you can choose from. + [% ELSIF message_tag == "quips_added" %] + Your quip <em>[% added_quip FILTER html %]</em> has been added. + [% IF Param("quip_list_entry_control") == "moderated" AND + !user.in_group('bz_quip_moderators') %] + It will be used as soon as it gets approved. + [% END %] + + [% ELSIF message_tag == "quips_deleted" %] + The quip <em>[% deleted_quip FILTER html %]</em> has been deleted. + + [% ELSIF message_tag == "quips_approved_unapproved" %] + [% IF approved.size == 1 %] + One quip + [% ELSE %] + [% approved.size %] quips + [% END %] + approved and + [% IF unapproved.size == 1 %] + one quip + [% ELSE %] + [%+ unapproved.size %] quips + [% END %] + unapproved. + [% ELSIF message_tag == "report_created" %] OK, you have a new saved report named <em>[% reportname FILTER html %]</em>. @@ -850,6 +869,12 @@ [%+ series.name FILTER html %]</em> has been deleted. + [% ELSIF message_tag == "series_updated" %] + [% title = "Series Updated" %] + The series <em>[% default.category FILTER html %] / + [%+ default.subcategory FILTER html %] / + [%+ default.name FILTER html %]</em> has been updated. + [% ELSIF message_tag == "shutdown" %] [% title = "$terms.Bugzilla is Down" %] [% Param("shutdownhtml") %] @@ -917,7 +942,7 @@ [%# Give sensible error if the message function is used incorrectly. #%] [% IF !message %] [% message = BLOCK %] - You are using [% terms.Bugzilla %]'s messaging functions incorrectly. You + You are using Bugzilla's messaging functions incorrectly. You passed in the string '[% message_tag FILTER html %]'. The correct use is to pass in a tag, and define that tag in the file <kbd>messages.html.tmpl</kbd>.<br> <br> diff --git a/template/en/default/global/product-select.html.tmpl b/template/en/default/global/product-select.html.tmpl new file mode 100644 index 000000000..23a7b3d58 --- /dev/null +++ b/template/en/default/global/product-select.html.tmpl @@ -0,0 +1,92 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +[%# INTERFACE: + # 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; accesskey attribute value + # add: optional; prepend menu option for value specified to start of select + # dontchange: optional; prepend menu option for "dontchange" to start of select + # multiple: optional; do multiselect box, value is size (height) of box + # title: optional; extra information to display as a tooltip + # products: optional; an array of custom product names + # isselect: optional; whether the product list should be displayed as a <select> + # or as just the plain text of its value. + # valueattribute: optional; the product attribute to be used for <option value="">, + # defaults to product name + #%] + +[% IF !isselect.defined %] + [% isselect = 1 %] +[% END %] +[% DEFAULT valueattribute = "name" %] +[% IF isselect %] + <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 title %] title="[% title FILTER html %]" [% END %] + > + [% IF add %] + <option value="">[% add FILTER html %]</option> + [% END %] + [% IF dontchange %] + <option value="[% dontchange FILTER html %]">[% dontchange FILTER html %]</option> + [% END %] + + [% IF Param('useclassification') %] + [% classifications = {} %] + [% IF products %] + [% FOREACH p = products %] + [% IF NOT classifications.${p.classification.name}.defined %] + [% classifications.${p.classification.name} = [] %] + [% END %] + [% classifications.${p.classification.name}.push(p) %] + [% END %] + [% ELSE %] + [% FOREACH c = user.get_selectable_classifications %] + [% classifications.${c.name} = [] %] + [% FOREACH p = user.get_selectable_products(c.id) %] + [% classifications.${c.name}.push(p) %] + [% END %] + [% END %] + [% END %] + + [% FOREACH c = all_classifications %] + [% NEXT UNLESS classifications.${c}.size %] + <optgroup label="[% c FILTER html %]"> + [% FOREACH p = classifications.$c %] + <option value="[% p.$valueattribute FILTER html %]" + [% " selected" IF (cgi.param(name) == p.name) || (value.contains(p.name)) %]> + [% p.name FILTER html %] + </option> + [% END %] + </optgroup> + [% END %] + [% ELSE %] + [% IF NOT products.defined %] + [% products = user.get_selectable_products %] + [% END %] + [% FOREACH p = products %] + <option value="[% p.$valueattribute FILTER html %]" + [% " selected" IF (cgi.param(name) == p.name) || (value.contains(p.name)) %]> + [% p.name FILTER html %] + </option> + [% END %] + [% END %] + </select> +[% ELSE %] + [% value.join(', ') FILTER html %] +[% END %] diff --git a/template/en/default/global/setting-descs.none.tmpl b/template/en/default/global/setting-descs.none.tmpl index d20068306..6e3358782 100644 --- a/template/en/default/global/setting-descs.none.tmpl +++ b/template/en/default/global/setting-descs.none.tmpl @@ -43,6 +43,7 @@ "text_only" => "Text Only", "requestee_cc" => "Automatically add me to the CC list of $terms.bugs I am requested to review", "bugmail_new_prefix" => "Add 'New:' to subject line of email sent when a new $terms.bug is filed", + "possible_duplicates" => "Display possible duplicates when reporting a new $terms.bug", } %] diff --git a/template/en/default/global/site-navigation.html.tmpl b/template/en/default/global/site-navigation.html.tmpl deleted file mode 100644 index 5c68ad7f6..000000000 --- a/template/en/default/global/site-navigation.html.tmpl +++ /dev/null @@ -1,75 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] - -[%# INTERFACE: - # bug.bug_id: integer. Number of current bug (for navigation purposes) - #%] - -[% USE Bugzilla %] -[% cgi = Bugzilla.cgi %] - -[% IF NOT (cgi.user_agent("MSIE [1-6]") OR cgi.user_agent("Mozilla/4")) %] - <link rel="Top" href="[% urlbase FILTER html %]"> - - [%# *** Attachment *** %] - [% IF attachment && attachment.bug_id %] - <link rel="Up" href="show_bug.cgi?id=[% attachment.bug_id FILTER none %]"> - [% END %] - - - [%# *** Dependencies, Activity, Print-version *** %] - [% IF bug %] - <link rel="Show" title="Dependency Tree" - href="showdependencytree.cgi?id=[% bug.bug_id %]&hide_resolved=1"> - [% IF Param('webdotbase') %] - <link rel="Show" title="Dependency Graph" - href="showdependencygraph.cgi?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" - href="show_bug.cgi?format=multiple&id=[% bug.bug_id %]"> - [% END %] - - - [%# *** Saved Searches *** %] - [% IF user.showmybugslink %] - [% user_login = user.login FILTER uri %] - <link rel="Saved Searches" title="My [% terms.Bugs %]" - href="[% Param('mybugstemplate').replace('%userid%', user_login) %]"> - [% END %] - - [% FOREACH q = user.queries_subscribed %] - <link rel="Saved Search" - title="[% q.name FILTER html %] ([% q.user.login FILTER html %])" - href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd= - [% q.name FILTER uri %]&sharer_id= - [% q.user.id FILTER uri %]"> - [% END %] - - [%# *** Bugzilla Administration Tools *** %] - [% IF user.login %] - [% '<link rel="Administration" title="Parameters" - href="editparams.cgi">' IF user.in_group('tweakparams') %] - [% '<link rel="Administration" title="Users" - href="editusers.cgi">' IF user.in_group('editusers') %] - [% '<link rel="Administration" title="Products" href="editproducts.cgi">' - IF user.in_group('editcomponents') || user.get_products_by_permission("editcomponents").size %] - [% '<link rel="Administration" title="Flag Types" - href="editflagtypes.cgi">' IF user.in_group('editcomponents') %] - [% '<link rel="Administration" title="Groups" - href="editgroups.cgi">' IF user.in_group('creategroups') %] - [% '<link rel="Administration" title="Keywords" - href="editkeywords.cgi">' IF user.in_group('editkeywords') %] - [% '<link rel="Administration" title="Whining" - href="editwhines.cgi">' IF user.in_group('bz_canusewhines') %] - [% '<link rel="Administration" title="Sanity Check" - href="sanitycheck.cgi">' IF user.in_group('editcomponents') %] - [% END %] -[% END %] diff --git a/template/en/default/global/tabs.html.tmpl b/template/en/default/global/tabs.html.tmpl index 454066889..9cf5a897b 100644 --- a/template/en/default/global/tabs.html.tmpl +++ b/template/en/default/global/tabs.html.tmpl @@ -15,7 +15,7 @@ #%] <div class="tabbed"> - <table class="tabs" cellspacing="0" cellpadding="10" border="0" width="100%"> + <table class="tabs"> <tr> <td class="spacer"> </td> diff --git a/template/en/default/global/textarea.html.tmpl b/template/en/default/global/textarea.html.tmpl index 216f2ddbf..f3e23dd3f 100644 --- a/template/en/default/global/textarea.html.tmpl +++ b/template/en/default/global/textarea.html.tmpl @@ -11,7 +11,6 @@ # id: (optional) The "id"-attribute of the textarea. # name: (optional) The "name"-attribute of the textarea. # accesskey: (optional) The "accesskey"-attribute of the textarea. - # style: (optional) The "style"-attribute of the textarea. # classes: (optional) The "class"-attribute of the textarea. # wrap: (deprecated; optional) The "wrap"-attribute of the textarea. # disabled: (optional) Disable the textarea. @@ -33,7 +32,6 @@ <textarea [% IF name %]name="[% name FILTER html %]"[% END %] [% IF id %] id="[% id FILTER html %]"[% END %] [% IF accesskey %] accesskey="[% accesskey FILTER html %]"[% END %] - [% 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 %] @@ -48,7 +46,7 @@ onFocus="this.rows=[% maxrows FILTER html %]" [% END %] [% IF mandatory %] - aria-required="true" + aria-required="true" required [% END %] [% IF onchange %] onchange="[% onchange FILTER html %]" diff --git a/template/en/default/global/useful-links.html.tmpl b/template/en/default/global/useful-links.html.tmpl index 5959ab656..5c5bfc316 100644 --- a/template/en/default/global/useful-links.html.tmpl +++ b/template/en/default/global/useful-links.html.tmpl @@ -6,51 +6,48 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[%# Migration note: this whole file corresponds to the old %commandmenu% - substitution param in 'footerhtml' %] - <ul id="useful-links"> <li id="links-actions"> [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_bottom" %] </li> [%# Saved searches %] - - [% IF user.showmybugslink OR user.queries.size - OR user.queries_subscribed.size - %] - [% print_pipe = 0 %] + + [% IF user.showmybugslink OR user.queries.size %] <li id="links-saved"> <ul class="links"> + [% print_pipe = 0 %] [% IF user.showmybugslink %] [% filtered_username = user.login FILTER uri %] - <li><a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My [% terms.Bugs %]</a></li> + <li> + <a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My [% terms.Bugs %]</a> + </li> [% print_pipe = 1 %] [% END %] [% FOREACH q = user.queries %] - [% IF q.link_in_footer %] - <li>[% '<span class="separator">| </span>' IF print_pipe %] - <a href="buglist.cgi?cmdtype=runnamed&namedcmd=[% q.name FILTER uri %]">[% q.name FILTER html %]</a></li> - [% print_pipe = 1 %] - [% END %] + [% NEXT UNLESS q.link_in_footer %] + <li> + [% '<span class="separator">| </span>' IF print_pipe %] + <a href="buglist.cgi?cmdtype=runnamed&namedcmd=[% q.name FILTER uri %]">[% q.name FILTER html %]</a> + </li> + [% print_pipe = 1 %] [% END %] - [% new_line = print_pipe %] - [% print_pipe = 0 %] + </ul> + </li> + [% END %] + + [% IF user.queries_subscribed.size %] + <li id="links-shared"> + <ul class="links"> [% FOREACH q = user.queries_subscribed %] - [% IF new_line %] - <br> - [% new_line = 0 %] - [% END %] <li> - [% '<span class="separator">| </span>' IF print_pipe %] + [% '<span class="separator">| </span>' UNLESS loop.first %] <a href="buglist.cgi?cmdtype=dorem&remaction=run&namedcmd= - [% q.name FILTER uri %]&sharer_id= - [% q.user.id FILTER uri %]" - class="shared" - title="Shared by [% q.user.identity FILTER html %]" - >[% q.name FILTER html FILTER no_break %]</a></li> - [% print_pipe = 1 %] + [%- q.name FILTER uri %]&sharer_id=[% q.user.id FILTER uri %]" + class="shared" title="Shared by [% q.user.identity FILTER html %]"> + [%- q.name FILTER html %]</a> + </li> [% END %] </ul> </li> @@ -60,10 +57,11 @@ <li id="reports-saved"> <ul class="links"> [% FOREACH r = user.reports %] - <li>[% '<span class="separator">| </span>' IF print_pipe %] - <a href="report.cgi?[% r.query FILTER html %]&saved_report_id= - [%~ r.id FILTER uri %]">[% r.name FILTER html %]</a></li> - [% print_pipe = 1 %] + <li> + [% '<span class="separator">| </span>' UNLESS loop.first %] + <a href="report.cgi?[% r.query FILTER html %]&saved_report_id= + [%~ r.id FILTER uri %]">[% r.name FILTER html %]</a> + </li> [% END %] </ul> </li> diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index 492c2ad4b..a0ae25c08 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -97,6 +97,15 @@ [% terms.Bug %] aliases cannot be longer than 20 characters. Please choose a shorter alias. + [% ELSIF error == "api_key_not_valid" %] + [% title = "Invalid API key" %] + The API key you specified is invalid. Please check that you typed it + correctly. + + [% ELSIF error == "api_key_revoked" %] + [% title = "Invalid API key" %] + The API key you specified has been revoked by the user that created it. + [% ELSIF error == "attachment_bug_id_mismatch" %] [% title = "Invalid Attachments" %] You tried to perform an action on attachments from different [% terms.bugs %]. @@ -170,6 +179,8 @@ classifications [% ELSIF object == "components" %] components + [% ELSIF object == "comment_tags" %] + comment tags [% ELSIF object == "custom_fields" %] custom fields [% ELSIF object == "field_values" %] @@ -217,6 +228,11 @@ [% Hook.process("auth_failure") %] + [% ELSIF error == "auth_invalid_token" %] + [% title = 'A token error occurred' %] + The token '[% token FILTER html %]' is not valid. It could be because + you loaded this page more than 3 days ago. + [% ELSIF error == "auth_untrusted_request" %] [% title = "Untrusted Authentication Request" %] You tried to log in using the <em>[% login FILTER html %]</em> account, @@ -240,12 +256,12 @@ valid page identifier. [% ELSIF error == "bug_access_denied" %] - [% title = "Access Denied" %] + [% title = "$terms.Bug Access Denied" %] [% admindocslinks = {'groups.html' => 'Group Security'} %] You are not authorized to access [% terms.bug %] #[% bug_id FILTER html %]. [% ELSIF error == "bug_access_query" %] - [% title = "Access Denied" %] + [% title = "$terms.Bug Access Denied" %] [% docslinks = {'myaccount.html' => 'Creating an account'} %] You are not authorized to access [% terms.bug %] #[% bug_id FILTER html %]. To see this [% terms.bug %], you must @@ -265,7 +281,7 @@ [% ELSE %] [%+ field_descs.see_also FILTER html %] URLs should point to one of: <ul> - <li><code>show_bug.cgi</code> in a [% terms.Bugzilla %] + <li><code>show_bug.cgi</code> in a Bugzilla installation.</li> <li>A b[% %]ug on launchpad.net</li> <li>An issue on code.google.com.</li> @@ -274,7 +290,7 @@ <li>A ticket in a Trac installation.</li> <li>A b[% %]ug in a MantisBT installation.</li> <li>A b[% %]ug on sourceforge.net.</li> - <li>An issue on github.com.</li> + <li>An issue/pull request on github.com.</li> [% Hook.process('bug_url_invalid_tracker') %] </ul> [% END %] @@ -327,6 +343,25 @@ Comments cannot be longer than [%+ constants.MAX_COMMENT_LENGTH FILTER html %] characters. + [% ELSIF error == "comment_tag_disabled" %] + [% title = "Comment Tagging Disabled" %] + The comment tagging is not enabled. + + [% ELSIF error == "comment_tag_invalid" %] + [% title = "Invalid Comment Tag" %] + The comment tag "[% tag FILTER html %]" contains invalid characters or + words. + + [% ELSIF error == "comment_tag_too_long" %] + [% title = "Comment Tag Too Long" %] + Comment tags cannot be longer than + [%+ constants.MAX_COMMENT_TAG_LENGTH FILTER html %] characters. + + [% ELSIF error == "comment_tag_too_short" %] + [% title = "Comment Tag Too Short" %] + Comment tags must be at least + [%+ constants.MIN_COMMENT_TAG_LENGTH FILTER html %] characters. + [% ELSIF error == "auth_classification_not_enabled" %] [% title = "Classification Not Enabled" %] Sorry, classification is not enabled. @@ -481,7 +516,7 @@ [% ELSIF error == "feature_disabled" %] The [% install_string("feature_$feature") FILTER html %] feature is not - available in this [% terms.Bugzilla %]. + available in this Bugzilla. [% IF user.in_group('admin') %] If you would like to enable this feature, please run <kbd>checksetup.pl</kbd> to see how to install the necessary @@ -643,10 +678,15 @@ <br>Alternately, if your attachment is an image, you could convert it to a compressible format like JPG or PNG and try again. - [% ELSIF error == "flag_requestee_disabled" %] + [% ELSIF error == "flag_type_requestee_disabled" %] [% title = "Flag not Requestable from Specific Person" %] You can't ask a specific person for <em>[% type.name FILTER html %]</em>. + [% ELSIF error == "flag_requestee_disabled" %] + [% title = "Flag Requestee Disabled" %] + You can't ask <em>[% requestee.identity FILTER html %]</em> because that + account is disabled. + [% ELSIF error == "flag_requestee_needs_privs" %] [% title = "Flag Requestee Needs Privileges" %] [% requestee.identity FILTER html %] does not have permission to set the @@ -728,6 +768,16 @@ You are not allowed to edit properties of the '[% flagtype.name FILTER html %]' flag type, because this flag type is not available for the products you can administer. + [% ELSIF error == "flag_not_unique" %] + [% title = "Flag not Unique" %] + The flag '[% value FILTER html %]' has been set multiple times. + You must specify the id value to update the flag. + + [% ELSIF error == "flag_type_not_unique" %] + [% title = "Flag Type not Unique" %] + The flag type '[% value FILTER html %]' matches several flag types. + You must specify the type id value to update or add a flag. + [% ELSIF error == "flag_type_not_multiplicable" %] [% docslinks = {'flags-overview.html' => 'An overview on Flags', 'flags.html' => 'Using Flags'} %] @@ -776,6 +826,11 @@ in the database which refer to it. All references to this group must be removed before you can remove it. + [% ELSIF error == "group_cannot_view" %] + [% title = "Cannot View Groups" %] + In order to view groups, you need to be a member of the 'editusers' or + 'creategroups' group, or have bless privileges to at least one group. + [% ELSIF error == "group_exists" %] [% title = "The group already exists" %] The group [% name FILTER html %] already exists. @@ -868,9 +923,9 @@ [% ELSIF error == "illegal_date" %] [% title = "Illegal Date" %] - '<tt>[% date FILTER html %]</tt>' is not a legal date. + '<kbd>[% date FILTER html %]</kbd>' is not a legal date. [% IF format %] - Please use the format '<tt>[% format FILTER html %]</tt>'. + Please use the format '<code>[% format FILTER html %]</code>'. [% END %] [% ELSIF error == "illegal_email_address" %] @@ -896,6 +951,13 @@ Your group control combination for group " [% groupname FILTER html %]" is illegal. + [% ELSIF error == "illegal_pronoun" %] + [% title = "Illegal Pronoun" %] + The pronoun you used ([% pronoun FILTER html %]) is illegal. You must use + one of the approved pronouns. Please see + <a href="[% docs_urlbase FILTER html %]query.html#pronouns">Pronoun Substitution</a> + for a complete list. + [% ELSIF error == "illegal_query_name" %] [% title = "Illegal Search Name" %] The name of your search cannot contain any of the following characters: @@ -914,9 +976,9 @@ [% ELSIF error == "illegal_time" %] [% title = "Illegal Time" %] - '<tt>[% time FILTER html %]</tt>' is not a legal time. + '<kbd>[% time FILTER html %]</kbd>' is not a legal time. [% IF format %] - Please use the format '<tt>[% format FILTER html %]</tt>'. + Please use the format '<code>[% format FILTER html %]</code>'. [% END %] [% ELSIF error == "illegal_regexp" %] @@ -963,11 +1025,6 @@ 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, - "file" or "patch"). - [% ELSIF error == "invalid_datasets" %] [% title = "Invalid Datasets" %] Invalid datasets <em>[% datasets.join(":") FILTER html %]</em>. Only digits, @@ -1005,10 +1062,6 @@ [% title = "Invalid Parameter" %] The new value for [% name FILTER html %] is invalid: [% err FILTER html %]. - [% ELSIF error == "invalid_product_name" %] - [% title = "Invalid Product Name" %] - The product name '[% product FILTER html %]' is invalid or does not exist. - [% ELSIF error == "invalid_regexp" %] [% title = "Invalid regular expression" %] The regular expression you entered is invalid. @@ -1044,13 +1097,13 @@ [% ELSIF error == "invalid_username" %] [% title = "Invalid Username" %] - The name <tt>[% name FILTER html %]</tt> is not a valid username. + The name <kbd>[% name FILTER html %]</kbd> is not a valid username. Either you misspelled it, or the person has not registered for a [% terms.Bugzilla %] account. - [% ELSIF error == "invalid_username_or_password" %] - [% title = "Invalid Username Or Password" %] - The username or password you entered is not valid. + [% ELSIF error == "invalid_login_or_password" %] + [% title = "Invalid Login Or Password" %] + The login or password you entered is not valid. [%# People get two login attempts before being warned about # being locked out. #%] @@ -1063,6 +1116,11 @@ the "Forgot Password" link. [% END %] + [% ELSIF error == "invalid_cookies_or_token" %] + [% title = "Invalid Cookies or Token" %] + The cookies or token provide were not valid or have expired. + You may login again to get new cookies or a new token. + [% ELSIF error == "json_rpc_get_method_required" %] When using JSON-RPC over GET, you must specify a 'method' parameter. See the documentation at @@ -1087,6 +1145,13 @@ For security reasons, you must use HTTP POST to call the '[% method FILTER html %]' method. + [% ELSIF error == "rest_invalid_resource" %] + A REST API resource was not found for '[% method FILTER html +%] [%+ path FILTER html %]'. + + [% ELSIF error == "get_products_invalid_type" %] + The product type '[% type FILTER html %]' is invalid. Valid choices + are 'accessible', 'selectable', and 'enterable'. + [% ELSIF error == "keyword_already_exists" %] [% title = "Keyword Already Exists" %] A keyword with the name [% name FILTER html %] already exists. @@ -1122,7 +1187,7 @@ [% ELSIF error == "migrate_from_invalid" %] '[% from FILTER html %]' is not a valid type of [% terms.bug %]-tracker - to migrate from. See the contents of the <kbd>B[% %]ugzilla/Migrate/</kbd> + to migrate from. See the contents of the <kbd>Bugzilla/Migrate/</kbd> directory for a list of valid [% terms.bug %]-trackers. [% ELSIF error == "milestone_already_exists" %] @@ -1289,6 +1354,8 @@ to modify. [% ELSIF action == "view" %] to view. + [% ELSIF action == 'summarize' %] + for viewing time summaries. [% END %] [% ELSIF error == "no_tag_to_edit" %] @@ -1299,6 +1366,11 @@ [% title = "No Initial $terms.Bug Status" %] No [% terms.bug %] status is available on [% terms.bug %] creation. Please report the problem to [% Param("maintainer") %]. + + [% ELSIF error == "no_keywords" %] + [% title = "No Keywords" %] + [% admindocslinks = {'keywords.html' => 'Setting up a keyword'} %] + No keywords have been defined for this installation. [% ELSIF error == "no_new_quips" %] [% title = "No New Quips" %] @@ -1317,6 +1389,12 @@ Either no products have been defined to enter [% terms.bugs %] against or you have not been given access to any. + [% ELSIF error == "number_not_integer" %] + [% title = "Integer Value Required" %] + The value '[% num FILTER html %]' in the + <em>[% field_descs.$field FILTER html %]</em> field + is not an integer value (i.e. a whole number). + [% ELSIF error == "number_not_numeric" %] [% title = "Numeric Value Required" %] The value '[% num FILTER html %]' in the @@ -1357,8 +1435,7 @@ Either you mis-typed the name or that user has not yet registered for a [% terms.Bugzilla %] account. [% ELSIF class == "Bugzilla::Keyword" %] - The legal keyword names are <a href="describekeywords.cgi">listed - here</a>. + See the list of available <a href="describekeywords.cgi">keywords</a>. [% END %] [% ELSIF error == "old_password_incorrect" %] @@ -1377,18 +1454,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 uri %]"> - 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 [%+ constants.USER_PASSWORD_MIN_LENGTH FILTER html %] characters long. + [% IF locked_user %] + You must <a href="token.cgi?a=reqpw&loginname=[% locked_user.email FILTER uri %]&token=[% issue_hash_token(['reqpw']) FILTER uri %]"> + request a new password</a> in order to log in again. + [% END %] [% ELSIF error == "password_not_complex" %] [% title = "Password Fails Requirements" %] @@ -1406,6 +1479,10 @@ <li>digit</li> [% END %] </ul> + [% IF locked_user %] + You must <a href="token.cgi?a=reqpw&loginname=[% locked_user.email FILTER uri %]&token=[% issue_hash_token(['reqpw']) FILTER uri %]"> + request a new password</a> in order to log in again. + [% END %] [% ELSIF error == "product_access_denied" %] [% title = "Product Access Denied" %] @@ -1519,7 +1596,7 @@ [% ELSIF error == "quicksearch_unbalanced_quotes" %] [% title = "Badly Formatted Query" %] - [% terms.Bugzilla %] is unable to parse your query correctly: + Bugzilla is unable to parse your query correctly: <em>[% string FILTER html %]</em>.<br> If you use quotes to enclose strings, make sure both quotes are present. If you really want to look for a quote in a string, type \" instead of ". @@ -1618,7 +1695,7 @@ field. [% ELSIF error == "search_grouped_field_invalid" %] - [% terms.Bugzilla %] does not support using the + Bugzilla does not support using the "[%+ field_descs.$field FILTER html %]" ([% field FILTER html %]) field with grouped search conditions. @@ -1629,7 +1706,7 @@ All conditions under a groups search must use the same field. [% ELSIF error == "search_field_operator_invalid" %] - [% terms.Bugzilla %] does not support using the + Bugzilla does not support using the "[%+ field_descs.$field FILTER html %]" ([% field FILTER html %]) field with the "[% search_descs.$operator FILTER html %]" ([% operator FILTER html %]) search type. @@ -1704,7 +1781,7 @@ [% ELSIF error == "tag_name_too_long" %] [% title = "Tag Name Too Long" %] - The tag name must be less than [% constants.MAX_LEN_QUERY_NAME FILTER html %] + The tag must be less than [% constants.MAX_LEN_QUERY_NAME FILTER html %] characters long. [% ELSIF error == "token_does_not_exist" %] @@ -1734,7 +1811,7 @@ [% ELSIF error == "unknown_tab" %] [% title = "Unknown Tab" %] - <code>[% current_tab_name FILTER html %]</code> is not a legal tab name. + There is no tab named <code>[% current_tab_name FILTER html %]</code>. [% ELSIF error == "value_inactive" %] [% title = "Value is Not Active" %] @@ -1795,12 +1872,12 @@ [% ELSIF error == "user_match_failed" %] [% title = "Match Failed" %] - <tt>[% name FILTER html %]</tt> does not exist or you are not allowed + <kbd>[% name FILTER html %]</kbd> does not exist or you are not allowed to see that user. [% ELSIF error == "user_match_too_many" %] [% title = "No Conclusive Match" %] - [% terms.Bugzilla %] cannot make a conclusive match for one or more + Bugzilla cannot make a conclusive match for one or more of the names and/or email addresses you entered for the [% fields.join(', ') FILTER html %] field(s). @@ -1809,6 +1886,16 @@ Sorry, but you are not allowed to (un)mark comments or attachments as private. + [% ELSIF error == "user_not_involved" %] + [% title = "User Not Involved with $terms.Bug" %] + Sorry, but you are not involved with [% terms.Bug %] [%+ + bug_id FILTER bug_link(bug_id) FILTER none %]. + + [% ELSIF error == "webdot_too_large" %] + [% title = "Dependency Graph Too Large" %] + The dependency graph contains too many [% terms.bugs %] to display (more + than [% constants.MAX_WEBDOT_BUGS FILTER html %] [%+ terms.bugs %]). + [% ELSIF error == "wrong_token_for_cancelling_email_change" %] [% title = "Wrong Token" %] That token cannot be used to cancel an email address change. @@ -1888,15 +1975,11 @@ admindocslinks = admindocslinks %] -<table cellpadding="20"> - <tr> - <td id="error_msg" class="throw_error"> - [% error_message FILTER none %] - </td> - </tr> -</table> +<div id="error_msg" class="throw_error"> + [% error_message FILTER none %] +</div> -<p> +<p id="post_err_msg"> Please press <b>Back</b> and try again. </p> diff --git a/template/en/default/global/userselect.html.tmpl b/template/en/default/global/userselect.html.tmpl index 828c4bb58..e2210c6f2 100644 --- a/template/en/default/global/userselect.html.tmpl +++ b/template/en/default/global/userselect.html.tmpl @@ -20,6 +20,7 @@ # 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 + # mandatory: optional; if true, the field cannot be empty. #%] [% IF Param("usemenuforusers") %] @@ -31,6 +32,7 @@ [% 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 mandatory %] required [% END %] > [% IF emptyok %] <option value=""></option> @@ -83,6 +85,7 @@ [% IF field_title %] title="[% field_title FILTER html %]" [% END %] [% IF size %] size="[% size FILTER html %]" [% END %] [% IF id %] id="[% id FILTER html %]" [% END %] + [% IF mandatory %] required [% END %] > [% IF feature_enabled('jsonrpc') && Param('ajax_user_autocompletion') && id %] <div id="[% id FILTER html %]_autocomplete_container"></div> diff --git a/template/en/default/global/variables.none.tmpl b/template/en/default/global/variables.none.tmpl index 9e411e3cd..4587d229f 100644 --- a/template/en/default/global/variables.none.tmpl +++ b/template/en/default/global/variables.none.tmpl @@ -24,6 +24,8 @@ "ABug" => "A Bug", "bugs" => "bugs", "Bugs" => "Bugs", + "comment" => "comment", + "comments" => "comments", "zeroSearchResults" => "Zarro Boogs found", "Bugzilla" => "Bugzilla" } diff --git a/template/en/default/index.html.tmpl b/template/en/default/index.html.tmpl index b47b912c0..84a5b7d5c 100644 --- a/template/en/default/index.html.tmpl +++ b/template/en/default/index.html.tmpl @@ -14,57 +14,18 @@ title = "$terms.Bugzilla Main Page" header = "Main Page" header_addl_info = "version $constants.BUGZILLA_VERSION" - style_urls = [ 'skins/standard/index.css' ] %] - -<script type="text/javascript"> -<!-- -function onLoadActions() { - quicksearchHelpText('quicksearch_main', 'show'); - if( window.external.AddSearchProvider ){ - YAHOO.util.Dom.removeClass('quicksearch_plugin', 'bz_default_hidden'); - } - document.getElementById('quicksearch_top').focus(); -} -var quicksearch_message = "Enter [% terms.abug %] # or some search terms"; - -function checkQuicksearch( form ) { - if (form.quicksearch.value == '' || form.quicksearch.value == quicksearch_message ) { - alert('Please enter one or more search terms first.'); - return false; - } - return true; -} - -function quicksearchHelpText(el_id, action){ - var el = document.getElementById(el_id); - if ( action == "show") { - if( el.value == "" ) { - el.value = quicksearch_message - YAHOO.util.Dom.addClass(el, "quicksearch_help_text"); - } - } else { - if( el.value == quicksearch_message ) { - el.value = ""; - YAHOO.util.Dom.removeClass(el, "quicksearch_help_text"); - } - } -} -YAHOO.util.Event.onDOMReady(onLoadActions); -//--> -</script> - [% IF release %] <div id="new_release"> [% IF release.data %] [% IF release.deprecated %] - <p>[% terms.Bugzilla %] [%+ release.deprecated FILTER html %] is no longer + <p>Bugzilla [%+ release.deprecated FILTER html %] is no longer supported. You are highly encouraged to upgrade in order to keep your system secure.</p> [% END %] - <p>A new [% terms.Bugzilla %] version ([% release.data.latest_ver FILTER html %]) + <p>A new Bugzilla version ([% release.data.latest_ver FILTER html %]) is available at <a href="[% release.data.url FILTER html %]">[% release.data.url FILTER html %]</a>.<br> Release date: [% release.data.date FILTER html %]</p> @@ -101,73 +62,102 @@ YAHOO.util.Event.onDOMReady(onLoadActions); [% END %] <div id="page-index"> - <table> - <tr> - <td> - <h1 id="welcome"> Welcome to [% terms.Bugzilla %]</h1> - <div class="intro">[% Hook.process('intro') %]</div> + <h1 id="welcome"> Welcome to [% terms.Bugzilla %]</h1> + <div class="intro">[% Hook.process('intro') %]</div> + + <div class="bz_common_actions"> + <ul> + <li> + <a id="enter_bug" href="enter_bug.cgi"><span>File [% terms.aBug %]</span></a> + </li> + <li> + <a id="query" href="query.cgi"><span>Search</span></a> + </li> + <li> + <a id="account" + [% IF user.id %] + href="userprefs.cgi"><span>User Preferences</span></a> + [% ELSIF Param('createemailregexp') && user.authorizer.user_can_create_account %] + href="createaccount.cgi"><span>Open a New Account</span></a> + [% ELSE %] + href="?GoAheadAndLogIn=1"><span>Log In</span></a> + [% END %] + </li> + <li> + <a id="help" href="[% docs_urlbase FILTER html %]using/index.html"><span>Documentation</span></a> + </li> + </ul> + </div> - <div class="bz_common_actions"> - <ul> - <li> - <a id="enter_bug" href="enter_bug.cgi"><span>File - [%= terms.aBug %]</span></a> - </li> - <li> - <a id="query" href="query.cgi"><span>Search</span></a> - </li> - <li> - <a id="account" - [% IF user.id %] - href="userprefs.cgi"><span>User Preferences</span></a> - [% ELSIF Param('createemailregexp') - && user.authorizer.user_can_create_account - %] - href="createaccount.cgi"><span>Open a New Account</span></a> - [% ELSE %] - href="?GoAheadAndLogIn=1"><span>Log In</span></a> - [% END %] - </li> - </ul> - </div> + <div> + <form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi"> + <input id="quicksearch_main" name="quicksearch" title="Quick Search" + placeholder="Enter [% terms.abug %] # or some search terms" + autofocus required> + <input id="find" type="submit" value="Quick Search"> + <a href="page.cgi?id=quicksearch.html" title="Quick Search help">[?]</a> + </form> + + <ul class="additional_links"> + [% Hook.process('additional_links') %] + </ul> + </div> + + <div id="common_queries"> + <h4>Common Queries:</h4> + <ul> + [% IF user.id %] + <li> + [% title = BLOCK %]Open [% terms.bugs %] assigned to me[% END %] + <a href="buglist.cgi?f1=assigned_to&o1=equals&v1=%25user%25&resolution=---"> + [% title FILTER html %]</a> ([% assignee_count FILTER html %]) + <a href="buglist.cgi?f1=assigned_to&o1=equals&v1=%25user%25&resolution=---&ctype=atom&title=[% title FILTER uri %]" + class="rss"> </a> + </li> + <li> + [% title = BLOCK %]Open [% terms.bugs %] reported by me[% END %] + <a href="buglist.cgi?f1=reporter&o1=equals&v1=%25user%25&resolution=---"> + [% title FILTER html %]</a> ([% reporter_count FILTER html %]) + <a href="buglist.cgi?f1=reporter&o1=equals&v1=%25user%25&resolution=---&ctype=atom&title=[% title FILTER uri %]" + class="rss"> </a> + </li> + [% IF Bugzilla.has_flags %] + <li> + [% title = BLOCK %]Requests addressed to me[% END %] + <a href="request.cgi?action=queue&requestee=[% user.login FILTER uri %]&group=type&do_union=0"> + [% title FILTER html %]</a> ([% requestee_count FILTER html %]) + <a href="buglist.cgi?f1=requestees.login_name&o1=equals&v1=%25user%25&ctype=atom&title=[% title FILTER uri %]" + class="rss"> </a> + </li> + [% END %] + [% END %] + + <li> + [% terms.Bugs %] reported in the + <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=24h">last 24 hours</a> + [% title = BLOCK %][% terms.Bugs %] reported in the last 24 hours[% END %] + <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=24h&ctype=atom&title=[% title FILTER uri %]" + class="rss"> </a> + | <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=7d">last 7 days</a> + [% title = BLOCK %][% terms.Bugs %] reported in the last 7 days[% END %] + <a href="buglist.cgi?chfield=%5BBug%20creation%5D&chfieldfrom=7d&ctype=atom&title=[% title FILTER uri %]" + class="rss"> </a> + </li> + <li> + [% terms.Bugs %] changed in the + <a href="buglist.cgi?chfieldfrom=24h">last 24 hours</a> + [% title = BLOCK %][% terms.Bugs %] changed in the last 24 hours[% END %] + <a href="buglist.cgi?chfieldfrom=24h&ctype=atom&title=[% title FILTER uri %]" + class="rss"> </a> + | <a href="buglist.cgi?chfieldfrom=7d">last 7 days</a> + [% title = BLOCK %][% terms.Bugs %] changed in the last 7 days[% END %] + <a href="buglist.cgi?chfieldfrom=7d&ctype=atom&title=[% title FILTER uri %]" + class="rss"> </a> + </li> + </ul> + </div> - <form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi" - onsubmit="return checkQuicksearch(this);"> - <div> - <input id="quicksearch_main" type="text" name="quicksearch" - title="Quick Search" - onfocus="quicksearchHelpText(this.id, 'hide');" - onblur="quicksearchHelpText(this.id, 'show');" - > - <input id="find" type="submit" value="Quick Search"> - <ul class="additional_links" id="quicksearch_links"> - <li> - <a href="page.cgi?id=quicksearch.html">Quick Search help</a> - </li> - <li class="bz_default_hidden" id="quicksearch_plugin"> - | - <a href="javascript:window.external.AddSearchProvider('[% urlbase FILTER html %]search_plugin.cgi')"> - Install the Quick Search plugin - </a> - </li> - </ul> - <ul class="additional_links"> - <li> - <a href="[% docs_urlbase FILTER html %]using.html"> - [%- terms.Bugzilla %] User's Guide</a> - </li> - <li> - | - <a href="page.cgi?id=release-notes.html">Release Notes</a> - </li> - [% Hook.process('additional_links') %] - </ul> - </div> - </form> - <div class="outro">[% Hook.process('outro') %]</div> - </td> - </tr> - </table> + <div class="outro">[% Hook.process('outro') %]</div> </div> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/list/change-columns.html.tmpl b/template/en/default/list/change-columns.html.tmpl index 17d711eec..c0279803c 100644 --- a/template/en/default/list/change-columns.html.tmpl +++ b/template/en/default/list/change-columns.html.tmpl @@ -8,7 +8,7 @@ [% PROCESS global/header.html.tmpl title = "Change Columns" - javascript_urls = "js/change-columns.js" + javascript_urls = [ "js/change-columns.js" ] onload = "initChangeColumns()" %] diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl index 465578a31..e581f0892 100644 --- a/template/en/default/list/edit-multiple.html.tmpl +++ b/template/en/default/list/edit-multiple.html.tmpl @@ -10,6 +10,11 @@ <input type="hidden" name="dontchange" value="[% dontchange FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> +<input type="button" id="uncheck_all" value="Uncheck All" + class="bz_default_hidden" onclick="SetCheckboxes(false);"> +<input type="button" id="check_all" value="Check All" + class="bz_default_hidden" onclick="SetCheckboxes(true);"> + <script type="text/javascript"> function SetCheckboxes(value) { var elements = document.forms.changeform.getElementsByTagName('input'), @@ -22,30 +27,38 @@ } } } - document.write(' <input type="button" name="uncheck_all" value="Uncheck All" onclick="SetCheckboxes(false);">'); - document.write(' <input type="button" name="check_all" value="Check All" onclick="SetCheckboxes(true);">'); + YAHOO.util.Dom.removeClass("check_all", "bz_default_hidden"); + YAHOO.util.Dom.removeClass("uncheck_all", "bz_default_hidden"); </script> <hr> -<p style="font-size:smaller"> - To change multiple [% terms.bugs %]:</p> -<ol style="font-size:smaller"> - <li>Check the [% terms.bugs %] you want to change above.</li> - <li>Make your changes in the form fields below. If the change - you are making requires an explanation, include it in - the comments box.</li> - <li>Click the <em>Commit</em> button.</li> -</ol> +<div class="bz_info"> + To change multiple [% terms.bugs %]: + <ol> + <li>Check the [% terms.bugs %] you want to change above.</li> + <li>Make your changes in the form fields below. If the change + you are making requires an explanation, include it in + the comments box.</li> + <li>Click the <em>Commit</em> button.</li> + </ol> +</div> + +[% IF excluded_values %] + <p class="extra_info">Only values that are available for all products of the above + [%+ terms.bugs %] are shown.</p> +[% END %] <table id="form"> <tr> <th><label for="product">Product:</label></th> <td> - [% PROCESS selectmenu menuname = "product" - menuitems = products - property = "name" %] + [% INCLUDE "global/product-select.html.tmpl" + id => "product" + name => "product" + dontchange => dontchange + %] </td> <th><label for="version">Version:</label></th> @@ -116,7 +129,7 @@ <th><label for="target_milestone">Target Milestone:</label></th> <td> [% PROCESS selectmenu menuname = "target_milestone" - menuitems = targetmilestones %] + menuitems = milestones %] </td> [% END %] </tr> @@ -259,11 +272,11 @@ [% IF Param('usestatuswhiteboard') %] <tr> - <td align="right"> - <b>Status Whiteboard:</b> - </td> + <th> + <label for="status_whiteboard">Status Whiteboard:</label> + </th> <td colspan="7"> - <input name="status_whiteboard" + <input name="status_whiteboard" id="status_whiteboard" value="[% dontchange FILTER html %]" size="60"> </td> </tr> @@ -288,7 +301,7 @@ [% IF user.is_insider %] <input type="checkbox" name="comment_is_private" value="1" id="newcommentprivacy" - onClick="updateCommentTagControl(this, 'comment')"/> + onClick="updateCommentTagControl(this, 'comment')"> <label for="newcommentprivacy"> Make comment private (visible only to members of the <strong>[% Param('insidergroup') FILTER html %]</strong> group) @@ -308,6 +321,13 @@ </script> [% END %] +[% IF flag_types %] +<b><label for="flags">Flags:</label></b><br> +[% PROCESS "flag/list.html.tmpl" + edit_multiple_bugs = 1 + flag_no_header = 1 %] +[% END %] + [% Hook.process('before_groups') %] [% IF groups.size > 0 %] @@ -322,23 +342,23 @@ </script> <b>Groups:</b><br> - <table border="1"> + <table id="groups_edit_multiple"> <tr> - <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> + <th class="narrow_column">Remove [% terms.bugs %] from this group</th> + <th class="narrow_column">Add [% terms.bugs %] to this group</th> + <th>Group Name</th> </tr> [% FOREACH group = groups %] <tr> - <td align="center"> + <td class="center"> <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"> + <td class="center"> <input type="checkbox" name="groups" id="group_[% group.id FILTER html %]" value="[% group.name FILTER html %]" @@ -360,7 +380,7 @@ </table> [% IF foundinactive %] - <p style="font-size:smaller">(Note: [% terms.Bugs %] may not be added to [% FILTER inactive %]inactive + <p class="bz_info">(Note: [% terms.Bugs %] may not be added to [% FILTER inactive %]inactive groups[% END %], only removed.)</p> [% END %] diff --git a/template/en/default/list/list-simple.html.tmpl b/template/en/default/list/list-simple.html.tmpl index 24e2bcf5a..01f784d59 100644 --- a/template/en/default/list/list-simple.html.tmpl +++ b/template/en/default/list/list-simple.html.tmpl @@ -12,8 +12,8 @@ [% DEFAULT title = "$terms.Bug List" %] +<!DOCTYPE html> <html> - <head> <title>[% title FILTER html %]</title> <base href="[% urlbase FILTER html %]"> @@ -28,5 +28,4 @@ [% PROCESS list/table.html.tmpl %] [% END %] </body> - </html> diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl index e179a90e4..65065bf32 100644 --- a/template/en/default/list/list.html.tmpl +++ b/template/en/default/list/list.html.tmpl @@ -59,12 +59,12 @@ [% PROCESS global/header.html.tmpl title = title - style = style + generate_api_token = dotweak atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom" yui = [ 'autocomplete', 'calendar' ] javascript_urls = [ "js/util.js", "js/field.js", "js/TUI.js" ] style_urls = [ "skins/standard/buglist.css" ] - doc_section = "query.html#list" + doc_section = "using/finding.html" %] <div class="bz_query_head"> @@ -76,7 +76,7 @@ <div class="bz_query_debug"> <p>Total execution time: [% query_time FILTER html %] seconds</p> [% FOREACH query = queries %] - <p>[% query.sql FILTER html %]</p> + <pre>[% query.sql FILTER html %]</pre> <p>Execution time: [% query.time FILTER html %] seconds</p> [% IF query.explain %] <pre>[% query.explain FILTER html %]</pre> @@ -86,7 +86,7 @@ [% END %] [% IF user.settings.display_quips.value == 'on' %] - [% DEFAULT quip = "$terms.Bugzilla would like to put a random quip here, but no one has entered any." %] + [% DEFAULT quip = "Bugzilla would like to put a random quip here, but no one has entered any." %] <span class="bz_quip"> <a href="quips.cgi"><em>[% quip FILTER html %]</em></a> </span> @@ -96,7 +96,7 @@ [% IF toolong %] <h2 class="bz_smallminded"> - This list is too long for [% terms.Bugzilla %]'s little mind; the + This list is too long for Bugzilla's little mind; the Next/Prev/First/Last buttons won't appear on individual [% terms.bugs %]. </h2> [% END %] @@ -105,7 +105,7 @@ 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq', 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter', 'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords', - 'nowordssubstr', 'notmatches', + 'nowordssubstr', 'notmatches', 'isempty', 'isnotempty' ] %] <a id="search_description_controller" class="bz_default_hidden" href="javascript:TUI_toggle_class('search_description')">Hide Search Description</a> @@ -175,8 +175,6 @@ </ul> [% END %] -<br> - [%############################################################################%] [%# Rest of Change Form #%] [%############################################################################%] @@ -191,24 +189,15 @@ [%# Navigation Bar #%] [%############################################################################%] -<table> - <tr> + <div class="buglist_menu"> [% IF bugs.size > 0 %] - <td valign="middle" class="bz_query_buttons"> + <div class="bz_query_buttons"> <form method="post" action="show_bug.cgi"> - [% id = buglist.join(",") %] - <input type="hidden" name="id" value="[% id FILTER html %]"> + [% buglist_joined = buglist.join(",") %] + <input type="hidden" name="id" value="[% buglist_joined FILTER html %]"> <input type="hidden" name="format" value="multiple"> <input type="submit" id="long_format" value="Long Format"> </form> - <form method="post" action="show_bug.cgi"> - <input type="hidden" name="ctype" value="xml"> - [% FOREACH id = buglist %] - <input type="hidden" name="id" value="[% id FILTER html %]"> - [% END %] - <input type="hidden" name="excludefield" value="attachmentdata"> - <input type="submit" value="XML" id="xml"> - </form> [% IF user.is_timetracker %] <form method="post" action="summarize_time.cgi"> @@ -216,77 +205,89 @@ <input type="submit" id="timesummary" value="Time Summary"> </form> [% IF time_summary_limited %] - <small> - Time Summary will only include the [% terms.bugs %] shown above. In order to - to see a time summary for all [% terms.bugs %] found by the search, you can + <span class="bz_info"> + Time Summary will only include the [% terms.bugs %] shown above. + In order to see a time summary for all [% terms.bugs %] found + by the search, you can <a href="buglist.cgi?[% urlquerypart FILTER html %] [%- "&order=$qorder" FILTER html IF order %]&limit=0"> - Show all search results</a>.</small> + show all search results</a>. + </span> [% END %] [% END %] - </td> - - <td> </td> - - <td valign="middle" class="bz_query_links"> - <a href="buglist.cgi? - [% urlquerypart FILTER html %]&ctype=csv&human=1">CSV</a> | - <a href="buglist.cgi? - [% urlquerypart FILTER html %]&title= - [%- title FILTER html %]&ctype=atom">Feed</a> | - <a href="buglist.cgi? - [% urlquerypart FILTER html %]&ctype=ics">iCalendar</a> | - <a href="colchange.cgi? - [% urlquerypart FILTER html %]&query_based_on= - [% defaultsavename OR searchname FILTER uri %]">Change Columns</a> | + + <form method="post" action="show_bug.cgi"> + <input type="hidden" name="ctype" value="xml"> + [% FOREACH id = buglist %] + <input type="hidden" name="id" value="[% id FILTER html %]"> + [% END %] + <input type="hidden" name="excludefield" value="attachmentdata"> + <button type="submit" id="xml"> + <img src="images/xml.png" width="24" height="24" alt="XML" title="XML Format"> + </button> + </form> + </div> + <div class="bz_query_links"> + <a href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=csv&human=1" + ><img title="CSV Format" alt="CSV" src="images/csv.png" height="24" width="24"></a> + <a href="buglist.cgi?[% urlquerypart FILTER html %]&title= + [%- title FILTER uri %]&ctype=atom" + ><img title="Feed Format" alt="Feed" src="images/rss.png" height="24" width="24"></a> + <a href="buglist.cgi?[% urlquerypart FILTER html %]&ctype=ics" + ><img title="iCal Format" alt="iCal" src="images/ical.png" height="24" width="24"></a> + <button type="button" id="change_columns" + onclick="document.location='colchange.cgi?[% urlquerypart FILTER html %]&query_based_on= + [%~ defaultsavename OR searchname FILTER uri %]'"> + Change Columns</button> + [% IF bugs.size > 1 && caneditbugs && !dotweak %] - <a href="buglist.cgi?[% urlquerypart FILTER html %] - [%- "&order=$qorder" FILTER html IF order %]&tweak=1" - >Change Several [% terms.Bugs %] at Once</a> - | + <button type="button" id="mass_change" + onclick="document.location='buglist.cgi?[% urlquerypart FILTER html %] + [%- "&order=$qorder" FILTER html IF order %]&tweak=1'"> + Change Several [% terms.Bugs %] at Once</button> [% END %] [% IF bugowners && user.id %] - <a href="mailto: - [% bugowners FILTER html %]">Send Mail to [% terms.Bug %] Assignees</a> | + <button type="button" id="email_assignees" + onclick="document.location='mailto:[% bugowners FILTER html %]'"> + Send Mail to [% terms.Bug %] Assignees</button> [% END %] [%# Links to more things users can do with this bug list. %] [% Hook.process("links") %] - </td> + </div> + <br> [% END %] - - <td valign="middle" class="bz_query_edit"> - <a href="[% PROCESS edit_search_url %]">Edit Search</a> - </td> - + <div class="bz_query_edit"> + <button type="button" id="edit_search" + onclick="document.location='[% PROCESS edit_search_url %]'"> + Edit Search</button> + </div> + [% IF searchtype == "saved" %] - <td valign="middle" nowrap="nowrap" class="bz_query_forget"> - | - <a href="buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd= - [% searchname FILTER uri %]&token= - [% issue_hash_token([search_id, searchname]) FILTER uri %]"> - Forget Search '[% searchname FILTER html %]'</a> - </td> + <div class="bz_query_forget"> + <button type="button" id="forget_search" + onclick="document.location='buglist.cgi?cmdtype=dorem&remaction=forget&namedcmd= + [%- searchname FILTER uri %]&token= + [%- issue_hash_token([search_id, searchname]) FILTER uri %]'"> + Forget Search '[% searchname FILTER html %]'</button> + </div> [% ELSE %] - <td> </td> - - <td valign="middle" class="bz_query_remember"> + <div class="bz_query_remember"> <form method="get" action="buglist.cgi"> - <input type="submit" id="remember" value="Remember search"> as - <input type="hidden" name="newquery" + <input type="submit" id="remember" value="Remember search"> as + <input type="hidden" name="newquery" value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]"> <input type="hidden" name="cmdtype" value="doit"> <input type="hidden" name="remtype" value="asnamed"> <input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]"> <input type="text" id="save_newqueryname" name="newqueryname" size="20" - title="New query name" value="[% defaultsavename FILTER html %]"> - </form> - </td> - [% END %] - </tr> -</table> + title="New query name" value="[% defaultsavename FILTER html %]"> + </form> + </div> + [% END %] + </div> [% IF one_product.defined && bugs.size %] <p class="bz_query_single_product"> @@ -315,10 +316,16 @@ [% BLOCK enter_bug_link %] <a href="enter_bug.cgi [%- IF one_product.defined %]?product= - [%- one_product.name FILTER uri %][% END %]">File + [%- one_product.name FILTER uri %] + [%- IF one_component.defined %]&component= + [%- one_component FILTER uri %][% END %][% END %]">File a new [% terms.bug %] [% IF one_product.defined %] - in the "[% one_product.name FILTER html %]" product + in the + [% IF one_component.defined %] + "[% one_component FILTER html %]" component of the + [% END %] + "[% one_product.name FILTER html %]" product [% END %]</a> [% END %] diff --git a/template/en/default/list/list.ics.tmpl b/template/en/default/list/list.ics.tmpl index 4295b4642..327ae171c 100644 --- a/template/en/default/list/list.ics.tmpl +++ b/template/en/default/list/list.ics.tmpl @@ -21,6 +21,9 @@ BEGIN:VTODO [% IF bug.changeddate %] [%+ bug.changedtime FILTER time("%Y%m%dT%H%M%SZ", "UTC") FILTER ics('LAST-MODIFIED') +%] [% END %] +[% IF bug.deadline %] +[%+ bug.deadline FILTER time("%Y%m%dT%H%M%SZ", "UTC") FILTER ics('DUE') +%] +[% END %] [% IF bug.percentage_complete %] [%+ bug.percentage_complete FILTER format('%d') FILTER ics('PERCENT-COMPLETE') +%] [% END %] diff --git a/template/en/default/list/quips.html.tmpl b/template/en/default/list/quips.html.tmpl index 31e766a9b..e928cf0c5 100644 --- a/template/en/default/list/quips.html.tmpl +++ b/template/en/default/list/quips.html.tmpl @@ -15,36 +15,13 @@ #%] [% PROCESS global/header.html.tmpl - title = "$terms.Bugzilla Quip System" + title = "Bugzilla Quip System" header = "Add your own clever headline" + style_urls = ['skins/standard/buglist.css'] %] -[% IF added_quip %] - <p> - <font color="red"> - Your quip '<tt>[% added_quip FILTER html %]</tt>' has been added. - [% IF Param("quip_list_entry_control") == "moderated" AND !user.in_group('bz_quip_moderators') %] - It will be used as soon as it gets approved. - [% END %] - </font> - </p> -[% END %] - -[% IF deleted_quip %] - <p> - <font color="red"> - The quip '<tt>[% deleted_quip FILTER html %]</tt>' has been deleted. - </font> - </p> -[% END %] - -[% IF approved or unapproved %] - <p>[% approved.size %] quips approved and [% unapproved.size %] quips unapproved</p> -[% END %] - - <p> - [% terms.Bugzilla %] will pick a random quip for the headline on each + Bugzilla will pick a random quip for the headline on each [% terms.bug %] list. </p> @@ -61,7 +38,7 @@ <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" maxlength="512"> + <input size="80" name="quip" maxlength="512" required> <p> <input type="submit" id="add" value="Add This Quip"> </p> @@ -93,13 +70,17 @@ <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> + <table id="quips"> + <thead> + <tr class="column_header"> <th>Quip</th> <th>Author</th> <th>Action</th> <th>Approved</th> - </tr></thead><tbody> + </tr> + </thead> + + <tbody> [% FOREACH quipid = quipids %] <tr> <td>[% quips.$quipid.quip FILTER html %]</td> @@ -114,7 +95,7 @@ Delete </a> </td> - <td> + <td class="center"> <input type="hidden" name="defined_quipid_[% quipid FILTER html %]" id="defined_quipid_[% quipid FILTER html %]" value="1"> @@ -126,7 +107,15 @@ [% END %] </tbody> </table> - <script type="text/javascript"><!-- + + <input type="button" id="uncheck_all" value="Uncheck All" + class="bz_default_hidden" onclick="SetCheckboxes(false);"> + <input type="button" id="check_all" value="Check All" + class="bz_default_hidden" onclick="SetCheckboxes(true);"> + <input type="submit" id="update" value="Save Changes"> + + <script type="text/javascript"> + <!-- var numelements = document.forms.editform.elements.length; function SetCheckboxes(value) { var item; @@ -135,13 +124,10 @@ item.checked = value; } } - document.write(' <input type="button" name="uncheck_all" ' - +'value="Uncheck All" onclick="SetCheckboxes(false);">'); - document.write(' <input type="button" name="check_all" ' - +'value="Check All" onclick="SetCheckboxes(true);">'); - //--></script> - - <input type="submit" id="update" value="Save Changes"> + YAHOO.util.Dom.removeClass("check_all", "bz_default_hidden"); + YAHOO.util.Dom.removeClass("uncheck_all", "bz_default_hidden"); + //--> + </script> </form> <br> [% END %] diff --git a/template/en/default/list/server-push.html.tmpl b/template/en/default/list/server-push.html.tmpl index c4a3a8455..65358e6cd 100644 --- a/template/en/default/list/server-push.html.tmpl +++ b/template/en/default/list/server-push.html.tmpl @@ -11,6 +11,7 @@ # query: string. The SQL query which makes the buglist. #%] +<!DOCTYPE html> <html> <head> <title>[% terms.Bugzilla %] is pondering your search</title> @@ -18,7 +19,11 @@ rel="stylesheet" type="text/css"> </head> <body> - <h1 style="margin-top: 20%; text-align: center; font-size: xx-large;">Please stand by ...</h1> + <h1 id="serverpush_msg">Please stand by ...</h1> + + <p class="center"> + <progress>Data is being retrieved...</progress> + </p> [% IF debug %] <p>[% query FILTER html %]</p> diff --git a/template/en/default/list/table.html.tmpl b/template/en/default/list/table.html.tmpl index 96f4ea342..d3abc9b21 100644 --- a/template/en/default/list/table.html.tmpl +++ b/template/en/default/list/table.html.tmpl @@ -28,6 +28,7 @@ [% field_descs.reporter_realname = field_descs.reporter %] [% field_descs.qa_contact_realname = field_descs.qa_contact %] +[%# Setting maxlength => 0 means no limit. We set it for performance reasons. %] [% abbrev = { "bug_severity" => { maxlength => 3 , title => "Sev" } , @@ -41,19 +42,22 @@ "qa_contact" => { maxlength => 30 , ellipsis => "..." , title => "QAContact" } , "qa_contact_realname" => { maxlength => 20 , ellipsis => "..." , title => "QAContact" } , "resolution" => { maxlength => 4 } , - "short_desc" => { wrap => 1 } , + "short_desc" => { maxlength => 0, wrap => 1 } , "short_short_desc" => { maxlength => 60 , ellipsis => "..." , wrap => 1 } , - "status_whiteboard" => { title => "Whiteboard" , wrap => 1 } , - "keywords" => { wrap => 1 } , - "flagtypes.name" => { wrap => 1 } , + "status_whiteboard" => { maxlength => 0, title => "Whiteboard" , wrap => 1 } , + "keywords" => { maxlength => 0, wrap => 1 } , + "tags" => { maxlength => 0, title => "Tags", wrap => 1}, + "dependson" => { maxlength => 0, wrap => 1 } , + "blocked" => { maxlength => 0, wrap => 1 } , + "flagtypes.name" => { maxlength => 0, wrap => 1 } , "component" => { maxlength => 8 , title => "Comp" } , "product" => { maxlength => 8 } , "version" => { maxlength => 5 , title => "Vers" } , - "op_sys" => { maxlength => 4 } , + "op_sys" => { maxlength => 12 } , "bug_file_loc" => { maxlength => 30 } , - "target_milestone" => { title => "TargetM" } , - "longdescs.count" => { title => "# Comments" }, - "percentage_complete" => { format_value => "%d %%" } , + "target_milestone" => { maxlength => 0, title => "TargetM" } , + "longdescs.count" => { maxlength => 0, title => "# Comments" }, + "percentage_complete" => { maxlength => 0, format_value => "%d %%" } , } %] @@ -66,7 +70,7 @@ [%############################################################################%] [% tableheader = BLOCK %] - <table class="bz_buglist" cellspacing="0" cellpadding="4" width="100%"> + <table class="bz_buglist"> <tr class="bz_buglist_header bz_first_buglist_header"> [% IF dotweak %] <th> </th> @@ -137,13 +141,13 @@ [% END %] [% BLOCK order_arrow %] - [% IF order.match("^$id DESC") %] + [% IF order.search("^$id DESC") %] <span class="bz_sort_order_primary">▼</span> - [% ELSIF order.match("^$id(,\\s*|\$)") %] + [% ELSIF order.search("^$id(,\\s*|\$)") %] <span class="bz_sort_order_primary">▲</span> - [% ELSIF order.match("\\b$id DESC") %] + [% ELSIF order.search("\\b$id DESC") %] <span class="bz_sort_order_secondary">▼</span> - [% ELSIF order.match("\\b$id(,\\s*|\$)") %] + [% ELSIF order.search("\\b$id(,\\s*|\$)") %] <span class="bz_sort_order_secondary">▲</span> [% END %] [% END %] @@ -174,45 +178,58 @@ [% END %] <td class="first-child bz_id_column"> <a href="show_bug.cgi?id=[% bug.bug_id %]">[% bug.bug_id %]</a> - <span style="display: none">[%+ '[SEC]' IF bug.secure_mode %]</span> + <span class="bz_default_hidden">[%+ '[SEC]' IF bug.secure_mode %]</span> </td> [% FOREACH column = displaycolumns %] - <td [% 'style="white-space: nowrap"' IF NOT abbrev.$column.wrap %] - class="bz_[% column FILTER css_class_quote %]_column"> - [% IF abbrev.$column.maxlength %] + [% col_abbrev = abbrev.$column %] + <td class="bz_[% column FILTER css_class_quote %]_column + [%~ ' nowrap' UNLESS col_abbrev.wrap + OR bug_fields.$column.type == constants.FIELD_TYPE_FREETEXT + OR bug_fields.$column.type == constants.FIELD_TYPE_TEXTAREA %]"> + [% IF col_abbrev.maxlength %] <span title="[%- display_value(column, bug.$column) FILTER html %]"> [% END %] - [% IF abbrev.$column.format_value %] - [%- bug.$column FILTER format(abbrev.$column.format_value) FILTER html -%] + [% IF col_abbrev.format_value %] + [%- bug.$column FILTER format(col_abbrev.format_value) FILTER html -%] [% ELSIF column == 'actual_time' || column == 'remaining_time' || column == 'estimated_time' %] [% PROCESS formattimeunit time_unit=bug.$column %] [%# Display the login name of the user if their real name is empty. %] - [% ELSIF column.match('_realname$') && bug.$column == '' %] + [% ELSIF column.search('_realname$') && bug.$column == '' %] [% SET login_column = column.remove('_realname$') %] - [% bug.${login_column}.truncate(abbrev.$column.maxlength, - abbrev.$column.ellipsis) FILTER html %] + [% bug.${login_column}.truncate(col_abbrev.maxlength, + col_abbrev.ellipsis) FILTER html %] [% ELSIF column == 'short_desc' || column == "short_short_desc" %] <a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]"> - [%- bug.$column.truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%] + [%- bug.$column.truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%] + </a> + [% ELSIF bug_fields.$column.type == constants.FIELD_TYPE_BUG_ID %] + <a href="show_bug.cgi?id=[% bug.$column FILTER html %]"> + [%- bug.$column.truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%] + </a> + [% ELSIF bug_fields.$column.type == constants.FIELD_TYPE_TEXTAREA %] + [%- bug.$column.truncate(256, '...') FILTER html -%] + [% ELSIF column == 'bug_file_loc' && is_safe_url(bug.bug_file_loc) %] + <a href="[% bug.bug_file_loc FILTER html %]" target="_blank" + rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]"> + [%- display_value(column, bug.$column).truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%] </a> [% ELSE %] - [%- display_value(column, bug.$column).truncate(abbrev.$column.maxlength, abbrev.$column.ellipsis) FILTER html -%] + [%- display_value(column, bug.$column).truncate(col_abbrev.maxlength, col_abbrev.ellipsis) FILTER html -%] [% END %] - [% IF abbrev.$column.maxlength %] + [% IF col_abbrev.maxlength %] </span> [% END %] </td> [% END %] </tr> +[% END %] - [% IF loop.last() && time_info.time_present == 1 %] - [% PROCESS time_summary_line %] - [% END %] - +[% IF time_info.time_present %] + [% PROCESS time_summary_line %] [% END %] </table> diff --git a/template/en/default/pages/bug-writing.html.tmpl b/template/en/default/pages/bug-writing.html.tmpl index 1fc097eda..22dd652a7 100644 --- a/template/en/default/pages/bug-writing.html.tmpl +++ b/template/en/default/pages/bug-writing.html.tmpl @@ -66,10 +66,10 @@ no-one else appears to have reported it, then:</p> A good summary should <b>quickly and uniquely identify [% terms.abug %] report</b>. It should explain the problem, not your suggested solution.<br> <ul> - <li>Good: "<tt>Cancelling a File Copy dialog crashes - File Manager</tt>"</li> - <li>Bad: "<tt>Software crashes</tt>"</li> - <li>Bad: "<tt>Browser should work with my web site</tt>"</li> + <li>Good: "<kbd>Cancelling a File Copy dialog crashes + File Manager</kbd>"</li> + <li>Bad: "<kbd>Software crashes</kbd>"</li> + <li>Bad: "<kbd>Browser should work with my web site</kbd>"</li> </ul> <b>Description:</b> diff --git a/template/en/default/pages/bugzilla.dtd.tmpl b/template/en/default/pages/bugzilla.dtd.tmpl index ee4492c61..56e7773e3 100644 --- a/template/en/default/pages/bugzilla.dtd.tmpl +++ b/template/en/default/pages/bugzilla.dtd.tmpl @@ -6,15 +6,15 @@ # defined by the Mozilla Public License, v. 2.0. #%] [% USE Bugzilla %] -<!ELEMENT [% "bugzilla" %] (bug+)> -<!ATTLIST [% "bugzilla" %] +<!ELEMENT bugzilla (bug+)> +<!ATTLIST bugzilla version CDATA #REQUIRED urlbase CDATA #REQUIRED maintainer CDATA #REQUIRED exporter CDATA #IMPLIED > <!ELEMENT [% "bug" %] (bug_id, - (alias?, + (alias*, creation_ts, short_desc, delta_ts, diff --git a/template/en/default/pages/fields.html.tmpl b/template/en/default/pages/fields.html.tmpl index 48b09aee0..8db61c519 100644 --- a/template/en/default/pages/fields.html.tmpl +++ b/template/en/default/pages/fields.html.tmpl @@ -6,9 +6,9 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[% PROCESS global/header.html.tmpl - title = "$terms.Bug Fields" - style_urls = ['skins/standard/page.css'] +[% PROCESS global/header.html.tmpl + title = "$terms.Bug Fields" + bodyclasses = ['narrow_page'] %] <p>This page describes the various fields that you see diff --git a/template/en/default/pages/linked.html.tmpl b/template/en/default/pages/linked.html.tmpl index 92d0f5920..3fcf87952 100644 --- a/template/en/default/pages/linked.html.tmpl +++ b/template/en/default/pages/linked.html.tmpl @@ -25,7 +25,7 @@ <hr> <p> - If you place it in <tt><pre></tt> tags, + If you place it in <code><pre></code> tags, the text will end up looking like this: </p> diff --git a/template/en/default/pages/linkify.html.tmpl b/template/en/default/pages/linkify.html.tmpl index e02ca8d57..eaf45ddd8 100644 --- a/template/en/default/pages/linkify.html.tmpl +++ b/template/en/default/pages/linkify.html.tmpl @@ -10,7 +10,7 @@ <p> If you enter some text, this form will return it marked up like a - standard [% terms.Bugzilla %] comment. That is, valid [% terms.bug %] numbers, + standard Bugzilla comment. That is, valid [% terms.bug %] numbers, URLs, email addresses and so on will be replaced with appropriate HTML links. </p> diff --git a/template/en/default/pages/quicksearch.html.tmpl b/template/en/default/pages/quicksearch.html.tmpl index f3794e1ed..8564f64d0 100644 --- a/template/en/default/pages/quicksearch.html.tmpl +++ b/template/en/default/pages/quicksearch.html.tmpl @@ -7,9 +7,8 @@ #%] [% INCLUDE global/header.html.tmpl - title = "$terms.Bugzilla QuickSearch", - style_urls = ['skins/standard/page.css'] - onload = 'document.forms[\'f\'].quicksearch.focus()' + title = "$terms.Bugzilla QuickSearch" + bodyclasses = ['narrow_page'] %] [% USE Bugzilla %] @@ -17,11 +16,8 @@ <p><label for="quicksearch">Type in one or more words (or pieces of words) to search for:</label></p> -<form name="f" action="buglist.cgi" method="get" - onsubmit="if (this.quicksearch.value == '') - { alert('Please enter one or more search terms first.'); - return false; } return true;"> - <input type="text" size="40" name="quicksearch" id="quicksearch"> +<form name="f" action="buglist.cgi" method="get"> + <input size="40" name="quicksearch" id="quicksearch" autofocus required> <input type="submit" value="Search" id="find"> </form> @@ -38,7 +34,7 @@ <ul class="qs_help"> <li>If you just put a word or series of words in the search box, - [%+ terms.Bugzilla %] will search the + Bugzilla will search the [%+ field_descs.product FILTER html %], [%+ field_descs.component FILTER html %], [%+ IF use_keywords %][%+ field_descs.keywords FILTER html %],[% END %] @@ -53,14 +49,14 @@ </li> <li>Adding more terms <strong>narrows down</strong> the search, it does not - expand it. (In other words, [% terms.Bugzilla %] searches for + expand it. (In other words, Bugzilla searches for [%+ terms.bugs %] that match <em>all</em> your criteria, not [%+ terms.bugs %] that match <em>any</em> of your criteria.)</li> <li>Searching is <strong>case-insensitive</strong>. So <kbd>table</kbd>, <kbd>Table</kbd>, and <kbd>TABLE</kbd> are all the same.</li> - <li>[% terms.Bugzilla %] does not just search for the exact word you put in, + <li>Bugzilla does not just search for the exact word you put in, but also for any word that <strong>contains</strong> that word. So, for example, searching for "cat" would also find [% terms.bugs %] that contain it as part of other words—for example, [% terms.abug %] @@ -128,7 +124,7 @@ referred to as <kbd>[% first_field.name.replace('^cf_') FILTER html %]</kbd>, also. However, if this causes a conflict between the standard - [%+ terms.Bugzilla %] field names and the custom field names, the + Bugzilla field names and the custom field names, the standard field names always take precedence.</p> [% END %] @@ -139,7 +135,7 @@ [% END %] -<table cellspacing="0" cellpadding="0" border="0" class="qs_fields"> +<table class="qs_fields"> <thead> <tr> <th class="field_name">Field</th> @@ -213,6 +209,52 @@ (<kbd>url</kbd> OR <kbd>location</kbd>) AND (<kbd>bar</kbd> OR <kbd>field</kbd>) AND (NOT <kbd>focus</kbd>)</p> </li> + + <li> + The default operator, colon (:), performs a <strong>substring</strong> + match of the value. The following operators are supported: + <ul> + <li> + <strong>:</strong> (substring):<br> + <kbd><em>summary:foo</em></kbd> will search for [% terms.bugs %] + where the <kbd>summary</kbd> contains <kbd>foo</kbd>. + </li> + <li> + <strong>=</strong> (equals):<br> + <kbd><em>summary=foo</em></kbd> will search for [% terms.bugs %] + where the <kbd>summary</kbd> is exactly <kbd>foo</kbd>. + </li> + <li> + <strong>!=</strong> (notequals):<br> + <kbd><em>summary!=foo</em></kbd> will search for [% terms.bugs %] + where the <kbd>summary</kbd> is not <kbd>foo</kbd>. + </li> + <li> + <strong>></strong> (greaterthan):<br> + <kbd><em>creation_ts>-2w</em></kbd> will search for [% terms.bugs %] + where that were created between two weeks ago and now, excluding [% + terms.bugs %] exactly two weeks old. + </li> + <li> + <strong>>=</strong> (greaterthaneq):<br> + <kbd><em>creation_ts>=-2w</em></kbd> will search for [% terms.bugs %] + where that were created between two weeks ago and now, including [% + terms.bugs %] exactly two weeks old. + </li> + <li> + <strong><</strong> (lessthan):<br> + <kbd><em>creation_ts<-2w</em></kbd> will search for [% terms.bugs %] + where that were created more than two weeks ago, excluding [% + terms.bugs %] exactly two weeks old. + </li> + <li> + <strong><=</strong> (lessthaneq):<br> + <kbd><em>creation_ts<=-2w</em></kbd> will search for [% terms.bugs %] + where that were created more than two weeks ago, including [% + terms.bugs %] exactly two weeks old. + </li> + </ul> + </li> </ul> <h2 id="shortcuts">Advanced Shortcuts</h2> @@ -221,7 +263,7 @@ specific fields, there are certain characters or words that you can use as a "shortcut" for searching certain fields:</p> -<table cellspacing="0" cellpadding="0" border="0" class="qs_fields"> +<table class="qs_fields"> <thead> <tr> <th class="field_name">Field</th> @@ -304,7 +346,7 @@ <a href="query.cgi?format=advanced">Advanced Search</a> form.</p> <ul class="qs_help"> - <li>All [% terms.bugs %] reported by userA@company.com or assigned to him + <li>All [% terms.bugs %] reported by userA@company.com or assigned to them (the initial @ is a shortcut for the assignee, see the <a href="#shortcuts">Advanced Shortcuts</a> section above):<br> <kbd>ALL @userA@company.com OR reporter:userA@company.com</kbd></li> diff --git a/template/en/default/pages/release-notes.html.tmpl b/template/en/default/pages/release-notes.html.tmpl index 5ac57bdfc..d4bf1c596 100644 --- a/template/en/default/pages/release-notes.html.tmpl +++ b/template/en/default/pages/release-notes.html.tmpl @@ -6,286 +6,91 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[% SET title = "$terms.Bugzilla 4.4 Release Notes" %] -[% INCLUDE global/header.html.tmpl +[% SET title = "Bugzilla 5.0 Release Notes" %] +[% INCLUDE global/header.html.tmpl title = title - style_urls = ['skins/standard/page.css'] + bodyclasses = ['narrow_page'] %] <h1>[% title FILTER html %]</h1> <ul class="bz_toc"> - <li><a href="#v44_introduction">Introduction</a></li> - <li><a href="#v44_point">Updates in this 4.4.x Release</a></li> - <li><a href="#v44_req">Minimum Requirements</a></li> - <li><a href="#v44_feat">New Features and Improvements</a></li> - <li><a href="#v44_issues">Outstanding Issues</a></li> - <li><a href="#v44_upgrading">Notes On Upgrading From a Previous Version</a></li> - <li><a href="#v44_code_changes">Code Changes Which May Affect + <li><a href="#introduction">Introduction</a></li> + <li><a href="#point">Updates in this 5.0.x Release</a></li> + <li><a href="#req">Minimum Requirements</a></li> + <li><a href="#feat">New Features and Improvements</a></li> + <li><a href="#issues">Outstanding Issues</a></li> + <li><a href="#code_changes">Code Changes Which May Affect Customizations and Extensions</a></li> - <li><a href="#v44_previous">Release Notes for Previous Versions</a></li> + <li><a href="https://bugzilla.readthedocs.org/en/latest/installing/upgrading.html"> + Notes On Upgrading From a Previous Version</a></li> + <li><a href="http://www.bugzilla.org/releases/">Release Notes for Previous Versions</a></li> </ul> -<h2 id="v44_introduction">Introduction</h2> +<h2 id="introduction">Introduction</h2> -<p>Welcome to [% terms.Bugzilla %] 4.4! It has been over a year since we - released [% terms.Bugzilla %] 4.2 on February 2012, and this new major - release comes with several new features and improvements. This release - contains major improvements to WebServices, which were our main target in - this release, a rewritten tagging system, a real MIME type auto-detection for - attachments, improved support for Oracle, performance improvements and lots - of other enhancements.</p> +<p>Welcome to Bugzilla 5.0! It has been slightly over two years since we released + Bugzilla 4.4 in May of 2013. This new major release comes with many new features + and improvements to WebServices and performance.</p> -<p>If you're upgrading, make sure to read <a href="#v44_upgrading">Notes On - Upgrading From a Previous Version</a>. If you are upgrading from a release - before 4.2, make sure to read the release notes for all the - <a href="#v44_previous">previous versions</a> in between your version and - this one, <strong>particularly the Upgrading section of each version's - release notes</strong>.</p> - -<h2 id="v44_point">Updates in this 4.4.x Release</h2> - -<h3>4.4.9</h3> - -<p>This release contains the following [% terms.bug %] fixes:</p> - -<ul> - <li>Users who are not in the insidergroup were able to determine if some - specific user made a private comment in [% terms.bugs %]. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1151290">[% terms.Bug %] 1151290</a>)</li> - <li>Due to a regression caused by <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1090275"> - [% terms.bug %] 1090275</a>, the WebService methods <kbd>B[%%]ug.get_bugs</kbd> and - <kbd>B[%%]ug.get_history</kbd> were no longer allowed. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1154099">[% terms.Bug %] 1154099</a>)</li> - <li>[% terms.Bugzilla %] now supports the new <kbd>.htaccess</kbd> format from Apache 2.4. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1121477">[% terms.Bug %] 1121477</a>)</li> - <li>A regression in [% terms.Bugzilla %] 4.4.3 due to CVE-2014-1517 caused the admin's password - to be ignored when starting a sudo session. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1132887">[% terms.Bug %] 1132887</a>)</li> -</ul> - -<h3>4.4.8</h3> - -<p>This release contains the following [% terms.bug %] fix:</p> - -<ul> - <li>Fixing a regression caused by <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1090275"> - [% terms.bug %] 1090275</a>, <kbd>JSON-RPC</kbd> API calls could crash in - certain cases instead of displaying the proper error message. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1124716">[% terms.Bug %] 1124716</a>)</li> -</ul> - -<h3>4.4.7</h3> - -<p>This release contains fixes for a couple of security issues. - See the <a href="https://www.bugzilla.org/security/4.0.15/"> - Security Advisory</a> for details.</p> - -<p>In addition, the following important fixes have been made in the release:</p> - -<ul> - <li>The <kbd>B[%%]ug.add_comment</kbd> WebService method now returns the correct - ID for the newly created [% terms.bug %] comment. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1111043">[% terms.Bug %] 1111043</a>)</li> - <li>Fixing a regression caused by CVE-2014-1571 - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1064140">[% terms.bug %] 1064140</a>), - comments made while setting a flag from the attachment details page are again - included in the flag notification email. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1082887">[% terms.Bug %] 1082887</a>)</li> -</ul> - -<h3>4.4.6</h3> - -<p>This release fixes several security issues. See the - <a href="http://www.bugzilla.org/security/4.0.14/">Security Advisory</a> - for details.</p> - -<h3>4.4.5</h3> - -<p>This release fixes a security issue. See the - <a href="http://www.bugzilla.org/security/4.0.13/">Security Advisory</a> - for details.</p> - -<h3>4.4.4</h3> - -<p>This release fixes one regression introduced in [% terms.Bugzilla %] 4.4.3 by - <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=968576">security [% terms.bug %] 968576</a>: - URLs in [% terms.bug %] comments are displayed correctly again. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=998323">[% terms.Bug %] 998323</a>)</p> - -<h3>4.4.3</h3> - -<p>This release fixes two security issues. See the - <a href="http://www.bugzilla.org/security/4.0.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 <kbd>User.login</kbd> WebService method now also returns a - <kbd>token</kbd> argument containing a login token which you can use in - subsequent calls to authenticate. For security reasons, this method - no longer generates login cookies. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=893195">[% terms.Bug %] 893195</a>)</li> - <li>The <kbd>User.get</kbd> WebService method now correctly takes the - <kbd>maxusermatches</kbd> parameter into account when the <kbd>match</kbd> - argument is passed. Previously, it was returning all matching accounts. - To further limit the number of accounts returned by <kbd>User.get</kbd>, - you can now pass the <kbd>limit</kbd> argument. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=962060">[% terms.Bug %] 962060</a>)</li> - <li>The sudo cookie is no longer accessible from JavaScript. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=966676">[% terms.Bug %] 966676</a>)</li> - <li>Large dependency trees with lots of resolved [% terms.bugs %] now load - much faster. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=961789">[% terms.Bug %] 961789</a>)</li> -</ul> - -<h3>4.4.2</h3> - -<p>The following [% terms.bugs %] have been fixed in this release:</p> - -<ul> - <li><kbd>checksetup.pl</kbd> was incorrectly reporting DBI 1.630 (1.63) as - being older than 1.614, preventing the upgrade to complete. - If you still use Perl 5.10.0 or older, make sure you have the - <a href="http://search.cpan.org/~jpeacock/version/lib/version.pod">version</a> - module installed before running <kbd>checksetup.pl</kbd>. - If you use Perl 5.10.1 or newer, this module is already available and - no special action is required. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=938300">[% terms.Bug %] 938300</a>)</li> - <li>An error about <kbd>longdescs.comment_id</kbd> was thrown by MySQL 5.0 - and 5.1 when upgrading to [% terms.Bugzilla %] 4.4 or 4.4.1. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=870369">[% terms.Bug %] 870369</a>)</li> - <li>Saved searches containing Unicode characters in their name could not - be run if Digest::SHA 5.82 or newer is installed. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=964113">[% terms.Bug %] 964113</a>)</li> - <li>A regression in [% terms.Bugzilla %] 4.4.1 caused <kbd>email_in.pl</kbd> - to fail with an "invalid token" error message. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=928331">[% terms.Bug %] 928331</a> and - <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=930013">[% terms.bug %] 930013</a>)</li> - <li>The PROJECT environment variable is now correctly taken into account - when mod_perl is enabled (this variable allows several installations to - share the same codebase). - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=843457">[% terms.Bug %] 843457</a>)</li> - <li>Mandatory custom fields whose visibility depends on a component are now - correctly required on [% terms.bug %] creation. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=895813">[% terms.Bug %] 895813</a>)</li> - <li>Windows 8.1 is now recognized when reporting new [% terms.bugs %]. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=928092">[% terms.Bug %] 928092</a>)</li> - <li>[% terms.Bugzilla %] no longer crashes when the <kbd>shutdownhtml</kbd> - parameter is set and using a non-cookie based authentication method. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=748095">[% terms.Bug %] 748095</a>)</li> - <li><kbd>importxml.pl</kbd> no longer ignores the <kbd>maxattachmentsize</kbd> - and <kbd>maxlocalattachment</kbd> parameters when importing [% terms.bugs %]. - This means that large attachments are now stored locally in - <kbd>data/attachments/</kbd> if parameters are configured this way. - The script must now be run as the webserver user (e.g. apache) to make these - attachments readable from web browsers. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=360231">[% terms.Bug %] 360231</a>)</li> - <li>The default date and time format used for SQLite has been fixed. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=938161">[% terms.Bug %] 938161</a>)</li> -</ul> - -<h3>4.4.1</h3> - -<p>This release fixes several security issues. See the - <a href="http://www.bugzilla.org/security/4.0.10/">Security Advisory</a> - for details.</p> - -<p>In addition, the following [% terms.bugs %] have been fixed in this release:</p> - -<ul> - <li><kbd>checksetup.pl</kbd> no longer fails with "Invalid version format (non-numeric data)" - when a Perl module contains an invalid version number. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=781672">[% terms.Bug %] 781672</a>)</li> - <li>Internet Explorer 11 and KHTML-based browsers such as Konqueror can now - display buglists correctly. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=902515">[% terms.Bug %] 902515</a> and - <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=914262">[% terms.bug %] 914262</a>)</li> - <li>When editing several [% terms.bugs %] at once and moving them into a new - product, [% terms.bugs %] restricted to a group in the old product could - loose these group restrictions in the new product. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=769134">[% terms.Bug %] 769134</a>)</li> - <li>When the <kbd>password_complexity</kbd> parameter was set to - 'letters_numbers_specialchars', passwords containing numbers and special - characters only were accepted. Now it makes sure that a letter is also present. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=897264">[% terms.Bug %] 897264</a>)</li> - <li>Large dependency trees are now displayed much faster. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=917370">[% terms.Bug %] 917370</a>)</li> - <li>When a user has set many votes, the "Votes" page is now displayed much faster. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=851267">[% terms.Bug %] 851267</a>)</li> - <li>The "My Requests" page now correctly uses the AND/OR operator for the - requester and requestee fields only instead of using it for all fields. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=891311">[% terms.Bug %] 891311</a>)</li> - <li>With DB servers doing case-insensitive comparisons, such as MySQL, tokens - and login cookies were not correctly validated as the case was ignored. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=906745">[% terms.Bug %] 906745</a> and - <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=907438">[% terms.bug %] 907438</a>)</li> - <li>All security headers (such as X-Frame-Options) are now returned when using XML-RPC. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=787328">[% terms.Bug %] 787328</a>)</li> - <li>Oracle crashed when reporting a new [% terms.bug %] if a custom free-text field - was non-mandatory and left empty. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=919475">[% terms.Bug %] 919475</a>)</li> - <li>It was not possible to import [% terms.bugs %] using <kbd>importxml.pl</kbd> with Oracle. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=848063">[% terms.Bug %] 848063</a>)</li> -</ul> +<p>If you're upgrading, make sure to read + <a href="https://bugzilla.readthedocs.org/en/latest/installing/upgrading.html"> + Notes On Upgrading From a Previous Version</a>. If you are upgrading from a + release before 4.4, make sure to read the release notes for all the + <a href="http://www.bugzilla.org/releases/">previous versions</a> in between + your version and this one, <strong>particularly the Upgrading section of each + version's release notes</strong>.</p> -<h2 id="v44_req">Minimum Requirements</h2> +<h2 id="req">Minimum Requirements</h2> -<p>Any requirements that are new since 4.2 will look like +<p>Any requirements that are new since 4.4 will look like <span class="req_new">this</span>.</p> <ul> - <li><a href="#v44_req_perl">Perl</a></li> - <li><a href="#v44_req_mysql">For MySQL Users</a></li> - <li><a href="#v44_req_pg">For PostgreSQL Users</a></li> - <li><a href="#v44_req_oracle">For Oracle Users</a></li> - <li><a href="#v44_req_sqlite">For SQLite Users</a></li> - <li><a href="#v44_req_modules">Required Perl Modules</a></li> - <li><a href="#v44_req_optional_mod">Optional Perl Modules</a></li> - <li><a href="#v44_req_apache">Optional Apache Modules</a></li> + <li><a href="#req_perl">Perl</a></li> + <li><a href="#req_mysql">For MySQL Users</a></li> + <li><a href="#req_pg">For PostgreSQL Users</a></li> + <li><a href="#req_oracle">For Oracle Users</a></li> + <li><a href="#req_sqlite">For SQLite Users</a></li> + <li><a href="#req_modules">Required Perl Modules</a></li> + <li><a href="#req_optional_mod">Optional Perl Modules</a></li> + <li><a href="#req_apache">Optional Apache Modules</a></li> </ul> -<h3 id="v44_req_perl">Perl</h3> - -<p>Perl v5.8.1</p> +<h3 id="req_perl">Perl</h3> -<p><strong>IMPORTANT:</strong> This is the last major release to support - Perl 5.8.x! The next major release, [% terms.Bugzilla %] 5.0, will require - Perl 5.10.1 as a minimum.</p> +<p>Perl <span class="req_new">v5.10.1</span></p> [% INCLUDE db_req db='mysql' %] -[% INCLUDE db_req db='pg' dbd_new => 1 %] +[% INCLUDE db_req db='pg' %] [% INCLUDE db_req db='oracle' %] [% INCLUDE db_req db='sqlite' %] -<h3 id="v44_req_modules">Required Perl Modules</h3> +<h3 id="req_modules">Required Perl Modules</h3> [% INCLUDE req_table reqs = REQUIRED_MODULES - updated = ['TimeDate', 'DBI', 'Email-Send', 'List-MoreUtils'] %] + new = ['File-Slurp','JSON-XS', 'Email-Sender'] + updated = ['DateTime', 'DateTime-TimeZone', + 'Template-Toolkit', 'URI'] %] -<h3 id="v44_req_optional_mod">Optional Perl Modules</h3> +<h3 id="req_optional_mod">Optional Perl Modules</h3> <p>The following perl modules, if installed, enable various - features of [% terms.Bugzilla %]:</p> + features of Bugzilla:</p> [% INCLUDE req_table reqs = OPTIONAL_MODULES - new = ['Net-SMTP-SSL', 'HTML-FormatText-WithLinks', - 'File-MimeInfo', 'IO-stringy'] - updated = ['TheSchwartz'] + new = ['Cache-Memcached','File-Copy-Recursive'] + updated = ['Chart', 'Test-Taint'] include_feature = 1 %] -<h3 id="v44_req_apache">Optional Apache Modules</h3> +<h3 id="req_apache">Optional Apache Modules</h3> -<p>If you are using Apache as your webserver, [% terms.Bugzilla %] can +<p>If you are using Apache as your webserver, Bugzilla can 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> + modules installed and enabled.</p> <ul> <li>mod_headers</li> @@ -298,2075 +103,246 @@ you.</p> -<h2 id="v44_feat">New Features and Improvements</h2> +<h2 id="feat">New Features and Improvements</h2> <ul> - <li><a href="#v44_feat_search">Allow Multiple Search Criteria to Match one Field</a></li> - <li><a href="#v44_feat_search_perf">Improved Performance for Searches</a></li> - <li><a href="#v44_feat_bug_tags">Overhaul of the Tagging System</a></li> - <li><a href="#v44_feat_mimetype_autodetect">Auto-Detection of the Attachment MIME Type</a></li> - <li><a href="#v44_feat_saved_reports">Saving Tabular and Graphical Reports</a></li> - <li><a href="#v44_feat_whining">Custom Columns in Whine Emails</a></li> - <li><a href="#v44_feat_webservices">Improved WebServices</a></li> - <li><a href="#v44_feat_apache_config">New Apache Configuration</a></li> - <li><a href="#v44_feat_other">Other Enhancements and Changes</a></li> + <li><a href="#feat_webservices">Improved WebServices</a></li> + <li><a href="#feat_caching_performance">Improved Caching using Memcached</a></li> + <li><a href="#feat_comment_tags">Abililty to Tag [% terms.Bug %] Comments</a></li> + <li><a href="#feat_bug_groups">Improved [% terms.Bug %] Group Membership Checking</a></li> + <li><a href="#feat_documentation">Improved Documentation for Users and Administrators</a></li> + <li><a href="#feat_other">Other Enhancements and Changes</a></li> </ul> -<h3 id="v44_feat_search">Allow Multiple Search Criteria to Match one Field</h3> - -<p> - In the "Advanced Search" page, it is now possible to build queries using - multiple custom search criteria against the same field. In [% terms.Bugzilla %] - 4.2 and older, queries of the form - <br><br> - <kbd>"Status changed to VERIFIED" AND "Status changed by foo@bar.com"</kbd> - <br><br> - were returning all [% terms.bugs %] which had their status changed to VERIFIED - by some user and which were edited by foo@bar.com once, but both actions could - be independent. In [% terms.Bugzilla %] 4.4, you can now decide if both - criteria must match the exact same action or not, i.e. if you want - [%+ terms.bugs %] whose status has been set to VERIFIED by foo@bar.com himself. - In the same way, queries of the form - <br><br> - <kbd>"Flags changed to approval+" AND "Flags changed by foo@bar.com"</kbd> - <br><br> - can now return [% terms.bugs %] for which the approval flag has been set to - "+" by foo@bar.com himself. In previous versions, both actions were treated - independently and [% terms.bugs %] for which foo@bar.com set the approval flag - to "?" and which is then set to "+" by someone else were also returned. -</p> -<p> - This new feature gives you the ability to build more accurate queries and to - get more relevant results. -</p> - -<h3 id="v44_feat_search_perf">Improved Performance for Searches</h3> +<h3 id="feat_webservices">Improved WebServices</h3> <p> - The search system got a performance boost which in some cases decreases the - time spent to run queries from several minutes to a few seconds only. - The more complex your queries are, the more visible the performance win - should be. -</p> - -<h3 id="v44_feat_bug_tags">Overhaul of the Tagging System</h3> - -<p> - The old tagging system which was in the footer of all pages had severe design - and usability limitations and has been replaced by a shiny new one which lets - you tag [% terms.bugs %] from the [% terms.bug %] report directly. Tags now - mostly work like keywords, but with two major differences. First of all, they - are personal, meaning that tags you set on [% terms.bugs %] are only visible - by you, and nobody else is notified nor can see which tags you set. This - behavior is the same as the old tagging system and so this feature didn't - change. The second major difference is that the list of available tags is - unlimited and is in no way hardcoded by administrators. You can type either - a new tag of your choice, or you can select one from an auto-generated list - of tags which you already used in other [% terms.bugs %]. Again, this feature - was already present in the old tagging system, but its usability has been - greatly improved. In particular, this means that tags are now displayed in - [%+ terms.bug %] reports directly, so that you immediately know which tags - you already set for that [% terms.bug %]. This feature is new in this release. + This release has major improvements in the WebServices interface. One big + addition is a new REST-like endpoint alongside the existing XML-RPC and JSON-RPC + endpoints. This will allow clients to access Bugzilla data using standard HTTP + calls for easy development. <strong>Note:</strong> XML-RPC and JSON-RPC are + deprecated in favor of REST and will likely be removed in the Bugzilla 7.0 release. </p> <p> - Another new feature is that your personal tags can now be listed in buglists. - They can also be used as search criteria in your queries. If you decide to - share a saved search which uses tags as criteria, this will work too! Note - that when you add a new tag, no saved search based on this tag is created - anymore, as you can easily create it yourself if you really need it. + Also API key support has been added so that API calls will no longer need to use + cookies or a user's login and password. Users can create a different API key for + each application and revoke API keys that have been compromised or are no longer + needed. The API key will simply be passed to each call as credentials. </p> <p> - The tags set with the old tagging system are automatically migrated to the - new system. + Several methods have been added and existing ones improved to allow returning + data that was not available before such as <kbd>Group.get</kbd>. <kbd>B[%%]ug.search</kbd> + is now as full featured as the Advanced Query UI allowing for the same searches + to be executed. Attachment data such as flags and other metadata can now be + updated through the API. Other WebService changes are detailed + <a href="#feat_webservices_other">below</a>. </p> -<h3 id="v44_feat_mimetype_autodetect">Auto-Detection of the Attachment MIME Type</h3> +<h3 id="feat_caching_performance">Improved Caching using Memcached</h3> <p> - When a user uploads a new attachment and lets the "Content Type" field set to - "auto-detect", [% terms.Bugzilla %] now does its own MIME type detection - if the web browser tells him that the attachment is of type - "application/octet-stream", in an attempt to make a better guess than the web - browser. In all other cases, [% terms.Bugzilla %] still trusts what the browser - tells him. -</p> -<p> - Check the <a href="#v44_req_optional_mod">list of optional Perl modules</a> to - know which modules to install in order to enable MIME type sniffing. + Bugzilla now has the ability to connect to a Memcached server running either + locally or on the network to allow fast access to different types of data. + This cuts down on the amount of database hits and can improve performance. Other + areas have been improved as well to take advantage of caching in memory for + objects that are retrieved multiple times during a request such as user data, etc. </p> -<h3 id="v44_feat_saved_reports">Saving Tabular and Graphical Reports</h3> +<h3 id="feat_comment_tags">Ability to Tag [% terms.Bug %] Comments</h3> <p> - It is now possible to save tabular and graphical reports in the same way as - you save searches. Saved reports will appear in the footer of pages, below - saved searches. -</p> -<p> - Unlike saved searches, it is not yet possible to share saved reports with - other users. + Users can add tags, visible to other users, to [% terms.bug %] comments. This + gives the users the ability to thread conversations, mark comments as spam, + identify important comments, etc. Users can hide comments that contain specific + tags if desired. The tag input field also supports autocompletion so commonly + used tags can be selected. Administrators can make specifically tagged comments + be automatically hidden from view. </p> -<h3 id="v44_feat_whining">Custom Columns in Whine Emails</h3> +<h3 id="feat_bug_groups">Improved [% terms.Bug %] Group Membership Checking</h3> <p> - The list of columns to display in buglists contained in emails sent by the - whining system on a regular basis is no longer hardcoded. If the saved - search used for whining emails contains a list of columns, these columns are - used to be displayed in the emails. If no custom list is found, the default - column list is used instead. + In the past, Bugzilla restricted who can view [% terms.abug %] to everyone + who was a member of ALL the groups the [% terms.bug %] was in. That is, the + groups were ANDed together. This made some access control scenarios rather + difficult to achieve. So now, Bugzilla defaults to (and can be switched to, + in existing installations) a mode where the [% terms.bug %] can be viewed by + everyone who is a member of ANY group the [% terms.bug %] is in. That is, the + groups are ORed together. This give more flexibility in the way [% terms.bugs %] + are made private to specific groups of users. </p> <p> - This means that depending on the kind of email notifications you want, you - can fully customize data to return, on a per saved search basis! + <strong>Note:</strong> Group memberships for [% terms.bugs %] and users are + not changed at all when this setting is switched. When switching from AND to + OR, this means that [% terms.bugs %] may be more widely viewable than previously. + It is the responsibility of the administrator to make sure that no [% terms.bugs %] + are accidentally revealed to the wrong people when changing this setting. </p> -<h3 id="v44_feat_webservices">Improved WebServices</h3> +<h3 id="feat_documentation">Improved Documentation for Users and Administrators</h3> <p> - This release got major improvements in its WebServices interface. Many new - methods have been implemented to let third-party applications interact with - [%+ terms.Bugzilla %] even more closely. For instance, it is now possible to - know what parameters are set to using <kbd>B[%%]ugzilla.parameters</kbd>. - It is now also possible to update tags, products, groups or user accounts - using our API. -<p> -<p> - Several existing methods have also been improved to return data which - weren't available till now, such as [% terms.bug %] and attachment flags - using <kbd>B[%%]ug.get</kbd>, <kbd>B[%%]ug.attachments</kbd> or - <kbd>Product.get</kbd>. Users can also get their saved searches and reports - using <kbd>User.get</kbd>; and much more, see the - <a href="#v44_feat_webservices_details">detailed list</a> below. -</p> - -<h3 id="v44_feat_apache_config">New Apache Configuration</h3> - -<p> - For improved security, [% terms.Bugzilla %] now prevents directory browsing - by default. 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="#v44_upgrading">Notes On Upgrading From a Previous Version</a> - section for details. + The standard documentation that is shipped along with the Bugzilla code has been + rewritten and improved using the reStructuredText format. This allows the + documentation to be easily hosted at sites such as ReadTheDocs.org and can + also be more easily converted into different formats such as HTML and PDF. + A new section dedicated to the new REST WebService API has also been added, + significantly improving on the old WebService documentation. </p> -<h3 id="v44_feat_other">Other Enhancements and Changes</h3> - -<h4>Enhancements for Users</h4> - -<ul> - <li><strong>[% terms.Bugs %]:</strong> It is now possible to add yourself to - the CC list when uploading an attachment and when editing an existing one.</li> - <li><strong>[% terms.Bugs %]:</strong> There is a new user preference to be - automatically added to the CC list of [% terms.bugs %] for which a flag - request is addressed to you (the flag has you as the requestee).</li> - <li><strong>[% terms.Bugs %]:</strong> Changes to the CC list no longer - causes midair collisions.</li> - <li><strong>[% terms.Bugs %]:</strong> There is now a <em>(take)</em> link - besides the QA Contact field to easily set yourself as QA contact.</li> - <li><strong>[% terms.Bugs %]:</strong> [% terms.Bugs %] are no longer - reassigned to the default assignee when moving the [% terms.bug %] into - another product or component if the current assignee is not the default - one. Same goes for the QA contact.</li> - <li><strong>[% terms.Bugs %]:</strong> When reporting a new [% terms.bug %], - flags which are not available for the selected component and those which - the reporter cannot edit are now hidden instead of being disabled. For - existing [% terms.bugs %], unset flags are also hidden by default. Clicking - the <em>(set flags)</em> or <em>(more flags)</em> link will make them - appear.</li> - <li><strong>[% terms.Bugs %]:</strong> When viewing [% terms.abug %], the list - of duplicated [% terms.bugs %] is now listed near the top of the page.</li> - <li><strong>[% terms.Bugs %]:</strong> Private comments now always remain - visible to their author. Previously, the author of a comment couldn't see - it anymore if the comment was marked private and the author isn't in the - insider group.</li> - <li><strong>[% terms.Bugs %]:</strong> The See Also field now supports URLs - pointing to GitHub by default. If the new MoreBugUrl extension included in - this release is enabled, then you can also add URLs pointing to: - b[%%]ugs.php.net, RT, appspot.com (Rietveld), Review Board, and - getsatisfaction.com.</li> - <li><strong>Searches:</strong> The alias of [% terms.bugs %] you cannot see - are no longer resolved to their [% terms.bug %] ID, meaning that it is no - longer possible to connect an alias with its ID unless you can see the - [%+ terms.bug %].</li> - <li><strong>Searches:</strong> Custom multi-select fields are now available - in the "Search By Change History" section of the query page.</li> - <li><strong>Searches:</strong> The <em>changed by</em> operator in boolean - charts now accepts pronouns.</li> - <li><strong>Searches:</strong> The requester and requestee fields in boolean - charts now accept pronouns.</li> - <li><strong>Searches:</strong> It is now possible to hide the description of - queries appearing at the top of buglists.</li> - <li><strong>Requests:</strong> The "My Requests" page now displays an AND/OR - radio button to define the interaction between the requester and requestee - fields.</li> - <li><strong>Email Notifications:</strong> There is a new user preference to - not prepend "New:" to the subject of [% terms.bug %]mails when reporting - a new [% terms.bug %]. Some email clients couldn't thread emails correctly - due to this.</li> - <li><strong>Email Notifications:</strong> There is a new email event to get - notifications when the product or component of [% terms.abug %] changes.</li> - <li><strong>Email Notifications:</strong> All [% terms.bug %]mails now have - a <em>X-Bugzilla-Flags</em> email header, listing currently set flags.</li> - <li><strong>Email Notifications:</strong> All [% terms.bug %]mails now have - a <em>X-Bugzilla-Version</em> email header with the current product - version.</li> - <li><strong>Whining:</strong> The sort order of the saved search is used to - sort [% terms.bugs %] in the emails.</li> - <li><strong>User Accounts:</strong> To confirm an email address change, the - password is now requested instead of the old email address.</li> - <li><strong>Graphical Reports:</strong> The size of graphical reports is now - set dynamically to fit within the window of the web browser. - The Taller/Thinner/Fatter/Shorter links are now gone.</li> - <li><strong>Incoming Emails:</strong> <kbd>email_in.pl</kbd> now accepts - HTML-only emails to create and edit [% terms.bugs %] by email.</li> - <li><strong>Incoming Emails:</strong> When creating a new [% terms.bug %], - <kbd>email_in.pl</kbd> will look at the <em>Importance</em> and - <em>X-Priority</em> email headers to increase or decrease the initial - priority of the [% terms.bug %], unless the priority is already explicitly - set in the email itself.</li> - <li><strong>Skins:</strong> [% terms.Bugzilla %] no longer fetches all skins - available when viewing a page. It only loads the skin selected by the user - in his preferences, which results in less requests to the server.</li> -</ul> - -<h4>Enhancements for Administrators and Developers</h4> - -<ul> - <li><strong>License:</strong> The [% terms.Bugzilla %] code is now released - under the MPL 2.0 license (previously was MPL 1.1).</li> - <li><strong>Installation:</strong> On mod_perl, templates now remain in - memory for one hour, which can cause an increase in memory requirements. - This also means that it can take up to one hour before changes in templates - become active (unless you restart Apache).</li> - <li><strong>Installation:</strong> Running - <kbd>checksetup.pl --make-admin=foo@bar.com</kbd> now automatically - re-enables the user account if it was disabled.</li> - <li><strong>Configuration:</strong> A new parameter <em>smtp_ssl</em> can be - turned on to enable SSL connections to the SMTP server to send email - notifications.</li> - <li><strong>Administration:</strong> Custom fields now have a new <em>Long - description</em> attribute to better describe what the custom field is - about. This description then appears as a tooltip when hovering the custom - field in [% terms.bug %] reports.</li> - <li><strong>Administration:</strong> When creating a new product, the form - lets you add a component at the same time.</li> - <li><strong>Administration:</strong> When viewing a user account in - <kbd>editusers.cgi</kbd>, the date of the last login is displayed. Users - who did not log in since you upgraded to 4.4 will have this field empty.</li> - <li><strong>Administration:</strong> It is now possible to exclude disabled - user accounts when running a query in <kbd>editusers.cgi</kbd>.</li> - <li><strong>Administration:</strong> The default CC list is now also displayed - when listing components in <kbd>editcomponents.cgi</kbd>.</li> - <li><strong>Administration:</strong> Target milestones can now be 64 characters - long, for consistency with versions (previously was limited to 20 characters - only).</li> - <li><strong>Administration:</strong> The result code returned by - <kbd>contrib/bugzilla-queue.rhel</kbd> when it's not running is now 2 - instead of 0.</li> - <li><strong>Database:</strong> Support for MySQL 5.6 has been added.</li> - <li><strong>Database:</strong> Support for Oracle has been greatly improved.</li> - <li><strong>Security:</strong> For improved security, the - "X-Content-Type-Options: nosniff" and "X-XSS-Protection: block" - headers are now sent with every response.</li> - <li><strong>Security:</strong> Tokens are now generated using HMAC SHA-256 - instead of MD5.</li> - <li><strong>Documentation:</strong> The documentation is now generated with - <kbd>xmlto</kbd> and <kbd>dblatex</kbd> instead of <kbd>jade</kbd>.</li> -</ul> - -<h4 id="v44_feat_webservices_details">WebService Changes</h4> - -<ul> - <li>Several new methods have been added: <kbd>B[%%]ug.update_tags</kbd>, - <kbd>B[%%]ugzilla.parameters</kbd>, <kbd>B[%%]ugzilla.last_audit_time</kbd>, - <kbd>Classification.get</kbd>, <kbd>Group.update</kbd>, - <kbd>Product.update</kbd>, <kbd>User.update</kbd>.</li> - <li><kbd>B[%%]ug.add_attachment</kbd> now only returns the ID of the newly - created attachments instead of all the attachment data.</li> - <li><kbd>B[%%]ug.attachments</kbd> now also returns the <kbd>size</kbd> field - containing the size of the attachment.</li> - <li><kbd>B[%%]ug.attachments</kbd> and <kbd>B[%%]ug.get</kbd> now return - data about flags.</li> - <li><kbd>B[%%]ug.comments</kbd> now also returns <kbd>creation_time</kbd> - which is exactly the same as <kbd>time</kbd>, but is provided for - consistency with <kbd>B[%%]ug.get</kbd> and <kbd>B[%%]ug.attachments</kbd>. - The <kbd>time</kbd> field may be deprecated and removed in a future release, - so you should use <kbd>creation_time</kbd> instead.</li> - <li><kbd>B[%%]ug.comments</kbd> now also returns the <kbd>count</kbd> field - containing the comment ID relative to the [% terms.bug %] it belongs to. - This is the same comment ID as the one you can see in [% terms.bug %] - reports.</li> - <li>It is now possible to create new [% terms.bugs %] with a closed status with - <kbd>B[%%]ug.create</kbd>.</li> - <li>The <kbd>bug_status</kbd> field returned by <kbd>B[%%]ug.fields</kbd> now - also includes [% terms.bug %] statuses available on [% terms.bug %] creation.</li> - <li><kbd>B[%%]ug.fields</kbd> now also returns keyword descriptions, not only - their names.</li> - <li><kbd>B[%%]ug.fields</kbd> now also returns the <kbd>is_active</kbd> field - for product-specific fields.</li> - <li>For users in the timetracking group, <kbd>B[%%]ug.get</kbd> now also - returns the <kbd>actual_time</kbd> field with the total number of hours - spent in the [% terms.bug %].</li> - <li>Field names returned in the <kbd>field_name</kbd> field of the - <kbd>B[%%]ug.history</kbd> method have changed to be consistent with other - methods.</li> - <li>The <kbd>B[%%]ug.search</kbd> method was returning all visible [% terms.bugs %] - when called with no arguments, ignoring the <kbd>max_search_results</kbd> - and <kbd>search_allow_no_criteria</kbd> parameters. This has been fixed.</li> - <li><kbd>Product.get</kbd> now also returns the <kbd>flag_types</kbd> field - containing all the relevant data for attachment and [% terms.bug %] flag types.</li> - <li><kbd>Product.get</kbd> now throws an error if neither <kbd>ids</kbd> nor - <kbd>names</kbd> is passed to the method.</li> - <li>When requesting data for your own account using <kbd>User.get</kbd>, - this method now returns two additional fields: <kbd>saved_searches</kbd> - and <kbd>saved_reports</kbd> containing all your saved searches and - graphical and tabular reports.</li> - <li><kbd>User.get</kbd> now also returns the <kbd>groups</kbd> field - containing the list of groups the user belongs to. The list is filtered - based on your privileges.</li> -</ul> - - -<h2 id="v44_issues">Outstanding Issues</h2> - -<ul> - <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 - <em>chartgroup</em> parameter as the only access mechanism available.</li> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=584742"> - [%- terms.Bug %] 584742</a>: When viewing [% terms.abug %], WebKit-based - browsers can automatically reset a field's selected value when the field - has disabled values.</li> -</ul> - - -<h2 id="v44_upgrading">Notes On Upgrading From a Previous Version</h2> - -<h3>IMPORTANT: Apache Configuration Change</h3> - -<p> - For improved security, [% terms.Bugzilla %] now prevents directory browsing - by default. In order to do that, the root <kbd>bugzilla/.htaccess</kbd> file - now contains the <kbd>Options -Indexes</kbd> directive. By default, this - directive is not allowed in <kbd>.htaccess</kbd> and so you must configure - Apache to allow it. To do that, add <kbd>Options</kbd> to the - <kbd>AllowOverride</kbd> directive in <kbd>httpd.conf</kbd>. This means you - should now have something like this: - <p> - <kbd>AllowOverride Limit FileInfo Indexes Options</kbd> - </p> - Check the - <a href="http://www.bugzilla.org/docs/4.4/en/html/configuration.html#http-apache">documentation</a> - for more information about how to configure Apache. -</p> - -<h2 id="v44_code_changes">Code Changes Which May Affect Customizations and Extensions</h2> - -<ul> - <li>The <em>usebugaliases</em> parameter has been removed. Aliases are now - always available.</li> - <li>There is a new code hook <kbd>admin_editusers_action</kbd> to alter the - way <kbd>editusers.cgi</kbd> works.</li> - <li>There is a new code hook <kbd>buglist_column_joins</kbd> to alter the way - tables and columns are joined in queries. In combination with the - <kbd>buglist_columns</kbd> hook, this permits to customize the list of - columns to display in buglists.</li> - <li>There is a new code hook <kbd>bug_start_of_update</kbd> which is called - after <kbd>object_end_of_update</kbd> but before <kbd>bug_end_of_update</kbd> - for a better control on how to update [% terms.bugs %].</li> - <li>There is a new code hook <kbd>bug_url_sub_classes</kbd> to support - additional URLs in the See Also field.</li> - <li>There is a new code hook <kbd>error_catch</kbd> to catch errors thrown - by [% terms.Bugzilla %] and to take the appropriate actions.</li> - <li>There is a new code hook <kbd>path_info_whitelist</kbd> to whitelist - scripts which should still get the Path-Info information from URLs. By - default, Path-Info is now removed before being passed to CGI scripts.</li> - <li>It is now illegal to have a product with no components and no versions. - Trying to delete the last component or version of a product is now - rejected.</li> - <li>Trying to set the component, target milestone or version of [% terms.abug %] - to a disabled value is no longer accepted. The change will be rejected.</li> - <li>The comment box now checks the returned value of check_can_change_field() - to determine if it should be displayed or not. This means its visibility - can now be controlled by the <kbd>bug_check_can_change_field</kbd> hook.</li> - <li>Flags now checks the returned value of check_can_change_field() to - determine if they should appear as editable or not. This means their - visibility can now be controlled by the <kbd>bug_check_can_change_field</kbd> - hook.</li> - <li>Quips can no longer exceed 512 characters. Existing quips longer than - that are automatically truncated when upgrading.</li> - <li>The static <kbd>bugzilla.dtd</kbd> file has been replaced by a dynamic - one to take custom fields into account. The old - <em><urlbase>/bugzilla.dtd</em> URL is now - <em><urlbase>/page.cgi?id=bugzilla.dtd</em>.</li> - <li>There is a new extension located at <kbd>extensions/MoreBugUrl/</kbd> - which permits to add new classes of URLs in the See Also field. It uses - the <kbd>bug_url_sub_classes</kbd> hook mentioned above.</li> - <li>There is a new <kbd>B[%%]ugzilla->process_cache</kbd> method to store - data which should remain available for the lifetime of the worker process, - on mod_perl. On mod_cgi, it behaves the same way as - <kbd>B[%%]ugzilla->request_cache</kbd>.</li> - <li>In the RDF output of <kbd>config.cgi</kbd>, URIs used to identify - versions and target milestones have been changed to be unique across - products.</li> - <li>The RDF output of <kbd>config.cgi</kbd> now also returns data about - classifications.</li> - <li>It is now legal to call <kbd>B[%%]ugzilla::Version->check({ id => $id })</kbd> - and <kbd>B[%%]ugzilla::Milestone->check({ id => $id })</kbd> to validate - and get an object using its ID.</li> - <li>Rows in the <kbd>dependencies</kbd>, <kbd>flaginclusions</kbd> and - <kbd>flagexclusions</kbd> DB tables are now enforced to be unique.</li> - <li>The <kbd>b[%%]ugs_activity</kbd> and <kbd>profiles_activity</kbd> DB - tables now have an auto-incremented primary key named <kbd>id</kbd>.</li> - <li>A custom <kbd>B[%%]ugzilla.pm</kbd> module has been added into - <kbd>contrib/</kbd> to help packagers to package B[%%]ugzilla in their - Linux distros.</li> -</ul> - - -<h1 id="v44_previous">[% terms.Bugzilla %] 4.2 Release Notes</h1> - -<ul class="bz_toc"> - <li><a href="#v42_introduction">Introduction</a></li> - <li><a href="#v42_point">Updates in this 4.2.x Release</a></li> - <li><a href="#v42_req">Minimum Requirements</a></li> - <li><a href="#v42_feat">New Features and Improvements</a></li> - <li><a href="#v42_issues">Outstanding Issues</a></li> - <li><a href="#v42_code_changes">Code Changes Which May Affect - Customizations and Extensions</a></li> - <li><a href="#v42_previous">Release Notes for Previous Versions</a></li> -</ul> - -<h2 id="v42_introduction">Introduction</h2> - -<p>Welcome to [% terms.Bugzilla %] 4.2! It has been almost a year since we - released [% terms.Bugzilla %] 4.0 on February 2011, and this new major - release comes with several new features and improvements. This release - contains major improvements to search, support for SQLite, improved - WebServices, and lots of other enhancements.</p> - -<p>If you are upgrading from a release before 4.0, make sure to read the - release notes for all the <a href="#v42_previous">previous versions</a> - in between your version and this one, <strong>particularly the Upgrading - section of each version's release notes</strong>.</p> - -<h2 id="v42_point">Updates in this 4.2.x Release</h2> - -<h3>4.2.3</h3> - -<p>This release fixes two security issues. See the - <a href="http://www.bugzilla.org/security/3.6.10/">Security Advisory</a> - for details.</p> - -<p>In addition, the following important fixes/changes have been made in this - release:</p> - -<ul> - <li>Attaching a file to [% terms.abug %] was broken due to a change in - Perl 5.16. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=771100">[% terms.Bug %] 771100</a>)</li> - <li>A regression in [% terms.Bugzilla %] 4.2.2 made Oracle crash when - displaying a buglist. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=780028">[% terms.Bug %] 780028</a>)</li> - <li>It was possible to search on history for comments and attachments you - cannot see (though these private comments and attachments are never disclosed). - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=779709">[% terms.Bug %] 779709</a>)</li> - <li>PostgreSQL databases could be created with the wrong encoding despite - the utf8 parameter being enabled. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=783786">[% terms.Bug %] 783786</a>)</li> - <li>Scheduled whines could be sent at the wrong time on Oracle. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=559539">[% terms.Bug %] 559539</a>)</li> - <li>Tokens are no longer included in saved queries. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=772953">[% terms.Bug %] 772953</a>)</li> - <li>An admin could unintentionally break the display of buglists if a custom - field description contains a < or > character, because these characters - were not filtered. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=785917">[% terms.Bug %] 785917</a>)</li> - <li>Adding or removing a DB column in Oracle didn't handle SERIAL columns - correctly. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=731156">[% terms.Bug %] 731156</a>)</li> - <li>A minor CSRF vulnerability in token.cgi allowed possible unauthorized - password reset e-mail requests. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=706271">[% terms.Bug %] 706271</a>)</li> -</ul> - -<h3>4.2.2</h3> - -<p>This release fixes two security issues. See the - <a href="http://www.bugzilla.org/security/3.6.9/">Security Advisory</a> - for details.</p> - -<p>In addition, the following important fixes/changes have been made in this - release:</p> - -<ul> - <li>A regression introduced in [% terms.Bugzilla %] 4.0 caused some login - names to be ignored when entered in the CC list of [% terms.bugs %]. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=756314">[% terms.Bug %] 756314</a>)</li> - <li>Some queries could trigger an invalid SQL query if strings entered by - the user contained leading or trailing whitespaces. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=760075">[% terms.Bug %] 760075</a>)</li> - <li>The auto-completion form for keywords no longer automatically selects - the first keyword in the list when the field is empty. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=764517">[% terms.Bug %] 764517</a>)</li> - <li>A regression in [% terms.Bugzilla %] 4.2 prevented classifications - from being used in graphical and tabular reports in the "Multiple Tables" - field. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=753688">[% terms.Bug %] 753688</a>)</li> - <li>Attachments created by the <kbd>email_in.pl</kbd> script were associated - to the wrong comment. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=762785">[% terms.Bug %] 762785</a>)</li> - <li>Very long dependency lists can now be viewed correctly. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=762783">[% terms.Bug %] 762783</a>)</li> - <li>Keywords are now correctly escaped in the auto-completion form to prevent - any XSS abuse. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=754561">[% terms.Bug %] 754561</a>)</li> - <li>A regression introduced in [% terms.Bugzilla %] 4.0rc2 when fixing - CVE-2011-0046 caused the "Un-forget the search" link to not work correctly - anymore when restoring a deleted saved search, because this link was - lacking a valid token. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=768870">[% terms.Bug %] 768870</a>)</li> - <li>Two minor CSRF vulnerabilities have been fixed which could let an attacker - alter your default search criteria in the Advanced Search page. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=754672">[% terms.Bugs %] 754672</a> - and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=754673">754673</a>)</li> -</ul> - -<h3>4.2.1</h3> - -<p>This release fixes one security issue. See the - <a href="http://www.bugzilla.org/security/3.6.8/">Security Advisory</a> - for details.</p> - -<p>In addition, the following important fixes/changes have been made in this - release:</p> - -<ul> - <li>Due to a regression introduced when fixing CVE-2012-0453, if an XML-RPC - client sets the charset as part of its Content-Type header, we were - incorrectly rejecting the request. The header is now correctly parsed. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=731219">[% terms.Bug %] 731219</a>)</li> - <li>Email notifications about status changes in blockers were incorrectly - formatted. Several pieces of text were missing in the emails. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=731586">[% terms.Bug %] 731586</a>)</li> - <li>Many [% terms.bugs %] related to the searching system have been fixed. - (<a href="https://bugzilla.mozilla.org/buglist.cgi?bug_id=58179,715270,730984,731163,737436"> - [% terms.Bugs %] 58179, 715270, 730984, 731163 and 737436</a>)</li> - <li>When using the QuickSearch box, complex queries are now parsed correctly. - It also behaves correctly with non-ASCII characters (such as é, ä, ü, etc.). - (<a href="https://bugzilla.mozilla.org/buglist.cgi?bug_id=554819,663377,730207"> - [% terms.Bugs %] 554819, 663377 and 730207</a>)</li> - <li>The 'take' link besides the assignee field now works correctly when - the <kbd>usemenuforusers</kbd> parameter is turned on. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=734997">[% terms.Bug %] 734997</a>)</li> - <li>URLs in the 'Total' row at the bottom of tabular reports were broken - when JavaScript was enabled and a user field was used for the vertical - axis. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=731323">[% terms.Bug %] 731323</a>)</li> - <li>Some performance problems have been fixed for installations with many - products, components or versions. - (<a href="https://bugzilla.mozilla.org/buglist.cgi?bug_id=695514,731055"> - [% terms.Bugs %] 695514 and 731055</a>)</li> - <li>A new hook named <kbd>buglist_column_joins</kbd> has been added to let - extensions alter the <kbd>Bugzilla::Search::COLUMN_JOINS</kbd> hash. - Now more fields can be displayed as columns in buglists, in combination - with the already existing <kbd>buglist_columns</kbd> hook. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=743991">[% terms.Bug %] 743991</a>)</li> - <li>A new hook named <kbd>admin_editusers_action</kbd> has been added to let - extensions alter the behavior of <kbd>editusers.cgi</kbd>. This lets you add - new features to this script very easily. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=730794">[% terms.Bug %] 730794</a>)</li> -</ul> - -<h2 id="v42_req">Minimum Requirements</h2> - -<p>Any requirements that are new since 4.0.2 will look like - <span class="req_new">this</span>.</p> - -<ul> - <li><a href="#v42_req_perl">Perl</a></li> - <li><a href="#v42_req_mysql">For MySQL Users</a></li> - <li><a href="#v42_req_pg">For PostgreSQL Users</a></li> - <li><a href="#v42_req_oracle">For Oracle Users</a></li> - <li><a href="#v42_req_sqlite">For SQLite Users</a></li> - <li><a href="#v42_req_modules">Required Perl Modules</a></li> - <li><a href="#v42_req_optional_mod">Optional Perl Modules</a></li> - <li><a href="#v42_req_apache">Optional Apache Modules</a></li> -</ul> - -<h3 id="v42_req_perl">Perl</h3> - -<p>Perl v5.8.1</p> - -<h3 id="v42_req_mysql">For MySQL Users</h3> - -<ul> - <li>MySQL <span class="req_new">v5.0.15</span></li> - <li><strong>perl module:</strong> DBD::mysql <span class="req_new">v4.001</span></li> -</ul> - -<h3 id="v42_req_pg">For PostgreSQL Users</h3> - -<ul> - <li>PostgreSQL <span class="req_new">v8.03.0000</span></li> - <li><strong>perl module:</strong> DBD::Pg v1.45</li> -</ul> - -<h3 id="v42_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="v42_req_sqlite">For SQLite Users</h3> - -<ul> - <li>SQLite v3.6.22</li> - <li><strong>perl module:</strong> DBD::SQLite v1.29</li> -</ul> - -<h3 id="v42_req_modules">Required Perl Modules</h3> - - -<table class="req_table" border="0" cellpadding="0" cellspacing="0"> - <tbody> - <tr> - <th>Module</th> - <th>Version</th> - </tr> - <tr> - <td>CGI</td> - <td>3.51</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.614</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.904</td> - </tr> - <tr> - <td>URI</td> - <td class="req_new">1.37</td> - </tr> - <tr> - <td>List::MoreUtils</td> - <td>0.22</td> - </tr> - <tr> - <td class="req_new">Math::Random::ISAAC</td> - <td class="req_new">1.0.1</td> - </tr> - </tbody> -</table> - -<h3 id="v42_req_optional_mod">Optional Perl Modules</h3> - -<p>The following perl modules, if installed, enable various - features of [% terms.Bugzilla %]:</p> - - -<table class="req_table" border="0" cellpadding="0" cellspacing="0"> - <tbody> - <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>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>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>XML::Twig</td> - <td>(Any)</td> - <td>Move [% terms.Bugs %] Between Installations, Automatic Update Notifications</td> - </tr> - <tr> - <td>PatchReader</td> - <td class="req_new">0.9.6</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.712</td> - <td>XML-RPC Interface</td> - </tr> - <tr> - <td>JSON::RPC</td> - <td>(Any)</td> - <td>JSON-RPC Interface</td> - </tr> - <tr> - <td>JSON::XS</td> - <td>2.0</td> - <td>Make JSON-RPC Faster</td> - </tr> - <tr> - <td>Test::Taint</td> - <td>(Any)</td> - <td>JSON-RPC Interface, XML-RPC Interface</td> - </tr> - <tr> - <td>HTML::Parser</td> - <td>3.67</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 class="req_new">Encode</td> - <td class="req_new">2.21</td> - <td>Automatic charset detection for text attachments</td> - </tr> - <tr> - <td class="req_new">Encode::Detect</td> - <td class="req_new">(Any)</td> - <td>Automatic charset detection for text attachments</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> - <tr> - <td>Apache2::SizeLimit</td> - <td class="req_new">0.96</td> - <td>mod_perl</td> - </tr> - </tbody> -</table> - -<h3 id="v42_req_apache">Optional Apache Modules</h3> - -<p>If you are using Apache as your webserver, [% terms.Bugzilla %] can - 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="v42_feat">New Features and Improvements</h2> - -<ul> - <li><a href="#v42_feat_sqlite">Experimental SQLite Support</a></li> - <li><a href="#v42_feat_attach">Creating an Attachment by Pasting Text Into - a Text Field</a></li> - <li><a href="#v42_feat_email">HTML [% terms.Bug %]mail</a></li> - <li><a href="#v42_feat_search">Improved Searching System</a></li> - <li><a href="#v42_feat_product">Disabling Old Components, Versions and Milestones</a></li> - <li><a href="#v42_feat_custom">Displaying a Custom Field Value Based on Multiple - Values of Another Field</a></li> - <li><a href="#v42_feat_audit">Auditing of All Changes Within [% terms.Bugzilla %]</a></li> - <li><a href="#v42_feat_wai">Accessibility Improvements</a></li> - <li><a href="#v42_feat_other">Other Enhancements and Changes</a></li> -</ul> - -<h3 id="v42_feat_sqlite">Experimental SQLite Support</h3> - -<p>SQLite is now supported by [% terms.Bugzilla %] and becomes the 4th supported - database besides MySQL, PostgreSQL and Oracle. SQLite support must be considered - as experimental, at least till the next major release.</p> - -<p>Note that use of SQLite is only recommended for small installations. Larger - installations should use MySQL, PostgreSQL, or Oracle.</p> - -<h3 id="v42_feat_attach">Creating an Attachment by Pasting Text Into a Text Field</h3> - -<p>You can now create a new attachment simply by pasting some text into a text - field, in addition to the normal upload process for attachments.</p> - -<h3 id="v42_feat_email">HTML [% terms.Bug %]mail</h3> - -<p>By default, [% terms.bug %]mails (email notifications about changes to - [%+ terms.bugs %]) are now sent in an HTML format that is more readable than - the old text format. Those who prefer the old text format can still choose it - in their Preferences, however.</p> - -<h3 id="v42_feat_search">Improved Searching System</h3> - -<p>The Custom Search section in the Advanced Search page has been redesigned - to work in a more sensible way. Complex queries are easier to build and have - more sensible results, as they are built using a more intuitive logic. - Some very complicated queries are still impossible to generate, though. - Things should improve in future releases.</p> - -<h3 id="v42_feat_product">Disabling Old Components, Versions and Milestones</h3> - -<p>Older components, versions and milestones can now be disabled. [% terms.Bugs %] - already using them are not affected, but these values will no longer be - available for new [% terms.bugs %].</p> - -<h3 id="v42_feat_custom">Displaying a Custom Field Value Based on Multiple Values - of Another Field</h3> - -<p>A custom field can now be displayed based on multiple values of another field. - (For example, one custom field could now appear in multiple products.) - Previously, you could only display a custom field based on a single value of - another field.</p> - -<h3 id="v42_feat_audit">Auditing of All Changes Within [% terms.Bugzilla %]</h3> - -<p>Most changes made through the admin interface are now logged to the database, - in the <kbd>audit_log</kbd> table. There is no UI to access this table yet, - but developers are free to create their own tools to track changes made into - their installation. This is only a first step, and improvements are expected - in future releases.</p> - -<h3 id="v42_feat_wai">Accessibility Improvements</h3> - -<p>A project has started thanks to Francisco Donalisio from IBM to make - [%+ terms.Bugzilla %] compliant with the W3C Web Accessibility Initiative - standards. A lot more work still needs to be done, but we expect a much - better compatibility for the next major release.</p> - -<h3 id="v42_feat_other">Other Enhancements and Changes</h3> +<h3 id="feat_other">Other Enhancements and Changes</h3> <h4>Enhancements for Users</h4> <ul> - <li><strong>[% terms.Bugs %]:</strong> Users without editbugs privileges can - no longer remove other users from the CC list of [% terms.bugs %].</li> - <li><strong>[% terms.Bugs %]:</strong> Local [% terms.bug %] IDs are now valid - in the See Also field. Adding such an ID will also add a reciprocal link in - the other [% terms.bug %].</li> - <li><strong>[% terms.Bugs %]:</strong> After editing [% terms.abug %] or an - attachment, the URL is automatically changed to <kbd>show_bug.cgi</kbd> - instead of <kbd>post_bug.cgi</kbd>, <kbd>process_bug.cgi</kbd> or - <kbd>attachment.cgi</kbd> so that reloading the page (for instance when - restarting the web browser) displays the right page. This feature is supported - by Firefox, Chrome and Safari, but not by Internet Explorer 9.</li> - <li><strong>[% terms.Bugs %]:</strong> Inactive accounts are no longer - displayed in user fields when user-autocompletion is enabled.</li> - <li><strong>[% terms.Bugs %]:</strong> User-autocompletion is now much faster - on installations with many user accounts.</li> - <li><strong>[% terms.Bugs %]:</strong> The See Also field now accepts URLs - pointing to MantisBT, Trac, JIRA and the sourceforge.net b[%%]ug trackers.</li> - <li><strong>[% terms.Bugs %]:</strong> Displaying [% terms.abug %] with many - dependencies is now much faster.</li> - <li><strong>Attachments:</strong> The encoding of text files can be automatically - detected when uploading them as attachments.</li> - <li><strong>Attachments:</strong> Clickjacking could possibly occur in an attachment - Details page if a user attached a specially formatted HTML file. To fix this - potential problem, the Details page always displays the HTML source instead and - users can see rendered page by clicking on View.</li> - <li><strong>Flags:</strong> Changing the requestee of a flag no longer changes - the requester.</li> - <li><strong>Reports:</strong> If JavaScript is enabled in your web browser, - tabular reports are now sortable based on any displayed column.</li> - <li><strong>Dependency graphs:</strong> The <em>Show every [% terms.bug %] in - the system with dependencies</em> option has been removed.</li> - <li><strong>Searches:</strong> The columns displayed by default in - [%+ terms.bug %]lists have changed. These columns are now displayed by default - unless otherwise specified:<br> - <kbd>product | component | assignee | [% terms.bug %] status | resolution | - [%+ terms.bug %] summary | last change date</kbd><br> - This means that the priority, severity and operating system columns are no - longer displayed by default.</li> - <li><strong>Searches:</strong> [% terms.Bug %]lists will now only display the - first 500 [% terms.bugs %] by default. It is still possible to display the - whole list, though.</li> - <li><strong>Searches:</strong> When using relative dates and times, <kbd>-1w</kbd> - is now a synonym for <kbd>-7d</kbd> and means exactly 7 days. Previously, - <kbd>-1w</kbd> meant the beginning of the week, which was confusing some users. - The same confusion existed for <kbd>-1d</kbd> which was different from - <kbd>-24h</kbd>, and for <kbd>-1m</kbd> which was different from <kbd>-30d</kbd>. - Now if you really want the beginning of the day, week or month, you must use - <kbd>-1ds</kbd>, <kbd>-1ws</kbd>, and <kbd>-1ms</kbd> respectively, where - "s" means "start of". This change will affect existing saved searches using - relative dates.</li> - <li><strong>Searches:</strong> A new <em>Include fulltext when performing quick - searches</em> user preference has been added which permits users to include - or exclude comments when using quicksearches.</li> - <li><strong>Searches:</strong> It is now possible to query for [% terms.bugs %] - based on personal tags in the Custom Search section in the Advanced Search - page.</li> - <li><strong>Email notifications: </strong> The date and time of comments are no - longer displayed in the comment header in [% terms.bug%]mails. This information - is already available in the email header itself.</li> + <li><strong>[% terms.Bugs %]:</strong> The deadline field is now visible to users + not in the the <kbd>timetracking</kbd> group.</li> + <li><strong>[% terms.Bugs %]:</strong> There is now a "Preview" mode when + creating a new comment that allows you to see how the comment will look + before committing to the database.</li> + <li><strong>[% terms.Bugs %]:</strong> The reporter is now allowed to enter + keywords at time of [% terms.bug %] creation.</li> + <li><strong>[% terms.Bugs %]:</strong> "See Also" now allows spaces as well as + commas to delimit multiple values.</li> + <li><strong>[% terms.Bugs %]:</strong> Auto linkification in comments of [% terms.bug %] + IDs and comment IDs has been improved.</li> + <li><strong>[% terms.Bugs %]:</strong> [% terms.Bugs %] can now have multiple + aliases assigned to them. Before each [% terms.bug %] could only have a single + value. Also, aliases are now visible in the browser's title bar.</li> + <li><strong>[% terms.Bugs %]:</strong> Users can now change the flags of multiple + [%+ terms.bugs %] at once using the mass-edit form.</li> + <li><strong>Charts and Reports:</strong> UTF-8 characters are now correctly + displayed in "New Charts" and graphical reports.</li> + <li><strong>Charts and Reports:</strong> Custom multi-select fields are now + available as report axis options. This makes them usable for categorizing + [%+ terms.bugs %] in reports.</li> + <li><strong>Email:</strong> You can now choose to not receive any mail at all + about a particular [% terms.bug %], even if you continue to have a role on + that [% terms.bug %] (e.g. reporter).</li> + <li><strong>Email:</strong> When adding or removing [% terms.abug %] as a + dependency, the summary of the [% terms.bug %] is included in the email + notification.</li> + <li><strong>Requests:</strong> <kbd>request.cgi</kbd> can now output results in + CSV format.</li> + <li><strong>Requests:</strong><kbd> X-Bugzilla-*</kbd> headers are now included + in flag notification emails.</li> + <li><strong>Searches:</strong> Some useful searches have been added to the + Bugzilla home page.</li> + <li><strong>Searches:</strong> Quicksearch now allows for use of comparison + operators such as !=, >=, >, <, etc., in addition to substring searches.</li> + <li><strong>Searches:</strong> The "Blocks" and "Depends On" values can now be + displayed as columns in [% terms.abug %] list.</li> + <li><strong>Searches:</strong> The "is empty" and "is not empty" search operators + have been added to the Advanced Search UI. This allows searching for null + and not null values for certain fields.</li> </ul> <h4>Enhancements for Administrators and Developers</h4> <ul> - <li><strong>Installation:</strong> <kbd>checksetup.pl</kbd> is now much quieter - when creating a new database.</li> - <li><strong>Security:</strong> [% terms.Bugzilla %] 4.0 is using - <kbd>Math::Random::Secure</kbd> to generate cryptographically secure - pseudorandom numbers, but it appeared that installing this Perl module from - CPAN caused a lot of trouble for some people due to its numerous dependencies. - So the RNG code has been rewritten to only depend on <kbd>Math::Random::ISAAC</kbd>, - which was already in use in previous versions of [% terms.Bugzilla %].</li> - <li><strong>Security:</strong> <kbd>X-Frame-Options = SAMEORIGIN</kbd> is now - passed to all page headers (except when viewing attachments, as they can be - on a different host) to protect users from framing and subsequent possible - clickjacking problems.</li> - <li><strong>Configuration:</strong> A new parameter <em>password_complexity</em> - has been added (default: no_constraints) which allows admins to force users - to use passwords with a higher complexity, such as a combination of uppercase - and lowercase letters, numbers and special characters, or a subset of them.</li> - <li><strong>Configuration:</strong> A new parameter <em>search_allow_no_criteria</em> - has been added (default: on) which allows admins to forbid queries with no - criteria. This is particularly useful for large installations with several - tens of thousands [% terms.bugs %] where returning all [% terms.bugs %] - doesn't make sense and would have a performance impact on the database.</li> - <li><strong>Configuration:</strong> A new parameter <em>default_search_limit</em> - has been added (default: 500) which limits the number of [% terms.bugs %] - displayed by default in a [% terms.bug%]list. The user can ask to see a larger - list, though.</li> - <li><strong>Configuration:</strong> A new parameter <em>max_search_results</em> - has been added (default: 10000) which limits the number of [% terms.bugs %] - a user can request at once in a [% terms.bug%]list. This is a hard limit and - a user cannot bypass this value.</li> - <li><strong>Configuration:</strong> A new parameter <em>ajax_user_autocompletion</em> - has been added (default: on) 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.</li> - <li><strong>Configuration:</strong> The <em>config_modify_panels</em> hook now - lets you add additional parameters to existing parameters panels.</li> - <li><strong>Flags:</strong> Users with local editcomponents privileges can now - edit flag types for products they can administer.</li> - <li><strong>Quips:</strong> A new system group <em>bz_quip_moderators</em> has - been created to moderate quips. Till now, you had to be in the <em>admin</em> - group to do that.</li> - <li><kbd>importxml.pl</kbd> now inserts each comment separately into the imported - [%+ terms.bug %] instead of concatenating them all into a single comment.</li> - <li><kbd>email_in.pl</kbd> now ignores auto-submitted incoming emails (for - instance, all these "out of office" emails).</li> - <li>New code hooks: email_in_before_parse, email_in_after_parse, - install_filesystem, install_update_db_fielddefs, job_map, object_end_of_create, - quicksearch_map, user_preferences.</li> -</ul> - -<h4>WebService Changes</h4> - -<ul> - <li>Two new methods have been added: <kbd>Product.create</kbd> and - <kbd>Group.create</kbd>.</li> - <li><kbd>B[%%]ug.update</kbd> no longer throws an error when passing an empty - string to <kbd>see_also</kbd>. It now simply ignores this empty value.</li> - <li><kbd>Product.get</kbd> now also returns data about the classification it - belongs to as well as its components, milestones and versions. It also - returns the <kbd>default_milestone</kbd> and <kbd>has_unconfirmed</kbd> - attributes.</li> - <li>In <kbd>B[%%]ug.fields</kbd>, the <kbd>sortkey</kbd> attribute used in - <kbd>values</kbd> has been renamed to <kbd>sort_key</kbd>.</li> - <li>In <kbd>B[%%]ug.attachments</kbd> and <kbd>B[%%]ug.add_attachment</kbd>, - the <kbd>is_url</kbd> attribute no longer exists.</li> -</ul> - - -<h2 id="v42_issues">Outstanding Issues</h2> - -<ul> - <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 - <em>chartgroup</em> parameter as the only access mechanism available.</li> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=584742"> - [%- terms.Bug %] 584742</a>: When viewing [% terms.abug %], WebKit-based - browsers can automatically reset a field's selected value when the field - has disabled values.</li> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=780053"> - [%- terms.Bug %] 780053</a>: Oracle crashes when listing keywords, tags - or flags in buglists.</li> -</ul> - - -<h2 id="v42_code_changes">Code Changes Which May Affect Customizations and Extensions</h2> - -<ul> - <li>The <kbd>email/newchangedmail.txt.tmpl</kbd> template is now fully templatized, - meaning that the diff table displaying changes in [% terms.bug %] fields is - now generated in the template itself. This means [% terms.bug %]mails are now - fully localizable.</li> - <li>The bugmail_recipients hook has been modified to pass <kbd>diffs</kbd> with - changes made to the [% terms.bug %] as well as <kbd>users</kbd> including - recipients of the email notification.</li> - <li>YUI has been upgraded to 2.9.0.</li> - <li>Due to the major code refactor of <kbd>B[%%]ugzilla/Search.pm</kbd>, any - customization made against this file will probably need to be rewritten.</li> - <li>The [% terms.Bugzilla %]-specific <kbd>url_quote</kbd> filter used in templates - has been removed and replaced by the <kbd>uri</kbd> filter from Template::Toolkit - as they are now similar.</li> - <li><kbd>long_list.cgi</kbd>, <kbd>showattachment.cgi</kbd> and <kbd>xml.cgi</kbd> - have been removed from the codebase. As <a href="#v40_code_changes">announced</a> - in the release notes of [% terms.Bugzilla %] 4.0, these scripts were deprecated - since [% terms.Bugzilla %] 2.19.</li> - <li><kbd>sidebar.cgi</kbd> has been removed, because Gecko-based browsers no - longer support remote XUL, and its popularity is very low.</li> - <li><kbd>contrib/yp_nomail.sh</kbd> has been removed. This script is no longer - useful since [% terms.Bugzilla %] 3.0.</li> - <li><kbd>contrib/bugzilla_ldapsync.rb</kbd> has been removed. This script didn't - work for a long time.</li> -</ul> - - -<h1 id="v42_previous">[% terms.Bugzilla %] 4.0 Release Notes</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.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 <kbd>B[% %]ug.create</kbd> 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><kbd>importxml.pl</kbd> 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 <kbd>install-module.pl</kbd> 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> + <li><strong>Administration:</strong> There are now <kbd>INTEGER</kbd> and + <kbd>DATE</kbd> custom field types.</li> + <li><strong>Administration:</strong> Filenames used to store product data for + "Old Charts" are now based on product IDs to avoid data loss when changing + product names.</li> + <li><strong>Administration:</strong> JavaScript and CSS files are now minified + and concatenated to improve page load performance. When changes are made, + <kbd>checksetup.pl</kbd> should be run to regenerate the combined files.</li> + <li><strong>[% terms.Bugs %]:</strong> Bugzilla now keeps track of the last + time each user visited (that is, loaded the show_bug page in a web browser) + each [% terms.bug %]. This could be useful for dashboards or API clients.</li> + <li><strong>Database:</strong> Text that contained unicode + supplementary characters (outside BMP) was cut off when using MySQL as backend. + This has been fixed to prevent data loss.</li> + <li><strong>Database:</strong> SSL connections are now possible when using + MySQL as backend.</li> + <li><strong>Database:</strong> For version 8.x of PostgreSQL, <kbd>plpgsql</kbd> + was not always installed by default and <kbd>checksetup.pl</kbd> would + generate an error. This has been fixed.</li> + <li><strong>Development:</strong> Bugzilla is now HTML5 compliant. As a + consequence, Internet Explorer 6 and 7 are no longer supported.</li> + <li><strong>Email:</strong> Email generation originally was done before the + jobqueue job was inserted. This is now delayed and done by + <kbd>jobqueue.pl</kbd> right before sending the email which can improve + responsiveness when processing [% terms.bug %] changes.</li> + <li><strong>Email:</strong> When a site administrator creates a new user, an + email is sent to the user.</li> + <li><strong>Email:</strong> For dependency email notifications, the header + <kbd>X-B[%%]ugzilla-Type: dep_changed</kbd> is set.</li> + <li><strong>Email:</strong> <kbd>whine.pl</kbd> emails now use + <kbd>DEFAULT_COLUMN_LIST</kbd> (the same default columns seen in the buglist + page) instead of hard coded column list.</li> + <li><strong>Security:</strong> Support for increased values for + <kbd>PASSWORD_SALT_LENGTH</kbd> without breaking compatibility with old + hashes.</li> +</ul> + +<h4 id="feat_webservices_other">WebService Changes</h4> + +<ul> + <li><kbd>B[%%]ug.search</kbd> now allows for full search functionality + similar to what is possible using the Advanced Query UI.</li> + <li>Basic support for eTag headers has been added to all WebServices + to allow for better network performance.</li> + <li>Administrators can now change a parameter that filters all email + addresses returned in WebService calls similar to filtering that + happens in the web UI.</li> + <li>WebService calls now support use of API keys for authentication. + Usernames and passwords remain supported.</li> + <li>Invalid or expired authentication cookies and tokens now throw + errors instead of being silently ignored. <kbd>User.valid_login</kbd> + can be used to determine if they are still valid or not.</li> + <li>WebService calls that are used to create and update [% terms.bugs %] + and attachments now support setting and updating of flags.</li> + <li><kbd>B[%%]ug.update_attachment</kbd> can update an attachment's + metadata as well as its flags.</li> + <li>The <kbd>product</kbd> parameter for <kbd>B[%%]ug.possible_duplicates</kbd> + has been renamed to <kbd>products</kbd>.</li> + <li>Some compatibility fields included in returned data that were marked + to be removed in this release are now gone.</li> + <li><kbd>Group.get</kbd> has been added to get information about a group and + its members.</li> + <li><kbd>FlagType.get</kbd> has been added to get information about valid + flag types for a given product and component.</li> + <li>The deprecated <kbd>B[%%]ug.get_bugs</kbd> and <kbd>B[%%]ug.get_history</kbd> + methods are no longer supported. They have been renamed to <kbd>B[%%]ug.get</kbd> + and <kbd>B[%%]ug.history</kbd> respectively.</li> +</ul> + +<h2 id="code_changes">Code Changes Which May Affect Customizations and Extensions</h2> + +<ul> + <li>Support for CVS, Bonsai and LXR has been removed entirely when viewing + attachments. This means that the <kbd>cvsroot</kbd>, <kbd>cvsroot_get</kbd>, + <kbd>bonsai_url</kbd>, <kbd>lxr_url</kbd> and <kbd>lxr_root</kbd> parameters + are all gone, as well as <kbd>cvsbin</kbd> from the <kbd>localconfig</kbd> + file.</li> + <li>The <kbd>docs_urlbase</kbd> parameter has been removed. If documentation + has not been compiled locally, the "Help" links and other documentation links + will redirect to <a href="https://bugzilla.readthedocs.org">bugzilla.readthedocs.org</a> + automatically.</li> + <li>The <kbd>mostfreqthreshold</kbd> parameter has also been removed.</li> + <li>All extensions which define new public WebService methods must list them + in a <kbd>PUBLIC_METHODS</kbd> constant. Methods which are not listed there + will not be accessible remotely.</li> + <li><kbd>JSON::XS</kbd> is now used instead of <kbd>Data::Dumper</kbd> for + storage on configuration values in <kbd>data/params</kbd>. This should + improve performance when loading the file.</li> + <li>A new test has been added to check for reserved words in SQL schema.</li> + <li><kbd>Pod::Coverage</kbd> is now used to ensure subroutines are documented.</li> + <li>Bugzilla code now uses <kbd>use parent</kbd> instead of <kbd>use base</kbd> + in all places applicable.</li> + <li>A new hook called <kbd>cgi_headers</kbd> has been added to allow + customization of the HTTP headers returned.</kbd> + <li>A new hook called <kbd>user_check_account_creation</kbd> has been added + to add extra checks before accepting the creation of a new user account.</li> </ul> -<h3 id="v40_req_perl">Perl</h3> - -<p>Perl v5.8.1</p> -<h3 id="v40_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="v40_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="v40_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="v40_req_modules">Required Perl Modules</h3> - - <table cellspacing="0" cellpadding="0" border="0" class="req_table"> - <tbody> - <tr> - <th>Module</th><th>Version</th> - </tr> - <tr> - <td>CGI</td> - <td class="req_new">3.51</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 class="req_new">1.904</td> - </tr> - <tr> - <td>URI</td> - <td>(Any)</td> - </tr> - <tr> - <td class="req_new">List::MoreUtils</td> - <td class="req_new">0.22</td> - </tr> - </tbody> - </table> - -<h3 id="v40_req_optional_mod">Optional Perl Modules</h3> - -<p>The following perl modules, if installed, enable various - features of [% terms.Bugzilla %]:</p> - - <table cellspacing="0" cellpadding="0" border="0" class="req_table"> - <tbody> - <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>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>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>XML::Twig</td> - <td>(Any)</td> - <td>Move [% terms.Bugs %] Between Installations, 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 class="req_new">0.712</td> - <td>XML-RPC Interface</td> - </tr> - <tr> - <td>JSON::RPC</td> - <td>(Any)</td> - <td>JSON-RPC Interface</td> - </tr> - <tr> - <td class="req_new">JSON::XS</td> - <td class="req_new">2.0</td> - <td>Make JSON-RPC Faster</td> - </tr> - <tr> - <td>Test::Taint</td> - <td>(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> - <tr> - <td>Apache2::SizeLimit</td> - <td class="req_new">0.93</td> - <td>mod_perl</td> - </tr> - <tr> - <td class="req_new">Math::Random::Secure</td> - <td class="req_new">0.05</td> - <td>Improve cookie and token security</td> - </tr> - </tbody> - </table> - -<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> - -<h2 id="v40_previous">Release Notes For Previous Versions</h2> - -<p><a href="page.cgi?id=release-notes3.html">Release Notes for - [%+ terms.Bugzilla %] 3.x and Earlier</a></p> - [% INCLUDE global/footer.html.tmpl %] [% BLOCK db_req %] [% SET m = DB_MODULE.$db %] - <h3 id="v44_req_[% db FILTER html %]">For [% m.name FILTER html %] Users</h3> + <h3 id="req_[% db FILTER html %]">For [% m.name FILTER html %] Users</h3> <ul> <li>[% m.name FILTER html %] @@ -2374,15 +350,15 @@ [% '</span>' IF db_new %] </li> <li><strong>perl module:</strong> - [%+ m.dbd.module FILTER html %] - [% '<span class="req_new">' IF dbd_new %]v[% m.dbd.version FILTER html %] + [%+ m.dbd.module FILTER html %] + [%+ '<span class="req_new">' IF dbd_new %]v[% m.dbd.version FILTER html %] [% '</span>' IF dbd_new %]</li> </ul> [% END %] [% BLOCK req_table %] - <table class="req_table" border="0" cellspacing="0" cellpadding="0"> + <table class="req_table"> <tr> <th>Module</th> <th>Version</th> [% IF include_feature %] @@ -2392,8 +368,8 @@ [% FOREACH req = reqs %] <tr> <td [% ' class="req_new"' IF new.contains(req.package) %]> - [%- req.module FILTER html %]</td> - <td [% ' class="req_new"' IF updated.contains(req.package) + [%- req.module FILTER html %]</td> + <td [% ' class="req_new"' IF updated.contains(req.package) OR new.contains(req.package) %]> [%- IF req.version == 0 %] (Any) @@ -2401,7 +377,7 @@ [%- req.version FILTER html %] [% END %] </td> - [% IF include_feature %] + [% IF include_feature %] <td>[% req.feature.join(', ') FILTER html %]</td> [% END %] </tr> diff --git a/template/en/default/pages/release-notes3.html.tmpl b/template/en/default/pages/release-notes3.html.tmpl deleted file mode 100644 index 8d6ada56a..000000000 --- a/template/en/default/pages/release-notes3.html.tmpl +++ /dev/null @@ -1,3474 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] - -[% SET title = "$terms.Bugzilla 3.6 Release Notes" %] -[% INCLUDE global/header.html.tmpl - title = title - style_urls = ['skins/standard/page.css'] -%] - -<h3>Release Notes For Newer Versions</h3> - -<p>Release notes for versions of [% terms.Bugzilla %] of the 4.x series are - available <a href="page.cgi?id=release-notes.html">here</a>.</p> - -<h1>[% title FILTER html %]</h1> - -<ul class="bz_toc"> - <li><a href="#v36_introduction">Introduction</a></li> - <li><a href="#v36_point">Updates in this 3.6.x Release</a></li> - <li><a href="#v36_req">Minimum Requirements</a></li> - <li><a href="#v36_feat">New Features and Improvements</a></li> - <li><a href="#v36_issues">Outstanding Issues</a></li> - <li><a href="#v36_upgrading">Notes On Upgrading From a Previous Version</a></li> - <li><a href="#v36_code_changes">Code Changes Which May Affect - Customizations</a></li> - <li><a href="#v36_previous">Release Notes for Previous Versions</a></li> -</ul> - -<h2 id="v36_introduction">Introduction</h2> - -<p>Welcome to [% terms.Bugzilla %] 3.6! The focus of the 3.6 release is - on improving usability and "polishing up" all our features (by adding - some pieces that were "missing" or always wanted), although we - also have a few great new features for you, as well!</p> - -<p>If you're upgrading, make sure to read <a href="#v36_upgrading">Notes - On Upgrading From a Previous Version</a>. If you are upgrading from a release - before 3.4, make sure to read the release notes for all the - <a href="#v36_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.canonical.com/">Canonical - Ltd.</a>, <a href="http://www.itasoftware.com/">ITA Software</a>, - the <a href="http://www.ibm.com/linux/ltc/">IBM Linux Technology Center</a>, - <a href="http://www.redhat.com/">Red Hat</a>, and - <a href="http://www.novell.com/">Novell</a> for funding the development - of various features and improvements in this release of - [%+ terms.Bugzilla %].</p> - -<h2 id="v36_point">Updates in this 3.6.x Release</h2> - -<h3>3.6.2</h3> - -<p>This release fixes various security issues. See the - <a href="http://www.bugzilla.org/security/3.2.7/">Security Advisory</a> - for details.</p> - -<p>In addition, the following important fixes/changes have been made in - this release:</p> - -<ul> - <li>[% terms.Bugzilla %] installations running on older versions of IIS - will no longer experience the "Undef to trick_taint" errors that would - sometimes occur. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=521416">[% terms.Bug %] 521416</a>) - </li> - <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, - again. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=578494">[% terms.Bug %] 578494</a> - and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=553884">[% terms.Bug %] 553884</a>) - </li> - <li>Quicksearch was usually (incorrectly) being limited to 200 results. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=581622">[% terms.Bug %] 581622</a>) - </li> - <li>On Windows, <kbd>install-module.pl</kbd> can now properly install - DateTime and certain other Perl modules that didn't install properly - before. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=576105">[% terms.Bug %] 576105</a>) - </li> - <li>Searching "keywords" for "contains none of the words" or "does not - match regular expression" now works properly. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=562014">[% terms.Bug %] 562014</a>) - </li> - <li>Doing <kbd>collectstats.pl --regenerate</kbd> now works on installations - using PostgreSQL. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=577058">[% terms.Bug %] 577058</a>) - </li> - <li>The "Field Values" administrative control panel was sometimes denying - admins the ability to delete field values when there was no reason - to deny the deletion. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=577054">[% terms.Bug %] 577054</a>) - </li> - <li>Eliminate the "uninitialized value" warnings that would happen when - editing a product's components. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=576911">[% terms.Bug %] 576911</a>) - </li> - <li>The updating of bugs_fulltext that happens during - <kbd>checksetup.pl</kbd> for upgrades to 3.6 should now be MUCH faster. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=577754">[% terms.Bug %] 577754</a>) - </li> - <li><kbd>email_in.pl</kbd> was not allowing the setting of time-tracking - fields via inbound emails. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=583622">[% terms.Bug %] 583622</a>) - </li> -</ul> - -<h3>3.6.1</h3> - -<p>This release fixes two security issues. See the - <a href="http://www.bugzilla.org/security/3.2.6/">Security Advisory</a> - for details.</p> - -<p>In addition, the following important fixes/changes have been made in - this release:</p> - -<ul> - <li>Using the "Change Columns" page would sometimes result in a - plain-text page instead of HTML. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=376044">[% terms.Bug %] 376044</a>) - </li> - <li>Extensions that have only templates and no code are now working. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=562551">[% terms.Bug %] 562551</a>) - </li> - <li><kbd>install-module.pl</kbd> has been fixed so that it installs - modules properly on both new and old versions of Perl. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=560318">[% terms.Bug %] 560318</a> - and <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=560330">[% terms.Bug %] 560330</a>) - </li> - <li>It is now possible to upgrade from 3.4 to 3.6 when using Oracle. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=561379">[% terms.Bug %] 561379</a>) - </li> - <li>Editing a field value's name (using the Field Values admin control - panel) wasn't working if the value was set as the default for that - field. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=561296">[% terms.Bug %] 561296</a>) - </li> - <li>If you had the <kbd>noresolveonopenblockers</kbd> parameter set, - [%+ terms.bugs %] couldn't be edited at all if they were marked FIXED - and had any open blockers. (The parameter is only supposed to prevent - <em>changing</em> [% terms.bugs %] to FIXED, not modifying already-FIXED - [%+ terms.bugs %].) - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=565314">[% terms.Bug %] 565314</a>) - </li> - <li>Some minor issues with Perl 5.12 were fixed (mostly warnings that Perl - 5.12 was throwing). [% terms.Bugzilla %] now supports Perl 5.12.</li> -</ul> - -<h2 id="v36_req">Minimum Requirements</h2> - -<p>Any requirements that are new since 3.4.5 will look like - <span class="req_new">this</span>.</p> - -<ul> - <li><a href="#v36_req_perl">Perl</a></li> - <li><a href="#v36_req_mysql">For MySQL Users</a></li> - <li><a href="#v36_req_pg">For PostgreSQL Users</a></li> - <li><a href="#v36_req_oracle">For Oracle Users</a></li> - <li><a href="#v36_req_modules">Required Perl Modules</a></li> - <li><a href="#v36_req_optional_mod">Optional Perl Modules</a></li> -</ul> - -<h3 id="v36_req_perl">Perl</h3> - -<p>Perl v5.8.1</p> - -<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> - -<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> - -<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> - -<ul> - <li><a href="#v36_feat_usability">General Usability Improvements</a></li> - <li><a href="#v36_feat_extensions">New Extensions System</a></li> - <li><a href="#v36_feat_qs">Improved Quicksearch</a></li> - <li><a href="#v36_feat_browse">Simple "Browse" Interface</a></li> - <li><a href="#v36_feat_suexec">SUExec Support</a></li> - <li><a href="#v36_feat_mpwindows">Experimental mod_perl Support on Windows</a></li> - <li><a href="#v36_email_attachments">Send Attachments by Email</a></li> - <li><a href="#v36_feat_jsonrpc">JSON-RPC Interface</a></li> - <li><a href="#v36_feat_migrate">Migration From Other [% terms.Bug %]-Trackers</a></li> - <li><a href="#v36_feat_other">Other Enhancements and Changes</a></li> -</ul> - -<h3 id="v36_feat_usability">General Usability Improvements</h3> - -<p>A <a href="https://wiki.mozilla.org/Bugzilla:CMU_HCI_Research_2008">scientific - usability study</a> was done on [% terms.Bugzilla %] by researchers - from Carnegie-Mellon University. As a result of this study, - <a href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=490786&hide_resolved=0">several - usability issues</a> were prioritized to be fixed, based on specific data - from the study.</p> - -<p>As a result, you will see many small improvements in [% terms.Bugzilla %]'s - usability, such as using Javascript to validate certain forms before - they are submitted, standardizing the words that we use in the user interface, - being clearer about what [% terms.Bugzilla %] needs from the user, - and other changes, all of which are also listed individually in this New - Features section.</p> - -<p>Work continues on improving usability for the next release of - [%+ terms.Bugzilla %], but the results of the research have already - had an impact on this 3.6 release.</p> - -<h3 id="v36_feat_extensions">New Extensions System</h3> - -<p>[% terms.Bugzilla %] has a brand-new Extensions system. The system is - consistent, fast, and - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Extension.html">fully - documented</a>. It makes it possible to easily extend [% terms.Bugzilla %]'s - code and user interface to add new features or change existing features. - There's even - <a href="[% docs_urlbase FILTER html %]api/extensions/create.html">a - script</a> that will create the basic layout of an extension for you, to - help you get started. For more information about the new system, see the - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Extension.html">Extensions - documentation</a>.</p> - -<p>If you had written any extensions using [% terms.Bugzilla %]'s previous - extensions system, there is - <a href="[% docs_urlbase FILTER html %]api/contrib/extension-convert.html">a - script to help convert old extensions into the new format</a>.</p> - -<h3 id="v36_feat_qs">Improved Quicksearch</h3> - -<p>The "quicksearch" box that appears on the front page of - [%+ terms.Bugzilla %] and in the header/footer of every page - is now simplified and made more powerful. There is a - <kbd>[?]</kbd> link next to the box that will take you to - the simplified <a href="page.cgi?id=quicksearch.html">Quicksearch Help</a>, - which describes every single feature of the system in a simple layout, - including new features such as the ability to use partial field names - when searching.</p> - -<p>Quicksearch should also be much faster than it was before, particularly - on large installations.</p> - -<p>Note that in order to implement the new quicksearch, certain old - and rarely-used features had to be removed: - -<ul> - <li><b>+</b> as a prefix to mean "search additional resolutions", and - <b>+</b> as a prefix to mean "search just the summary". You can - instead use <kbd>summary:</kbd> to explicitly search summaries.</li> - <li>Searching the [% field_descs.bug_severity FILTER html %] field if you - type something that matches the first few characters of a [% - field_descs.bug_severity FILTER html %]. You can explicitly - search the [% field_descs.bug_severity FILTER html %] field if you want to - find [% terms.bugs %] by [% field_descs.bug_severity FILTER html %].</li> - <li>Searching the Priority field if you typed something that exactly - matched the name of a priority. You can explicitly search the - Priority field if you want to find [% terms.bugs %] by priority.</li> - <li>Searching the [% field_descs.rep_platform FILTER html %] and OS fields - if you typed in one of a certain hard-coded list of strings (like "pc", - "windows", etc.). You can explicitly search these fields, instead, if you want - to find [% terms.bugs %] with a specific [% field_descs.rep_platform - FILTER html %] or OS set.</li> -</ul> - -<h3 id="v36_feat_browse">Simple "Browse" Interface</h3> - -<p>There is now a "Browse" link in the header of each [% terms.Bugzilla %] - page that presents a very basic interface that allows users to simply - browse through all open [% terms.bugs %] in particular components.</p> - -<h3 id="v36_feat_suexec">SUExec Support</h3> - -<p>[% terms.Bugzilla %] can now be run in Apache's "SUExec" mode, - which is what control panel software like cPanel and Plesk use - (so [% terms.Bugzilla %] should now be much easier to install - on shared hosting). SUExec support shows up as an option - in the <kbd>localconfig</kbd> file during installation.</p> - -<h3 id="v36_feat_mpwindows">Experimental mod_perl Support on Windows</h3> - -<p>There is now experimental support for running [% terms.Bugzilla %] - under mod_perl on Windows, for a significant performance enhancement - (in exchange for using more memory).</p> - -<h3 id="v36_email_attachments">Send Attachments by Email</h3> - -<p>The <a href="[% docs_urlbase FILTER html %]api/email_in.html">email_in</a> - script now supports attaching multiple attachments to [% terms.abug %] - by email, both when filing and when updating [% terms.abug %].</p> - -<h3 id="v36_feat_jsonrpc">JSON-RPC Interface</h3> - -<p>[% terms.Bugzilla %] now has support for the - <a href="http://json-rpc.org/">JSON-RPC</a> WebServices protocol via - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Server/JSONRPC.html">jsonrpc.cgi</a>. - The JSON-RPC interface is experimental in this release--if you want any - fundamental changes in how it works, - <a href="http://www.bugzilla.org/developers/reporting_bugs.html">let us - know</a>, for the next release of [% terms.Bugzilla %].</p> - -<h3 id="v36_feat_migrate">Migration From Other [% terms.Bug %]-Trackers</h3> - -<p>[% terms.Bugzilla %] 3.6 comes with a new script, - <a href="[% docs_urlbase FILTER html %]api/migrate.html">migrate.pl</a>, - which allows migration from other [% terms.bug %]-tracking systems. - Among the various features of the migration system are:</p> - -<ul> - <li>It is non-destructive--you can migrate into an existing - [%+ terms.Bugzilla %] installation without destroying any data - in the installation.</li> - <li>It has a "dry-run" mode so you can test your migration - before actually running it.</li> - <li>It is relatively easy to write new migrators for new systems, - if you know Perl. The basic migration framework does most of the work - for you, you just have to provide it with the data from your - [%+ terms.bug %]-tracker. See the - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Migrate.html">Bugzilla::Migrate</a> - documentation and see our current migrator, - <kbd>Bugzilla/Migrate/GNATS.pm</kbd> for information on how to make your - own migrator.</li> -</ul> - -<p>The first migrator that has been implemented is for the GNATS - [%+ terms.bug %]-tracking system. We'd love to see migrators for - other systems! If you want to contribute a new migrator, see our - <a href="http://wiki.mozilla.org/Bugzilla:Developers">development - process</a> for details on how to get code into [% terms.Bugzilla %].</p> - -<p>Thanks to <a href="http://lambdares.com/">Lambda Research</a> for - funding the initial development of this feature.</p> - -<h3 id="v36_feat_other">Other Enhancements and Changes</h3> - -<h4>Enhancements for Users</h4> - -<ul> - <li><b>[% terms.Bug %] Filing:</b> When filing [% terms.abug %], - [%+ terms.Bugzilla %] now visually indicates which fields are - mandatory.</li> - <li><b>[% terms.Bug %] Filing:</b> "Bookmarkable templates" now - support the "alias" and "estimated hours" fields.</li> - - <li><b>[% terms.Bug %] Editing:</b> In previous versions of - [%+ terms.Bugzilla %], if you added a private comment to [% terms.abug %], - then <em>none</em> of the changes that you made at that time were - sent to users who couldn't see the private comment. Now, for users - who can't see private comments, public changes are sent, but the private - comment is excluded from their email notification.</li> - <li><b>[% terms.Bug %] Editing:</b> The controls for groups now - appear to the right of the attachment and time-tracking tables, - when editing [% terms.abug %].</li> - <li><b>[% terms.Bug %] Editing:</b> The "Collapse All Comments" - and "Expand All Comments" links now appear to the right of the - comment list instead of above it.</li> - <li><b>[% terms.Bug %] Editing:</b> The See Also field now supports - URLs for Google Code Issues and the Debian B[% %]ug-Tracking System.</li> - <li><b>[% terms.Bug %] Editing:</b> There have been significant performance - improvements in <kbd>show_bug.cgi</kbd> (the script that displays the - [% terms.bug %]-editing form), particularly for [% terms.bugs %] that - have lots of comments or attachments.</li> - - <li><b>Attachments:</b> The "Details" page of an attachment - now displays itself as uneditable if you can't edit the fields - there.</li> - <li><b>Attachments:</b> We now make sure that there is - a Description specified for an attachment, using JavaScript, before - the form is submitted.</li> - <li><b>Attachments:</b> There is now a link back to the [% terms.bug %] - at the bottom of the "Details" page for an attachment.</li> - <li><b>Attachments:</b> When you click on an "attachment 12345" link - in a comment, if the attachment is a patch, you will now see the - formatted "Diff" view instead of the raw patch.</li> - <li><b>Attachments</b>: For text attachments, we now let the browser - auto-detect the character encoding, instead of forcing the browser to - always assume the attachment is in UTF-8.</li> - - <li><b>Search:</b> You can now display [% terms.bug %] flags as a column - in search results.</li> - <li><b>Search:</b> When viewing search results, you can see which columns are - being sorted on, and which direction the sort is on, as indicated - by arrows next to the column headers.</li> - <li><b>Search:</b> You can now search the Deadline field using relative - dates (like "1d", "2w", etc.).</li> - <li><b>Search:</b> The iCalendar format of search results now includes - a PRIORITY field.</li> - <li><b>Search:</b> It is no longer an error to enter an invalid search - order in a search URL--[% terms.Bugzilla %] will simply warn you that - some of your order options are invalid.</li> - <li><b>Search:</b> When there are no search results, some helpful - links are displayed, offering actions you might want to take.</li> - <li><b>Search:</b> For those who like to make their own - <kbd>buglist.cgi</kbd> URLs (and for people working on customizations), - <kbd>buglist.cgi</kbd> now accepts nearly every valid field in - [%+ terms.Bugzilla %] as a direct URL parameter, like - <kbd>&field=value</kbd>.</li> - - <li><b>Requests:</b> When viewing the "My Requests" page, you can now - see the lists as a normal search result by clicking a link at the - bottom of each table.</li> - <li><b>Requests:</b> When viewing the "My Requests" page, if you are - using Classifications, the Product drop-down will be grouped by - Classification.</li> - - <li><b>Inbound Email:</b> When filing [% terms.abug %] by email, if the - product that you are filing the [% terms.bug %] into has some groups - set as Default for you, the [% terms.bug %] will now be placed into those - groups automatically.</li> - <li><b>Inbound Email:</b> The field names that can be used when creating - [%+ terms.bugs %] by email now exactly matches the set of valid parameters - to the - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#create">B[% %]ug.create - WebService function</a>. You can still use most of the old field names - that 3.4 and earlier used for inbound emails, though, for - backwards-compatibility.</li> - - <li>If there are multiple languages available for your - [%+ terms.Bugzilla %], you can now select what language you want - [%+ terms.Bugzilla %] displayed in using links at the top of every - page.</li> - <li>When creating a new account, you will be automatically logged in - after setting your password.</li> - <li>There is no longer a maximum password length for accounts.</li> - <li>In the Dusk skin, it's now easier to see links.</li> - <li>In the Whining system, you can now choose to receive emails even - if there are no [% terms.bugs %] that match your searches.</li> - <li>The arrows in dependency graphs now point the other way, so that - [%+ terms.bugs %] point at their dependencies.</li> - - <li><b>New Charts:</b> You can now convert an existing Saved Search - into a data series for New Charts.</li> - <li><b>New Charts:</b> There is now an interface that allows you to - delete data series.</li> - <li><b>New Charts:</b> When deleting a product, you now have the option - to delete the data series that are associated with that product.</li> -</ul> - -<h4>Enhancements for Administrators and Developers</h4> - -<ul> - <li>Depending on how your workflow is set up, it is now possible to - have both UNCONFIRMED and REOPENED show up as status choices for - a closed [% terms.bug %]. If you only want one or the other to - show up, you should edit your status workflow appropriately - (possibly by removing or disabling the REOPENED status).</li> - <li>You can now "disable" field values so that they don't show - up as choices on [% terms.abug %] unless they are already set as - the value for that [% terms.bug %]. This doesn't work for the - per-product field values (component, target_milestone, and version) - yet, though.</li> - <li>Users are now locked out of their accounts for 30 minutes after - trying five bad passwords in a row during login. Every time a - user is locked out like this, the user in the "maintainer" parameter - will get an email.</li> - <li>The minimum length allowed for a password is now 6 characters.</li> - <li>The <kbd>UNCONFIRMED</kbd> status being enabled in a product - is now unrelated to the voting parameters. Instead, there is a checkbox - to enable the <kbd>UNCONFIRMED</kbd> status in a product.</li> - <li>Information about duplicates is now stored in the database instead - of being stored in the <kbd>data/</kbd> directory. On large installations - this could save several hundred megabytes of disk space.</li> - - <li><b>Installation:</b> When installing [% terms.Bugzilla %], the - "maintainer" parameter will be automatically set to the administrator - that was created by <kbd>checksetup.pl</kbd>.</li> - <li><b>Installation:</b> <kbd>checksetup.pl</kbd> now prints out - certain errors in a special color so that you know that something - needs to be done.</li> - <li><b>Installation:</b> <kbd>checksetup.pl</kbd> is now <em>much</em> - faster at upgrading installations, particularly older installations. - Also, it's been made faster to run for the case where it's not - doing an upgrade.</li> - <li><b>Installation:</b> If you install [% terms.Bugzilla %] using the - tarball, the <kbd>CGI.pm</kbd> module from CPAN is now included in - the <kbd>lib/</kbd> dir. If you would rather use the CGI.pm from your - global Perl installation, you can delete <kbd>CGI.pm</kbd> and the - <kbd>CGI</kbd> directory from the <kbd>lib/</kbd> directory.</li> - - <li>When editing a group, you can now specify that members of a group - 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 <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 - localized. See the <kbd>value_descs</kbd> variable in - <kbd>template/en/default/global/field-descs.none.tmpl</kbd>.</li> - <li><kbd>config.cgi</kbd> now returns an ETag header and understands - the If-None-Match header in HTTP requests.</li> - <li>The XML format of <kbd>show_bug.cgi</kbd> now returns more information: - the numeric id of each comment, whether an attachment is a URL, - the modification time of an attachment, the numeric id of a flag, - and the numeric id of a flag's type.</li> - - <li><b>Parameters:</b> Parameters that aren't actually required are no longer - in the "Required" section of the Parameters page. Instead, some are in the - new "General" section, and some are in the new "Advanced" section.</li> - <li><b>Parameters:</b> The old <kbd>ssl</kbd> parameter has been - changed to <kbd>ssl_redirect</kbd>, and can only be turned "on" or "off". - If "on", then all users will be forcibly redirected to SSL whenever - they access [% terms.Bugzilla %]. When the parameter is off, - no SSL-related redirects will occur (even if the user directly - accesses [% terms.Bugzilla %] via SSL, they will <em>not</em> be - redirected to a non-SSL page).</li> - <li><b>Parameters:</b> In the Advanced parameters, there is a new parameter, - <kbd>inbound_proxies</kbd>. If your [% terms.Bugzilla %] is behind a - proxy, you should set this parameter to the IP address of that proxy. - Then, [% terms.Bugzilla %] will "believe" any "X-Forwarded-For" - header sent from that proxy, and correctly use the X-Forwarded-For - as the end user's IP, instead of believing that all traffic is coming - from the proxy.</li> - - <li><b>Removed Parameter:</b> The <kbd>loginnetmask</kbd> parameter has - been removed. Since [% terms.Bugzilla %] sends secure cookies, it's no - longer necessary to always restrict logins to a specific IP or block - of addresses.</li> - <li><b>Removed Parameter:</b> The <kbd>quicksearch_comment_cutoff</kbd> - parameter is gone. Quicksearch now always searches comments; however, it - uses a much faster algorithm to do it.</li> - <li><b>Removed Parameter:</b> The <kbd>usermatchmode</kbd> parameter has - been removed. User-matching is now <em>always</em> done.</li> - <li><b>Removed Parameter:</b> The <kbd>useentrygroupdefault</kbd> parameter - has been removed. [% terms.Bugzilla %] now always behaves as though - that parameter were off.</li> - <li>The <kbd>t/001compile.t</kbd> test should now always pass, no matter - what configuration of optional modules you do or don't have installed.</li> - <li>New script: <kbd>contrib/console.pl</kbd>, which allows you to have - a "command line" into [% terms.Bugzilla %] by inputting Perl code - or using a few custom commands.</li> -</ul> - -<h4>WebService Changes</h4> - -<ul> - <li>The WebService now returns all dates and times in the UTC timezone. - <kbd>B[% %]ugzilla.time</kbd> now acts as though the [% terms.Bugzilla %] - server were in the UTC timezone, always. If you want to write clients - that are compatible across all [% terms.Bugzilla %] versions, - check the timezone from <kbd>B[% %]ugzilla.timezone</kbd> or - <kbd>B[% %]ugzilla.time</kbd>, and always input times in that timezone - and expect times to be returned in that format.</li> - <li>You can now log in by passing <kbd>Bugzilla_login</kbd> and - <kbd>Bugzilla_password</kbd> as arguments to any WebService function. - See the - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService.html#LOGGING_IN">Bugzilla::WebService</a> - documentation for details.</li> - <li>New Method: - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#attachments">B[% %]ug.attachments</a> - which allows getting information about attachments.</li> - <li>New Method: - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#fields">B[% %]ug.fields</a>, - which gets information about all the fields that [% terms.abug %] can have - in [% terms.Bugzilla %], include custom fields and legal values for - all fields. The <kbd>B[% %]ug.legal_values</kbd> method is now deprecated.</li> - <li>In the <kbd>B[% %]ug.add_comment</kbd> method, the "private" parameter - has been renamed to "is_private" (for consistency with other methods). - You can still use "private", though, for backwards-compatibility.</li> - <li>The WebService now has Perl's "taint mode" turned on. This means that - it validates all data passed in before sending it to the database. - Also, all parameter names are validated, and if you pass in a parameter - whose name contains anything other than letters, numbers, or underscores, - that parameter will be ignored. Mostly this just affects - customizers--[% terms.Bugzilla %]'s WebService is not functionally - affected by these changes.</li> - <li>In previous versions of [% terms.Bugzilla %], error messages were - sent word-wrapped to the client, from the WebService. Error messages - are now sent as one unbroken line.</li> -</ul> - -<h2 id="v36_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=69621"> - [%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is - in use on [% terms.bugs %], you will need to rebuild the "keyword cache" - by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing - the option to rebuild the cache when it asks. Otherwise keywords may - not show up properly in search results.</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="v36_upgrading">Notes On Upgrading From a Previous Version</h2> - -<p>When upgrading to 3.6, <kbd>checksetup.pl</kbd> will create foreign keys - for many columns in the database. Before doing this, it will check the - database for consistency. If there are an unresolvable consistency - problems, it will tell you what table and column in the database contain - the bad values, and which values are bad. If you don't know what else to do, - you can always delete the database records which contain the bad values by - logging in to your database and running the following command:</p> - -<p><code>DELETE FROM <var>table</var> WHERE <var>column</var> IN - (<var>1, 2, 3, 4</var>)</code></p> - -<p>Just replace "table" and "column" with the name of the table - and column that <kbd>checksetup.pl</kbd> mentions, and "1, 2, 3, 4" - with the invalid values that <kbd>checksetup.pl</kbd> prints out.</p> - -<p>Remember that you should always back up your database before doing - an upgrade.</p> - -<h2 id="v36_code_changes">Code Changes Which May Affect Customizations</h2> - -<ul> - <li>There is no longer a SendBugMail method in the templates, and bugmail - is no longer sent by processing a template. Instead, it is sent - by using <kbd>Bugzilla::BugMail::Send</kbd>.</li> - <li>Comments are now represented as a - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Comment.html">Bugzilla::Comment</a> - object instead of just being hashes.</li> - <li>In previous versions of [% terms.Bugzilla %], the template for displaying - [%+ terms.abug %] required a lot of extra variables that are now global - template variables instead.</li> - <li>You can now check if optional modules are installed by using - <kbd>Bugzilla->feature</kbd> in Perl code or - <kbd>feature_enabled</kbd> in template code.</li> - <li>All of the various template header information required to display - the [% terms.bug %] form is now in one template, - <kbd>template/en/default/bug/show-header.html.tmpl</kbd>.</li> - <li>You should now use <kbd>display_value</kbd> instead of - <kbd>get_status</kbd> or <kbd>get_resolution</kbd> in templates. - <kbd>display_value</kbd> should be used anywhere that a - <select>-type field has its values displayed.</li> -</ul> - - -<h1 id="v36_previous">[% terms.Bugzilla %] 3.4 Release Notes</h1> - -<ul class="bz_toc"> - <li><a href="#v34_introduction">Introduction</a></li> - <li><a href="#v34_point">Updates in this 3.4.x Release</a></li> - <li><a href="#v34_req">Minimum Requirements</a></li> - <li><a href="#v34_feat">New Features and Improvements</a></li> - <li><a href="#v34_issues">Outstanding Issues</a></li> - <li><a href="#v34_upgrading">Notes On Upgrading From a Previous Version</a></li> - <li><a href="#v34_code_changes">Code Changes Which May Affect - Customizations</a></li> - <li><a href="#v34_previous">Release Notes for Previous Versions</a></li> -</ul> - -<h2 id="v34_introduction">Introduction</h2> - -<p>This is [% terms.Bugzilla %] 3.4! [% terms.Bugzilla %] 3.4 brings a lot - of great enhancements for [% terms.Bugzilla %] over previous versions, - with various improvements to the user interface, lots of interesting new - features, and many long-standing requests finally being addressed.</p> - -<p>If you're upgrading, make sure to read <a href="#v34_upgrading">Notes - On Upgrading From a Previous Version</a>. If you are upgrading from a release - before 3.2, make sure to read the release notes for all the - <a href="#v34_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.canonical.com/">Canonical - Ltd.</a> for funding development of one new feature, and NASA for funding - development of several new features through the - <a href="http://www.sjsufoundation.org/">San Jose State University - Foundation</a>.</p> - -<h2 id="v34_point">Updates In This 3.4.x Release</h2> - -<h3>3.4.6</h3> - -<ul> - <li>When doing a search that involves "not equals" or "does not contain the - string" or similar "negative" search types, the search description that - appears at the top of the resulting [% terms.bug %] list will indicate - that the search was of that type. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=474738">[% terms.Bug %] 474738</a>) - </li> - <li>In Internet Explorer, users couldn't easily mark a RESOLVED DUPLICATE - [%+ terms.bug %] as REOPENED, due to a JavaScript error. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=546719">[% terms.Bug %] 546719</a>) - </li> - <li>If you use a "bookmarkable template" to pre-fill forms on - the [% terms.bug %]-filing page, and you have custom fields - that are only supposed to appear (or only supposed to have certain - values) based on the values of other fields, those custom fields will - now work properly. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=538211">[% terms.Bug %] 538211</a>) - </li> - <li>If you have a custom field that's only supposed to appear when - a [% terms.bug %]'s resolution is FIXED, it will now behave properly - on the [% terms.bug %]-editing form when a user sets the [% terms.bug %]'s - status to RESOLVED. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=520993">[% terms.Bug %] 520993</a>) - </li> - <li>If you are logged-out and using <kbd>request.cgi</kbd>, the Requester - and Requestee fields no longer respect the <kbd>usermatching</kbd> - parameter--they always require full usernames. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=533018">[% terms.Bug %] 533018</a>) - </li> - <li>If you tried to do a search with too many terms (resulting in a URL - that was longer than about 7000 characters), Apache would return a - 500 error instead of your search results. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=513989">[% terms.Bug %] 513989</a>) - </li> - <li>[% terms.Bugzilla %] would sometimes lose fields from your sort order - when you added new fields to your sort order. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=470214">[% terms.Bug %] 470214</a>) - </li> - <li>The Atom format of search results would sometimes be missing the - Reporter or Assignee field for some [% terms.bugs %]. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=537834">[% terms.Bug %] 537834</a>) - </li> -</ul> - -<h3>3.4.5</h3> - -<p>This release contains fixes for multiple security issues. See the - <a href="http://www.bugzilla.org/security/3.0.10/">Security Advisory</a> - for details.</p> - -<p>In addition, the following important fixes/changes have been made in - this release:</p> - -<ul> - <li>Whining was failing if jobqueue.pl was enabled. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=530270">[% terms.Bug %] 530270</a>) - </li> - <li>The Assignee field was empty in Whine mails. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=511216">[% terms.Bug %] 511216</a>) - </li> - <li>Administrators can now successfully create user accounts using - editusers.cgi when using the "Env" authentication method. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=483987">[% terms.Bug %] 483987</a>) - </li> - <li>[% terms.Bug %]mail now uses the timezone of the recipient of the email, - when displaying the time a comment was made, instead of the timezone of the - person who made the change. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=534587">[% terms.Bug %] 534587</a>) - </li> - <li>"[% terms.bug %] 1234" in comments sometimes would not become a link if - 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 <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> -</ul> - -<h3>3.4.4</h3> - -<p>This release contains a fix for a security issue. See the - <a href="http://www.bugzilla.org/security/3.4.3/">Security Advisory</a> - for details.</p> - -<p>Additionally, this release fixes a few minor [% terms.bugs %].</p> - -<h3>3.4.3</h3> - -<ul> - <li>[% terms.Bugzilla %] installations running under mod_perl were leaking - about 512K of RAM per page load. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=517793">[% terms.Bug %] 517793</a>) - </li> - <li>Attachments with Unicode characters in their names were being downloaded - with mangled names. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=328628">[% terms.Bug %] 328628</a>) - </li> - <li>Creating custom fields with Unicode in their database column name - is now no longer allowed, as it would break [% terms.Bugzilla %]. If you - created such a custom field, you should delete it by first marking it - obsolete and then clicking "Delete" in the custom field list, using - <a href="editfields.cgi">editfields.cgi</a>. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=525025">[% terms.Bug %] 525025</a>) - </li> - <li>Clicking "submit only my comment" on the "mid-air collisions" page - was leading to a "Suspicious Action" warning. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=514378">[% terms.Bug %] 514378</a>) - </li> - <li>The XML format of [% terms.abug %] accidentally contained the - word-wrapped content of comments instead of the unwrapped content. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=509152">[% terms.Bug %] 509152</a>) - </li> - <li>You can now do <kbd>./install-module.pl --shell</kbd> to get a CPAN - shell using the configuration of - <a href="[% docs_urlbase FILTER html %]api/install-module.html">install-module.pl</a>, - which allows you to do more advanced Perl module installation tasks. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=445875">[% terms.Bug %] 445875</a>) - </li> -</ul> - -<h3>3.4.2</h3> - -<p>This release contains fixes for multiple security issues, one of which - is highly critical. See the - <a href="http://www.bugzilla.org/security/3.0.8/">Security Advisory</a> - for details.</p> - -<p>In addition, the following important fixes/changes have been made in - this release:</p> - -<ul> - <li>Upgrades from older releases were sometimes failing during UTF-8 - conversion with a foreign key error. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=508181">[% terms.Bug %] 508181</a>) - </li> - <li>Sorting [% terms.bug %] lists on certain fields would result in an error. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=510944">[% terms.Bug %] 510944</a>) - </li> - <li>[% terms.Bug %] update emails had two or three blank lines at the top - and between the various sections of the email. There is now only one - blank line in each of those places, making these emails more compact. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=73330">[% terms.Bug %] 73330</a>) - </li> - <li>[% terms.Bug %] email notifications for new [% terms.bugs %] incorrectly - had a line saying that the description was "Comment 0". - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=510798">[% terms.Bug %] 510798</a>) - </li> - <li>Running <kbd>./collectstats.pl --regenerate</kbd> is now much faster, - on the order of 20x or 100x faster. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=286625">[% terms.Bug %] 286625</a>) - </li> - <li>For users of RHEL, CentOS, Fedora, etc. jobqueue.pl can now automatically - be installed as a daemon by running <kbd>./jobqueue.pl install</kbd> - as root. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=475403">[% terms.Bug %] 475403</a>) - </li> - <li>XML-RPC interface responses had an incorrect Content-Length header - and would sometimes be truncated, if they contained certain UTF-8 - characters. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=486306">[% terms.Bug %] 486306</a>) - </li> - <li>Users who didn't have access to the time-tracking fields would get an - empty [% terms.bug %] update email when the time-tracking fields were - changed. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=509035">[% terms.Bug %] 509035</a>) - </li> - <li>In the New Charts, non-public series now no longer show up as selectable - if you cannot access them. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=389396">[% terms.Bug %] 389396</a>) - </li> -</ul> - -<h3>3.4.1</h3> - -<p>This release contains an important security fix. See the - <a href="http://www.bugzilla.org/security/3.4/">Security Advisory</a> - for details.</p> - -<h2 id="v34_req">Minimum Requirements</h2> - -<p>Any requirements that are new since 3.2.3 will look like - <span class="req_new">this</span>.</p> - -<ul> - <li><a href="#v34_req_perl">Perl</a></li> - <li><a href="#v34_req_mysql">For MySQL Users</a></li> - <li><a href="#v34_req_pg">For PostgreSQL Users</a></li> - <li><a href="#v34_req_oracle">For Oracle Users</a></li> - <li><a href="#v34_req_modules">Required Perl Modules</a></li> - <li><a href="#v34_req_optional_mod">Optional Perl Modules</a></li> -</ul> - -<h3 id="v34_req_perl">Perl</h3> - -<p>Perl v5.8.1</p> - -<h3 id="v34_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="v34_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="v34_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="v34_req_modules">Required 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 class="req_new">Digest::SHA</td> - <td class="req_new"> (Any)</td> - </tr> - <tr> - <td>Date::Format</td> - <td>2.21</td> - </tr> - <tr> - <td class="req_new">DateTime</td> - <td class="req_new">0.28</td> - </tr> - <tr> - <td class="req_new">DateTime::TimeZone</td> - <td class="req_new">0.71</td> - </tr> - <tr> - <td>DBI</td> - <td>1.41</td> - </tr> - <tr> - <td>Template</td> - <td class="req_new">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 class="req_new">URI</td> - <td class="req_new">(Any)</td> - </tr> -</table> - -<h3 id="v34_req_optional_mod">Optional Perl Modules</h3> - -<p>The following perl modules, if installed, enable various - features of [% terms.Bugzilla %]:</p> - -<table class="req_table" border="0" cellspacing="0" cellpadding="0"> - <tr> - <th>Module</th> - <th>Version</th> - <th>Enables Feature</th> - </tr> - <tr> - <td>LWP::UserAgent</td> - <td>(Any)</td> - <td>Automatic Update Notifications</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>GD</td> - <td>1.20</td> - <td>Graphical Reports, New Charts, Old Charts</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>Net::LDAP</td> - <td>(Any)</td> - <td>LDAP Authentication</td> - </tr> - <tr> - <td class="req_new">TheSchwartz</td> - <td class="req_new">(Any)</td> - <td>Mail Queueing</td> - </tr> - <tr> - <td class="req_new">Daemon::Generic</td> - <td class="req_new">(Any)</td> - <td>Mail Queueing</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>XML::Twig</td> - <td>(Any)</td> - <td>Move [% terms.Bugs %] Between Installations</td> - </tr> - <tr> - <td>MIME::Parser</td> - <td>5.406</td> - <td>Move [% terms.Bugs %] Between Installations</td> - </tr> - <tr> - <td>Chart::Base</td> - <td>1.0</td> - <td>New Charts, Old Charts</td> - </tr> - <tr> - <td>Image::Magick</td> - <td>(Any)</td> - <td>Optionally Convert BMP Attachments to PNGs</td> - </tr> - <tr> - <td>PatchReader</td> - <td>0.9.4</td> - <td>Patch Viewer</td> - </tr> - <tr> - <td>Authen::Radius</td> - <td>(Any)</td> - <td>RADIUS Authentication</td> - </tr> - <tr> - <td>Authen::SASL</td> - <td>(Any)</td> - <td>SMTP Authentication</td> - </tr> - <tr> - <td>SOAP::Lite</td> - <td>0.710.06</td> - <td>XML-RPC Interface</td> - </tr> - <tr> - <td>mod_perl2</td> - <td>1.999022</td> - <td>mod_perl</td> - </tr> -</table> - -<h2 id="v34_feat">New Features and Improvements</h2> - -<ul> - <li><a href="#v34_feat_enter">Simple [% terms.Bug %] Filing</a></li> - <li><a href="#v34_feat_index">New Home Page</a></li> - <li><a href="#v34_feat_spam">Email Addresses Hidden From Logged-Out - Users</a></li> - <li><a href="#v34_feat_urls">Shorter Search URLs</a></li> - <li><a href="#v34_feat_async">Asynchronous Email Sending</a></li> - <li><a href="#v34_feat_tz">Dates and Times Displayed In User's Time - Zone</a></li> - <li><a href="#v34_feat_vis">Custom Fields That Only Appear When - Another Field Has a Particular Value</a></li> - <li><a href="#v34_feat_vals">Custom Fields Whose List of Values - Change Depending on the Value of Another Field</a></li> - <li><a href="#v34_feat_bugid">New Custom Field Type: - [%+ terms.Bug %] ID</a></li> - <li><a href="#v34_feat_see">"See Also" Field</a></li> - <li><a href="#v34_feat_cols">Re-order Columns in Search Results</a></li> - <li><a href="#v34_feat_desc">Search Descriptions</a></li> - <li><a href="#v34_feat_other">Other Enhancements and Changes</a></li> -</ul> - -<h3 id="v34_feat_enter">Simple [% terms.Bug %] Filing</h3> - -<p>When entering a new [% terms.bug %], the vast majority of fields are - now hidden by default, which enormously simplifies the bug-filing form. - You can click "Show Advanced Fields" to show all the fields, if you want - them. [%+ terms.Bugzilla %] remembers whether you last used the "Advanced" - or "Simple" version of the [% terms.bug %]-entry form, and will display the - same version to you again next time you file [% terms.abug %].</p> - -<h3 id="v34_feat_index">New Home Page</h3> - -<p>[% terms.Bugzilla %]'s front page has been redesigned to be better at - guiding new users into the activities that they most commonly want to - do. Further enhancements to the home page are coming in future versions - of [% terms.Bugzilla %].</p> - -<h3 id="v34_feat_spam">Email Addresses Hidden From Logged-Out Users</h3> - -<p>To help prevent spam to [% terms.Bugzilla %] users, all email addresses - stored in [% terms.Bugzilla %] are now displayed only if you are logged in. - If you are logged out, only the part before the "@" of the email address is - displayed. This includes [% terms.bug %] lists, viewing [% terms.bugs %], the - XML format of [% terms.abug %], and any other place in the web interface that - an email address could appear.</p> - -<p>Email addresses are not filtered out of [% terms.bug %] comments. - The WebService still returns full email addresses, even if you are logged - out.</p> - -<h3 id="v34_feat_urls">Shorter Search URLs</h3> - -<p>When submitting a search, all the unused fields are now stripped from - the URL, so search URLs are much more meaningful, and much shorter.</p> - -<h3 id="v34_feat_async">Asynchronous Email Sending</h3> - -<p>The largest performance problem in former versions of [% terms.Bugzilla %] - was that when updating [% terms.bugs %], email would be sent immediately - to every user who needed to be notified, and <kbd>process_bug.cgi</kbd> - would wait for the emails to be sent before continuing.</p> - -<p>Now [% terms.Bugzilla %] is capable of queueing emails to be sent - while [% terms.abug %] is being updated, and sending them in the - background. This requires the administrator to run a daemon - that comes with [% terms.Bugzilla %], named - <a href="[% docs_urlbase FILTER html %]api/jobqueue.html">jobqueue.pl</a>, - and to enable the <a href="editparams.cgi?section=mta#use_mailer_queue"> - use_mailer_queue</a> parameter.</p> - -<p>Using the background email-sending daemon instead of sending mail directly - should result in a very large speed-up for updating [% terms.bugs %], - particularly on larger installations.</p> - -<h3 id="v34_feat_tz">Dates and Times Displayed In User's Time Zone</h3> - -<p>Users can now select what time zone they are in and [% terms.Bugzilla %] - will adjust displayed times to be correct for their time zone. However, - times the user inputs are unfortunately still in [% terms.Bugzilla %]'s - time zone.</p> - -<h3 id="v34_feat_vis">Custom Fields That Only Appear When Another Field - Has a Particular Value</h3> - -<p>When creating a new custom field (or updating the definition of - an existing custom field), you can now say that "this field only - appears when field X has value Y". (In the future, you will be able - to select multiple values for "Y", so a field will appear when any - one of those values is selected.)</p> - -<p>This feature only hides fields--it doesn't make their values go away. - So [% terms.bugs %] will still show up in searches for that field's - value, but the field won't appear in the user interface.</p> - -<p>This is a good way of making Product-specific fields.</p> - -<h3 id="v34_feat_vals">Custom Fields Whose List of Values Change - Depending on the Value of Another Field</h3> - -<p>When creating a drop-down or multiple-selection custom field, you can - now specify that another field "controls the values" of this field. - Then, when adding values to this field, you can say that a particular - value only appears when the other field is set to a particular - value.</p> - -<p>Here's an example: Let's say that we create a field called "Colors", - and we make the Product field "control the values" for Colors. Then we - add Blue, Red, Black, and Yellow as legal values for the "Colors" field. - Now we can say that "Blue" and "Red" only appear as valid choices in - Product A, "Yellow" only appears in Product B, but "Black" <em>always</em> - appears.</p> - -<p>One thing to note is that this feature only controls what values appear in - the <em>user interface</em>. [% terms.Bugzilla %] itself will still accept - any combination of values as valid, in the backend.</p> - -<h3 id="v34_feat_bugid">New Custom Field Type: [% terms.Bug %] ID</h3> - -<p>You can now create a custom field that holds a reference to a single - valid [% terms.bug %] ID. In the future this will be enhanced to allow - [%+ terms.bugs %] to refer to each other via this field.</p> - -<h3 id="v34_feat_see">"See Also" Field</h3> - -<p>We have added a new standard field called "See Also" to - [%+ terms.Bugzilla %]. In this field, you can put URLs to multiple - [%+ terms.bugs %] in any [% terms.Bugzilla %] installation, to indicate - that those [% terms.bugs %] are related to this one. It also supports - adding URLs to [% terms.bugs %] in - <a href="http://launchpad.net/">Launchpad</a>.</p> - -<p>Right now, the field just validates the URLs and then displays them, but - in the future, it will grab information from the other installation about - the [% terms.bug %] and display it here, and possibly even update the - other installation.</p> - -<p>If your installation does not need this field, you can hide it by disabling - the <a href="editparams.cgi?section=bugfields#use_see_also">use_see_also - parameter</a>.</p> - -<h3 id="v34_feat_cols">Re-order Columns in Search Results</h3> - -<p>There is a new interface for choosing what columns appear in search - results, which allows you to change the order in which columns appear - from left to right when viewing the [% terms.bug %] list.</p> - -<h3 id="v34_feat_desc">Search Descriptions</h3> - -<p>When displaying search results, [% terms.Bugzilla %] will now show - a brief description of what you searched for, at the top of the - [%+ terms.bug %] list.</p> - -<h3 id="v34_feat_other">Other Enhancements and Changes</h3> - -<h4>Enhancements for Users</h4> - -<ul> - <li>You can now log in from every page, using the login form that appears - in the header or footer when you click "Log In".</li> - <li>When viewing [% terms.abug %], obsolete attachments are now - hidden from the attachment list by default. You can show them - by clicking "Show Obsolete" at the bottom of the attachment list.</li> - <li>In the Email Preferences, you can now choose to get email when - a new [% terms.bug %] report is filed and you have a particular - role on it.</li> - <li>When resolving a mid-air collision, you can now choose to submit - only your comment.</li> - <li>You can now set the Blocks and Depends On field on the "Change - Several [% terms.Bugs %] At Once" page.</li> - <li>If your installation uses the "insidergroup" feature, you can now add - private comments on the "Change Several [% terms.Bugs %] At Once" - page.</li> - <li>When viewing a search result, you can now hover over any abbreviated - field to see its full value.</li> - <li>When logging out, users are now redirected to the main page of - [%+ terms.Bugzilla %] instead of an empty page.</li> - <li>When editing [% terms.abug %], text fields (except the comment box) now - grow longer when you widen your browser window.</li> - <li>When viewing [% terms.abug %], the Depends On and Blocks list will - display [% terms.abug %]'s alias if it has one, instead of its id. - Also, closed [% terms.bugs %] will be sorted to the end of the list.</li> - - <li>If you use the time-tracking features of [% terms.Bugzilla %], and - you enable the time-tracking related columns in a search result, - then you will see a summary of the time-tracking data at the - bottom of the search result.</li> - <li>For users of time-tracking, the <kbd>summarize_time.cgi</kbd> page - now contains more data.</li> - - <li>When viewing an attachment's details page while you are logged-out, - flags are no longer shown as editable.</li> - <li>Cloning [% terms.abug %] will now retain the "Blocks" and "Depends On" - fields from the [% terms.bug %] being cloned.</li> - <li>[% terms.Bug %]mail for new [% terms.bugs %] will now indicate - what security groups the [% terms.bug %] has been restricted to.</li> - <li>You can now use any custom drop-down field as an axis for a tabular - or graphical report.</li> - <li>The <kbd>X-Bugzilla-Type</kbd> header in emails sent by - [%+ terms.Bugzilla %] is now "new" for [% terms.bug %]mail sent for - newly-filed [% terms.bugs %], and "changed" for emails having to do - with updated [% terms.bugs %].</li> - <li>Mails sent by the "Whining" system now contain the header - <kbd>X-Bugzilla-Type: whine</kbd>.</li> - <li>[% terms.bug %]mail now contains a X-Bugzilla-URL header to uniquely - identify which [% terms.Bugzilla %] installation the email came from.</li> - <li>If you input an invalid regular expression anywhere in - [%+ terms.Bugzilla %], it will now tell you explicitly instead of failing - cryptically.</li> - <li>The <kbd>duplicates.xul</kbd> page (which wasn't used by very many - people) is now gone.</li> -</ul> - -<h4>Enhancements for Administrators and Developers</h4> - -<ul> - <li>[% terms.Bugzilla %] now uses the SHA-256 algorithm (a variant of - SHA-2) to encrypt passwords in the database, instead of using Unix's - "crypt" function. This allows passwords longer than eight characters - to actually be effective. Each user's password will be converted to - SHA-256 the first time they log in after you upgrade to - [%+ terms.Bugzilla %] 3.4 or later.</li> - <li>If you are using database replication with [% terms.Bugzilla %], - many more scripts now take advantage of the read-only slave (the - "shadowdb"). It may be safe to open up <kbd>show_bug.cgi</kbd> - to search-engine indexing by editing your <kbd>robots.txt</kbd> file, - now, if your [% terms.Bugzilla %] is on fast-enough hardware.</li> - <li>The database now uses foreign keys to enforce the validity of - relationships between tables. Not every single table has all its - foreign keys yet, but most do.</li> - <li>Various parameters have been removed, in an effort to de-clutter - the parameter interface and simplify [% terms.Bugzilla %]'s code. - The parameters that were removed were: timezone, supportwatchers, - maxpatchsize, commentonclearresolution, commentonreassignbycomponent, - showallproducts. They have all been replaced with sensible default - behaviors. (For example, user watching is now always enabled.)</li> - <li>When adding <code>&debug=1</code> to the end of a - <kbd>buglist.cgi</kbd> URL, [% terms.Bugzilla %] will now also do an - EXPLAIN on the query, to help debug performance issues.</li> - <li>When editing flag types in the administrative interface, you can now - see how many flags of each type have been set.</li> -</ul> - -<h4>WebService Changes</h4> - -<ul> - <li>Various functions have been added to the WebService: - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#history">B[% %]ug.history</a>, - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#search">B[% %]ug.search</a>, - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#comments">B[% %]ug.comments</a>, - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html#update_see_also">B[% %]ug.update_see_also</a>, - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/User.html#get">User.get</a>, - and <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bugzilla.html#time">B[% %]ugzilla.time</a> - (<kbd>B[% %]ugzilla.timezone</kbd> is now deprecated). - </li> - <li>For network efficiency, you can now limit which fields are returned - from certain WebService functions, like <kbd>User.get</kbd>.</li> - <li>There is now a "permissive" argument for the <kbd>B[% %]ug.get</kbd> - WebService function, which causes it not to throw an error when you - ask for [% terms.bugs %] you can't see.</li> - - <li>The <kbd>B[% %]ug.get</kbd> method now returns many more fields.</li> - <li>The <kbd>B[% %]ug.add_comment</kbd> method now returns the ID of the comment - that was just added.</li> - <li>The <kbd>B[% %]ug.add_comment</kbd> method will now throw an error if you - try to add a private comment but do not have the correct permissions. - (In previous versions, it would just silently ignore the <kbd>private</kbd> - argument if you didn't have the correct permissions.)</li> - <li>Many WebService function parameters now take individual values in - addition to arrays.</li> - <li>The WebService now validates input types--it makes sure that dates - are in the right format, that ints are actually ints, etc. It will throw - an error if you send it invalid data. It also accepts empty ints, doubles, - and dateTimes, and translates them to <kbd>undef</kbd>.</li> -</ul> - -<h2 id="v34_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=69621"> - [%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is - in use on [% terms.bugs %], you will need to rebuild the "keyword cache" - by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing - the option to rebuild the cache when it asks. Otherwise keywords may - not show up properly in search results.</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> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370"> - [%- terms.Bug %] 370370</a>: mod_perl support is currently not - working on Windows machines.</li> -</ul> - -<h2 id="v34_upgrading">Notes On Upgrading From a Previous Version</h2> - -<p>When upgrading to 3.4, <kbd>checksetup.pl</kbd> will create foreign keys - for many columns in the database. Before doing this, it will check the - database for consistency. If there are an unresolvable consistency - problems, it will tell you what table and column in the database contain - the bad values, and which values are bad. If you don't know what else to do, - you can always delete the database records which contain the bad values by - logging in to your database and running the following command:</p> - -<p><code>DELETE FROM <var>table</var> WHERE <var>column</var> IN - (<var>1, 2, 3, 4</var>)</code></p> - -<p>Just replace "table" and "column" with the name of the table - and column that <kbd>checksetup.pl</kbd> mentions, and "1, 2, 3, 4" - with the invalid values that <kbd>checksetup.pl</kbd> prints out.</p> - -<p>Remember that you should always back up your database before doing - an upgrade.</p> - -<h2 id="v34_code_changes">Code Changes Which May Affect Customizations</h2> - -<ul> - <li><kbd>checksetup.pl</kbd> now re-writes the <kbd>localconfig</kbd> - file every time it runs, keeping the current values set (if there - are any), but moving any unexpected variables into a file called - <kbd>localconfig.old</kbd>. If you want to continue having custom - varibles in <kbd>localconfig</kbd>, you will have to add them to - the <code>LOCALCONFIG_VARS</code> constant in - <kbd>Bugzilla::Install::Localconfig</kbd>.</li> - <li><kbd>Bugzilla::Object->update()</kbd> now returns something different - in list context than it does in scalar context.</li> - <li><kbd>Bugzilla::Object->check()</kbd> now can take object - ids in addition to names. Just pass in <code>{ id => $some_value - }</code>.</li> - <li>Instead of being defined in <kbd>buglist.cgi</kbd>, columns for - search results are now defined in a subroutine called <code>COLUMNS</code> - in <kbd>Bugzilla::Search</kbd>. The data now mostly comes from the - <kbd>fielddefs</kbd> table in the database. Search.pm now takes a list - of column names from fielddefs for its <kbd>fields</kbd> argument instead - of literal SQL columns.</li> - <li><kbd>Bugzilla::Field->legal_values</kbd> now returns an array of - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Field/Choice.html">Bugzilla::Field::Choice</a> - objects instead of an array of strings. Bugzilla::Field::Choice will be used - in more places, in the future.</li> - <li>We now use <kbd>Bugzilla::Bug->check()</kbd> instead of - <kbd>ValidateBugId</kbd>.</li> - <li>The <kbd>groups</kbd> and <kbd>bless_groups</kbd> methods in - <kbd>Bugzilla::User</kbd> now return an arrayref of - <kbd>Bugzilla::Group</kbd> objects instead of a hashref with - group ids and group names.</li> - <li>Standard [% terms.Bugzilla %] drop-down fields now have their type - set to <kbd>FIELD_TYPE_SINGLE_SELECT</kbd> in the fielddefs table.</li> - <li><kbd>Bugzilla->usage_mode</kbd> now defaults to - <kbd>USAGE_MODE_CMDLINE</kbd> if we are not running inside a web - server.</li> - <li>We no longer delete environment variables like <kbd>$ENV{PATH}</kbd> - automatically unless we're actually running in taint mode.</li> - <li>We are now using YUI 2.6.0.</li> - <li>In <a href="config.cgi?ctype=rdf">the RDF format of config.cgi</a>, - the "resource" attribute for flags now contains "flag.cgi" instead - of "flags.cgi".</li> -</ul> - - - - - - - -<h1 id="v34_previous">[% terms.Bugzilla %] 3.2 Release Notes</h1> - -<h2>Table of Contents</h2> - -<ul class="bz_toc"> - <li><a href="#v32_introduction">Introduction</a></li> - <li><a href="#v32_point">Updates In This 3.2.x Release</a></li> - <li><a href="#v32_security">Security Fixes In This 3.2.x Release</a></li> - <li><a href="#v32_req">Minimum Requirements</a></li> - <li><a href="#v32_feat">New Features and Improvements</a></li> - <li><a href="#v32_issues">Outstanding Issues</a></li> - <li><a href="#v32_upgrading">How to Upgrade From An Older Version</a></li> - <li><a href="#v32_code_changes">Code Changes Which May Affect - Customizations</a></li> - <li><a href="#v32_previous">Release Notes for Previous Versions</a></li> -</ul> - -<h2 id="v32_introduction">Introduction</h2> - -<p>Welcome to [% terms.Bugzilla %] 3.2! This is our first major feature - release since [% terms.Bugzilla %] 3.0, and it brings a lot of great - improvements and polish to the [% terms.Bugzilla %] experience.</p> - -<p>If you're upgrading, make sure to read <a href="#v32_upgrading">How to - Upgrade From An Older Version</a>. If you are upgrading from a release - before 3.0, make sure to read the release notes for all the - <a href="#v32_previous">previous versions</a> in between your version - and this one, <strong>particularly the "Notes For Upgraders" section of each - version's release notes</strong>.</p> - -<h2 id="v32_point">Updates in this 3.2.x Release</h2> - -<p>This section describes what's changed in the most recent b<!-- -->ug-fix - releases of [% terms.Bugzilla %] after 3.2. We only list the - most important fixes in each release. If you want a detailed list of - <em>everything</em> that's changed in each version, you should use our - <a href="http://www.bugzilla.org/status/changes.html">Change Log - Page</a>.</p> - -<h3>3.2.3</h3> - -<ul> - <li>[% terms.Bugzilla %] is now compatible with MySQL 5.1.x versions 5.1.31 - and greater. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480001">[% terms.Bug %] 480001</a>)</li> - <li>On Windows, [% terms.Bugzilla %] sometimes would send mangled emails - (that would often fail to send). - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=467920">[% terms.Bug %] 467920</a>)</li> - <li><code>recode.pl</code> would sometimes crash when trying to convert - databases from older versions of [% terms.Bugzilla %]. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=431201">[% terms.Bug %] 431201</a>)</li> - <li>Running a saved search with Unicode characters in its name would - cause [% terms.Bugzilla %] to crash. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=477513">[% terms.Bug %] 477513</a>)</li> - <li>[% terms.Bugzilla %] clients like Mylyn can now update [% terms.bugs %] - again (the [% terms.bug %] XML format now contains a "token" element that - can be used when updating [% terms.abug %]). - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=476678">[% terms.Bug %] 476678</a>)</li> - <li>For installations using the <code>shadowdb</code> parameter, - [%+ terms.Bugzilla %] was accidentally writing to the "tokens" table - in the shadow database (instead of the master database) when using the - "Change Several [% terms.Bugs %] at Once" page. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=476943">[% terms.Bug %] 476943</a>)</li> -</ul> - -<p>This release also contains a security fix. See the - <a href="#v32_security">Security Fixes Section</a> for details.</p> - -<h3>3.2.2</h3> - -<p>This release fixes one security issue that is critical for installations - running 3.2.1 under mod_perl. See the - <a href="http://www.bugzilla.org/security/3.0.7/">Security Advisory</a> - for details.</p> - -<h3>3.2.1</h3> - -<ul> - <li>Attachments, charts, and graphs would sometimes be garbled on Windows. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=464992">[% terms.Bug %] 464992</a>)</li> - - <li>Saving changes to parameters would sometimes fail silently (particularly - on Windows when the web server didn't have the right permissions to - update the <code>params</code> file). [% terms.Bugzilla %] will now - throw an error in this case, telling you what is wrong. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=347707">[% terms.Bug %] 347707</a>)</li> - - <li>If you were using the <code>usemenuforusers</code> parameter, - and [% terms.abug %] was assigned to (or had a QA Contact of) a disabled - user, that field would be reset to the first user in the list when - updating [% terms.abug %]. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=465589">[% terms.Bug %] 465589</a>)</li> - - <li>If you were using the <code>PROJECT</code> environment variable - to have multiple [% terms.Bugzilla %] installations using one codebase, - project-specific templates were being ignored. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=467324">[% terms.Bug %] 467324</a>)</li> - - <li>Some versions of the SOAP::Lite Perl module had a b[% %]ug that caused - [%+ terms.Bugzilla %]'s XML-RPC service to break. - <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> - - <li>The font sizes in various places were too small, when using the - Classic skin. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=469136">[% terms.Bug %] 469136</a>)</li> -</ul> - -<h2 id="v32_security">Security Fixes In This 3.2.x Release</h2> - -<h3>3.2.3</h3> - -<p>This release fixes one security issue related to attachments. See the - <a href="http://www.bugzilla.org/security/3.2.2/">Security Advisory</a> - for details.</p> - -<h3>3.2.2</h3> - -<p>This release fixes one security issue that is critical for installations - running 3.2.1 under mod_perl. See the - <a href="http://www.bugzilla.org/security/3.0.7/">Security Advisory</a> - for details.</p> - -<h3>3.2.1</h3> - -<p>This release contains several security fixes. One fix may break any - automated scripts you have that are loading <kbd>process_bug.cgi</kbd> - directly. We recommend that you read the entire - <a href="http://www.bugzilla.org/security/2.22.6/">Security Advisory</a> - for this release.</p> - -<h2 id="v32_req">Minimum Requirements</h2> - -<p>Any requirements that are new since 3.0.5 will look like - <span class="req_new">this</span>.</p> - -<ul> - <li><a href="#v32_req_perl">Perl</a></li> - <li><a href="#v32_req_mysql">For MySQL Users</a></li> - <li><a href="#v32_req_pg">For PostgreSQL Users</a></li> - <li><a href="#v32_req_oracle">For Oracle Users</a></li> - <li><a href="#v32_req_modules">Required Perl Modules</a></li> - <li><a href="#v32_req_optional_mod">Optional Perl - Modules</a></li> -</ul> - -<h3 id="v32_req_perl">Perl</h3> - -<p>Perl <span class="req_new">v<strong>5.8.1</strong></span></p> - -<h3 id="v32_req_mysql">For MySQL Users</h3> - -<ul> - <li>MySQL v4.1.2</li> - <li><strong>perl module:</strong> - DBD::mysql <span class="req_new">v4.00</span></li> -</ul> - -<h3 id="v32_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="v32_req_oracle">Email Addresses Hidden From Logged-Out Users - For Oracle Users</h3> - -<ul> - <li>Oracle v10.02.0</li> - <li><strong>perl module:</strong> DBD::Oracle v1.19</li> -</ul> - -<h3 id="v32_req_modules">Required Perl Modules</h3> - -<table class="req_table" border="0" cellpadding="0" cellspacing="0"> -<tr> <th>Module</th> <th>Version</th> </tr> -<tr> <td>CGI</td> <td class="req_new">3.21 (on Perl 5.8.x) - or 3.33 (on Perl 5.10.x)</td> </tr> -<tr> <td>Date::Format</td> <td>2.21</td> </tr> -<tr> <td>File::Spec</td> <td>0.84</td> </tr> -<tr> <td>DBI</td> <td>1.41</td> </tr> -<tr> <td>Template</td> <td class="req_new">2.15</td> </tr> -<tr> <td>Email::Send</td> <td>2.00</td> </tr> -<tr> <td>Email::MIME</td> <td class="req_new">1.861</td> </tr> -<tr> - <td class="req_new">Email::MIME::Encodings</td> - <td class="req_new">1.313</td> -</tr> -<tr> - <td>Email::MIME::Modifier</td> - <td class="req_new">1.442</td> -</tr> -</table> - -<h3 id="v32_req_optional_mod">Optional Perl Modules</h3> - -<p>The following perl modules, if installed, enable various - features of [% terms.Bugzilla %]:</p> - -<table class="req_table" border="0" cellpadding="0" cellspacing="0"> -<tr> - <th>Module</th> - <th>Version</th> - <th>Enables Feature</th> -</tr> -<tr> - <td>LWP::UserAgent</td> - <td>(Any)</td> - <td>Automatic Update Notifications</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>GD</td> - <td>1.20</td> - <td>Graphical Reports, New Charts, Old Charts</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>Net::LDAP</td> - <td>(Any)</td> - <td>LDAP Authentication</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>XML::Twig</td> - <td>(Any)</td> - <td>Move [% terms.Bugs %] Between Installations</td> -</tr> -<tr> - <td>MIME::Parser</td> - <td>5.406</td> - <td>Move [% terms.Bugs %] Between Installations</td> -</tr> -<tr> - <td>Chart::Base</td> - <td>1.0</td> - <td>New Charts, Old Charts</td> -</tr> -<tr> - <td>Image::Magick</td> - <td>(Any)</td> - <td>Optionally Convert BMP Attachments to PNGs</td> -</tr> -<tr> - <td>PatchReader</td> - <td>0.9.4</td> - <td>Patch Viewer</td> -</tr> -<tr> - <td class="req_new">Authen::Radius</td> - <td class="req_new">(Any)</td> - <td>RADIUS Authentication</td> -</tr> -<tr> - <td class="req_new">Authen::SASL</td> - <td class="req_new">(Any)</td> - <td>SMTP Authentication</td> -</tr> -<tr> - <td>SOAP::Lite</td> - <td>(Any)</td> - <td>XML-RPC Interface</td> -</tr> -<tr> - <td>mod_perl2</td> - <td>1.999022</td> - <td>mod_perl</td> -</tr> -</table> - -<h2 id="v32_feat">New Features and Improvements</h2> - -<ul> - <li><a href="#v32_feat_ui">Major UI Improvements</a></li> - <li><a href="#v32_feat_skin">New Default Skin: Dusk</a></li> - <li><a href="#v32_feat_status">Custom Status Workflow</a></li> - <li><a href="#v32_feat_fields">New Custom Field Types</a></li> - <li><a href="#v32_feat_install">Easier Installation</a></li> - <li><a href="#v32_feat_oracle">Experimental Oracle Support</a></li> - <li><a href="#v32_feat_utf8">Improved UTF-8 Support</a></li> - <li><a href="#v32_feat_grcons">Group Icons</a></li> - <li><a href="#v32_feat_other">Other Enhancements and Changes</a></li> -</ul> - -<h3 id="v32_feat_ui">Major UI Improvements</h3> - -<p>[% terms.Bugzilla %] 3.2 has had some UI assistance from the NASA - Human-Computer Interaction department and the new - <a href="http://wiki.mozilla.org/Bugzilla:UE">[% terms.Bugzilla %] - User Interface Team</a>.</p> - -<p>In particular, you will notice a massively redesigned [% terms.bug %] - editing form, in addition to our <a href="#v32_feat_skin">new skin</a>.</p> - -<h3 id="v32_feat_skin">New Default Skin: Dusk</h3> - -<p>[% terms.Bugzilla %] 3.2 now ships with a skin called "Dusk" that is - a bit more colorful than old default "Classic" skin.</p> - -<p>Upgrading installations will still default to the "Classic" - skin--administrators can change the default in the Default Preferences - control panel. Users can also choose to use the old skin in their - Preferences (or using the View :: Page Style menu in Firefox).</p> - -<p>The changes that [% terms.Bugzilla %] required for Dusk made - [%+ terms.Bugzilla %] much easier to skin. See the - <a href="http://wiki.mozilla.org/Bugzilla:Addons#Skins">Addons page</a> - for additional skins, or try making your own!</p> - -<h3 id="v32_feat_status">Custom Status Workflow</h3> - -<p>You can now customize the list of statuses in [% terms.Bugzilla %], - and transitions between them.</p> - -<p>You can also specify that a comment must be made on certain transitions.</p> - -<h3 id="v32_feat_fields">New Custom Field Types</h3> - -<p>[% terms.Bugzilla %] 3.2 has support for three new types of - custom fields:</p> - -<ul> - <li>Large Text: Adds a multi-line textbox to your [% terms.bugs %].</li> - <li>Multiple Selection Box: Adds a box that allows you to choose - multiple items from a list.</li> - <li>Date/Time: Displays a date and time, along with a JavaScript - calendar popup to make picking a date easier.</li> -</ul> - -<h3 id="v32_feat_install">Easier Installation</h3> - -<p>[% terms.Bugzilla %] now comes with a script called - <kbd>install-module.pl</kbd> that can automatically download - and install all of the required Perl modules for [% terms.Bugzilla %]. - It stores them in a directory inside your [% terms.Bugzilla %] - installation, so you can use it even if you don't have administrator-level - access to your machine, and without modifying your main Perl install.</p> - -<p><kbd>checksetup.pl</kbd> will print out instructions for using - <kbd>install-module.pl</kbd>, or you can read its - <a href="[% docs_urlbase FILTER html %]api/install-module.html">documentation</a>.</p> - -<h3 id="v32_feat_oracle">Experimental Oracle Support</h3> - -<p>[% terms.Bugzilla %] 3.2 contains experimental support for using - Oracle as its database. Some features of [% terms.Bugzilla %] are known - to be broken on Oracle, but hopefully will be working by our next major - release.</p> - -<p>The [% terms.Bugzilla %] Project, as an open-source project, of course - does not recommend the use of proprietary database solutions. However, - if your organization requires that you use Oracle, this will allow - you to use [% terms.Bugzilla %]!</p> - -<p>The [% terms.Bugzilla %] Project thanks Oracle Corp. for their extensive - development contributions to [% terms.Bugzilla %] which allowed this to - happen!</p> - -<h3 id="v32_feat_utf8">Improved UTF-8 Support</h3> - -<p>[% terms.Bugzilla %] 3.2 now has advanced UTF-8 support in its code, - including correct handling for truncating and wrapping multi-byte - languages. Major issues with multi-byte or unusual languages - are now resolved, and [% terms.Bugzilla %] should now be usable - by users in every country with little (or at least much less) - customization.</p> - -<h3 id="v32_feat_grcons">Group Icons</h3> - -<p>Administrators can now specify that users who are in certain groups - should have an icon appear next to their name whenever they comment. - This is particularly useful for distinguishing developers from - [%+ terms.bug %] reporters.</p> - -<h3 id="v32_feat_other">Other Enhancements and Changes</h3> - -<p>These are either minor enhancements, or enhancements that have - very short descriptions. Some of these are very useful, though!</p> - -<h4>Enhancements For Users</h4> - -<ul> - <li><strong>[% terms.Bugs %]</strong>: You can now reassign - [%+ terms.abug %] at the same time as you are changing its status.</li> - <li><strong>[% terms.Bugs %]</strong>: When entering [% terms.abug %], - you will now see the description of a component when you select it.</li> - <li><strong>[% terms.Bugs %]</strong>: The [% terms.bug %] view now - contains some <a href="http://microformats.org/about/">Microformats</a>, - most notably for users' names and email addresses.</li> - <li><strong>[% terms.Bugs %]</strong>: You can now remove a QA Contact - from [% terms.abug %] simply by clearing the QA Contact field.</li> - <li><strong>[% terms.Bugs %]</strong>: There is now a user preference - that will allow you to exclude the quoted text when replying - to comments.</li> - <li><strong>[% terms.Bugs %]</strong>: You can now expand or collapse - individual comments in the [% terms.bug %] view.</li> - - <li><strong>Attachments</strong>: There is now "mid-air collision" - protection when editing attachments.</li> - <li><strong>Attachments</strong>: Patches in the Diff Viewer now show - line numbers (<a href="https://bugzilla.mozilla.org/attachment.cgi?id=327546">Example</a>).</li> - <li><strong>Attachments</strong>: After creating or updating an attachment, - you will be immediately shown the [% terms.bug %] that the attachment - is on.</li> - - <li><strong>Search</strong>: You can now reverse the sort of - [%+ terms.abug %] list by clicking on a column header again.</li> - <li><strong>Search</strong>: Atom feeds of [% terms.bug %] lists now - contain more fields.</li> - <li><strong>Search</strong>: QuickSearch now supports searching flags - and groups. It also now includes the OS field in the list of fields - it searches by default.</li> - <li><strong>Search</strong>: "Help" text can now appear on query.cgi - for Internet Explorer and other non-Firefox browsers. (It always - could appear for Firefox.)</li> - - <li>[% terms.Bugzilla %] now ships with an icon that will show - up next to the URL in most browsers. If you want to replace it, - it's in <kbd>images/favicon.ico</kbd>.</li> - - <li>You can now set the Deadline when using "Change Several - [%+ terms.Bugs %] At Once"</li> - <li><strong>Saved Searches</strong> now save their column list, so if - you customize the list of columns and save your search, it will - always contain those columns.</li> - <li><strong>Saved Searches</strong>: When you share a search, you can - now see how many users have subscribed to it, on - <kbd>userprefs.cgi</kbd>.</li> - <li><strong>Saved Searches</strong>: You can now see what group a - shared search was shared to, on the list of available shared searches - in <kbd>userprefs.cgi</kbd>.</li> - <li><strong>Flags</strong>: If your installation uses drop-down user - lists, the flag requestee box will now contain only users who are - actually allowed to take requests.</li> - <li><strong>Flags</strong>: If somebody makes a request to you, and you - change the requestee to somebody else, the requester is no longer set - to you. In other words, you can "redirect" requests and maintain the - original requester.</li> - <li><strong>Flags</strong>: Emails about flags now will thread properly - in email clients to be a part of [% terms.abug %]'s thread.</li> - <li>When using <kbd>email_in.pl</kbd>, you can now add users to the CC - list by just using <kbd>@cc</kbd> as the field name.</li> - <li>Many pages (particularly administrative pages) now contain links to - the relevant section of the [% terms.Bugzilla %] Guide, so you can read - the documentation for that page.</li> - <li>Dependency Graphs should render more quickly, as they now (by default) - only include the same [% terms.bugs %] that you'd see in the dependency - tree.</li> -</ul> - -<h4>Enhancements For Administrators</h4> - -<ul> - <li><strong>Admin UI</strong>: Instead of having the Administration - Control Panel links in the footer, there is now just one link called - "Administration" that takes you to a page that links to all the - administrative controls for [% terms.Bugzilla %].</li> - <li><strong>Admin UI</strong>: Administrative pages no longer display - confirmation pages, instead they redirect you to some useful page - and display a message about what changed.</li> - <li><strong>Admin UI</strong>: The interface for editing group - inheritance in <kbd>editgroups.cgi</kbd> is much clearer now.</li> - <li><strong>Admin UI</strong>: When editing a user, you can now see - all the components where that user is the Default Assignee or Default - QA Contact.</li> - - <li><strong>Email</strong>: For installations that use SMTP to send - mail (as opposed to Sendmail), [%+ terms.Bugzilla %] now supports - SMTP Authentication, so that it can log in to your mail server - before sending messages.</li> - <li><strong>Email</strong>: Using the "Test" mail delivery method now - creates a valid mbox file to make testing easier.</li> - - <li><strong>Authentication</strong>: [% terms.Bugzilla %] now correctly - handles LDAP records which contain multiple email addresses. (The first - email address in the list that is a valid [% terms.Bugzilla %] account - will be used, or if this is a new user, the first email address in - the list will be used.)</li> - <li><strong>Authentication</strong>: [% terms.Bugzilla %] can now take - a list of LDAP servers to try in order until it gets a successful - connection.</li> - <li><strong>Authentication</strong>: [% terms.Bugzilla %] now supports - RADIUS authentication.</li> - - <li><strong>Security</strong>: The login cookie is now created as - "HTTPOnly" so that it can't be read by possibly malicious scripts. - Also, if SSL is enabled on your installation, the login cookie is - now only sent over SSL connections.</li> - <li><strong>Security</strong>: The <code>ssl</code> parameter now protects - every page a logged-in user accesses, when set to "authenticated sessions." - Also, SSL is now enforced appropriately in the WebServices interface when - the parameter is set.</li> - - <li><strong>Database</strong>: [% terms.Bugzilla %] now uses transactions in - the database instead of table locks. This should generally improve - performance with many concurrent users. It also means if there is - an unexpected error in the middle of a page, all database changes made - during that page will be rolled back.</li> - <li><strong>Database</strong>: You no longer have to set - <code>max_packet_size</code> in MySQL to add large attachments. However, - you may need to set it manually if you restore a mysqldump into your - database.</li> - - <li>New WebService functions: - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bug.html">B<!-- -->ug.add_comment</a> - and <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bugzilla.html">Bugzilla.extensions</a>.</li> - - <li>You can now delete custom fields, but only if they have never been - set on any [% terms.bug %].</li> - <li>There is now a <kbd>--reset-password</kbd> argument to - <kbd>checksetup.pl</kbd> that allows you to reset a user's password - from the command line.</li> - <li>There is now a script called <kbd>sanitycheck.pl</kbd> that you can - run from the command line. It works just like <kbd>sanitycheck.cgi</kbd>. - By default, it only outputs anything if there's an error, so it's - ideal for administrators who want to run it nightly in a cron job.</li> - <li>The <kbd>strict_isolation</kbd> parameter now prevents you from setting - users who cannot see [% terms.abug %] as a CC, Assignee, or QA - Contact. Previously it only prevented you from adding users who - could not <em>edit</em> the [% terms.bug %].</li> - <li>Extensions can now add their own headers to the HTML <head> - for things like custom CSS and so on.</li> - <li><kbd>sanitycheck.cgi</kbd> has been templatized, meaning that the - entire [% terms.Bugzilla %] UI is now contained in templates.</li> - <li>When setting the <kbd>sslbase</kbd> parameter, you can now specify - a port number in the URL.</li> - <li>When importing [% terms.bugs %] using <kbd>importxml.pl</kbd>, - attachments will have their actual creator set as their creator, - instead of the person who exported the [% terms.bug %] from the other - system.</li> - <li>The voting system is off by default in new installs. This is to - prepare for the fact that it will be moved into an extension at - some point in the future.</li> - <li>The <code>shutdownhtml</code> parameter now works even when - [%+ terms.Bugzilla %]'s database server is down.</li> -</ul> - -<h3>Enhancements for Localizers (or Localized Installations)</h3> - -<ul> - <li>The documentation can now be localized--in other words, you can have - documentation installed for multiple languages at once and - [%+ terms.Bugzilla %] will link to the correct language in its internal - documentation links.</li> - <li>[% terms.Bugzilla %] no longer uses the <kbd>languages</kbd> parameter. - Instead it reads the <kbd>template/</kbd> directory to see which - languages are available.</li> - <li>Some of the messages printed by <kbd>checksetup.pl</kbd> can now - be localized. See <kbd>template/en/default/setup/strings.txt.pl</kbd>. -</ul> - -<h2 id="v32_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=69621"> - [%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is - in use on [% terms.bugs %], you will need to rebuild the "keyword cache" - by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing - the option to rebuild the cache when it asks. Otherwise keywords may - not show up properly in search results.</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> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370"> - [%- terms.Bug %] 370370</a>: mod_perl support is currently not - working on Windows machines.</li> -</ul> - -<h2 id="v32_upgrading">How to Upgrade From An Older Version</h2> - -<h3 id="v32_upgrading_notes">Notes For Upgraders</h3> - -<ul> - <li>If you upgrade by CVS, the <kbd>extensions</kbd> and - <kbd>skins/contrib</kbd> directories are now in CVS instead of - being created by <kbd>checksetup.pl</kbd> If you do a <kbd>cvs update</kbd> - from 3.0, you will be told that your directories are "in the way" and - you should delete (or move) them and then do <kbd>cvs update</kbd> - again. Also, the <kbd>docs</kbd> directory has been restructured - and after you <kbd>cvs update</kbd> you can delete the <kbd>docs/html</kbd>, - <kbd>docs/pdf</kbd>, <kbd>docs/txt</kbd>, and <kbd>docs/xml</kbd> - directories.</li> - <li>If you are using MySQL, you should know that [% terms.Bugzilla %] - now uses InnoDB for all tables. <kbd>checksetup.pl</kbd> will convert - your tables automatically, but if you have InnoDB disabled, - the upgrade will not be able to complete (and <kbd>checksetup.pl</kbd> - will tell you so).</li> - - <li><strong>You should also read the - <a href="#v30_upgrading_notes">[% terms.Bugzilla %] 3.0 Notes For Upgraders - section</a> of the - <a href="#v32_previous">previous release notes</a> if you are upgrading - from a version before 3.0.</strong></li> -</ul> - -<h3>Steps For Upgrading</h3> - -<p>Once you have read the notes above, see the - <a href="[% docs_urlbase FILTER html %]upgrade.html">Upgrading - documentation</a> for instructions on how to upgrade.</p> - -<h2 id="v32_code_changes">Code Changes Which May Affect Customizations</h2> - -<ul> - <li><a href="#v32_code_hooks">More Hooks!</a></li> - <li><a href="#v32_code_search">Search.pm Rearchitecture</a></li> - <li><a href="#v32_code_lib">lib Directory</a></li> - <li><a href="#v32_code_other">Other Changes</a></li> -</ul> - -<h3 id="v32_code_hooks">More Hooks!</h3> - -<p>There are more code hooks in 3.2 than there were in 3.0. See the - documentation of <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Hook.html">Bugzilla::Hook</a> - for more details.</p> - -<h3 id="v32_code_search">Search.pm Rearchitecture</h3> - -<p><kbd>Bugzilla/Search.pm</kbd> has been heavily modified, to be much - easier to read and use. It contains mostly the same code as it did in - 3.0, but it has been moved around and reorganized significantly.</p> - -<h3 id="v32_code_lib">lib Directory</h3> - -<p>As part of implementing <a href="#v32_feat_install">install-module.pl</a>, - [%+ terms.Bugzilla %] was given a local <kbd>lib</kbd> directory which - it searches for modules, in addition to the standard system path.</p> - -<p>This means that all [% terms.Bugzilla %] scripts now start with - <code>use lib qw(. lib);</code> as one of the first lines.</p> - -<h3 id="v32_code_other">Other Changes</h3> - -<ul> - <li>You should now be using <code>get_status('NEW')</code> instead of - <code>status_descs.NEW</code> in templates.</li> - <li>The <code>[%# version = 1.0 %]</code> comment at the top of every - template file has been removed.</li> -</ul> - -<h1 id="v32_previous">[% terms.Bugzilla %] 3.0.x Release Notes</h1> - -<h2>Table of Contents</h2> - -<ul class="bz_toc"> - <li><a href="#v30_introduction">Introduction</a></li> - <li><a href="#v30_point">Updates In This 3.0.x Release</a></li> - <li><a href="#v30_req">Minimum Requirements</a></li> - <li><a href="#v30_feat">New Features and Improvements</a></li> - <li><a href="#v30_issues">Outstanding Issues</a></li> - <li><a href="#v30_security">Security Fixes In This Release</a></li> - <li><a href="#v30_upgrading">How to Upgrade From An Older Version</a></li> - <li><a href="#v30_code_changes">Code Changes Which May Affect - Customizations</a></li> - <li><a href="#v30_previous">Release Notes for Previous Versions</a></li> -</ul> - -<h2 id="v30_introduction">Introduction</h2> - -<p>Welcome to [% terms.Bugzilla %] 3.0! It's been over eight years since - we released [% terms.Bugzilla %] 2.0, and everything has changed since - then. Even just since our previous release, [% terms.Bugzilla %] 2.22, - we've added a <em>lot</em> of new features. So enjoy the release, we're - happy to bring it to you.</p> - -<p>If you're upgrading, make sure to read <a href="#v30_upgrading">How to - Upgrade From An Older Version</a>. If you are upgrading from a release - before 2.22, make sure to read the release notes for all the - <a href="#v30_previous">previous versions</a> in between your version - and this one.</p> - -<h2 id="v30_point">Updates in this 3.0.x Release</h2> - -<p>This section describes what's changed in the most recent b<!-- -->ug-fix - releases of [% terms.Bugzilla %] after 3.0. We only list the - most important fixes in each release. If you want a detailed list of - <em>everything</em> that's changed in each version, you should use our - <a href="http://www.bugzilla.org/status/changes.html">Change Log Page</a>.</p> - -<h3>3.0.6</h3> - -<ul> - <li>Before 3.0.6, unexpected fatal WebService errors would result in - a <code>faultCode</code> that was a string instead of a number. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=446327">[% terms.Bug %] 446327</a>)</li> - <li>If you created a product or component with the same name as one you - previously deleted, it would fail with an error about the series table. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=247936">[% terms.Bug %] 247936</a>)</li> -</ul> - -<p>See also the <a href="#v30_security">Security Advisory</a> section for - information about a security issue fixed in this release.</p> - -<h3>3.0.5</h3> - -<ul> - <li>If you don't have permission to set a flag, it will now appear - unchangeable in the UI. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=433851">[% terms.Bug %] 433851</a>)</li> - <li>If you were running mod_perl, [% terms.Bugzilla %] was not correctly - closing its connections to the database since 3.0.3, and so sometimes - the DB would run out of connections. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=441592">[% terms.Bug %] 441592</a>)</li> - <li>The installation script is now clear about exactly which - <code>Email::</code> modules are required in Perl, thus avoiding the - problem where emails show up with a body like - <samp>SCALAR(0xBF126795)</samp>. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=441541">[% terms.Bug %] 441541</a>)</li> - <li><a href="[% docs_urlbase FILTER html %]api/email_in.html">email_in.pl</a> - is no longer case-sensitive for values of <kbd>@product</kbd>. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365697">[% terms.Bug %] 365697</a>)</li> -</ul> - -<p>See also the <a href="#v30_security">Security Advisory</a> section for - information about security issues fixed in this release.</p> - -<h3>3.0.4</h3> - -<ul> - <li>[% terms.Bugzilla %] administrators were not being correctly notified - about new releases. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=414726">[% terms.Bug %] 414726</a>)</li> - - <li>There could be extra whitespace in email subject lines. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=411544">[% terms.Bug %] 411544</a>)</li> - - <li>The priority, severity, OS, and platform fields were always required by - the <kbd>B<!-- -->ug.create</kbd> WebService function, even if they had - defaults specified. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=384009">[% terms.Bug %] 384009</a>)</li> - - <li>Better threading of [% terms.bug %]mail in some email clients. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=376453">[% terms.Bug %] 376453</a>)</li> - - <li>There were many fixes to the Inbound Email Interface - (<kbd>email_in.pl</kbd>). - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=92274">[% terms.Bug %] 92274</a>, - <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=377025">[% terms.Bug %] 377025</a>, - <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=412943">[% terms.Bug %] 412943</a>, - <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><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. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=388723">[% terms.Bug %] 388723</a>)</li> - - <li>All emails will now be sent in the correct language, when the user - has chosen a language for emails. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=405946">[% terms.Bug %] 405946</a>) - - <li>On Windows, temporary files created when uploading attachments are now - correctly deleted when the upload is complete. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=414002">[% terms.Bug %] 414002</a>)</li> - - <li><kbd>checksetup.pl</kbd> now prints correct installation instructions - for Windows users using Perl 5.10. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=414430">[% terms.Bug %] 414430</a>) -</ul> - -<p>See also the <a href="#v30_security">Security Advisory</a> section for - information about security issues fixed in this release.</p> - -<h3>3.0.3</h3> - -<ul> - <li>mod_perl no longer compiles [% terms.Bugzilla %]'s code for each Apache - process individually. It now compiles code only once and shares it among - each Apache process. This greatly improves performance and highly - decreases the memory footprint. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=398241">[% terms.Bug %] 398241</a>)</li> - - <li>You can now search for '---' (without quotes) in versions and milestones. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=362436">[% terms.Bug %] 362436</a>)</li> - - <li>[% terms.Bugzilla %] should no longer break lines unnecessarily in - email subjects. This was causing trouble with some email clients. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=374424">[% terms.Bug %] 374424</a>)</li> - - <li>If you had selected "I'm added to or removed from this capacity" option - for the "CC" role in your email preferences, you wouldn't get mail when - more than one person was added to the CC list at once. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=394796">[% terms.Bug %] 394796</a>)</li> - - <li>Deleting a user account no longer deletes whines from another user who - has the deleted account as addressee. The schedule is simply removed, - but the whine itself is left intact. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=395924">[% terms.Bug %] 395924</a>)</li> - - <li><kbd>contrib/merge-users.pl</kbd> now correctly merges all required - fields when merging two user accounts. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=400160">[% terms.Bug %] 400160</a>)</li> - - <li>[% terms.Bugzilla %] no longer requires Apache::DBI to run under - mod_perl. It caused troubles such as lost connections with the DB and - didn't give any important performance gain. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=408766">[% terms.Bug %] 408766</a>)</li> -</ul> - -<h3>3.0.2</h3> - -<ul> - <li>[% terms.Bugzilla %] should now work on Perl 5.9.5 (and thus the - upcoming Perl 5.10.0). - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=390442">[% terms.Bug %] 390442</a>)</li> -</ul> - -<p>See also the <a href="#v30_security">Security Advisory</a> section for - information about an important security issue fixed in this release.</p> - -<h3>3.0.1</h3> - -<ul> - <li>For users of Firefox 2, the <code>show_bug.cgi</code> user interface - should no longer "collapse" after you modify [% terms.abug %]. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370739">[% terms.Bug %] 370739</a>)</li> - <li>If you can bless a group, and you share a saved search with that - group, it will no longer automatically appear in all of that group's - footers unless you specifically request that it automatically appear - in their footers. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365890">[% terms.Bug %] 365890</a>)</li> - <li>There is now a parameter to allow users to perform searches without - any search terms. (In other words, to search for just a Product - and Status on the Simple Search page.) The parameter is called - <code>specific_search_allow_empty_words</code>. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=385910">[% terms.Bug %] 385910</a>)</li> - <li>If you attach a file that has a MIME-type of <code>text/x-patch</code> - or <code>text/x-diff</code>, it will automatically be treated as a - patch by [% terms.Bugzilla %]. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365756">[% terms.Bug %] 365756</a>)</li> - <li>Dependency Graphs now work correctly on all mod_perl installations. - There should now be no remaining signficant problems with running - [%+ terms.Bugzilla %] under mod_perl. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370398">[% terms.Bug %] 370398</a>)</li> - <li>If moving [% terms.abug %] between products would remove groups - from the [% terms.bug %], you are now warned. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=303183">[% terms.Bug %] 303183</a>)</li> - <li>On IIS, whenever [% terms.Bugzilla %] threw a warning, it would - actually appear on the web page. Now warnings are suppressed, - unless you have a file in the <code>data</code> directory called - <code>errorlog</code>, in which case warnings will be printed there. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=390148">[% terms.Bug %] 390148</a>)</li> - <li>If you used <kbd>email_in.pl</kbd> to edit [% terms.abug %] that was - protected by groups, all of the groups would be cleared. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=385453">[% terms.Bug %] 385453</a>)</li> - <li>PostgreSQL users: New Charts were failing to collect data over time. - They will now start collecting data correctly. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=257351">[% terms.Bug %] 257351</a>)</li> - <li>Some flag mails didn't specify who the requestee was. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=379787">[% terms.Bug %] 379787</a>)</li> - <li>Instead of throwing real errors, <kbd>collectstats.pl</kbd> would - just say that it couldn't find <code>ThrowUserError</code>. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=380709">[% terms.Bug %] 380709</a>)</li> - <li>Logging into [% terms.Bugzilla %] from the home page works again - with IIS5. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=364008">[% terms.Bug %] 364008</a>)</li> - <li>If you were using SMTP for sending email, sometimes emails would - be missing the <code>Date</code> header. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=304999">[% terms.Bug %] 304999</a>).</li> - <li>In the XML-RPC WebService, <code>B<!-- -->ug.legal_values</code> now - correctly returns values for custom fields if you request values - for custom fields. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=381737">[% terms.Bug %] 381737</a>)</li> - <li>The "[% terms.Bug %]-Writing Guidelines" page has been shortened - and re-written. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=378590">[% terms.Bug %] 378590</a>)</li> - <li>If your <code>urlbase</code> parameter included a port number, - like <code>www.domain.com:8080</code>, SMTP might have failed. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=384501">[% terms.Bug %] 384501</a>)</li> - <li>For SMTP users, there is a new parameter, <code>smtp_debug</code>. - Turning on this parameter will log the full information about - every SMTP session to your web server's error log, to help with - debugging issues with SMTP. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=384497">[% terms.Bug %] 384497</a>)</li> - <li>If you are a "global watcher" (you get all mails from every - [%+ terms.bug %]), you can now see that in your Email Preferences. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365302">[% terms.Bug %] 365302</a>)</li> - <li>The Status and Resolution of [% terms.bugs %] are now correctly - localized in CSV search results. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=389517">[% terms.Bug %] 389517</a>)</li> - <li>The "Subject" line of an email was being mangled if it contained - non-Latin characters. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=387860">[% terms.Bug %] 387860</a>)</li> - <li>Editing the "languages" parameter using <kbd>editparams.cgi</kbd> would - sometimes fail, causing [% terms.Bugzilla %] to throw an error. - (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=335354">[% terms.Bug %] 335354</a>)</li> -</ul> - -<h2 id="v30_req">Minimum Requirements</h2> - -<p>Any requirements that are new since 2.22 will look like - <span class="req_new">this</span>.</p> - -<ul> - <li><a href="#v30_req_perl">Perl</a></li> - <li><a href="#v30_req_mysql">For MySQL Users</a></li> - <li><a href="#v30_req_pg">For PostgreSQL Users</a></li> - <li><a href="#v30_req_modules">Required Perl Modules</a></li> - <li><a href="#v30_req_optional_mod">Optional Perl - Modules</a></li> -</ul> - - -<h3 id="v30_req_perl">Perl</h3> - -<ul> - <li>Perl <span class="req_new">v<strong>5.8.0</strong></span> (non-Windows - platforms)</li> - <li>Perl v<strong>5.8.1</strong> (Windows platforms)</li> -</ul> - -<h3 id="v30_req_mysql">For MySQL Users</h3> - -<ul> - <li>MySQL <span class="req_new">v4.1.2</span></li> - <li><strong>perl module:</strong> DBD::mysql v2.9003</li> -</ul> - -<h3 id="v30_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="v30_req_modules">Required 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>2.93</td> - </tr> - <tr> - <td>Date::Format</td> <td>2.21</td> - </tr> - <tr> - <td>DBI</td> - <td class="req_new">1.41</td> - </tr> - <tr> - <td>File::Spec</td> <td>0.84</td> - </tr> - <tr> - <td>Template</td> <td>2.12</td> - </tr> - <tr> - <td class="req_new">Email::Send</td> - <td class="req_new">2.00</td> - </tr> - <tr> - <td>Email::MIME</td> - <td>1.861</td> - </tr> - <tr> - <td class="req_new">Email::MIME::Modifier</td> - <td class="req_new">1.442</td> - </tr> -</table> - -<h3 id="v30_req_optional_mod">Optional Perl Modules</h3> - -<p>The following perl modules, if installed, enable various - features of [% terms.Bugzilla %]:</p> - -<table class="req_table" border="0" cellspacing="0" cellpadding="0"> - <tr> - <th>Module</th> <th>Version</th> - <th>Enables Feature</th> - </tr> - <tr> - <td class="req_new">LWP::UserAgent</td> - <td class="req_new">(Any)</td> - <td>Automatic Update Notifications</td> - </tr> - <tr> - <td>Template::Plugin::GD::Image</td> - <td>(Any)</td> - <td>Graphical Reports</td> - </tr> - <tr> - <td>GD::Graph</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</td> - <td>1.20</td> - <td>Graphical Reports, New Charts, Old Charts</td> - </tr> - <tr> - <td class="req_new">Email::MIME::Attachment::Stripper</td> - <td class="req_new">(Any)</td> - <td>Inbound Email</td> - </tr> - <tr> - <td class="req_new">Email::Reply</td> - <td class="req_new">(Any)</td> - <td>Inbound Email</td> - </tr> - <tr> - <td>Net::LDAP</td> - <td>(Any)</td> - <td>LDAP Authentication</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>XML::Twig</td> - <td>(Any)</td> - <td>Move [% terms.Bugs %] Between Installations</td> - </tr> - <tr> - <td>MIME::Parser</td> - <td>5.406</td> - <td>Move [% terms.Bugs %] Between Installations</td> - </tr> - <tr> - <td>Chart::Base</td> - <td>1.0</td> - <td>New Charts, Old Charts</td> - </tr> - <tr> - <td>Image::Magick</td> - <td>(Any)</td> - <td>Optionally Convert BMP Attachments to PNGs</td> - </tr> - <tr> - <td>PatchReader</td> - <td>0.9.4</td> - <td>Patch Viewer</td> - </tr> - <tr> - <td class="req_new">SOAP::Lite</td> - <td class="req_new">(Any)</td> - <td>XML-RPC Interface</td> - </tr> - <tr> - <td class="req_new">mod_perl2</td> - <td class="req_new">1.999022</td> - <td>mod_perl</td> - </tr> - <tr> - <td> CGI</td> - <td>3.11</td> - <td>mod_perl</td> - </tr> -</table> - -<h2 id="v30_feat">New Features and Improvements</h2> - -<ul> - <li><a href="#v30_feat_cf">Custom Fields</a></li> - <li><a href="#v30_feat_mp">mod_perl Support</a></li> - <li><a href="#v30_feat_sq">Shared Saved Searches</a></li> - <li> - <a href="#v30_feat_afn">Attachments and Flags on New [% terms.Bugs %]</a> - </li> - <li><a href="#v30_feat_cr">Custom Resolutions</a></li> - <li><a href="#v30_feat_ppp">Per-Product Permissions</a></li> - <li><a href="#v30_feat_ui">User Interface Improvements</a></li> - <li><a href="#v30_feat_xml">XML-RPC Interface</a></li> - <li><a href="#v30_feat_skin">Skins</a></li> - <li><a href="#v30_feat_sbu">Unchangeable Fields Appear - Unchangeable</a></li> - <li><a href="#v30_feat_et">All Emails in Templates</a></li> - <li><a href="#v30_feat_df">No More Double-Filed [% terms.Bugs %]</a></li> - <li><a href="#v30_feat_cc">Default CC List for Components</a></li> - <li><a href="#v30_feat_emi">File/Modify [% terms.Bugs %] By Email</a></li> - <li><a href="#v30_feat_gw">Users Who Get All [% terms.Bug %] - Notifications</a></li> - <li><a href="#v30_feat_utf8">Improved UTF-8 Support</a></li> - <li><a href="#v30_feat_upda">Automatic Update Notification</a></li> - <li><a href="#v30_feat_welc">Welcome Page for New Installs</a></li> - <li><a href="#v30_feat_other">Other Enhancements and Changes</a></li> -</ul> - -<h3 id="v30_feat_cf">Custom Fields</h3> - -<p>[% terms.Bugzilla %] now includes very basic support for custom fields.</p> - -<p>Users in the <kbd>admin</kbd> group can add plain-text or drop-down - custom fields. You can edit the values available for drop-down fields - using the "Field Values" control panel.</p> - -<p>Don't add too many custom fields! It can make [% terms.Bugzilla %] - very difficult to use. Try your best to get along with the default - fields, and then if you find that you can't live without custom fields - after a few weeks of using [% terms.Bugzilla %], only then should you - start your custom fields.</p> - -<h3 id="v30_feat_mp">mod_perl Support</h3> - -<p>[% terms.Bugzilla %] 3.0 supports mod_perl, which allows for extremely - enhanced page-load performance. mod_perl trades memory usage for performance, - allowing near-instantaneous page loads, but using much more memory.</p> - -<p>If you want to enable mod_perl for your [% terms.Bugzilla %], we recommend - a minimum of 1.5GB of RAM, and for a site with heavy traffic, 4GB to 8GB.</p> - -<p>If performance isn't that critical on your installation, you don't - have the memory, or you are running some other web server than - Apache, [% terms.Bugzilla %] still runs perfectly as a normal CGI - application, as well.</p> - -<h3 id="v30_feat_sq">Shared Saved Searches</h3> - -<p>Users can now choose to "share" their saved searches - with a certain group. That group will then be able to - "subscribe" to those searches, and have them appear - in their footer.</p> - -<p>If the sharer can "bless" the group he's sharing to, - (that is, if he can add users to that group), it's considered - that he's a manager of that group, and his queries show up - automatically in that group's footer (although they can - unsubscribe from any particular search, if they want.)</p> - -<p>In order to allow a user to share their queries, they also - have to be a member of the group specified in the - <code>querysharegroup</code> parameter.</p> - -<p>Users can control their shared and subscribed queries from - the "Preferences" screen.</p> - -<h3 id="v30_feat_afn">Attachments and Flags on New [% terms.Bugs %]</h3> - -<p>You can now add an attachment while you are filing a new - [%+ terms.bug %].</p> - -<p>You can also set flags on the [% terms.bug %] and on attachments, while - filing a new [% terms.bug %].</p> - -<h3 id="v30_feat_cr">Custom Resolutions</h3> - -<p>You can now customize the list of resolutions available - in [% terms.Bugzilla %], including renaming the default resolutions.</p> - -<p>The resolutions <code>FIXED</code>, <code>DUPLICATE</code> - and <code>MOVED</code> have a special meaning to [% terms.Bugzilla %], - though, and cannot be renamed or deleted.</p> - -<h3 id="v30_feat_ppp">Per-Product Permissions</h3> - -<p>You can now grant users <kbd>editbugs</kbd> and <kbd>canconfirm</kbd> - for only certain products. You can also grant users <kbd>editcomponents</kbd> - on a product, which means they will be able to edit that product - including adding/removing components and other product-specific - controls.</p> - -<h3 id="v30_feat_ui">User Interface Improvements</h3> - -<p>There has been some work on the user interface for [% terms.Bugzilla %] 3.0, - including:</p> - -<ul> - <li>There is now navigation and a search box a the <em>top</em> of - each page, in addition to the bar at the bottom of the page.</li> - <li>A re-designed "Format for Printing" page for - [%+ terms.bugs %].</li> - <li>The layout of <kbd>show_bug.cgi</kbd> (the [% terms.bug %] editing - page) has been changed, and the attachment table has been redesigned.</li> -</ul> - -<h3 id="v30_feat_xml">XML-RPC Interface</h3> - -<p>[% terms.Bugzilla %] now has a Web Services interface using the XML-RPC - protocol. It can be accessed by external applications by going - to the <kbd>xmlrpc.cgi</kbd> on your installation.</p> - -<p>Documentation can be found in the - <a href="[% docs_urlbase FILTER html %]api/">[% terms.Bugzilla %] - API Docs</a>, in the various <kbd>Bugzilla::WebService</kbd> modules.</p> - -<h3 id="v30_feat_skin">Skins</h3> - -<p>[% terms.Bugzilla %] can have multiple "skins" installed, - and users can pick between them. To write a skin, you just have to - write several CSS files. See the <a href="[% docs_urlbase FILTER html %]cust-skins.html">Custom - Skins Documentation</a> for more details.</p> - -<p>We currently don't have any alternate skins shipping with - [%+ terms.Bugzilla %]. If you write an alternate skin, please - let us know!</p> - -<h3 id="v30_feat_sbu">Unchangeable Fields Appear Unchangeable</h3> - -<p>As long as you are logged in, when viewing [% terms.abug %], if you - cannot change a field, it will not look like you can change it. That - is, the value will just appear as plain text.</p> - -<h3 id="v30_feat_et">All Emails in Templates</h3> - -<p>All outbound emails are now controlled by the templating system. - What used to be the <code>passwordmail</code>, <code>whinemail</code>, - <code>newchangedmail</code> and <code>voteremovedmail</code> - parameters are now all templates in the <kbd>template/</kbd> directory.</p> - -<p>This means that it's now much easier to customize your outbound - emails, and it's also possible for localizers to have more - localized emails as part of their language packs, if they want.</p> - -<p>We also added a <code>mailfrom</code> parameter to let you set - who shows up in the <code>From</code> field on all emails that - [%+ terms.Bugzilla %] sends.</p> - -<h3 id="v30_feat_df">No More Double-Filed [% terms.Bugs %]</h3> - -<p>Users of [% terms.Bugzilla %] will sometimes accidentally submit - [%+ terms.abug %] twice, either by going back in their web browser, - or just by refreshing a page. In the past, this could file the same - [%+ terms.bug %] twice (or even three times) in a row, irritating - developers and confusing users.</p> - -<p>Now, if you try to submit [% terms.abug %] twice from the same screen - (by going back or by refreshing the page), [% terms.Bugzilla %] will warn - you about what you're doing, before it actually submits the duplicate - [%+ terms.bug %].</p> - -<h3 id="v30_feat_cc">Default CC List for Components</h3> - -<p>You can specify a list of users who will <em>always</em> be added to - the CC list of new [% terms.bugs %] in a component.</p> - -<h3 id="v30_feat_emi">File/Modify [% terms.Bugs %] By Email</h3> - -<p>You can now file or modify [% terms.bugs %] via email. Previous versions - of [% terms.Bugzilla %] included this feature only as an - unsupported add-on, but it is now an official interface to - [%+ terms.Bugzilla %].</p> - -<p>For more details see the <a href="[% docs_urlbase FILTER html %]api/email_in.html">documentation - for email_in.pl</a>.</p> - -<h3 id="v30_feat_gw">Users Who Get All [% terms.Bug %] Notifications</h3> - -<p>There is now a parameter called <kbd>globalwatchers</kbd>. This - is a comma-separated list of [% terms.Bugzilla %] users who will - get all [% terms.bug %] notifications generated by [% terms.Bugzilla %].</p> - -<p>Group controls still apply, though, so users who can't see [% terms.abug %] - still won't get notifications about that [% terms.bug %].</p> - -<h3 id="v30_feat_utf8">Improved UTF-8 Support</h3> - -<p>[% terms.Bugzilla %] users running MySQL should now have excellent - UTF-8 support if they turn on the <kbd>utf8</kbd> parameter. (New - installs have this parameter on by default.) [% terms.Bugzilla %] - now correctly supports searching and sorting in non-English languages, - including multi-bytes languages such as Chinese.</p> - -<h3 id="v30_feat_upda">Automatic Update Notification</h3> - -<p>If you belong to the <kbd>admin</kbd> group, you will be notified - when you log in if there is a new release of [% terms.Bugzilla %] - available to download.</p> - -<p>You can control these notifications by changing the - <kbd>upgrade_notification</kbd> parameter.</p> - -<p>If your [% terms.Bugzilla %] installation is on a machine that needs to go - through a proxy to access the web, you may also have to set the - <kbd>proxy_url</kbd> parameter.</p> - -<h3 id="v30_feat_welc">Welcome Page for New Installs</h3> - -<p>When you log in for the first time on a brand-new [% terms.Bugzilla %] - installation, you will be presented with a page that describes - where you should go from here, and what parameters you should set.</p> - -<h3 id="v30_feat_qs">QuickSearch Plugin for IE7 and Firefox 2</h3> - -<p>Firefox 2 users and Internet Explorer 7 users will be presented - with the option to add [% terms.Bugzilla %] to their search bar. - This uses the - <a href="page.cgi?id=quicksearch.html">QuickSearch syntax</a>.</p> - -<h3 id="v30_feat_other">Other Enhancements and Changes</h3> - -<p>These are either minor enhancements, or enhancements that have - very short descriptions. Some of these are very useful, though!</p> - -<h4>Enhancements That Affect [% terms.Bugzilla %] Users</h4> - -<ul> - <li>In comments, quoted text (lines that start with <kbd>></kbd>) - will be a different color from normal text.</li> - <li>There is now a user preference that will add you to the CC list - of any [% terms.bug %] you modify. Note that it's <strong>on</strong> - by default.</li> - <li>[% terms.Bugs %] can now be filed with an initial state of - <kbd>ASSIGNED</kbd>, if you are in the <kbd>editbugs</kbd> group.</li> - <li>By default, comment fields will zoom large when you are typing in them, - and become small when you move out of them. You can disable this - in your user preferences.</li> - <li>You can hide obsolete attachments on [% terms.abug %] by clicking - "Hide Obsolete" at the bottom of the attachment table.</li> - <li>If [% terms.abug %] has flags set, and you move it to a different - product that has flags with the same name, the flags will be - preserved.</li> - <li>You now can't request a flag to be set by somebody who can't set it - ([% terms.Bugzilla %] will throw an error if you try).</li> - <li>Many new headers have been added to outbound [% terms.Bugzilla %] - [%+ terms.bug %] emails: <code>X-Bugzilla-Status</code>, - <code>X-Bugzilla-Priority</code>, <code>X-Bugzilla-Assigned-To</code>, - <code>X-Bugzilla-Target-Milestone</code>, and - <code>X-Bugzilla-Changed-Fields</code>, <code>X-Bugzilla-Who</code>. - You can look at an email to get an idea of what they contain.</li> - <li>In addition to the old <code>X-Bugzilla-Reason</code> email header - which tells you why you got an email, if you got an email because - you were watching somebody, there is now an - <code>X-Bugzilla-Watch-Reason</code> header that tells you who you - were watching and what role they had.</li> - <li>If you hover your mouse over a full URL (like - <code>http://bugs.mycompany.com/show_bug.cgi?id=1212</code>) that - links to [% terms.abug %], you will see the title of the - [%+ terms.bug %]. Of course, this only works for [% terms.bugs %] in your - [%+ terms.Bugzilla %] installation.</li> - <li>If your installation has user watching enabled, you will now see - the users that you can remove from your watch-list as a multi-select - box, much like the current CC list. (Previously it was just a text - box.)</li> - <li>When a user creates their own account in [% terms.Bugzilla %], the - account is now not actually created until they verify their email - address by clicking on a link that is emailed to them.</li> - <li>You can change [% terms.abug %]'s resolution without reopening it.</li> - <li>When you view the dependency tree on [% terms.abug %], resolved - [%+ terms.bugs %] will be hidden by default. (In previous versions, - resolved [% terms.bugs %] were shown by default.)</li> - <li>When viewing [% terms.bug %] activity, fields that hold [% terms.bug %] - numbers (such as "Blocks") will have the [% terms.bug %] numbers - displayed as links to those [% terms.bugs %].</li> - <li>When viewing the "Keywords" field in [% terms.abug %] list, - it will be sorted alphabetically, so you can sanely sort a list on - that field.</li> - <li>In most places, the Version field is now sorted using a version-sort - (so 1.10 is greater than 1.2) instead of an alphabetical sort.</li> - <li>Options for flags will only appear if you can set them. So, for - example, if you can't grant <kbd>+</kbd> on a flag, that option - won't appear for you.</li> - <li>You can limit the product-related output of <kbd>config.cgi</kbd> - by specifying a <kbd>product=</kbd> URL argument, containing the name - of a product. You can specify the argument more than once for multiple - products.</li> - <li>You can now search the boolean charts on whether or not a comment - is private.</li> -</ul> - -<h4>Enhancements For Administrators</h4> - -<ul> - <li>Administrators can now delete attachments, making them disappear - entirely from [% terms.Bugzilla %].</li> - <li><kbd>sanitycheck.cgi</kbd> can now only be accessed by users - in the <kbd>editcomponents</kbd> group.</li> - <li>The "Field Values" control panel can now only be accessed - by users in the <kbd>admin</kbd> group. (Previously it was accessible - to anybody in the <kbd>editcomponents</kbd> group.)</li> - <li>There is a new parameter <kbd>announcehtml</kbd>, that will allow - you to enter some HTML that will be displayed at the top of every - page, as an announcement.</li> - <li>The <kbd>loginnetmask</kbd> parameter now defaults to 0 for new - installations, meaning that as long as somebody has the right - login cookie, they can log in from any IP address. This makes - life a lot easier for dial-up users or other users whose IP - changes a lot. This could be done because the login cookie is now - very random, and thus secure.</li> - <li>Classifications now have sortkeys, so they can be sorted in an - order that isn't alphabetical.</li> - <li>Authentication now supports LDAP over SSL (LDAPS) or TLS (using - the STARTLS command) in addition to plain LDAP.</li> - <li>LDAP users can have their LDAP username be their email address, - instead of having the LDAP <kbd>mail</kbd> attribute be their - email address. You may wish to set the <kbd>emailsuffix</kbd> - parameter if you do this.</li> - <li>Administrators can now see what has changed in a user account, - when using the "Users" control panel.</li> - <li><code>REMIND</code> and <code>LATER</code> are no longer part - of the default list of resolutions. Upgrading installations will - not be affected--they will still have these resolutions.</li> - <li><kbd>editbugs</kbd> is now the default for the <kbd>timetrackinggroup</kbd> - parameter, meaning that time-tracking will be on by default in a new - installation.</li> -</ul> - -<h2 id="v30_issues">Outstanding Issues</h2> - -<ul> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621"> - [%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is - in use on [% terms.bugs %], you will need to rebuild the "keyword cache" - by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing - the option to rebuild the cache when it asks. Otherwise keywords may - not show up properly in search results.</li> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=99215"> - [%- terms.Bug %] 99215</a>: Flags are not protected by "mid-air - collision" detection. Nor are any attachment changes.</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> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370"> - [%- terms.Bug %] 370370</a>: mod_perl support is currently not - working on Windows machines.</li> - <li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=361149"> - [%- terms.Bug %] 361149</a>: If you are using Perl 5.8.0, you may - get a lot of warnings in your Apache error_log about "deprecated - pseudo-hashes." These are harmless--they are a b[%# fool test %]ug in - Perl 5.8.0. Perl 5.8.1 and later do not have this problem.</li> - <li>[% terms.Bugzilla %] 3.0rc1 allowed custom field column names in - the database to be mixed-case. [% terms.Bugzilla %] 3.0 only allows - lowercase column names. It will fix any column names that you have - made mixed-case, but if you have custom fields that previously were - mixed-case in any Saved Search, you will have to re-create that Saved - Search yourself.</li> -</ul> - -<h2 id="v30_security">Security Updates in This Release</h2> - -<h3>3.0.6</h3> - -<p>[% terms.Bugzilla %] contains a minor security fix. For details, see the - <a href="http://www.bugzilla.org/security/2.20.6/">Security Advisory</a>.</p> - -<h3>3.0.5</h3> - -<p>[% terms.Bugzilla %] contains one security fix for - <a href="[% docs_urlbase FILTER html %]api/importxml.html">importxml.pl</a>. - For details, see the - <a href="http://www.bugzilla.org/security/2.22.4/">Security Advisory</a>.</p> - -<h3>3.0.4</h3> - -<p>[% terms.Bugzilla %] 3.0.4 contains three security fixes. - For details, see the - <a href="http://www.bugzilla.org/security/2.20.5/">Security Advisory</a>.</p> - -<h3>3.0.3</h3> - -<p>No security fixes in this release.</p> - -<h3>3.0.2</h3> - -<p>[% terms.Bugzilla %] 3.0.1 had an important security fix that is - critical for public installations with "requirelogin" turned on. - For details, see the - <a href="http://www.bugzilla.org/security/3.0.1/">Security Advisory</a></p> - -<h3>3.0.1</h3> - -<p>[% terms.Bugzilla %] 3.0 had three security issues that have been - fixed in this release: one minor information leak, one hole only - exploitable by an admin or using <code>email_in.pl</code>, and one in an - uncommonly-used template. For details, see the - <a href="http://www.bugzilla.org/security/2.20.4/">Security Advisory</a>.</p> - -<h2 id="v30_upgrading">How to Upgrade From An Older Version</h2> - -<h3 id="v30_upgrading_notes">Notes For Upgraders</h3> - -<ul> - <li>If you upgrade by CVS, there are several .cvsignore files - that are now in CVS instead of being locally created by - <kbd>checksetup.pl</kbd>. This means that you will have to - delete those files when CVS tells you there's a conflict, and - then run <kbd>cvs update</kbd> again.</li> - <li>In this version of [% terms.Bugzilla %], the Summary field - is now limited to 255 characters. When you upgrade, any Summary - longer than that will be truncated, and the old summary will be - preserved in a comment.</li> - <li>If you have the <kbd>utf8</kbd> parameter turned on, at some - point you will have to convert your database. <kbd>checksetup.pl</kbd> - 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 <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, - so you may only want to run it if you use Old Charts.</li> - <li>You should also read the Outstanding Issues sections of - <a href="#v30_previous">older release notes</a> if you are upgrading - from a version lower than 2.22.</li> -</ul> - -<h3>Steps For Upgrading</h3> - -<p>Once you have read the notes above, see the - <a href="[% docs_urlbase FILTER html %]upgrade.html">Upgrading - documentation</a> for instructions on how to upgrade.</p> - -<h2 id="v30_code_changes">Code Changes Which May Affect Customizations</h2> - -<ul> - <li><a href="#v30_code_loc"><strong>Packagers:</strong> Location - Variables Have Moved</a></li> - <li><a href="#v30_code_hooks">Hooks!</a></li> - <li><a href="#v30_code_api">API Documentation</a></li> - <li><a href="#v30_code_globals">Elimination of globals.pl</a></li> - <li><a href="#v30_code_scope">Cleaned Up Variable Scoping Issues</a></li> - <li><a href="#v30_code_sql">No More SendSQL</a></li> - <li><a href="#v30_code_auth">Auth Re-write</a></li> - <li><a href="#v30_code_obj">Bugzilla::Object</a></li> - <li><a href="#v30_code_req">Bugzilla->request_cache</a></li> - <li><a href="#v30_code_other">Other Changes</a></li> -</ul> - -<h3 id="v30_code_loc"><strong>Packagers:</strong> Location Variables - Have Moved</h3> - -<p>In previous versions of [% terms.Bugzilla %], <kbd>Bugzilla::Config</kbd> - held all the paths for different things, such as the path to localconfig - and the path to the <kbd>data/</kbd> directory.</p> - -<p>Now, all of this data is stored in a subroutine, - <kbd>Bugzilla::Constants::bz_locations</kbd>.</p> - -<p>Also, note that for mod_perl, <kbd>bz_locations</kbd> must return - <em>absolute</em> (not relative) paths. There is already code in that - subroutine to help you with this.</p> - -<h3 id="v30_code_hooks">Hooks!</h3> - -<p>[% terms.Bugzilla %] now supports a code hook mechanism. See the - documentation for - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Hook.html">Bugzilla::Hook</a> - for more details.</p> - -<p>This gives [% terms.Bugzilla %] very advanced plugin support. You can - hook templates, hook code, add new parameters, and use the XML-RPC - interface. So we'd like to see some [% terms.Bugzilla %] plugins - written! Let us know on the <a href="http://bugzilla.org/cgi-bin/mj_wwwusr?func=lists-long-full&extra=developers">developers@bugzilla.org</a> - mailing list if you write a plugin.</p> - -<p>If you need more hooks, please - <a href="http://www.bugzilla.org/developers/reporting_bugs.html">File a b<!-- -->ug</a>!</p> - -<h3 id="v30_code_api">API Documentation</h3> - -<p>[% terms.Bugzilla %] now ships with all of its perldoc built - as HTML. Go ahead and read the - <a href="[% docs_urlbase FILTER html %]api/">API Documentation</a> - for all of the [% terms.Bugzilla %] modules now! Even scripts like - <kbd>checksetup.pl</kbd> have HTML documentation.</p> - -<h3 id="v30_code_globals">Elimination of globals.pl</h3> - -<p>The old file <kbd>globals.pl</kbd> has been eliminated. - Its code is now in various modules. Each function went to the module - that was appropriate for it.</p> - -<p>Usually we filed [% terms.abug %] in - <a href="https://bugzilla.mozilla.org">bugzilla.mozilla.org</a> for - each function we moved. You can search there for the old name of - the function, and that should get you the information about what - it's called now and where it lives.</p> - -<h3 id="v30_code_scope">Cleaned Up Variable Scoping Issues</h3> - -<p>In normal perl, you can have code like this:</p> -<pre>my $var = 0; -sub y { $var++ }</pre> - -<p>However, under mod_perl that doesn't work. So variables are no - longer "shared" with subroutines--instead all variables - that a subroutine needs must be declared inside the subroutine itself.</p> - -<h3 id="v30_code_sql">No More SendSQL</h3> - -<p>The old <kbd>SendSQL</kbd> function and all of its companions are - <strong>gone</strong>. Instead, we now use DBI for all database - interaction.</p> - -<p>For more information about how to use - <a href="http://search.cpan.org/perldoc?DBI">DBI</a> with - [%+ terms.Bugzilla %], see the - <a href="http://www.bugzilla.org/docs/developer.html#sql-sendreceive">Developer's - Guide Section About DBI</a></p> - -<h3 id="v30_code_auth">Auth Re-write</h3> - -<p>The <kbd>Bugzilla::Auth</kbd> family of modules have been completely - re-written. For details on how the new structure of authentication, - read the - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Auth.html">Bugzilla::Auth - API docs</a>.</p> - -<p>It should be very easy to write new authentication plugins, now.</p> - -<h3 id="v30_code_obj">Bugzilla::Object</h3> - -<p>There is a new base class for most of our objects, - <a href="[% docs_urlbase FILTER html %]api/Bugzilla/Object.html">Bugzilla::Object</a>. - It makes it really easy to create new objects based on things that are - in the database.</p> - -<h3 id="v30_code_req">Bugzilla->request-cache</h3> - -<p><kbd>Bugzilla.pm</kbd> used to cache things like the database - connection in package-global variables (like <kbd>$_dbh</kbd>). - That doesn't work in mod_perl, so instead now there's a hash - that can be accessed through <code>Bugzilla->request_cache</code> - to store things for the rest of the current page request.</p> - -<p>You shouldn't access <code>Bugzilla->request_cache</code> directly, - but you should use it inside of <kbd>Bugzilla.pm</kbd> if you modify - that. The only time you should be accessing it directly is if you need - to reset one of the caches. Hash keys are always named after the function - that they cache, so to reset the template object, you'd do: - <code>delete Bugzilla->request_cache->{template};</code>.</p> - -<h3 id="v30_code_other">Other Changes</h3> - -<ul> - <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 - documentation</a> and <a href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=277502&hide_resolved=0">[% terms.Bugzilla %] - [%+ terms.bug %] 277502</a> for details.</li> - <li>Instead of <kbd>UserInGroup()</kbd>, all of [% terms.Bugzilla %] now - uses <kbd>Bugzilla->user->in_group</kbd></li> - <li>mod_perl doesn't like dependency loops in modules, so we now have - a test for that detects dependency loops in modules when you run - <kbd>runtests.pl</kbd>.</li> - <li><kbd>globals.pl</kbd> used to modify the environment variables, - like <kbd>PATH</kbd>. That now happens in <kbd>Bugzilla.pm</kbd>.</li> - <li>Templates can now link to the documentation more easily. - See the <kbd>global/code-error.html.tmpl</kbd> and - <kbd>global/user-error.html.tmpl</kbd> templates for examples. - (Search for "docslinks.")</li> - <li>Parameters are accessed through <kbd>Bugzilla->params</kbd> - instead of using the <kbd>Param()</kbd> function, now.</li> - <li>The variables from the <kbd>localconfig</kbd> file are accessed - through the <code>Bugzilla->localconfig</code> hash instead of through - <kbd>Bugzilla::Config</kbd>.</li> - <li><kbd>Bugzilla::BugMail::MessageToMTA()</kbd> has moved into its - own module, along with other mail-handling code, called - <kbd>Bugzilla::Mailer</kbd></li> - <li>The <kbd>CheckCanChangeField()</kbd> subroutine in - <kbd>process_bug.cgi</kbd> has been moved to <kbd>Bugzilla::Bug</kbd>, - and is now a method of [% terms.abug %] object.</li> - <li>The code that used to be in the <kbd>global/banner.html.tmpl</kbd> - template is now in <kbd>global/header.html.tmpl</kbd>. The banner - still exists, but the file is empty.</li> -</ul> - -<h2 id="v30_previous">Release Notes For Previous Versions</h2> - -<p>Release notes for versions of [% terms.Bugzilla %] for versions - prior to 3.0 are only available in text format: - <a href="[% docs_urlbase FILTER remove('html/$') FILTER html %]rel_notes.txt">Release Notes for [% terms.Bugzilla %] 2.22 - and Earlier</a>.</p> - -[% INCLUDE global/footer.html.tmpl %] - -[% BLOCK db_req %] - [% SET m = DB_MODULE.$db %] - <h3 id="v40_req_[% db FILTER html %]">For [% m.name FILTER html %] Users</h3> - - <ul> - <li>[% m.name FILTER html %] - [%+ '<span class="req_new">' IF db_new %]v[% m.db_version FILTER html %] - [% '</span>' IF db_new %] - </li> - <li><strong>perl module:</strong> - [%+ m.dbd.module FILTER html %] - [% '<span class="req_new">' IF dbd_new %]v[% m.dbd.version FILTER html %] - [% '</span>' IF dbd_new %]</li> - </ul> -[% END %] - - -[% BLOCK req_table %] - <table class="req_table" border="0" cellspacing="0" cellpadding="0"> - <tr> - <th>Module</th> <th>Version</th> - [% IF include_feature %] - <th>Enables Feature</th> - [% END %] - </tr> - [% FOREACH req = reqs %] - <tr> - <td [% ' class="req_new"' IF new.contains(req.package) %]> - [%- req.module FILTER html %]</td> - <td [% ' class="req_new"' IF updated.contains(req.package) - OR new.contains(req.package) %]> - [%- IF req.version == 0 %] - (Any) - [% ELSE %] - [%- req.version FILTER html %] - [% END %] - </td> - [% IF include_feature %] - <td>[% req.feature.join(', ') FILTER html %]</td> - [% END %] - </tr> - [% END %] -</table> -[% END %] diff --git a/template/en/default/pages/sudo.html.tmpl b/template/en/default/pages/sudo.html.tmpl index 2e9035891..f118f04dd 100644 --- a/template/en/default/pages/sudo.html.tmpl +++ b/template/en/default/pages/sudo.html.tmpl @@ -9,13 +9,13 @@ [% INCLUDE global/header.html.tmpl title = "sudo: User Impersonation" %] <p> - [%+ terms.Bugzilla %] includes the ability to have one user impersonate + Bugzilla includes the ability to have one user impersonate another, in something called a <i>sudo session</i>, so long as the person doing the impersonating has the appropriate privileges. </p> <p> - While a session is in progress, [% terms.Bugzilla %] will act as if the + While a session is in progress, Bugzilla will act as if the impersonated user is doing everything. This is especially useful for testing, and for doing critical work when the impersonated user is unavailable. The impersonated user will receive an email from [% terms.Bugzilla %] when the diff --git a/template/en/default/reports/chart.html.tmpl b/template/en/default/reports/chart.html.tmpl index ab334639c..dfab725e6 100644 --- a/template/en/default/reports/chart.html.tmpl +++ b/template/en/default/reports/chart.html.tmpl @@ -20,7 +20,7 @@ header_addl_info = time %] -<div align="center"> +<div class="center"> [% imageurl = BLOCK %]chart.cgi? [% imagebase FILTER html %]&ctype=png&action=plot&width= @@ -36,7 +36,7 @@ <a href="[% sizeurl %]&width=[% width %]&height= [% height + 100 %]">Taller</a><br> <a href="[% sizeurl %]&width=[% width - 100 %]&height= - [% height %]">Thinner</a> * + [% height %]">Thinner</a> | <a href="[% sizeurl %]&width=[% width + 100 %]&height= [% height %]">Fatter</a> <br> <a href="[% sizeurl %]&width=[% width %]&height= diff --git a/template/en/default/reports/chart.png.tmpl b/template/en/default/reports/chart.png.tmpl index a464accd4..91944fee5 100644 --- a/template/en/default/reports/chart.png.tmpl +++ b/template/en/default/reports/chart.png.tmpl @@ -6,9 +6,6 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[% y_label = "$terms.Bugs" %] -[% x_label = "Time" %] - [% IF chart.cumulate %] [% USE graph = GD.Graph.area(width, height) %] [% graph.set(cumulate => "true") %] @@ -19,8 +16,8 @@ [% FILTER null; x_label_skip = (30 * chart.data.0.size / width); - graph.set(x_label => x_label, - y_label => y_label, + graph.set(x_label => "Time", + y_label => terms.Bugs, y_tick_number => 8, y_max_value => chart.y_max_value, x_label_position => 0.5, @@ -32,16 +29,18 @@ "lpurple", "lorange", "black", "green", "blue", "dpink", "lbrown", "gray", "red", "dpurple", "gold", "marine"]); - - # Workaround for the fact that set_legend won't take chart.labels directly, - # because chart.labels is an array reference rather than an array. - graph.set_legend(chart.labels.0, chart.labels.1, chart.labels.2, - chart.labels.3, chart.labels.4, chart.labels.5, - chart.labels.6, chart.labels.7, chart.labels.8, - chart.labels.9, chart.labels.10, chart.labels.11, - chart.labels.12, chart.labels.13, chart.labels.14, - chart.labels.15); - - graph.plot(chart.data).png | stdout(1); + + graph.set_legend(chart.labels); END; -%] + +[% IF Param("font_file") %] + [% graph.set_x_axis_font(Param("font_file"), 9); + graph.set_x_label_font(Param("font_file"), 10); + graph.set_y_axis_font(Param("font_file"), 9); + graph.set_y_label_font(Param("font_file"), 10); + graph.set_legend_font(Param("font_file"), 9); + %] +[% END %] + +[% graph.plot(chart.data).png | stdout(1) %] diff --git a/template/en/default/reports/components.html.tmpl b/template/en/default/reports/components.html.tmpl index 2a5d2399b..22a7c948e 100644 --- a/template/en/default/reports/components.html.tmpl +++ b/template/en/default/reports/components.html.tmpl @@ -16,8 +16,8 @@ [% END %] [% PROCESS global/header.html.tmpl - style_urls = [ "skins/standard/reports.css" ] - title = title + style_urls = ['skins/standard/buglist.css'] + title = title %] [% IF Param("useqacontact") %] @@ -26,39 +26,23 @@ [% numcols = 2 %] [% END %] -<table cellpadding="0" cellspacing="0" id="components_header_table"> - <tr> - <td class="instructions"> - Select a component to see open [% terms.bugs %] in that component: - </td> - <td class="product_container"> - <span class="product_name">[% product.name FILTER html %]</span> - <div class="product_desc"> - [% product.description FILTER html_light %] - </div> - </td> - </tr> -</table> +<h1>[% product.name FILTER html %]</h1> -<span class="components_header">Components</span> +<div id="product_desc">[% product.description FILTER html_light %]</div> +<p>Select a component to see open [% terms.bugs %] in that component.</p> -<table summary="Components table" - class="component_table" cellspacing="0" cellpadding="0"> - <thead> +<table id="component_table"> <tr> - <th> </th> + <th>Component</th> <th>Default Assignee</th> [% IF Param("useqacontact") %] <th>Default QA Contact</th> [% END %] </tr> - </thead> - <tbody> [% FOREACH comp = product.components %] [% INCLUDE describe_comp %] [% END %] - </tbody> </table> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/create-chart.html.tmpl b/template/en/default/reports/create-chart.html.tmpl index 471a9cb55..6b5fa5fe3 100644 --- a/template/en/default/reports/create-chart.html.tmpl +++ b/template/en/default/reports/create-chart.html.tmpl @@ -15,6 +15,7 @@ [% PROCESS global/header.html.tmpl title = "Create Chart" + style_urls = ['skins/standard/buglist.css'] %] [% PROCESS "reports/series-common.html.tmpl" @@ -47,9 +48,9 @@ function subcatSelected() { [% gttext = "Grand Total" %] -<form method="get" action="chart.cgi" name="chartform"> - - <table cellpadding="2" cellspacing="2" border="0"> +<form method="get" action="chart.cgi" name="chartform"> + + <table id="create_chart"> [% IF NOT category OR category.size == 0 %] <tr> <td> @@ -58,39 +59,38 @@ function subcatSelected() { </tr> [% ELSE %] <tr> - <th><label for="category">Category</label>:</th> + <th><label for="category">Category</label></th> + <th></th> + <th><label for="subcategory">Sub-category</label></th> <th></th> - <th><label for="subcategory">Sub-category</label>:</th> + <th><label for="name" accesskey="N">Name</label></th> <th></th> - <th><label for="name" accesskey="N">Name</label>:</th> - <th><br> - </th> </tr> <tr> - + [% PROCESS series_select sel = { name => 'category', size => 5, onchange = "catSelected(); subcatSelected();" } %] - + <td> <noscript> <input type="submit" name="action-assemble" value="Update -->" id="action-assemble"> </noscript> </td> - + [% PROCESS series_select sel = { name => 'subcategory', size => 5, onchange = "subcatSelected()" } %] - + <td> <noscript> <input type="submit" name="action-assemble" value="Update -->" id="action-assemble2"> </noscript> </td> - + [% PROCESS series_select sel = { name => 'name', size => 5, multiple => 1, @@ -98,7 +98,7 @@ function subcatSelected() { # not its name. value_in_hash => 1 } %] - <td align="center" valign="middle"> + <td> <input type="submit" name="action-add" value="Add To List" id="action-add"><br> </td> @@ -109,15 +109,15 @@ function subcatSelected() { <h3>List Of Data Sets To Plot</h3> [% IF chart.lines.size %] - <table cellspacing="2" cellpadding="2"> + <table id="edit_charts"> <tr> - <th style="width: 5em;">Select</th> + <th>Select</th> <th>Label</th> <th></th> <th>Data Set</th> <th></th> </tr> - + [%# The external loop has two counters; one which keeps track of where we # are in the old labels array, and one which keeps track of the new # indexes for the form elements. They are different if chart.lines has @@ -134,11 +134,11 @@ function subcatSelected() { [% labelidx = labelidx + 1 %] [% NEXT %] [% END %] - + [% FOREACH series = line %] <tr> [% IF loop.first %] - <td align="center" rowspan="[% line.size %]"> + <td class="center" rowspan="[% line.size %]"> <input type="checkbox" value="1" name="select[% newidx %]"> </td> <td rowspan="[% line.size %]"> @@ -160,7 +160,7 @@ function subcatSelected() { value="[% series.series_id %]"> </td> - <td align="center"> + <td> [% IF user.id == series.creator_id OR user.in_group("admin") %] <a href="chart.cgi?action=edit&series_id= [% series.series_id %]">Edit</a> | @@ -172,7 +172,7 @@ function subcatSelected() { [% series.subcategory FILTER uri %]%20/%20 [% series.name FILTER uri -%]&series_id= [% series.series_id %]&remaction=runseries">Run Search</a> - </td> + </td> </tr> [% END %] [% labelidx = labelidx + 1 %] @@ -181,7 +181,7 @@ function subcatSelected() { [% IF chart.gt %] <tr> - <td align="center"> + <td class="center"> <input type="checkbox" value="1" name="select65536"> <input type="hidden" value="1" name="gt"> </td> @@ -201,30 +201,30 @@ function subcatSelected() { </tr> <tr> - <td valign="bottom" style="text-align: center;"> - <input type="submit" name="action-sum" value="Sum" - style="width: 5em;" id="action-sum"><br> - <input type="submit" name="action-remove" value="Remove" - style="width: 5em;" id="action-remove"> + <td> + <input type="submit" id="action-sum" name="action-sum" value="Sum"><br> + <input type="submit" id="action-remove" name="action-remove" value="Remove"> </td> - <td style="text-align: right; vertical-align: bottom;"> + <td class="right"> <label for="cumulate"><b>Cumulate</b></label>: <input type="checkbox" name="cumulate" id="cumulate" value="1" [% " checked" IF chart.cumulate %]> </td> <td></td> - <td valign="bottom"> + <td> <label for="datefrom"><b>Date Range</b></label>: <input type="text" size="12" name="datefrom" id="datefrom" + placeholder="YYYY-MM-DD" value="[% time2str("%Y-%m-%d", chart.datefrom) IF chart.datefrom%]"> <label for="dateto"><b>to</b></label> <input type="text" size="12" name="dateto" id="dateto" + placeholder="YYYY-MM-DD" value="[% time2str("%Y-%m-%d", chart.dateto) IF chart.dateto %]"> </td> - <td style="text-align: right" valign="bottom"> + <td> <input type="submit" name="action-wrap" value="Chart This List" id="action-wrap"> </td> diff --git a/template/en/default/reports/delete-series.html.tmpl b/template/en/default/reports/delete-series.html.tmpl index 7ff8876aa..d19178ce3 100644 --- a/template/en/default/reports/delete-series.html.tmpl +++ b/template/en/default/reports/delete-series.html.tmpl @@ -24,7 +24,7 @@ This series has been created by <a href="mailto:[% series.creator.email FILTER html %]"> [% series.creator.email FILTER html %]</a> [% ELSE %] - This series has been automatically created by [% terms.Bugzilla %] + This series has been automatically created by Bugzilla [% END %] [% IF series.public %] diff --git a/template/en/default/reports/duplicates-simple.html.tmpl b/template/en/default/reports/duplicates-simple.html.tmpl index 6f586546a..5c3a34bb0 100644 --- a/template/en/default/reports/duplicates-simple.html.tmpl +++ b/template/en/default/reports/duplicates-simple.html.tmpl @@ -10,8 +10,7 @@ # You need to fulfill the interface to duplicates-table.html.tmpl. #%] -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" - "http://www.w3.org/TR/html4/loose.dtd"> +<!DOCTYPE html> <html> [% IF product.size %] [% title = BLOCK %] @@ -25,8 +24,6 @@ <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-table.html.tmpl b/template/en/default/reports/duplicates-table.html.tmpl index 45cf8c394..b8cd2ca78 100644 --- a/template/en/default/reports/duplicates-table.html.tmpl +++ b/template/en/default/reports/duplicates-table.html.tmpl @@ -31,7 +31,7 @@ description => "Change in last<br>$changedsince day(s)" }, { name => "component", description => field_descs.component }, { name => "bug_severity", description => field_descs.bug_severity }, - { name => "op_sys", description => field_descs.op_sys }, + { name => "priority", description => field_descs.priority }, { name => "target_milestone", description => field_descs.target_milestone }, { name => "short_desc", description => field_descs.short_desc }, ] %] @@ -53,7 +53,7 @@ [% base_args_string = base_args.join('&') %] [% IF bugs.size %] - <table id="duplicates_table" cellpadding="0" cellspacing="0"> + <table id="duplicates_table"> <thead> <tr> [% FOREACH column = columns %] @@ -92,8 +92,8 @@ <td class="bug_severity"> [%- display_value('bug_severity', bug.bug_severity) FILTER html %] </td> - <td class="op_sys"> - [%- display_value('op_sys', bug.op_sys) FILTER html %] + <td class="priority"> + [%- display_value('priority', bug.priority) FILTER html %] </td> <td class="target_milestone"> [% display_value('target_milestone', diff --git a/template/en/default/reports/duplicates.html.tmpl b/template/en/default/reports/duplicates.html.tmpl index 4efdcf9f5..35c141265 100644 --- a/template/en/default/reports/duplicates.html.tmpl +++ b/template/en/default/reports/duplicates.html.tmpl @@ -27,10 +27,7 @@ [% title = "Most Frequently Reported $terms.Bugs" %] [% END%] -[% PROCESS global/header.html.tmpl - title = title - style_urls = ['skins/standard/duplicates.css'] -%] +[% PROCESS global/header.html.tmpl title = title %] <p> <a href="#explanation">What is this data?</a> @@ -52,6 +49,18 @@ <input type="hidden" name="bug_id" value="[% bug_ids_string FILTER html %]"> <table> <tr> + <td>Restrict to products:</td> + <td> + [% INCLUDE "global/product-select.html.tmpl" + id => "product" + name => "product" + multiple => 5 + value => product + %] + </td> + </tr> + + <tr> <td>When sorting or restricting, work with:</td> <td> <input type="radio" name="sortvisible" id="entirelist" value="0" @@ -66,16 +75,6 @@ currently visible list </label> </td> - <td rowspan="4" valign="top">Restrict to products:</td> - <td rowspan="4" valign="top"> - <select name="product" size="5" multiple="multiple"> - [% FOREACH p = user.get_selectable_products %] - <option name="[% p.name FILTER html %]" - [% ' selected="selected"' IF product.contains(p.name) %] - >[% p.name FILTER html %]</option> - [% END %] - </select> - </td> </tr> <tr> diff --git a/template/en/default/reports/edit-series.html.tmpl b/template/en/default/reports/edit-series.html.tmpl index c789262ca..ad6bb32f4 100644 --- a/template/en/default/reports/edit-series.html.tmpl +++ b/template/en/default/reports/edit-series.html.tmpl @@ -13,15 +13,9 @@ [%+ default.name FILTER html %] [% END %] -[% PROCESS global/header.html.tmpl %] - -[% IF changes_saved %] - <p> - <font color="red"> - Series updated. - </font> - </p> -[% END %] +[% PROCESS global/header.html.tmpl + style_urls = ['skins/standard/buglist.css'] +%] <form method="get" action="chart.cgi" name="chartform"> @@ -42,7 +36,7 @@ <a href="mailto:[% default.creator.email FILTER html %]"> [% default.creator.email FILTER html %]</a> [% ELSE %] - (automatically created by [% terms.Bugzilla %]) + (automatically created by Bugzilla) [% END %] </p> diff --git a/template/en/default/reports/keywords.html.tmpl b/template/en/default/reports/keywords.html.tmpl index 0624041bd..598979d33 100644 --- a/template/en/default/reports/keywords.html.tmpl +++ b/template/en/default/reports/keywords.html.tmpl @@ -12,34 +12,26 @@ # name: the name of the keyword # description: keyword description. Can contain some limited HTML code. # bug_count: number of bugs with that keyword - # caneditkeywords: boolean. True if this user can edit keywords %] [% PROCESS global/header.html.tmpl title = "$terms.Bugzilla Keyword Descriptions" + style_urls = ['skins/standard/admin.css'] %] -[% FOREACH keyword = keywords %] - [% IF loop.index % 50 == 0 %] - [% IF loop.index != 0 %] - </table> - [% END %] - - <table border="1" cellpadding="4" cellspacing="0"> - <tr bgcolor="#6666FF"> - <th align="left">Name</th> - <th align="left">Description</th> - <th align="left">Open [% terms.Bugs %]</th> - <th align="left">Total [% terms.Bugs %]</th> - </tr> - [% END %] +<table id="admin_table"> + <tr class="column_header"> + <th>Name</th> + <th>Description</th> + <th>Open [% terms.Bugs %]</th> + <th>Total [% terms.Bugs %]</th> + </tr> + [% FOREACH keyword = keywords %] <tr id="[% keyword.name FILTER html %]"> - <th> - [% keyword.name FILTER html %] - </th> + <td>[% keyword.name FILTER html %]</td> <td>[% keyword.description FILTER html_light %]</td> - <td align="center"> + <td class="center"> [% IF keyword.bug_count > 0 %] <a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]&resolution=---"> Search</a> @@ -47,7 +39,7 @@ none [% END %] </td> - <td align="right"> + <td class="right"> [% IF keyword.bug_count > 0 %] <a href="buglist.cgi?keywords=[% keyword.name FILTER uri %]"> [% keyword.bug_count %]</a> @@ -56,13 +48,10 @@ [% END %] </td> </tr> -[% END %] - -[% IF keywords.size > 0 %] - </table> -[% END %] + [% END %] +</table> -[% IF caneditkeywords %] +[% IF user.in_group("editkeywords") %] <p> <a href="editkeywords.cgi">Edit keywords</a>. </p> diff --git a/template/en/default/reports/menu.html.tmpl b/template/en/default/reports/menu.html.tmpl index af83ffb11..526776bbb 100644 --- a/template/en/default/reports/menu.html.tmpl +++ b/template/en/default/reports/menu.html.tmpl @@ -13,12 +13,12 @@ [% PROCESS global/header.html.tmpl title = "Reporting and Charting Kitchen" - doc_section = "reporting.html" - style_urls = ['skins/standard/reports.css'] + doc_section = "using/reports-and-charts.html" + style_urls = ['skins/standard/buglist.css'] %] <p> - [% terms.Bugzilla %] allows you to view and track the state of the [% terms.bug %] database in + Bugzilla allows you to view and track the state of the [% terms.bug %] database in all manner of exciting ways. </p> diff --git a/template/en/default/reports/old-charts.html.tmpl b/template/en/default/reports/old-charts.html.tmpl index 12a0cdd83..a958911f4 100644 --- a/template/en/default/reports/old-charts.html.tmpl +++ b/template/en/default/reports/old-charts.html.tmpl @@ -7,7 +7,6 @@ #%] [%# INTERFACE: - # products: an array of product names the user is allowed to view. # datasets: an array of hashes with available statuses and resolutions. # url_image: URL of the generated graph. #%] @@ -15,29 +14,31 @@ [% PROCESS global/header.html.tmpl title = "$terms.Bug Charts" h1 = "Welcome to the $terms.Bugzilla Charting Kitchen" - doc_section = "reporting.html#charts" + style_urls = ['skins/standard/buglist.css'] + doc_section = "using/reports-and-charts.html#charts" %] -<div align="center"> - [% IF url_image %] +[% IF url_image %] + <div class="center"> <img src="[% url_image FILTER html %]"> - <br clear="both"> - [% ELSE %] + </div> +[% ELSE %] <form id="choose_product" method="get" action="reports.cgi"> - <table border="1" cellpadding="5" cellspacing="2"> + <table id="old_charts"> <tr> <th>Product:</th> - <td align="center"> - <select id="product" name="product"> - [% FOREACH product = products %] - <option value="[% product FILTER html %]">[% product FILTER html %]</option> - [% END %] - </select> + <td> + [% INCLUDE "global/product-select.html.tmpl" + id => "product_id" + name => "product_id" + valueattribute => "id" + add => "-All-" + %] </td> </tr> <tr> <th>Chart datasets:</th> - <td align="center"> + <td> <select id="datasets" name="datasets" multiple="multiple" size="5"> [%# We cannot use translated statuses and resolutions from field-descs.none.html # because old charts do not distinguish statuses from resolutions. %] @@ -56,7 +57,6 @@ </tr> </table> </form> - [% END %] -</div> +[% END %] [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/report-bar.png.tmpl b/template/en/default/reports/report-bar.png.tmpl index 70d482ec9..d879f6dd1 100644 --- a/template/en/default/reports/report-bar.png.tmpl +++ b/template/en/default/reports/report-bar.png.tmpl @@ -6,10 +6,6 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[% y_label = "$terms.Bugs" %] - -[% col_field_disp = field_descs.$col_field || col_field %] - [% FOR i IN [ 0 .. data.0.0.max ] %] [% data.0.0.$i = display_value(col_field, data.0.0.$i) %] [% END %] @@ -21,8 +17,8 @@ [% FILTER null; USE graph = GD.Graph.bars(width, height); - graph.set(x_label => col_field_disp, - y_label => y_label, + graph.set(x_label => field_descs.$col_field || col_field, + y_label => terms.Bugs, y_tick_number => 8, y_number_format => "%d", x_label_position => 0.5, @@ -36,13 +32,17 @@ graph.set(cumulate => "true", show_values => 0) IF cumulate; - # Workaround for the fact that set_legend won't take row_names directly, - # because row_names is an array reference rather than an array. - graph.set_legend(row_names.0, row_names.1, row_names.2, row_names.3, - row_names.4, row_names.5, row_names.6, row_names.7, - row_names.8, row_names.9, row_names.10, row_names.11, - row_names.12, row_names.13, row_names.14, row_names.15); - - graph.plot(data.0).png | stdout(1); + graph.set_legend(row_names); END; -%] + +[% IF Param("font_file") %] + [% graph.set_x_axis_font(Param("font_file"), 9); + graph.set_x_label_font(Param("font_file"), 10); + graph.set_y_axis_font(Param("font_file"), 9); + graph.set_y_label_font(Param("font_file"), 10); + graph.set_legend_font(Param("font_file"), 9); + %] +[% END %] + +[% graph.plot(data.0).png | stdout(1) %] diff --git a/template/en/default/reports/report-line.png.tmpl b/template/en/default/reports/report-line.png.tmpl index 073e69bcc..585133afd 100644 --- a/template/en/default/reports/report-line.png.tmpl +++ b/template/en/default/reports/report-line.png.tmpl @@ -6,10 +6,6 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[% y_label = "$terms.Bugs" %] - -[% col_field_disp = field_descs.$col_field || col_field %] - [% FOR i IN [ 0 .. data.0.0.max ] %] [% data.0.0.$i = display_value(col_field, data.0.0.$i) %] [% END %] @@ -26,8 +22,8 @@ [% END %] [% FILTER null; - graph.set(x_label => col_field_disp, - y_label => y_label, + graph.set(x_label => field_descs.$col_field || col_field, + y_label => terms.Bugs, y_tick_number => 8, x_label_position => 0.5, x_labels_vertical => x_labels_vertical, @@ -38,13 +34,17 @@ "blue", "dpink", "lbrown", "gray", "red", "dpurple", "gold", "marine"]); - # Workaround for the fact that set_legend won't take row_names directly, - # because row_names is an array reference rather than an array. - graph.set_legend(row_names.0, row_names.1, row_names.2, row_names.3, - row_names.4, row_names.5, row_names.6, row_names.7, - row_names.8, row_names.9, row_names.10, row_names.11, - row_names.12, row_names.13, row_names.14, row_names.15); - - graph.plot(data.0).png | stdout(1); + graph.set_legend(row_names); END; -%] + +[% IF Param("font_file") %] + [% graph.set_x_axis_font(Param("font_file"), 9); + graph.set_x_label_font(Param("font_file"), 10); + graph.set_y_axis_font(Param("font_file"), 9); + graph.set_y_label_font(Param("font_file"), 10); + graph.set_legend_font(Param("font_file"), 9); + %] +[% END %] + +[% graph.plot(data.0).png | stdout(1) %] diff --git a/template/en/default/reports/report-pie.png.tmpl b/template/en/default/reports/report-pie.png.tmpl index 9d3f16fa3..cc2a1325a 100644 --- a/template/en/default/reports/report-pie.png.tmpl +++ b/template/en/default/reports/report-pie.png.tmpl @@ -6,20 +6,24 @@ # defined by the Mozilla Public License, v. 2.0. #%] -[% col_field_disp = field_descs.$col_field || col_field %] - [% FOR i IN [ 0 .. data.0.0.max ] %] [% data.0.0.$i = display_value(col_field, data.0.0.$i) %] [% END %] [% FILTER null; USE graph = GD.Graph.pie(width, height); - - graph.set(title => col_field_disp, + + graph.set(title => field_descs.$col_field || col_field, pie_height => 20, suppress_angle => 2, start_angle => 180); - - graph.plot(data.0).png | stdout(1); END; -%] + +[% IF Param("font_file") %] + [% graph.set_title_font(Param("font_file"), 10); + graph.set_value_font(Param("font_file"), 9); + %] +[% END %] + +[% graph.plot(data.0).png | stdout(1) %] diff --git a/template/en/default/reports/report-simple.html.tmpl b/template/en/default/reports/report-simple.html.tmpl index 17b87c6a6..9be2f0113 100644 --- a/template/en/default/reports/report-simple.html.tmpl +++ b/template/en/default/reports/report-simple.html.tmpl @@ -10,16 +10,13 @@ # You need to fulfill the interface to report-table.html.tmpl. #%] +<!DOCTYPE html> <html> - - [% title = "$terms.Bug List" %] - <head> - <title>[% title FILTER html %]</title> + <title>[% "$terms.Bug List" FILTER html %]</title> </head> <body> [% PROCESS "reports/report-table.html.tmpl" %] </body> - </html> diff --git a/template/en/default/reports/report-table.html.tmpl b/template/en/default/reports/report-table.html.tmpl index 2747166be..57e998b1d 100644 --- a/template/en/default/reports/report-table.html.tmpl +++ b/template/en/default/reports/report-table.html.tmpl @@ -116,7 +116,7 @@ YAHOO.util.Event.addListener(window, "load", function() { return parseFloat(res[1]); }; - this.myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("tabular_report")); + this.myDataSource = new YAHOO.util.DataSource(YAHOO.util.Dom.get("tabular_report_[% tbl FILTER html FILTER js %]")); this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE; this.myDataSource.responseSchema = { fields: [ @@ -137,17 +137,17 @@ YAHOO.util.Event.addListener(window, "load", function() { <h2>[% tbl_disp FILTER email FILTER html %]</h2> [% END %] -<table> +<table class="tabular_report_container"> <tr> <td> </td> - <td align="center"> + <td class="center"> <strong>[% col_field_disp FILTER html %]</strong> </td> </tr> <tr> - <td valign="middle"> + <td class="middle"> <strong>[% row_field_disp FILTER html %]</strong> </td> <td> @@ -156,16 +156,15 @@ YAHOO.util.Event.addListener(window, "load", function() { [% classes = [ [ "t1", "t2" ] , [ "t3", "t4" ] ] %] [% col_idx = 0 %] [% row_idx = 0 %] -[% grand_total = 0 %] +[% total_key = '-total-' %] <div id="tabular_report_container_[% tbl FILTER html %]"> -<table id="tabular_report" border="1"> +<table id="tabular_report_[% tbl FILTER html %]" class="tabular_report"> [% IF col_field %] <thead> <tr> <th class="[% classes.$row_idx.$col_idx %]"> </th> [% FOREACH col = col_names %] - [% col_totals.$col = 0 %] [% NEXT IF col == "" %] [% col_idx = 1 - col_idx %] @@ -181,20 +180,16 @@ YAHOO.util.Event.addListener(window, "load", function() { [% END %] <tbody> [% FOREACH row = row_names %] - [% row_total = 0 %] - [% row_idx = 1 - row_idx %] <tr> - <td class="[% classes.$row_idx.$col_idx %]" align="right"> + <td class="[% classes.$row_idx.$col_idx %] right"> [% PROCESS value_display value = row field = row_field %] </td> [% FOREACH col = col_names %] - [% row_total = row_total + data.$tbl.$col.$row %] [% NEXT IF col == "" %] - [% col_totals.$col = (col_totals.$col || 0) + data.$tbl.$col.$row %] [% col_idx = 1 - col_idx %] - <td class="[% classes.$row_idx.$col_idx %]" align="center"> + <td class="[% classes.$row_idx.$col_idx %]"> [% IF data.$tbl.$col.$row AND data.$tbl.$col.$row > 0 %] <a href="[% urlbase %]& [% row_field FILTER uri %]=[% row FILTER uri %]& @@ -205,12 +200,11 @@ YAHOO.util.Event.addListener(window, "load", function() { [% END %] </td> [% END %] - <td class="ttotal" align="right"> + <td class="ttotal right"> <a href="[% urlbase %]& [% row_field FILTER uri %]=[% row FILTER uri %] [% "&$col_vals" IF col_vals %]"> - [% row_total %]</a> - [% grand_total = grand_total + row_total %] + [% data.$tbl.$total_key.$row OR 0 FILTER html %]</a> </td> </tr> [% END %] @@ -221,30 +215,37 @@ YAHOO.util.Event.addListener(window, "load", function() { </td> [% FOREACH col = col_names %] [% NEXT IF col == "" %] - - <td class="ttotal" align="center"> + + <td class="ttotal"> <a href="[% urlbase %]& [% col_field FILTER uri %]=[% col FILTER uri %] [% "&$row_vals" IF row_vals %]"> - [% col_totals.$col %]</a> + [% data.$tbl.$col.$total_key OR 0 FILTER html %]</a> </td> [% END %] - <td class="ttotal" align="right"> + <td class="ttotal right"> <strong> <a href="[% urlbase %] [% "&$row_vals" IF row_vals %] - [% "&$col_vals" IF col_vals %]">[% grand_total %]</a> + [% "&$col_vals" IF col_vals %]">[% data.$tbl.$total_key.$total_key OR 0 FILTER html %]</a> </strong> </td> </tr> </tbody> </table> </div> - + </td> </tr> </table> +[% IF note_multi_select %] + <p class="extra_info"> + NOTE: Axes contain multi-value fields, so the total numbers might not add up, + as a single [% terms.bug %] can match several rows or columns. + </p> +[% END %] + [% BLOCK value_display %] [% SET disp_value = display_value(field, value) %] [% IF field == 'assigned_to' OR field == 'reporter' diff --git a/template/en/default/reports/report.html.tmpl b/template/en/default/reports/report.html.tmpl index 2ca5dd90f..a9cd96551 100644 --- a/template/en/default/reports/report.html.tmpl +++ b/template/en/default/reports/report.html.tmpl @@ -56,7 +56,7 @@ [% PROCESS global/header.html.tmpl header_addl_info = time - style_urls = ['skins/standard/reports.css'] + style_urls = ['skins/standard/buglist.css'] yui = ['datatable'] %] @@ -66,9 +66,8 @@ [% END %] [% END %] -<div align="center"> - - [% FOREACH tbl = tbl_names %] +<div class="center"> + [% FOREACH tbl = tbl_names %] [% IF tbl == "-total-" %] [% tbl_disp = "Total" %] [% ELSE %] @@ -108,45 +107,38 @@ { name => "table", description => "Table" } ] %] [% formaturl = "report.cgi?$switchbase&width=$width&height=$height&action=wrap" %] - [% FOREACH other_format = formats %] - [% NEXT IF other_format.name == "pie" AND row_field AND col_field %] - [% UNLESS other_format.name == format %] - <a href="[% formaturl %]&format=[% other_format.name %]"> + <p> + [% FOREACH other_format = formats %] + [% NEXT IF other_format.name == "pie" AND row_field AND col_field %] + [% UNLESS other_format.name == format %] + <a href="[% formaturl %]&format=[% other_format.name %]"> + [% END %] + [% other_format.description FILTER html %] + [% "</a>" UNLESS other_format.name == format %] | [% END %] - [% other_format.description FILTER html %] - [% "</a>" UNLESS other_format.name == format %] | + <a href="[% formaturl %]&ctype=csv&format=table">CSV</a> + </p> + + [% IF format == "table" %] + <a href="query.cgi?[% switchbase %]&format=report-table">Edit this report</a> + [% ELSE %] + <a href="query.cgi?[% switchbase %]&chart_format= + [%~ format FILTER uri %]&format=report-graph&cumulate=[% cumulate %]"> + Edit this report</a> + [% END %] + | + [% IF saved_report_id %] + <a href="report.cgi?action=del&saved_report_id=[% saved_report_id FILTER uri %]&token= + [%~ issue_hash_token(['delete_report', saved_report_id]) FILTER uri %]">Forget this report</a> + [% ELSE %] + <form method="get" action="report.cgi" class="inline"> + <input type="submit" id="remember" value="Remember report"> as + <input type="hidden" name="query" value="[% switchbase %]&format=[% format FILTER uri %]&action=wrap"> + <input type="hidden" name="action" value="add"> + <input type="hidden" name="token" value="[% issue_hash_token(['save_report']) FILTER html %]"> + <input type="text" id="name" name="name" size="20" value="" maxlength="64"> + </form> [% END %] - <a href="[% formaturl %]&ctype=csv&format=table">CSV</a> - - <table> - <tr> - <td> - [% IF format == "table" %] - <a href="query.cgi?[% switchbase %]&format=report-table">Edit this report</a> - [% ELSE %] - <a href="query.cgi?[% switchbase %]&chart_format= - [%~ format FILTER uri %]&format=report-graph&cumulate=[% cumulate %]"> - Edit this report</a> - [% END %] - </td> - <td>|</td> - <td> - [% IF saved_report_id %] - <a href="report.cgi?action=del&saved_report_id=[% saved_report_id FILTER uri %]&token= - [%~ issue_hash_token(['delete_report', saved_report_id]) FILTER uri %]">Forget this report</a> - [% ELSE %] - <form method="get" action="report.cgi"> - <input type="submit" id="remember" value="Remember report"> as - <input type="hidden" name="query" value="[% switchbase %]&format=[% format FILTER uri %]&action=wrap"> - <input type="hidden" name="action" value="add"> - <input type="hidden" name="token" value="[% issue_hash_token(['save_report']) FILTER html %]"> - <input type="text" id="name" name="name" size="20" value="" maxlength="64"> - </form> - [% END %] - </td> - </tr> - </table> - </div> [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/reports/series-common.html.tmpl b/template/en/default/reports/series-common.html.tmpl index 35d3c04af..07b3888f3 100644 --- a/template/en/default/reports/series-common.html.tmpl +++ b/template/en/default/reports/series-common.html.tmpl @@ -85,9 +85,9 @@ function checkNewState() { [%###########################################################################%] [% BLOCK series_select %] - <td align="left"> + <td> <select name="[% sel.name %]" id="[% sel.name %]" - size="[% sel.size %]" style="width: 15em" + size="[% sel.size %]" [%+ 'multiple="multiple"' IF sel.multiple %] [%+ "disabled=\"disabled\"" UNLESS ${sel.name}.keys.size || newtext %] [%+ "onchange=\"$sel.onchange\"" IF sel.onchange %]> diff --git a/template/en/default/reports/series.html.tmpl b/template/en/default/reports/series.html.tmpl index a6bf0d97d..daf522348 100644 --- a/template/en/default/reports/series.html.tmpl +++ b/template/en/default/reports/series.html.tmpl @@ -17,16 +17,14 @@ [% PROCESS "reports/series-common.html.tmpl" newtext = "New (name below)" %] - -<table cellpadding="2" cellspacing="2" border="0" - style="text-align: left; margin-left: 20px"> - <tbody> + +<table id="edit_series"> <tr> - <th>Category:</th> + <th>Category</th> + <th></th> + <th>Sub-category</th> + <th>Name</th> <th></th> - <th>Sub-category:</th> - <th>Name:</th> - <td></td> </tr> <tr> [% PROCESS series_select sel = { name => 'category', @@ -38,41 +36,40 @@ id="action-edit"> </noscript> </td> - + [% PROCESS series_select sel = { name => 'subcategory', size => 5, onchange => "checkNewState()" } %] - - <td valign="top" name="name"> + + <td> <input type="text" name="name" maxlength="64" value="[% default.name.0 FILTER html %]" size="25"> </td> - <td valign="top"> - <span style="font-weight: bold;">Run every</span> - <input type="text" size="2" name="frequency" + <td> + Run every + <input type="text" size="2" id="frequency" name="frequency" value="[% (default.frequency.0 OR 7) FILTER html %]"> - <span style="font-weight: bold;"> day(s)</span><br> + day(s)<br> [%# Change 'admin' here and in Series.pm, or remove the check completely, if you want to change who can make series public. %] - [% IF user.in_group('admin') %] + [% IF user.in_group('admin') %] <input type="checkbox" name="public" [%+ "checked='checked'" IF default.public.0 %]> - <span style="font-weight: bold;">Visible to all<br> - (within group restrictions)</span> + Visible to all<br> + (within group restrictions) [% END %] </td> </tr> <tr> <td> - <input type="text" style="width: 100%" name="newcategory" - maxlength="64" value="[% default.newcategory.0 FILTER html %]"> + <input type="text" name="newcategory" maxlength="64" + value="[% default.newcategory.0 FILTER html %]"> </td> - <td></td> + <td></td> <td> - <input type="text" style="width: 100%" name="newsubcategory" - maxlength="64" + <input type="text" name="newsubcategory" maxlength="64" value="[% default.newsubcategory.0 FILTER html %]"> </td> <td></td> @@ -81,5 +78,4 @@ value="[% button_name FILTER html %]"> </td> </tr> - </tbody> </table> diff --git a/template/en/default/request/queue.csv.tmpl b/template/en/default/request/queue.csv.tmpl new file mode 100644 index 000000000..c6d962b4f --- /dev/null +++ b/template/en/default/request/queue.csv.tmpl @@ -0,0 +1,46 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. #%] + +[% PROCESS "global/field-descs.none.tmpl" %] + +[% column_headers = { + "type" => "Flag", + "status" => field_descs.bug_status, + "bug_summary" => field_descs.short_desc, + "bug_id" => field_descs.bug_id, + "attach_summary" => "Attachment Description", + "attach_id" => "Attachment ID", + "requester" => "Requester", + "requestee" => "Requestee", + "created" => "Created", + "category" => field_descs.product _ ": " _ field_descs.component, +} %] + +[% display_columns = ["requester", "requestee", "type", "status", + "bug_id", "bug_summary", "attach_id", + "attach_summary", "created", "category"] %] + +[% IF requests.size == 0 %] +No requests. +[% ELSE %] + [% FOREACH column = display_columns %] + [% column_headers.$column FILTER csv %][% ',' IF NOT loop.last() %] + [% END %] + + [% FOREACH request = requests %] + [% FOREACH column = display_columns %] + [% IF column == 'created' %] + [% request.$column FILTER time FILTER csv %] + [% ELSIF column.match('^requeste') %] + [% request.$column FILTER email FILTER csv %] + [% ELSE %] + [% request.$column FILTER csv %] + [% END %][% ',' IF NOT loop.last() %] + [% END %] + + [% END %] +[% END %] diff --git a/template/en/default/request/queue.html.tmpl b/template/en/default/request/queue.html.tmpl index bac0b8428..7e8c44c8b 100644 --- a/template/en/default/request/queue.html.tmpl +++ b/template/en/default/request/queue.html.tmpl @@ -11,6 +11,7 @@ [% PROCESS global/header.html.tmpl title="Request Queue" + generate_api_token = 1 onload="var f = document.request_form; selectProduct(f.product, f.component, null, null, 'Any');" javascript_urls=["js/productform.js", "js/field.js"] style_urls = ['skins/standard/buglist.css'] @@ -67,28 +68,12 @@ to some group are shown by default. </td> <th>Product:</th> <td> - <select name="product" onchange="selectProduct(this, this.form.component, null, null, 'Any');"> - <option value="">Any</option> - [% IF Param('useclassification') %] - [% FOREACH c = user.get_selectable_classifications %] - <optgroup label="[% c.name FILTER html %]"> - [% FOREACH p = user.get_selectable_products(c.id) %] - <option value="[% p.name FILTER html %]" - [% " selected" IF cgi.param('product') == p.name %]> - [% p.name FILTER html %] - </option> - [% END %] - </optgroup> - [% END %] - [% ELSE %] - [% FOREACH p = user.get_selectable_products %] - <option value="[% p.name FILTER html %]" - [% " selected" IF cgi.param('product') == p.name %]> - [% p.name FILTER html %] - </option> - [% END %] - [% END %] - </select> + [% INCLUDE "global/product-select.html.tmpl" + id => "product" + name => "product" + add => "Any" + onchange => "selectProduct(this, this.form.component, null, null, 'Any');" + %] </td> <th>Flag:</th> <td> @@ -201,6 +186,8 @@ to some group are shown by default. </tr> [% END %] [% PROCESS display_buglist %] + <br><br> + <a href="request.cgi?[% urlquerypart FILTER html %]&ctype=csv">View entire list as CSV</a> [% END %] [% PROCESS global/footer.html.tmpl %] @@ -210,7 +197,7 @@ to some group are shown by default. <h3>[% column_headers.$group_field %]: [%+ (request.$group_field || "None") FILTER email FILTER html %]</h3> - <table class="requests" cellspacing="0" cellpadding="4" border="1"> + <table class="requests"> <tr> [% FOREACH column = display_columns %] [% NEXT IF column == group_field || excluded_columns.contains(column) %] @@ -258,6 +245,6 @@ to some group are shown by default. </table> [% NEXT UNLESS buglist.keys.size %] <a href="buglist.cgi?bug_id= - [%- buglist.keys.nsort.join(",") FILTER html %]">(view as - [%+ terms.bug %] list)</a> + [%- buglist.keys.nsort.join(",") FILTER html %]">View as + [%+ terms.bug %] list</a> [% END %] diff --git a/template/en/default/rest.html.tmpl b/template/en/default/rest.html.tmpl new file mode 100644 index 000000000..f118e5da0 --- /dev/null +++ b/template/en/default/rest.html.tmpl @@ -0,0 +1,19 @@ +[%# This Source Code Form is subject to the terms of the Mozilla Public + # License, v. 2.0. If a copy of the MPL was not distributed with this + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + # + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. + #%] + +<!DOCTYPE html> +<html> + <head> + <title>Bugzilla::REST::API</title> + <link href="[% urlbase FILTER html %][% 'skins/standard/global.css' FILTER mtime %]" + rel="stylesheet" type="text/css"> + </head> + <body> + <pre>[% result FILTER html %]</pre> + </body> +</html> diff --git a/template/en/default/search/boolean-charts.html.tmpl b/template/en/default/search/boolean-charts.html.tmpl index 508e11c65..bfb4e7bf1 100644 --- a/template/en/default/search/boolean-charts.html.tmpl +++ b/template/en/default/search/boolean-charts.html.tmpl @@ -33,6 +33,8 @@ "changedby", "matches", "notmatches", + "isempty", + "isnotempty", ] %] <div class="bz_section_title" id="custom_search_filter"> @@ -132,7 +134,15 @@ id="f[% cond_num FILTER html %]" onchange="fix_query_string(this)" class="custom_search_form_field"> - [% FOREACH field = fields %] + [%# Turn the array in to a hash with the name as the key %] + [% + field_hash = {}; + FOREACH field IN fields; + field_hash.${field.name} = field; + END; + %] + [% FOREACH field_name = field_hash.keys.sort_by_field_name(field_descs) %] + [% field = field_hash.$field_name %] <option value="[% field.name FILTER html %]" [%~ ' selected="selected"' IF field.name == condition.f %]> [% field_descs.${field.name} || field.description FILTER html %] diff --git a/template/en/default/search/field.html.tmpl b/template/en/default/search/field.html.tmpl index 45c3650f8..5a95d67c1 100644 --- a/template/en/default/search/field.html.tmpl +++ b/template/en/default/search/field.html.tmpl @@ -23,7 +23,7 @@ <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]" size="40" [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %] - value="[% value FILTER html %]"> + value="[% value FILTER html %]" [% 'autofocus' IF focus %]> [% CASE constants.FIELD_TYPE_KEYWORDS %] [% INCLUDE "bug/field-label.html.tmpl" field = field @@ -39,10 +39,10 @@ <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]" size="40" [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %] - value="[% value FILTER html %]"> + value="[% value FILTER html %]" [% 'autofocus' IF focus %]> <div id="[% field.name FILTER html %]_autocomplete"></div> </div> - <script type="text/javascript" defer="defer"> + <script type="text/javascript"> if (typeof YAHOO.bugzilla.field_array === "undefined") YAHOO.bugzilla.field_array = []; YAHOO.bugzilla.field_array["[% field.name FILTER js %]"] = [ @@ -52,7 +52,7 @@ YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]', '[% field.name FILTER js %]_autocomplete'); </script> - [% CASE constants.FIELD_TYPE_DATETIME %] + [% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %] [% INCLUDE "bug/field-label.html.tmpl" field = field tag_name = "span" diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl index 8cfb12aac..0420811ee 100644 --- a/template/en/default/search/form.html.tmpl +++ b/template/en/default/search/form.html.tmpl @@ -52,11 +52,8 @@ TUI_hide_default('information_query'); value = default.short_desc.0 type_selected = default.short_desc_type.0 accesskey = "s" - %] - <script type="text/javascript"> <!-- - document.getElementById('short_desc').focus(); - // --> - </script> + focus = 1 + %] [% IF button_name %] <input type="submit" id="[% button_name FILTER css_class_quote %]_top" @@ -114,7 +111,7 @@ TUI_hide_default('information_query'); [%+ 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 %] + [% IF Param('timetrackinggroup') %] [%+ 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 %], @@ -153,8 +150,7 @@ TUI_hide_default('information_query'); </div> [% END %] - [%# Deadline %] - [% IF user.is_timetracker %] + [% IF Param('timetrackinggroup') %] <div class="search_field_row"> [% INCLUDE "search/field.html.tmpl" field = bug_fields.deadline @@ -166,16 +162,18 @@ TUI_hide_default('information_query'); <div class="search_field_row"> <span class="field_label"><label for="bug_id">[% terms.Bugs %] numbered</label></span> - <div id="bug_id_container" > + <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 + <span class="field_label field_label_sup"> + 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 + </span> </div> [% Hook.process('after_freetext_fields') %] diff --git a/template/en/default/search/search-advanced.html.tmpl b/template/en/default/search/search-advanced.html.tmpl index 2bff834bc..07c5fc528 100644 --- a/template/en/default/search/search-advanced.html.tmpl +++ b/template/en/default/search/search-advanced.html.tmpl @@ -29,8 +29,8 @@ function remove_token() { yui = [ 'autocomplete', 'calendar' ] javascript = javascript javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js"] - style_urls = [ "skins/standard/search_form.css" ] - doc_section = "query.html" + style_urls = ['skins/standard/buglist.css'] + doc_section = "using/finding.html" %] [% WRAPPER search/tabs.html.tmpl %] diff --git a/template/en/default/search/search-create-series.html.tmpl b/template/en/default/search/search-create-series.html.tmpl index d2f8f7d0b..95750ebc0 100644 --- a/template/en/default/search/search-create-series.html.tmpl +++ b/template/en/default/search/search-create-series.html.tmpl @@ -22,8 +22,8 @@ yui = [ 'autocomplete', 'calendar' ] javascript = js_data javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ] - style_urls = [ "skins/standard/search_form.css" ] - doc_section = "reporting.html#charts-new-series" + style_urls = ['skins/standard/buglist.css'] + doc_section = "using/reports-and-charts.html#creating-charts" %] <form method="get" action="chart.cgi" name="chartform"> diff --git a/template/en/default/search/search-report-graph.html.tmpl b/template/en/default/search/search-report-graph.html.tmpl index 698132ee6..b382edf95 100644 --- a/template/en/default/search/search-report-graph.html.tmpl +++ b/template/en/default/search/search-report-graph.html.tmpl @@ -21,8 +21,8 @@ var queryform = "reportform" yui = [ 'autocomplete', 'calendar' ] javascript = js_data javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ] - style_urls = [ "skins/standard/search_form.css" ] - doc_section = "reporting.html#reports" + style_urls = ['skins/standard/buglist.css'] + doc_section = "using/reports-and-charts.html#reports" %] [% PROCESS "search/search-report-select.html.tmpl" %] @@ -52,71 +52,63 @@ var queryform = "reportform" [% button_name = "Generate Report" %] <form method="get" action="report.cgi" name="reportform" id="reportform"> - -<table align="center"> - <tr> - <td valign="middle"> - <b>Vertical Axis:</b><br> - <noscript><small>(not for pie charts)</small><br></noscript> - [% PROCESS select name = 'y_axis_field' %]<br> - <br> - <b>Plot Data Sets:</b><br> - <input type="radio" name="cumulate" value="0" - [% " checked" IF default.cumulate.0 != "1" %]> - Individually<br> - <input type="radio" name="cumulate" value="1" - [% " checked" IF default.cumulate.0 == "1" %]> - Stacked - </td> - <td width="150" height="150"> - <table border="1" width="100%" height="100%"> - <tr> - <td align="center" valign="middle"> - <b>Multiple Images:</b><br> - [% PROCESS select name = 'z_axis_field' %] - </td> - </tr> - </table> - </td> - <td rowspan="2"> - <b>Format:</b><br> - [% chart_formats = [ - { name => "line", description => "Line Graph" }, - { name => "bar", description => "Bar Chart" }, - { name => "pie", description => "Pie Chart" } ] %] - [% default.chart_format.0 = default.chart_format.0 || "bar" %] - - [% FOREACH chart_format = chart_formats %] - <input type="radio" name="format" - value="[% chart_format.name FILTER html %]" - onchange="chartTypeChanged()" - [% " checked" IF default.chart_format.0 == chart_format.name %]> - [% chart_format.description FILTER html %]<br> - [% END %] - </td> - </tr> - - <tr> - <td> - </td> - <td align="left"> - <b>Horizontal Axis:</b> - [% PROCESS select name = 'x_axis_field' %]<br> - <label for="x_labels_vertical"><b>Vertical labels:</b></label> - <input type="checkbox" name="x_labels_vertical" id="x_labels_vertical" - value="1" - [% " checked" IF default.x_labels_vertical.0 == "1" %]> - </td> - <td> - </td> - </tr> -</table> - -<hr> - -[% PROCESS search/form.html.tmpl %] - -[% PROCESS "search/boolean-charts.html.tmpl" %] + <table id="graphical_reports_menu"> + <tr> + <th id="reports_menu_vertical_axis"> + Vertical Axis:<br> + [% PROCESS select name = 'y_axis_field' %]<br> + <br> + Plot Data Sets:<br> + <input type="radio" id="cumulate_indiv" name="cumulate" value="0" + [%+ 'checked="checked"' IF default.cumulate.0 != "1" %]> + <label for="cumulate_indiv">Individually</label><br> + <input type="radio" id="cumulate_stacked" name="cumulate" value="1" + [%+ 'checked="checked"' IF default.cumulate.0 == "1" %]> + <label for="cumulate_stacked">Stacked</label> + </th> + <th id="reports_menu_multiple_tables"> + Multiple Images:<br> + [% PROCESS select name = 'z_axis_field' %] + </th> + <th id="reports_menu_format"> + Format:<br> + [% chart_formats = [ + { name => "line", description => "Line Graph" }, + { name => "bar", description => "Bar Chart" }, + { name => "pie", description => "Pie Chart" } ] %] + [% default.chart_format.0 = default.chart_format.0 || "bar" %] + + [% FOREACH chart_format = chart_formats %] + <input type="radio" id="format_[% chart_format.name FILTER html %]" + name="format" value="[% chart_format.name FILTER html %]" + onchange="chartTypeChanged()" + [%+ 'checked="checked"' IF default.chart_format.0 == chart_format.name %]> + <label for="format_[% chart_format.name FILTER html %]"> + [% chart_format.description FILTER html %] + </label><br> + [% END %] + </th> + </tr> + + <tr> + <th></th> + <th id="reports_menu_horizontal_axis"> + Horizontal Axis:<br> + [% PROCESS select name = 'x_axis_field' %]<br> + <input type="checkbox" name="x_labels_vertical" id="x_labels_vertical" + value="1" + [%+ 'checked="checked"' IF default.x_labels_vertical.0 == "1" %]> + <label for="x_labels_vertical">Vertical labels</label> + </th> + <th></th> + </tr> + </table> + + <hr> + + [% PROCESS search/form.html.tmpl %] + + [% PROCESS "search/boolean-charts.html.tmpl" %] <div id="knob"> <input type="submit" id="[% button_name FILTER css_class_quote %]" diff --git a/template/en/default/search/search-report-select.html.tmpl b/template/en/default/search/search-report-select.html.tmpl index 93b4c44f8..40eeda1c1 100644 --- a/template/en/default/search/search-report-select.html.tmpl +++ b/template/en/default/search/search-report-select.html.tmpl @@ -17,7 +17,7 @@ <select name="[% name FILTER html %]"> <option value=""><none></option> - [% FOREACH field = report_columns.keys.sort %] + [% FOREACH field = report_columns.keys.sort_by_field_name(field_descs) %] [% NEXT IF field == "classification" AND !Param('useclassification') %] [% NEXT IF field == "target_milestone" AND !Param('usetargetmilestone') %] [% NEXT IF field == "qa_contact" AND !Param('useqacontact') %] diff --git a/template/en/default/search/search-report-table.html.tmpl b/template/en/default/search/search-report-table.html.tmpl index 7e0a0022d..483fd5b07 100644 --- a/template/en/default/search/search-report-table.html.tmpl +++ b/template/en/default/search/search-report-table.html.tmpl @@ -21,8 +21,8 @@ var queryform = "reportform" yui = [ 'autocomplete', 'calendar' ] javascript = js_data javascript_urls = [ "js/util.js", "js/TUI.js", "js/field.js" ] - style_urls = [ "skins/standard/search_form.css" ] - doc_section = "reporting.html#reports" + style_urls = ['skins/standard/buglist.css'] + doc_section = "using/reports-and-charts.html#reports" %] [% PROCESS "search/search-report-select.html.tmpl" %] @@ -35,36 +35,28 @@ var queryform = "reportform" [% button_name = "Generate Report" %] <form method="get" action="report.cgi" name="reportform" id="reportform"> + <table id="tabular_reports_menu"> + <tr> + <th></th> + <th id="reports_menu_horizontal_axis"> + Horizontal Axis:<br> + [% PROCESS select name = 'x_axis_field' %] + </th> + </tr> -<table align="center"> - <tr> - <td> - </td> - <td align="center"> - <b>Horizontal Axis:</b> - [% PROCESS select name = 'x_axis_field' %] - </td> - </tr> + <tr> + <th id="reports_menu_vertical_axis"> + Vertical Axis:<br> + [% PROCESS select name = 'y_axis_field' %] + </th> + <th id="reports_menu_multiple_tables"> + Multiple Tables:<br> + [% PROCESS select name = 'z_axis_field' %] + </th> + </tr> + </table> - <tr> - <td valign="middle" align="center"> - <b>Vertical Axis:</b><br> - [% PROCESS select name = 'y_axis_field' %] - </td> - <td width="150" height="150"> - <table border="1" width="100%"> - <tr> - <td align="center" valign="middle" height="150"> - <b>Multiple Tables:</b><br> - [% PROCESS select name = 'z_axis_field' %] - </td> - </tr> - </table> - </td> - </tr> -</table> - -<hr> + <hr> [% PROCESS search/form.html.tmpl %] diff --git a/template/en/default/search/search-specific.html.tmpl b/template/en/default/search/search-specific.html.tmpl index f09d4bdc0..af61ce52f 100644 --- a/template/en/default/search/search-specific.html.tmpl +++ b/template/en/default/search/search-specific.html.tmpl @@ -8,14 +8,15 @@ [% PROCESS global/header.html.tmpl title = "Simple Search" - style_urls = [ "skins/standard/search_form.css" ] + style_urls = ['skins/standard/buglist.css'] + doc_section = "using/finding.html" %] [% WRAPPER search/tabs.html.tmpl %] <p> Find a specific [% terms.bug %] by entering words that describe it. -[% terms.Bugzilla %] will search [% terms.bug %] descriptions and comments +Bugzilla will search [% terms.bug %] descriptions and comments for those words and return a list of matching [% terms.bugs %] sorted by relevance. </p> @@ -36,7 +37,7 @@ for "crash secure SSL flash". } </script> -<table summary="Search fields" class="bz_simple_search_form"> +<table class="bz_simple_search_form"> <tr> <th> <label for="bug_status">[% field_descs.bug_status FILTER html %]:</label> @@ -60,30 +61,11 @@ for "crash secure SSL flash". <label for="product">[% field_descs.product FILTER html %]:</label> </th> <td> - <select name="product" id="product"> - <option value="">All</option> - [% IF Param('useclassification') %] - [% FOREACH c = classification %] - <optgroup label="[% c.name FILTER html %]"> - [% FOREACH p = user.get_selectable_products(c.id) %] - [% IF p.components.size %] - <option value="[% p.name FILTER html %]" - [% " selected" IF default.product.contains(p.name) %]> - [% p.name FILTER html %] - </option> - [% END %] - [% END %] - </optgroup> - [% END %] - [% ELSE %] - [% FOREACH p = product %] - <option value="[% p.name FILTER html %]" - [% " selected" IF default.product.contains(p.name) %]> - [% p.name FILTER html %] - </option> - [% END %] - [% END %] - </select> + [% INCLUDE "global/product-select.html.tmpl" + id => "product" + name => "product" + add => "All" + %] </td> </tr> <tr> @@ -91,28 +73,14 @@ for "crash secure SSL flash". <label for="content">Words:</label> </th> <td> - <input name="content" size="40" id="content" - value="[% default.content.0 FILTER html %]"> - <script type="text/javascript"> <!-- - document.forms['queryform'].content.focus(); - // --> - </script> + <input name="content" size="40" id="content" autofocus + value="[% default.content.0 FILTER html %]" + [%- " required" UNLESS Param('search_allow_no_criteria') %]> </td> </tr> <tr> <td></td> - <td> - - [% IF Param('search_allow_no_criteria') %] - <input type="submit" id="search" value="Search"> - [% ELSE %] - <input type="submit" id="search" value="Search" - onclick="if (this.form.content.value == '') - {alert('The Words field cannot be empty. You have to ' + - 'enter at least one word in your search criteria.'); - return false;} return true;"> - [% END %] - </td> + <td><input type="submit" id="search" value="Search"></td> </tr> </table> </form> diff --git a/template/en/default/search/tabs.html.tmpl b/template/en/default/search/tabs.html.tmpl index f7703fd92..74569dceb 100644 --- a/template/en/default/search/tabs.html.tmpl +++ b/template/en/default/search/tabs.html.tmpl @@ -10,11 +10,15 @@ # This template has no interface. #%] +[% tabs = [ { name => 'specific', label => "Simple Search", + link => "query.cgi?format=specific" }, + { name => 'advanced', label => "Advanced Search", + link => "query.cgi?format=advanced" } ] %] + +[% Hook.process('search_tabs') %] + [% WRAPPER global/tabs.html.tmpl - tabs = [ { name => 'specific', label => "Simple Search", - link => "query.cgi?format=specific" }, - { name => 'advanced', label => "Advanced Search", - link => "query.cgi?format=advanced" } ] + tabs = tabs current_tab_name = query_format || format || "advanced" %] diff --git a/template/en/default/setup/strings.txt.pl b/template/en/default/setup/strings.txt.pl index d134ef429..78c4d861b 100644 --- a/template/en/default/setup/strings.txt.pl +++ b/template/en/default/setup/strings.txt.pl @@ -83,17 +83,19 @@ the documentation of Bugzilla::Extension for details. END feature_auth_ldap => 'LDAP Authentication', feature_auth_radius => 'RADIUS Authentication', + feature_documentation => 'Documentation', feature_graphical_reports => 'Graphical Reports', feature_html_desc => 'More HTML in Product/Group Descriptions', 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_memcached => 'Memcached Support', feature_mod_perl => 'mod_perl', feature_moving => 'Move Bugs Between Installations', feature_patch_viewer => 'Patch Viewer', + feature_rest => 'REST Interface', feature_smtp_auth => 'SMTP Authentication', feature_smtp_ssl => 'SSL Support for SMTP', feature_updates => 'Automatic Update Notifications', @@ -153,10 +155,6 @@ they don't exist. If this is set to 0, checksetup.pl will not create .htaccess files. END - localconfig_cvsbin => <<'END', -If you want to use the CVS integration of the Patch Viewer, please specify -the full path to the "cvs" executable here. -END localconfig_db_check => <<'END', Should checksetup.pl try to verify that your database setup is correct? With some combinations of database servers/Perl modules/moonphase this @@ -195,6 +193,22 @@ blank, then MySQL's compiled-in default will be used. You probably want that. END localconfig_db_user => "Who we connect to the database as.", + localconfig_db_mysql_ssl_ca_file => <<'END', +Path to a PEM file with a list of trusted SSL CA certificates. +The file must be readable by web server user. +END + localconfig_db_mysql_ssl_ca_path => <<'END', +Path to a directory containing trusted SSL CA certificates in PEM format. +Directory and files inside must be readable by the web server user. +END + localconfig_db_mysql_ssl_client_cert => <<'END', +Full path to the client SSL certificate in PEM format we will present to the DB server. +The file must be readable by web server user. +END + localconfig_db_mysql_ssl_client_key => <<'END', +Full path to the private key corresponding to the client SSL certificate. +The file must not be password-protected and must be readable by web server user. +END localconfig_diffpath => <<'END', For the "Difference Between Two Patches" feature to work, we need to know what directory the "diff" bin is in. (You only need to set this if you @@ -272,12 +286,15 @@ EOT *********************************************************************** * 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: * +* Some Apache modules allow to extend Bugzilla functionalities. * +* These modules can be enabled in the Apache configuration file * +* (usually called httpd.conf or apache2.conf). * +* - mod_headers, mod_env and mod_expires permit to automatically * +* refresh the browser cache of your users when upgrading Bugzilla. * +* - mod_rewrite permits to write shorter URLs used by the REST API. * +* - mod_version permits to write rules in .htaccess specific to * +* Apache 2.2 or 2.4. * +* The modules you need to enable are: * * * END modules_message_db => <<EOT, @@ -342,8 +359,7 @@ WARNING: We are about to convert your table storage format to UTF-8. This recommend that you stop checksetup.pl NOW and run contrib/recode.pl. END no_checksetup_from_cgi => <<END, -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd"> +<!DOCTYPE html> <html> <head> <title>checksetup.pl cannot run from a web browser</title> @@ -354,8 +370,8 @@ END <p> You <b>must not</b> execute this script from your web browser. To install or upgrade Bugzilla, run this script from - the command-line (e.g. <tt>bash</tt> or <tt>ssh</tt> on Linux - or <tt>cmd.exe</tt> on Windows), and follow instructions given there. + the command-line (e.g. <kbd>bash</kbd> or <kbd>ssh</kbd> on Linux + or <kbd>cmd.exe</kbd> on Windows), and follow instructions given there. </p> <p> @@ -371,7 +387,7 @@ OPTIONAL NOTE: If you want to be able to use the 'difference between two patches' feature of Bugzilla (which requires the PatchReader Perl module as well), you should install patchutils from: - http://cyberelk.net/tim/patchutils/ + http://cyberelk.net/tim/software/patchutils/ END template_precompile => "Precompiling templates...", template_removal_failed => <<END, diff --git a/template/en/default/welcome-admin.html.tmpl b/template/en/default/welcome-admin.html.tmpl index 0f7626c92..a9b30f68a 100644 --- a/template/en/default/welcome-admin.html.tmpl +++ b/template/en/default/welcome-admin.html.tmpl @@ -10,12 +10,11 @@ # none #%] -[% title = BLOCK %]Welcome to [% terms.Bugzilla %][% END %] +[% title = BLOCK %]Welcome to Bugzilla[% END %] [% PROCESS global/header.html.tmpl title = title header_addl_info = "version $constants.BUGZILLA_VERSION" - style_urls = [ 'skins/standard/index.css' ] %] <div id="welcome-admin"> @@ -55,7 +54,7 @@ <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 + to ".*" (the default), everybody is free to create their own account. If set to "@mycompany.com$", only users having an account @mycompany.com will be allowed to create an account. If left blank, users will not be able to create accounts themselves; only an administrator will be able to create one for them. If you want a private @@ -68,7 +67,7 @@ </ul> <p> - After having set up all this, we recommend looking at [% terms.Bugzilla %]'s other + After having set up all this, we recommend looking at Bugzilla's other parameters as well at some time so that you understand what they do and whether you want to modify their settings for your installation. </p> diff --git a/template/en/default/whine/mail.html.tmpl b/template/en/default/whine/mail.html.tmpl index b581d68fd..ed030237d 100644 --- a/template/en/default/whine/mail.html.tmpl +++ b/template/en/default/whine/mail.html.tmpl @@ -18,20 +18,20 @@ # recipient: user object for the intended recipient of the message #%] -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<!DOCTYPE html> <html> <head> <title> [[% terms.Bugzilla %]] [% subject FILTER html %] </title> </head> - <body bgcolor="#FFFFFF"> + <body> <pre> [% body FILTER html %] </pre> - <p align="left"> + <p> [% IF author.login == recipient.login %] <a href="[%+ urlbase FILTER html %]editwhines.cgi">Click here to edit your whine schedule</a> @@ -45,29 +45,29 @@ <h2>[%+ query.title FILTER html %] ([% query.bugs.size %] [%+ terms.bugs %])</h2> - <table width="100%"> + <table> <tr> - <th align="left">ID</th> + <th>ID</th> [% FOREACH col = query.columnlist %] [% NEXT IF col == 'bug_id' %] - <th align="left">[% field_descs.$col FILTER html %]</th> + <th>[% field_descs.$col FILTER html %]</th> [% END %] </tr> [% FOREACH bug=query.bugs %] <tr> - <td align="left"><a href="[%+ urlbase FILTER html %]show_bug.cgi?id= + <td><a href="[%+ urlbase FILTER html %]show_bug.cgi?id= [%- bug.bug_id %]">[% bug.bug_id %]</a></td> [% FOREACH col = query.columnlist %] [% NEXT IF col == 'bug_id' %] - <td align="left">[% display_value(col, bug.$col) FILTER html %]</td> + <td>[% display_value(col, bug.$col) FILTER html %]</td> [% END %] </tr> [% END %] </table> [% IF author.login == recipient.login %] - <p align="left"> + <p> <a href="[% urlbase FILTER html %]buglist.cgi?cmdtype=runnamed&namedcmd=[% query.name FILTER uri %]">View as [% terms.bug %] list</a> </p> [% END %] diff --git a/template/en/default/whine/schedule.html.tmpl b/template/en/default/whine/schedule.html.tmpl index dd58fc53b..a513d9a33 100644 --- a/template/en/default/whine/schedule.html.tmpl +++ b/template/en/default/whine/schedule.html.tmpl @@ -23,11 +23,11 @@ [% PROCESS global/header.html.tmpl title = title style_urls = ['skins/standard/admin.css'] - doc_section = "whining.html" + doc_section = "using/index.html" %] <p> - "Whining" is when [% terms.Bugzilla %] executes a saved query at a regular interval + "Whining" is when Bugzilla executes a saved search at a regular interval and sends the resulting list of [% terms.bugs %] via email. </p> @@ -47,9 +47,9 @@ <p> Searches come from saved searches, which are created by executing a <a - href="query.cgi">search</a>, then telling [% terms.Bugzilla %] to remember - the search under a particular name. Add a query by clicking "Add a new - query", and select the desired saved search name under "Search" and add a + href="query.cgi">search</a>, then telling Bugzilla to remember + the search under a particular name. Add a search by clicking "Add a + search", and select the desired saved search name under "Search" and add a title for the [% terms.bug %] table. The optional number entered under "Sort" will determine the execution order (lowest to highest) if multiple queries are listed. If you check "One message per [% terms.bug %]," each [% @@ -63,29 +63,25 @@ <form method="post" action="editwhines.cgi"> [%# This hidden submit button must be here to set default behavior when the user presses return on a form input field #%] -<input type="submit" value="Update / Commit" name="commit" - style="display: none;" id="commit"> +<input type="submit" value="Update / Commit" id="commit" name="commit" + class="bz_default_hidden"> <input type="hidden" name="update" value="1"> <input type="hidden" name="token" value="[% token FILTER html %]"> [% FOREACH event = events %] -<table cellspacing="2" cellpadding="2" style="border: 1px solid;"> +<table class="whining_list"> <tr> - <th align="left"> - Event: - </th> - <td align="right" colspan="2"> + <th class="subtitle">Event:</th> + <th colspan="2"> <input type="submit" value="Remove Event" name="remove_event_[% event.key %]" id="remove_event_[% event.key %]"> - </td> + </th> </tr> <tr> - <td valign="top" align="right"> - Email subject line: - </td> + <th>Email subject line:</th> <td colspan="2"> <input type="text" name="event_[% event.key %]_subject" size="60" maxlength="128" value=" @@ -94,9 +90,7 @@ </tr> <tr> - <td valign="top" align="right"> - Descriptive text sent within whine message: - </td> + <th>Descriptive text sent within whine message:</th> <td colspan="2"> [% INCLUDE global/textarea.html.tmpl name = "event_${event.key}_body" @@ -110,9 +104,7 @@ </tr> <tr> - <td valign="top" align="right"> - Send a message even if there are no [% terms.bugs %] in the search result: - </td> + <th>Send a message even if there are no [% terms.bugs %] in the search result:</th> <td colspan="2"> <input type="checkbox" name="event_[% event.key %]_mailifnobugs" [%- IF event.value.mailifnobugs == 1 %] checked [% END %]> @@ -122,9 +114,7 @@ [% IF event.value.schedule.size == 0 %] <tr> - <td valign="top" align="right"> - Schedule: - </td> + <th>Schedule:</th> <td class="unset" colspan="2"> Not scheduled to run<br> <input type="submit" value="Add a new schedule" @@ -136,28 +126,23 @@ [% ELSE %] <tr> - <td valign="top" align="right"> - Schedule: - </td> + <th>Schedule:</th> <td class="set" colspan="2"> - <table> + <table class="schedule_list"> <tr> - <th> - Interval - </th> + <th>Interval</th> <th> [% IF mail_others %] Mail to [% END %] </th> - <th> - </th> + <th></th> </tr> + [% FOREACH schedule = event.value.schedule %] <tr> - <td align="left"> - + <td> [%# these hidden fields allow us to compare old values instead of reading the database to tell if a field has changed %] @@ -168,7 +153,7 @@ [% PROCESS day_field val=schedule.day %] [% PROCESS time_field val=schedule.time %] </td> - <td align="left"> + <td> [% IF mail_others %] <input type="hidden" name="orig_mailto_type_[% schedule.id %]" value="[% schedule.mailto_type FILTER html %]"> @@ -186,7 +171,7 @@ value="[% schedule.mailto FILTER html %]" size="30"> [% END %] </td> - <td align="left"> + <td> <input type="submit" value="Remove" name="remove_schedule_[% schedule.id %]" id="remove_schedule_[% schedule.id %]"> @@ -211,16 +196,14 @@ [% IF event.value.queries.size == 0 %] <tr> - <td valign="top" align="right"> - Searches: - </td> - <td align="left"> + <th>Searches:</th> + <td> No searches <br> - <input type="submit" value="Add a new query" + <input type="submit" value="Add a search" name="add_query_[% event.key %]" id="add_query_[% event.key %]"> </td> - <td align="right" valign="bottom"> + <td class="right"> <input type="submit" value="Update / Commit" name="commit" id="update"> </td> </tr> @@ -228,42 +211,39 @@ [% ELSE %] <tr> - <td valign="top" align="right"> - Searches: - </td> - <td align="left" colspan="2"> + <th>Searches:</th> + <td colspan="2"> - <table> + <table class="search_list"> <tr> <th>Sort</th> <th>Search</th> <th>Title</th> - <th></th> - <th></th> + <th colspan="2"></th> </tr> [% FOREACH query = event.value.queries %] <tr> - <td align="left"> + <td> <input type="text" name="query_sort_[% query.id %]" size="3" value="[% query.sort %]"> <input type="hidden" value="[% query.sort %]" name="orig_query_sort_[% query.id %]"> </td> - <td align="left"> + <td> <input type="hidden" value="[% query.name FILTER html %]" name="orig_query_name_[% query.id %]"> [% PROCESS query_field thisquery=query.name %] </td> - <td align="left"> + <td> <input type="hidden" value="[% query.title FILTER html %]" name="orig_query_title_[% query.id %]"> <input type="text" name="query_title_[% query.id %]" size="50" value="[% query.title FILTER html %]" maxlength="64"> </td> - <td align="left"> + <td> <input type="hidden" value="[% query.onemailperbug FILTER html %]" name="orig_query_onemailperbug_[% query.id %]"> <input type="checkbox" [% IF query.onemailperbug == 1 %] checked [% END %] @@ -271,7 +251,7 @@ name="query_onemailperbug_[% query.id %]"> <label for="query_onemailperbug_[% query.id %]">One message per [% terms.bug %]</label> </td> - <td align="right"> + <td> <input type="submit" value="Remove" name="remove_query_[% query.id %]" id="remove_query_[% query.id %]"> @@ -282,11 +262,11 @@ <tr> <td colspan="3"> - <input type="submit" value="Add a new query" + <input type="submit" value="Add a search" name="add_query_[% event.key %]" id="add_query_[% event.key %]"> </td> - <td align="right" colspan="2"> + <td colspan="2" class="right"> <input type="submit" value="Update / Commit" name="commit" id="update"> </td> </tr> @@ -301,7 +281,7 @@ [% END %] -<p align="left"> +<p> <input type="submit" value="Add a new event" name="add_event" id="add_event"> </p> @@ -322,7 +302,7 @@ </select> [% ELSE %] - Please visit the <a href="query.cgi">Search</a> page and save a query + Please visit the <a href="query.cgi">Search</a> page and save a search [% END %] [%+ END %] |