diff options
Diffstat (limited to 'template/en')
87 files changed, 2332 insertions, 1142 deletions
diff --git a/template/en/default/account/auth/login-small.html.tmpl b/template/en/default/account/auth/login-small.html.tmpl index a9d86036a..220eb5f21 100644 --- a/template/en/default/account/auth/login-small.html.tmpl +++ b/template/en/default/account/auth/login-small.html.tmpl @@ -47,13 +47,14 @@ 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 %]')" + placeholder="email address" > - <input class="bz_password" + <input class="bz_password" id="Bugzilla_password[% qs_suffix FILTER html %]" name="Bugzilla_password" type="password" @@ -62,7 +63,6 @@ <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 %]')" > [% IF Param('rememberlogin') == 'defaulton' || Param('rememberlogin') == 'defaultoff' @@ -74,42 +74,8 @@ [% END %] <input type="submit" name="GoAheadAndLogIn" value="Log in" id="log_in[% qs_suffix %]"> - <script type="text/javascript"> - mini_login_constants = { - "login" : "login", - "warning" : "You must set the login and password before logging in." - }; - [%# We need this event to fire after autocomplete, because it does - # something different depending on whether or not there's already - # data in the login and password box. - # However, autocomplete happens at all sorts of different times in - # different browsers (before or after onDOMReady, before or after - # window.onload, in almost all combinations you can imagine). - # The only good solution I found is to time the event 200 - # milliseconds after window.onload for WebKit (doing it immediately - # at onload works in Chrome but not in Safari, but I can't detect - # them separately using YUI), and right after onDOMReady in Gecko. - # The WebKit solution is also fairly guaranteed to work on any - # browser (it's just strange, since the fields only populate 200 ms - # after the page loads), so it's the default. IE doesn't even - # recognize our forms as login forms, so I made it use the Gecko - # method also (since it's nicer visually). Opera never autocompletes - # forms without user interaction, so it also uses the Gecko method. - #%] - if (YAHOO.env.ua.gecko || YAHOO.env.ua.ie || YAHOO.env.ua.opera) { - YAHOO.util.Event.onDOMReady(function() { - init_mini_login_form('[% qs_suffix FILTER html %]'); - }); - } - else { - YAHOO.util.Event.on(window, 'load', function () { - window.setTimeout(function() { - init_mini_login_form('[% qs_suffix FILTER html %]'); - }, 200); - }); - } - </script> - <a href="#" onclick="return hide_mini_login_form('[% qs_suffix %]')">[x]</a> + <a href="#" id="hide_mini_login[% qs_suffix FILTER html %]" + onclick="return hide_mini_login_form('[% qs_suffix %]')">[x]</a> </form> </li> <li id="forgot_container[% qs_suffix %]"> diff --git a/template/en/default/account/auth/login.html.tmpl b/template/en/default/account/auth/login.html.tmpl index 3de52b6a0..0aac403a5 100644 --- a/template/en/default/account/auth/login.html.tmpl +++ b/template/en/default/account/auth/login.html.tmpl @@ -37,14 +37,14 @@ [% USE Bugzilla %] <p> - I need a legitimate login and password to continue. + I need an email address and password to continue. </p> <form name="login" action="[% 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 align="right"><label for="Bugzilla_login">Email Address:</label></th> <td> <input size="35" id="Bugzilla_login" name="Bugzilla_login"> [% Param('emailsuffix') FILTER html %] @@ -64,7 +64,7 @@ <td> <input type="checkbox" id="Bugzilla_remember" name="Bugzilla_remember" value="on" [%+ "checked" IF Param('rememberlogin') == "defaulton" %]> - <label for="Bugzilla_remember">Remember my Login</label> + <label for="Bugzilla_remember">Remember my email address</label> </td> </tr> [% END %] @@ -112,7 +112,7 @@ <form id="forgot" method="get" action="token.cgi"> <input type="hidden" name="a" value="reqpw"> If you have an account, but have forgotten your password, - enter your login name below and submit a request + enter your email address below and submit a request to change your password.<br> <input size="35" name="loginname"> <input type="hidden" id="token" name="token" value="[% issue_hash_token(['reqpw']) FILTER html %]"> diff --git a/template/en/default/account/create.html.tmpl b/template/en/default/account/create.html.tmpl index 5acd9f541..985a54841 100644 --- a/template/en/default/account/create.html.tmpl +++ b/template/en/default/account/create.html.tmpl @@ -77,4 +77,6 @@ <input type="submit" id="send" value="Send"> </form> +[% Hook.process('additional_methods') %] + [% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/account/prefs/email.html.tmpl b/template/en/default/account/prefs/email.html.tmpl index 96a111bae..ffb153785 100644 --- a/template/en/default/account/prefs/email.html.tmpl +++ b/template/en/default/account/prefs/email.html.tmpl @@ -46,9 +46,12 @@ 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 = false; + theinput.checked = !setting; } else { theinput.checked = setting; @@ -119,6 +122,8 @@ document.write('<input type="button" value="Disable All Mail" onclick="SetCheckb description = "A new $terms.bug is created" }, { id = constants.EVT_OPENED_CLOSED, description = "The $terms.bug is resolved or reopened" }, + { id = constants.EVT_COMPONENT, + description = "The product or component changes" }, { id = constants.EVT_PROJ_MANAGEMENT, description = "The priority, status, severity, or milestone changes" }, { id = constants.EVT_COMMENT, @@ -284,6 +289,40 @@ You are currently not watching any users. [% END %] </p> -<hr> +<b>Ignore [% terms.Bugs %]</b> -<br> +<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 5e8dc9ca2..d3c787b07 100644 --- a/template/en/default/account/prefs/permissions.html.tmpl +++ b/template/en/default/account/prefs/permissions.html.tmpl @@ -65,9 +65,9 @@ There are no permission bits set on your account. [% END %] - [% IF user.in_group('editusers') %] + [% IF user.in_group('admin') %] <br> - You have editusers privileges. You can turn on and off + You have admin privileges. You can turn on and off all permissions for all users. [% ELSIF set_bits.size %] <br> diff --git a/template/en/default/account/prefs/saved-searches.html.tmpl b/template/en/default/account/prefs/saved-searches.html.tmpl index 1b78592ca..ce9623372 100644 --- a/template/en/default/account/prefs/saved-searches.html.tmpl +++ b/template/en/default/account/prefs/saved-searches.html.tmpl @@ -67,6 +67,7 @@ Share With a Group </th> [% END %] + [% Hook.process('saved-header') %] </tr> <tr> <td>My [% terms.Bugs %]</td> @@ -145,6 +146,7 @@ [% END %] </td> [% END %] + [% Hook.process('saved-row') %] </tr> [% END %] </table> diff --git a/template/en/default/account/prefs/settings.html.tmpl b/template/en/default/account/prefs/settings.html.tmpl index f8b6ba487..65e31359b 100644 --- a/template/en/default/account/prefs/settings.html.tmpl +++ b/template/en/default/account/prefs/settings.html.tmpl @@ -42,7 +42,7 @@ [% FOREACH name = setting_names %] [% default_name = name _ '-isdefault' %] [% default_val = settings.${name}.default_value %] - <tr> + <tr id="[% name FILTER html %]_row"> <td align="right"> [% setting_descs.$name OR name FILTER html %] </td> @@ -75,3 +75,10 @@ </table> [% END %] <br> + +<script> +YAHOO.util.Event.onDOMReady(function() { + var id = document.location.hash.substring(1) + '_row'; + YAHOO.util.Dom.addClass(id, 'highlighted'); +}); +</script> diff --git a/template/en/default/account/profile-activity.html.tmpl b/template/en/default/account/profile-activity.html.tmpl index ee00875fe..aa6a63e85 100644 --- a/template/en/default/account/profile-activity.html.tmpl +++ b/template/en/default/account/profile-activity.html.tmpl @@ -35,7 +35,7 @@ #%] [% title = BLOCK %] - Account History for '[% otheruser.login FILTER html %]' + [% IF action == 'admin_activity' %]Admin[% ELSE %]Account[% END %] History for '[% otheruser.login FILTER html %]' [% END %] diff --git a/template/en/default/admin/flag-type/edit.html.tmpl b/template/en/default/admin/flag-type/edit.html.tmpl index de0476e19..69dc05bd3 100644 --- a/template/en/default/admin/flag-type/edit.html.tmpl +++ b/template/en/default/admin/flag-type/edit.html.tmpl @@ -231,6 +231,8 @@ </td> </tr> + [% Hook.process('rows') %] + <tr> <th> </th> <td> diff --git a/template/en/default/admin/params/advanced.html.tmpl b/template/en/default/admin/params/advanced.html.tmpl index a8e8a297b..a2103c652 100644 --- a/template/en/default/admin/params/advanced.html.tmpl +++ b/template/en/default/admin/params/advanced.html.tmpl @@ -78,4 +78,26 @@ _ " use the <code>http://user:pass@proxy_url/</code> syntax.", strict_transport_security => sts_desc, + + disable_bug_updates => + "When enabled, all updates to $terms.bugs will be blocked.", + + sentry_uri => + "When set, important errors and warnings will be sent to the" + _ " specified Sentry server. Enter the full API KEY URL." + _ " eg <kbd>https://01234567890123456780123456780123:01234567890123456780123456780123@errormill.mozilla.org/10</kbd>.", + + metrics_enabled => + "Collect metrics for reporting to ElasticSearch", + metrics_user_ids => + "Comma separated list of user_id's which trigger data collection and reporting." + _ " eg <kbd>3881,5038,5898,13647,20209,251051,373476,409787</kbd>.", + metrics_elasticsearch_server => + "Metrics ElasticSearch server and port. eg <kbd>127.0.0.1:9200</kbd>", + metrics_elasticsearch_index => + "Metrics ElasticSearch index. eg <kbd>bmo-metrics</kbd>", + metrics_elasticsearch_type => + "Metrics ElasticSearch type. eg <kbd>timings</kbd>", + metrics_elasticsearch_ttl => + "The time to live for data in the ElasticSearch cluster, in milliseconds. eg <kbd>1210000000</kbd>", } %] diff --git a/template/en/default/admin/params/attachment.html.tmpl b/template/en/default/admin/params/attachment.html.tmpl index 69f62e9be..4075374bc 100644 --- a/template/en/default/admin/params/attachment.html.tmpl +++ b/template/en/default/admin/params/attachment.html.tmpl @@ -63,13 +63,13 @@ 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> " _ + "<a href=\"#maxlocalattachment\"><tt>maxlocalattachment</tt> 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\"><tt>maxattachmentsize</tt> 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 2e11dffbc..7a8d34791 100644 --- a/template/en/default/admin/params/auth.html.tmpl +++ b/template/en/default/admin/params/auth.html.tmpl @@ -107,6 +107,12 @@ "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 <tt>requirelogin</tt> " _ + "is enabled, then this parameter has no effect as users must be logged " _ + "in to use Bugzilla.", + emailregexp => "This defines the regexp to use for legal email addresses. The " _ "default tries to match fully qualified email addresses. Another " _ "popular value to put here is <tt>^[^@]+$</tt>, which means " _ diff --git a/template/en/default/admin/params/bugfields.html.tmpl b/template/en/default/admin/params/bugfields.html.tmpl index 58b08f615..a0d9664ad 100644 --- a/template/en/default/admin/params/bugfields.html.tmpl +++ b/template/en/default/admin/params/bugfields.html.tmpl @@ -57,5 +57,9 @@ "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." } + "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/groupsecurity.html.tmpl b/template/en/default/admin/params/groupsecurity.html.tmpl index 783099a11..041af6833 100644 --- a/template/en/default/admin/params/groupsecurity.html.tmpl +++ b/template/en/default/admin/params/groupsecurity.html.tmpl @@ -42,6 +42,9 @@ 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.", 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..eef39860a --- /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, $terms.Bugzilla will integrate with Memcached. " _ + "Specify one of more server, 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/users/edit.html.tmpl b/template/en/default/admin/users/edit.html.tmpl index 3efa4b8bf..8eced20f7 100644 --- a/template/en/default/admin/users/edit.html.tmpl +++ b/template/en/default/admin/users/edit.html.tmpl @@ -107,6 +107,17 @@ [% END %] </td> </tr> + + <tr> + <th>Last Login:</th> + <td> + [% IF otheruser.last_seen_date %] + [% otheruser.last_seen_date FILTER html %] + [% ELSE %] + <em>never</em> + [% END %] + </td> + </tr> </table> <p> @@ -116,9 +127,15 @@ <input type="hidden" name="token" value="[% token FILTER html %]"> [% INCLUDE listselectionhiddenfields %] - or <a href="editusers.cgi?action=activity&userid=[% otheruser.id %]" - title="View Account History for ' - [%- otheruser.login FILTER html %]'">View Account History</a> + [% IF editusers %], [% ELSE %] or [% END %] + <a href="editusers.cgi?action=activity&userid=[% otheruser.id %]" + title="View Account History for ' + [%- otheruser.login FILTER html %]'">View Account History</a> + [% IF editusers %] + or <a href="editusers.cgi?action=admin_activity&userid=[% otheruser.id %]" + title="View Account History for ' + [%- otheruser.login FILTER html %]'">View Admin History</a> + [% END %] </p> </form> <p> diff --git a/template/en/default/admin/users/list.html.tmpl b/template/en/default/admin/users/list.html.tmpl index 3f745a458..3ebfc2970 100644 --- a/template/en/default/admin/users/list.html.tmpl +++ b/template/en/default/admin/users/list.html.tmpl @@ -42,6 +42,9 @@ {name => 'realname' heading => 'Real name' } + {name => 'last_seen_date' + heading => 'Last Login' + } {heading => 'Account History' content => 'View' contentlink => 'editusers.cgi?action=activity' _ @@ -51,6 +54,17 @@ ] %] +[% IF editusers %] + [% columns.push({ + heading => 'Admin History' + content => 'View' + contentlink => 'editusers.cgi?action=admin_activity' _ + '&userid=%%userid%%' _ + listselectionurlparams + }) + %] +[% END %] + [% IF Param('allowuserdeletion') && editusers %] [% columns.push({heading => 'Action' content => 'Delete' diff --git a/template/en/default/attachment/create.html.tmpl b/template/en/default/attachment/create.html.tmpl index 863d83ad0..45c61d5a1 100644 --- a/template/en/default/attachment/create.html.tmpl +++ b/template/en/default/attachment/create.html.tmpl @@ -105,13 +105,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' %] </td> </tr> diff --git a/template/en/default/attachment/createformcontents.html.tmpl b/template/en/default/attachment/createformcontents.html.tmpl index 5b04382b6..7f738c07f 100644 --- a/template/en/default/attachment/createformcontents.html.tmpl +++ b/template/en/default/attachment/createformcontents.html.tmpl @@ -54,6 +54,7 @@ <th>Content Type:</th> <td> <em>If the attachment is a patch, check the box below.</em><br> + [% Hook.process("patch_notes") %] <input type="checkbox" id="ispatch" name="ispatch" value="1" onchange="setContentTypeDisabledState(this.form);"> <label for="ispatch">patch</label><br><br> @@ -99,6 +100,7 @@ {type => "image/gif", desc => "GIF image"}, {type => "image/jpeg", desc => "JPEG image"}, {type => "image/png", desc => "PNG image"}, + {type => "application/pdf", desc => "PDF document"}, {type => "application/octet-stream", desc => "binary file"}] %] [% Hook.process("mimetypes", "attachment/createformcontents.html.tmpl") %] diff --git a/template/en/default/attachment/delete_reason.txt.tmpl b/template/en/default/attachment/delete_reason.txt.tmpl index e4a1fc41f..87175c1a3 100644 --- a/template/en/default/attachment/delete_reason.txt.tmpl +++ b/template/en/default/attachment/delete_reason.txt.tmpl @@ -16,17 +16,10 @@ [%# INTERFACE: # attachment: object of the attachment the user wants to delete. # reason: string; The reason provided by the user. - # date: the date when the request to delete the attachment was made. #%] -The content of attachment [% attachment.id %] has been deleted by - [%+ user.identity %] -[% IF reason %] -who provided the following reason: +The content of attachment [% attachment.id %] has been deleted +[%~ IF reason %] for the following reason: [%+ reason %] -[% ELSE %] -without providing any reason. [% END %] - -The token used to delete this attachment was generated at [% date FILTER time %]. diff --git a/template/en/default/attachment/diff-footer.html.tmpl b/template/en/default/attachment/diff-footer.html.tmpl index 49c662a98..e9965a9a8 100644 --- a/template/en/default/attachment/diff-footer.html.tmpl +++ b/template/en/default/attachment/diff-footer.html.tmpl @@ -20,6 +20,12 @@ </form> +[% IF !file_count %] +<div id="error_msg" class="throw_error"> + No valid patch files were found in the attachment. +</div> +[% END %] + [% IF headers %] <br> diff --git a/template/en/default/attachment/diff-header.html.tmpl b/template/en/default/attachment/diff-header.html.tmpl index c13b2e7ba..8cb5525f7 100644 --- a/template/en/default/attachment/diff-header.html.tmpl +++ b/template/en/default/attachment/diff-header.html.tmpl @@ -133,15 +133,18 @@ Interdiff of #[% oldid %] and #[% newid %] for [% terms.bug %] #[% bugid %] [% 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 [% terms.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 [%+ terms.Bugzilla %] when comparing patches made against different + revisions. + [% ELSIF warning == "interdiff3" %] + interdiff encountered errors while comparing these patches. [% END %] </h2> [% ELSE %] diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl index 95ad4d335..8c954a02b 100644 --- a/template/en/default/attachment/edit.html.tmpl +++ b/template/en/default/attachment/edit.html.tmpl @@ -208,7 +208,8 @@ readonly = 'readonly' %] [% ELSE %] - <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]"> + <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %] + [%- "&content_type=text/plain" IF attachment.contenttype.match('^text/x-') %]"> <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> @@ -258,22 +259,21 @@ <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 + minrows = 10 + cols = 80 + wrap = 'soft' + classes = classNames %] + [% Hook.process('after_comment_textarea') %] </div> - [% END %] + [% END %] <div id="attachment_flags"> [% IF attachment.flag_types.size > 0 %] [% PROCESS "flag/list.html.tmpl" flag_types = attachment.flag_types read_only_flags = !can_edit %] - + [% END %] </div> @@ -306,10 +306,17 @@ <div id="attachment_list"> Attachments on [% "$terms.bug ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]: [% FOREACH a = attachments %] - [% IF a == attachment.id %] - [%+ a %] + [% IF a.isobsolete %] + <span class="bz_obsolete"> + [% END %] + [% IF a.id == attachment.id %] + [%+ a.id FILTER html %] [% ELSE %] - <a href="attachment.cgi?id=[% a %]&action=edit">[% a %]</a> + <a href="attachment.cgi?id=[% a.id FILTER uri %]&action=edit" + title="[% a.description FILTER html %]">[% a.id FILTER html %]</a> + [% END %] + [% IF a.isobsolete %] + </span> [% END %] [% " |" UNLESS loop.last() %] [% END %] diff --git a/template/en/default/attachment/list.html.tmpl b/template/en/default/attachment/list.html.tmpl index fa8e4774e..c89c7bb78 100644 --- a/template/en/default/attachment/list.html.tmpl +++ b/template/en/default/attachment/list.html.tmpl @@ -64,6 +64,7 @@ function toggle_display(link) { [% count = 0 %] [% obsolete_attachments = 0 %] + [% user_cache = template_cache.users %] [% FOREACH attachment = attachments %] [% count = count + 1 %] @@ -100,9 +101,16 @@ 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>, - [% INCLUDE global/user.html.tmpl who = attachment.attacher %] + [%# No need to recreate the exact same template if we already have it. %] + [% attacher_id = attachment.attacher.id %] + [% UNLESS user_cache.$attacher_id %] + [% user_cache.$attacher_id = BLOCK %] + [% INCLUDE global/user.html.tmpl who = attachment.attacher %] + [% END %] + [% END %] + [% user_cache.$attacher_id FILTER none %] </span> </td> @@ -134,7 +142,7 @@ function toggle_display(link) { </td> [% END %] - <td valign="top"> + <td class="bz_attach_actions" valign="top"> <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/bug/activity/table.html.tmpl b/template/en/default/bug/activity/table.html.tmpl index a9aca0a64..8098d89b2 100644 --- a/template/en/default/bug/activity/table.html.tmpl +++ b/template/en/default/bug/activity/table.html.tmpl @@ -110,7 +110,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 e3099d94a..ef3131a5e 100644 --- a/template/en/default/bug/comments.html.tmpl +++ b/template/en/default/bug/comments.html.tmpl @@ -25,8 +25,65 @@ <script src="[% 'js/comments.js' FILTER mtime %]" type="text/javascript"> </script> +<script type="text/javascript"> +<!-- + /* 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 = ""; + [% IF user.settings.quote_replies.value == 'quoted_reply' %] + /* pre id="comment_name_N" */ + var text_elem = document.getElementById('comment_text_'+id); + var text = getText(text_elem); + replytext = prefix + wrapReplyText(text); + [% ELSIF user.settings.quote_replies.value == 'simple_reply' %] + replytext = prefix; + [% END %] + + [% IF user.is_insider %] + if (document.getElementById('isprivate_' + real_id).checked) { + document.getElementById('newcommentprivacy').checked = 'checked'; + updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment'); + } + [% END %] + + /* Remove embedded links to attachment details */ + replytext = replytext.replace(/(attachment\s+\d+)(\s+\[[^\[\n]+\])+/gi, '$1'); + + /* <textarea id="comment"> */ + var textarea = document.getElementById('comment'); + if (textarea.value != replytext) { + textarea.value += replytext; + } + + textarea.focus(); + } + + function toggleCommentWrap(a, id) { + var spans = document.getElementById('comment_text_' + id).getElementsByTagName('span'); + var old_class; + var new_class; + if (a.innerHTML == 'wrap') { + a.innerHTML = 'unwrap'; + old_class = 'quote'; + new_class = 'quote_wrapped'; + } else { + a.innerHTML = 'wrap'; + old_class = 'quote_wrapped'; + new_class = 'quote'; + } + for (var i = 0, l = spans.length; i < l; i++) { + if (spans[i].className == old_class) + spans[i].className = new_class; + } + return false; + } +//--> +</script> + [% DEFAULT start_at = 0 mode = "show" %] [% sort_order = user.settings.comment_sort_order.value %] +[% 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. @@ -35,23 +92,36 @@ [% sort_order = "oldest_to_newest" %] [% END %] + +[%# Set up the variables as needed, depending on the sort order %] +[% IF sort_order == "oldest_to_newest" %] + [% count = 0 %] + [% description = 0 %] + [% increment = 1 %] +[% ELSE %] + [% increment = -1 %] + [% IF sort_order == "newest_to_oldest" %] + [% count = comments.size - 1 %] + [% description = 0 %] + [% ELSIF sort_order == "newest_to_oldest_desc_first" %] + [% count = comments.size %] + [% description = comments.size %] + [% END %] +[% END %] + +[% Hook.process("comment_banner") %] + <!-- This auto-sizes the comments and positions the collapse/expand links to the right. --> <table class="bz_comment_table" cellpadding="0" cellspacing="0"><tr> <td> [% FOREACH comment = comments %] - [% IF comment.count >= start_at %] + [% IF count >= start_at %] [% PROCESS a_comment %] [% END %] -[% END %] - -[% IF user.settings.comment_box_position.value == "before_comments" && user.id %] - <div class="bz_add_comment"> - <a href="#" - onclick="return goto_add_comments();"> - Add Comment</a> - </div> + + [% count = count + increment %] [% END %] [%# Note: this template is used in multiple places; if you use this hook, @@ -63,15 +133,13 @@ <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 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 %] + [% IF Param('comment_taggers_group') %] + <li><div id="comment_tags_collapse_expand_container"></div></li> + [% END %] </ul> [% END %] </td> @@ -82,13 +150,13 @@ [%############################################################################%] [% BLOCK a_comment %] - [% RETURN IF comment.is_private AND ! user.is_insider %] + [% 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 %] <div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %] [% " bz_comment_hilite" IF marks.${comment.count} %] - [% " bz_first_comment" IF comment.count == 0 %]"> + [% " bz_first_comment" IF comment.count == description %]"> [% IF comment.count == 0 %] [% class_name = "bz_first_comment_head" %] [% comment_label = "Description" %] @@ -101,14 +169,28 @@ [% IF mode == "edit" %] <span class="bz_comment_actions"> - <script type="text/javascript"><!-- - addReplyLink([% comment.count %], [% comment.id %]); - addCollapseLink([% comment.count %], 'Toggle comment display'); // --> + [% IF comment_text.search("(?:^>|\n>)") %] + [<a class="bz_wrap_link" href="#" + onclick="return toggleCommentWrap(this, [% comment.count %])">wrap</a>] + [% END %] + [% IF bug.check_can_change_field('longdesc', 1, 0) %] + [% 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 %], [% comment.collapsed FILTER js %], 'Toggle comment display'); </script> </span> [% END %] - [% IF mode == "edit" && user.is_insider %] + [% IF mode == "edit" && user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %] <div class="bz_private_checkbox"> <input type="hidden" value="1" name="defined_isprivate_[% comment.id %]"> @@ -128,12 +210,21 @@ </span> <span class="bz_comment_user"> - [% INCLUDE global/user.html.tmpl who = comment.author %] - </span> + [% who = comment.author %] + [% Hook.process('user-image', 'bug/comments.html.tmpl') %] + [%# No need to recreate the exact same template if we already have it. %] + [% commenter_id = comment.author.id %] + [% UNLESS user_cache.$commenter_id %] + [% user_cache.$commenter_id = BLOCK %] + [% INCLUDE global/user.html.tmpl who = comment.author %] + [% END %] + [% END %] + [% user_cache.$commenter_id FILTER none %] + [% Hook.process('user', 'bug/comments.html.tmpl') %] + </span> <span class="bz_comment_user_images"> - [% FOREACH group = comment.author.direct_group_membership %] - [% NEXT UNLESS group.icon_url %] + [% FOREACH group = comment.author.groups_with_icon %] <img src="[% group.icon_url FILTER html %]" alt="[% group.name FILTER html %]" title="[% group.name FILTER html %] - [% group.description FILTER html %]"> @@ -152,12 +243,32 @@ [% 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[% " collapsed" IF comment.collapsed %] + [% " bz_default_hidden" UNLESS comment.tags.size %]"> + <span id="ct_[% comment.count %]"> + [% 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" +<pre class="bz_comment_text[% " collapsed" IF comment.collapsed %]" [% ' id="comment_text_' _ comment.count _ '"' IF mode == "edit" %]> [%- comment_text FILTER quoteUrls(bug, comment) -%] </pre> + [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %] </div> [% END %] diff --git a/template/en/default/bug/create/comment-guided.txt.tmpl b/template/en/default/bug/create/comment-guided.txt.tmpl index df04d8fb5..67748e594 100644 --- a/template/en/default/bug/create/comment-guided.txt.tmpl +++ b/template/en/default/bug/create/comment-guided.txt.tmpl @@ -41,7 +41,7 @@ Steps to Reproduce: [%+ cgi.param("reproduce_steps") %] [% END %] -[% IF cgi.param("actual_results") -%] +[% IF cgi.param("actual_results") %] Actual Results: [%+ cgi.param("actual_results") %] [% END %] diff --git a/template/en/default/bug/create/create-guided.html.tmpl b/template/en/default/bug/create/create-guided.html.tmpl index d10314628..43437bcd7 100644 --- a/template/en/default/bug/create/create-guided.html.tmpl +++ b/template/en/default/bug/create/create-guided.html.tmpl @@ -31,22 +31,12 @@ [% PROCESS global/header.html.tmpl title = "Enter $terms.ABug" onload = "PutDescription()" - style = "#somebugs { width: 100%; height: 500px }" + style_urls = [ "skins/standard/guided.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> +[% INCLUDE 'bug/create/user-message.html.tmpl' %] [% tablecolour = "#FFFFCC" %] @@ -80,15 +70,15 @@ function PutDescription() { [%# Include other products if sensible %] [% IF product.name == "Firefox" %] - [% productstring = "product=Mozilla%20Application%20Suite&product=Firefox" %] + [% productstring = "product=Toolkit&product=Core&product=Firefox" %] [% ELSIF product.name == "Thunderbird" %] - [% productstring = "product=Mozilla%20Application%20Suite&product=Thunderbird" %] + [% productstring = "product=MailNews%20Core&product=Thunderbird" %] [% ELSE %] [% productstring = BLOCK %]product=[% product.name FILTER uri %][% END %] [% END %] <p> - <a href="duplicates.cgi?[% productstring %]&format=simple" target="somebugs">All-time Top 100</a> (loaded initially) | + <a href="duplicates.cgi?[% productstring %]&format=simple" target="somebugs">All-time Top 20</a> (loaded initially) | <a href="duplicates.cgi?[% productstring %]&format=simple&sortby=delta&reverse=1&maxrows=100&changedsince=14" target="somebugs">Hot in the last two weeks</a> </p> @@ -112,14 +102,14 @@ function PutDescription() { <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 == "SeaMonkey" 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="product" value="MailNews Core"> + [% END %] <input type="hidden" name="chfieldfrom" value="-6m"> <input type="hidden" name="chfieldto" value="Now"> <input type="hidden" name="chfield" value="[Bug creation]"> @@ -215,7 +205,7 @@ function PutDescription() { [%# We override rep_platform and op_sys for simplicity. The values chosen are based on which are most common in the b.m.o database %] - [% rep_platform = [ "PC", "Macintosh", "All", "Other" ] %] + [% rep_platform = [ "x86", "x86_64", "PowerPC", "All", "Other" ] %] <tr bgcolor="[% tablecolour %]"> <td align="right" valign="top"> @@ -238,7 +228,7 @@ function PutDescription() { </td> </tr> - [% IF product.name.match("Firefox|Camino|Mozilla Application Suite") %] + [% IF product.name.match("Firefox|Camino|SeaMonkey") %] [% matches = cgi.user_agent('Gecko/(\d+)') %] [% buildid = cgi.user_agent() IF matches %] [% END %] @@ -257,8 +247,8 @@ function PutDescription() { <p> This should identify the exact version of the product you were using. If the above field is blank or you know it is incorrect, copy the - version text from the product's Help | - About menu (for browsers this will begin with "Mozilla/5.0..."). + user agent text from the product's Help | Troubleshooting Information menu + (for browsers this will begin with "Mozilla/5.0..."). If the product won't start, instead paste the complete URL you downloaded it from. </p> @@ -275,7 +265,7 @@ function PutDescription() { 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>. + <a href="http://input.mozilla.com/feedback">a different way</a>. </p> </td> </tr> @@ -418,10 +408,7 @@ function PutDescription() { %] <p> Add any additional information you feel may be - relevant to this [% terms.bug %], such as the <b>theme</b> you were - using (does the [% terms.bug %] still occur - with the default theme?), a - <b><a href="http://kb.mozillazine.org/Quality_Feedback_Agent">Talkback crash ID</a></b>, or special + relevant to this [% terms.bug %], such as 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 @@ -431,13 +418,12 @@ function PutDescription() { 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>). + If you are reporting a crash, please <a href="https://developer.mozilla.org/En/How_to_get_a_stacktrace_for_a_bug_report +">try and get a stack trace</a>, which tells us exactly where things went wrong. </p> </td> </tr> - + <tr> <td valign="top" align="right"> <b>Severity</b> diff --git a/template/en/default/bug/create/create.html.tmpl b/template/en/default/bug/create/create.html.tmpl index 634bcf326..d1de42eb9 100644 --- a/template/en/default/bug/create/create.html.tmpl +++ b/template/en/default/bug/create/create.html.tmpl @@ -32,16 +32,37 @@ title = title yui = [ 'autocomplete', 'calendar', 'datatable', 'button' ] style_urls = [ 'skins/standard/attachment.css', - 'skins/standard/enter_bug.css' ] + 'skins/standard/enter_bug.css', + 'skins/custom/create_bug.css' ] javascript_urls = [ "js/attachment.js", "js/util.js", - "js/field.js", "js/TUI.js", "js/bug.js" ] - onload = "set_assign_to(); hideElementById('attachment_true'); - showElementById('attachment_false'); showElementById('btn_no_attachment');" + "js/field.js", "js/TUI.js", "js/bug.js", + "js/create_bug.js" ] + onload = "init();" %] <script type="text/javascript"> <!-- +function init() { + set_assign_to(); + hideElementById('attachment_true'); + showElementById('attachment_false'); + showElementById('btn_no_attachment'); + initCrashSignatureField(); + init_take_handler('[% user.login FILTER js %]'); +} + +function initCrashSignatureField() { + var el = document.getElementById('cf_crash_signature'); + if (!el) return; + [% IF cf_crash_signature.length %] + YAHOO.util.Dom.addClass('cf_crash_signature_container', 'bz_default_hidden'); + [% ELSE %] + hideEditableField('cf_crash_signature_container','cf_crash_signature_input', + 'cf_crash_signature_action', 'cf_crash_signature'); + [% END %] +} + var initialowners = new Array([% product.components.size %]); var last_initialowner; var initialccs = new Array([% product.components.size %]); @@ -60,11 +81,9 @@ var flags = new Array([% product.components.size %]); initialowners[[% count %]] = "[% c.default_assignee.login FILTER js %]"; [% flag_list = [] %] [% FOREACH f = c.flag_types.bug %] - [% NEXT UNLESS f.is_active %] [% flag_list.push(f.id) %] [% END %] [% FOREACH f = c.flag_types.attachment %] - [% NEXT UNLESS f.is_active %] [% flag_list.push(f.id) %] [% END %] flags[[% count %]] = [[% flag_list.join(",") FILTER js %]]; @@ -112,6 +131,14 @@ function set_assign_to() { document.getElementById('initial_cc').innerHTML = initialccs[index]; document.getElementById('comp_desc').innerHTML = comp_desc[index]; + if (initialccs[index]) { + showElementById('initial_cc_label'); + showElementById('initial_cc'); + } else { + hideElementById('initial_cc_label'); + hideElementById('initial_cc'); + } + [% IF Param("useqacontact") %] var contact = initialqacontacts[index]; if (qa_contact == last_initialqacontact @@ -122,30 +149,31 @@ function set_assign_to() { } [% END %] - // First, we disable all flags. Then we re-enable those - // which are available for the selected component. - var inputElements = document.getElementsByTagName("select"); - var inputElement, flagField; - for ( var i=0 ; i<inputElements.length ; i++ ) { - inputElement = inputElements.item(i); - if (inputElement.name.search(/^flag_type-(\d+)$/) != -1) { - var id = inputElement.name.replace(/^flag_type-(\d+)$/, "$1"); - inputElement.disabled = true; - // Also hide the requestee field, if it exists. - inputElement = document.getElementById("requestee_type-" + id); - if (inputElement) - YAHOO.util.Dom.addClass(inputElement.parentNode, 'bz_default_hidden'); + // 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; + } } - } - // Now enable flags available for the selected component. - for (var i = 0; i < flags[index].length; i++) { - flagField = document.getElementById("flag_type-" + flags[index][i]); - // Do not enable flags the user cannot set nor request. - if (flagField && flagField.options.length > 1) { - flagField.disabled = false; - // Re-enabling the requestee field depends on the status - // of the flag. - toggleRequesteeField(flagField, 1); + 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'); } } } @@ -171,6 +199,7 @@ TUI_hide_default('attachment_text_field'); onsubmit="return validateEnterBug(this)"> <input type="hidden" name="product" value="[% product.name FILTER html %]"> <input type="hidden" name="token" value="[% token FILTER html %]"> +<input type="hidden" name="bug_ignored" value="[% bug_ignored ? "1" : "0" %]"> <table> <tbody> @@ -185,9 +214,8 @@ TUI_hide_default('attachment_text_field'); <tr> <td colspan="2"> - <a id="expert_fields_controller" class="controller bz_default_hidden" - href="javascript:TUI_toggle_class('expert_fields')">Hide - Advanced Fields</a> + <input type="button" id="expert_fields_controller" + value="Hide Advanced Fields" onClick="toggleAdvancedFields()"> [%# Show the link if the browser supports JS %] <script type="text/javascript"> YAHOO.util.Dom.removeClass('expert_fields_controller', @@ -349,120 +377,77 @@ TUI_hide_default('attachment_text_field'); bug = default, field = bug_fields.bug_status, editable = (bug_status.size > 1), value = default.bug_status override_legal_values = bug_status %] - - <td> </td> - [%# Calculate the number of rows we can use for flags %] - [% num_rows = 6 + (Param("useqacontact") ? 1 : 0) + - (user.is_timetracker ? 3 : 0) + - (Param("usebugaliases") ? 1 : 0) - %] - - <td rowspan="[% num_rows FILTER html %]"> - [% IF product.flag_types.bug.size > 0 %] - [% display_flag_headers = 0 %] - [% any_flags_requesteeble = 0 %] - - [% FOREACH flag_type = product.flag_types.bug %] - [% NEXT UNLESS flag_type.is_active %] - [% display_flag_headers = 1 %] - [% SET any_flags_requesteeble = 1 IF flag_type.is_requestable && flag_type.is_requesteeble %] - [% END %] - - [% IF display_flag_headers %] - [% PROCESS "flag/list.html.tmpl" flag_types = product.flag_types.bug - any_flags_requesteeble = any_flags_requesteeble - flag_table_id = "bug_flags" - %] - [% END %] - [% END %] - </td> </tr> <tr> [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.assigned_to editable = 1 %] - <td colspan="2"> + <td> [% INCLUDE global/userselect.html.tmpl - id => "assigned_to" - name => "assigned_to" - value => assigned_to + id => "assigned_to" + name => "assigned_to" + value => assigned_to disabled => assigned_to_disabled - size => 30 - emptyok => 1 + size => 30 + emptyok => 1 custom_userlist => assignees_list - %] + %] + [% UNLESS assigned_to_disabled %] + <span id="take_bug"> + (<a title="Assign to yourself" href="#" + onclick="return take_bug('[% user.login FILTER js %]')">take</a>) + </span> + [% END %] <noscript>(Leave blank to assign to component's default assignee)</noscript> </td> - </tr> [% IF Param("useqacontact") %] - <tr> - [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.qa_contact editable = 1 - %] - <td colspan="2"> - [% INCLUDE global/userselect.html.tmpl - id => "qa_contact" - name => "qa_contact" - value => qa_contact - disabled => qa_contact_disabled - size => 30 - emptyok => 1 - custom_userlist => qa_contacts_list - %] - <noscript>(Leave blank to assign to default qa contact)</noscript> - </td> - </tr> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.qa_contact editable = 1 + %] + <td> + [% INCLUDE global/userselect.html.tmpl + id => "qa_contact" + name => "qa_contact" + value => qa_contact + disabled => qa_contact_disabled + size => 30 + emptyok => 1 + custom_userlist => qa_contacts_list + %] + <noscript>(Leave blank to assign to default qa contact)</noscript> + </td> + </tr> [% END %] <tr> [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.cc editable = 1 %] - <td colspan="2"> + <td> [% INCLUDE global/userselect.html.tmpl - id => "cc" - name => "cc" - value => cc + id => "cc" + name => "cc" + value => cc disabled => cc_disabled - size => 30 + size => 30 multiple => 5 %] + </td> + <th> + <span id="initial_cc_label" class="bz_default_hidden"> + Default [% field_descs.cc FILTER html %]: + </span> + </th> + <td> + <span id="initial_cc"></span> </td> </tr> <tr> - <th>Default [% field_descs.cc FILTER html %]:</th> - <td colspan="2"> - <div id="initial_cc"> - </div> - </td> - </tr> - - <tr> - <td colspan="3"> </td> - </tr> - -[% IF user.is_timetracker %] - <tr> - [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.estimated_time editable = 1 - %] - <td colspan="2"> - <input name="estimated_time" size="6" maxlength="6" value="[% estimated_time FILTER html %]"> - </td> - </tr> - <tr> - [% INCLUDE bug/field.html.tmpl - bug = default, field = bug_fields.deadline, value = deadline, - editable = 1, value_span = 2 %] - </tr> - - <tr> <td colspan="3"> </td> </tr> -[% END %] [% IF Param("usebugaliases") %] <tr> @@ -474,34 +459,9 @@ TUI_hide_default('attachment_text_field'); </td> </tr> [% END %] - - <tr> - [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.bug_file_loc editable = 1 - %] - <td colspan="2" class="field_value"> - <input name="bug_file_loc" id="bug_file_loc" class="text_input" - size="40" value="[% bug_file_loc FILTER html %]"> - </td> - </tr> </tbody> <tbody> - [% USE Bugzilla %] - - [% FOREACH field = Bugzilla.active_custom_fields %] - [% NEXT UNLESS field.enter_bug %] - [% SET value = ${field.name}.defined ? ${field.name} : "" %] - <tr [% 'class="expert_fields"' IF !field.is_mandatory %]> - [% INCLUDE bug/field.html.tmpl - bug = default, field = field, value = value, editable = 1, - value_span = 3 %] - </tr> - [% END %] -</tbody> - -<tbody> - <tr> [% INCLUDE "bug/field-label.html.tmpl" field = bug_fields.short_desc editable = 1 @@ -562,9 +522,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 @@ -574,21 +532,17 @@ TUI_hide_default('attachment_text_field'); </td> </tr> - [% IF user.is_insider %] - <tr class="expert_fields"> - <th> </th> - <td colspan="3"> - - <input type="checkbox" id="comment_is_private" name="comment_is_private" - [% ' checked="checked"' IF comment_is_private %] - onClick="updateCommentTagControl(this, 'comment')"> - <label for="comment_is_private"> - Make description and any new attachment private (visible only to members - of the <strong>[% Param('insidergroup') FILTER html %]</strong> group) - </label> - </td> - </tr> - [% END %] +<tbody class="expert_fields"> + <tr> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.bug_file_loc editable = 1 + %] + <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> + </tr> +</tbody> [% IF Param("maxattachmentsize") || Param("maxlocalattachment") %] <tr> @@ -609,6 +563,16 @@ TUI_hide_default('attachment_text_field'); any_flags_requesteeble = 1 flag_table_id ="attachment_flags" %] </table> + + [% IF user.is_insider %] + <input type="checkbox" id="comment_is_private" name="comment_is_private" + [% ' checked="checked"' IF comment_is_private %] + onClick="updateCommentTagControl(this, 'comment')"> + <label for="comment_is_private"> + Make this attachment and [% terms.bug %] description private (visible only + to members of the <strong>[% Param('insidergroup') FILTER html %]</strong> group) + </label> + [% END %] </fieldset> </div> </td> @@ -618,41 +582,161 @@ TUI_hide_default('attachment_text_field'); <tbody class="expert_fields"> [% IF user.in_group('editbugs', product.id) %] + <tr> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.dependson editable = 1 + %] + <td> + <input name="dependson" accesskey="d" value="[% dependson FILTER html %]" size="30"> + </td> + [% INCLUDE "bug/field-label.html.tmpl" + field = bug_fields.blocked editable = 1 + %] + <td> + <input name="blocked" accesskey="b" value="[% blocked FILTER html %]" size="30"> + </td> + </tr> + [% IF use_keywords %] <tr> [% INCLUDE bug/field.html.tmpl bug = default, field = bug_fields.keywords, editable = 1, value = keywords, desc_url = "describekeywords.cgi", - value_span = 2 + value_span = 3 %] </tr> [% END %] <tr> - [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.dependson editable = 1 - %] - <td colspan="3"> - <input name="dependson" accesskey="d" value="[% dependson FILTER html %]"> + <th>Status Whiteboard:</th> + <td colspan="3" class="field_value"> + <input id="status_whiteboard" name="status_whiteboard" size="70" + value="[% status_whiteboard FILTER html %]" class="text_input"> </td> </tr> + [% END %] + + [% IF user.is_timetracker %] <tr> [% INCLUDE "bug/field-label.html.tmpl" - field = bug_fields.blocked editable = 1 + field = bug_fields.estimated_time editable = 1 %] - <td colspan="3"> - <input name="blocked" accesskey="b" value="[% blocked FILTER html %]"> + <td> + <input name="estimated_time" size="6" maxlength="6" value="[% estimated_time FILTER html %]"> </td> + [% INCLUDE bug/field.html.tmpl + bug = default, field = bug_fields.deadline, value = deadline, editable = 1 + %] </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> +[%# non-tracking flags custom fields %] +[% FOREACH field = Bugzilla.active_custom_fields(product=>product) %] + [% NEXT IF field.type == constants.FIELD_TYPE_EXTENSION %] + [% NEXT UNLESS field.enter_bug %] + [%# crash-signature gets custom handling %] + [% IF field.name == 'cf_crash_signature' %] + [% show_crash_signature = 1 %] + [% NEXT %] + [% END %] + [% SET value = ${field.name}.defined ? ${field.name} : "" %] + <tr [% 'class="expert_fields"' IF !field.is_mandatory %]> + [% INCLUDE bug/field.html.tmpl + bug = default, field = field, value = value, editable = 1, + value_span = 3 %] + </tr> +[% END %] +</tbody> + +[%# crash-signature handling %] +[% IF show_crash_signature %] +<tbody class="expert_fields"> + <tr> + <th id="field_label_cf_crash_signature" class="field_label"> + <label for="cf_crash_signature"> Crash Signature: </label> + </th> + <td colspan="3"> + <span id="cf_crash_signature_container"> + <span id="cf_crash_signature_nonedit_display"><i>None</i></span> + (<a id="cf_crash_signature_action" href="#">edit</a>) + </span> + <span id="cf_crash_signature_input"> + <textarea id="cf_crash_signature" name="cf_crash_signature" rows="4" cols="60" + >[% cf_crash_signature FILTER html %]</textarea> + </span> + </td> + </tr> </tbody> +[% END %] + +[% display_flags = 0 %] +[% any_flags_requesteeble = 0 %] +[% FOREACH flag_type = product.flag_types.bug %] + [% display_flags = 1 %] + [% SET any_flags_requesteeble = 1 IF flag_type.is_requestable && flag_type.is_requesteeble %] + [% LAST IF display_flags && any_flags_requesteeable %] +[% END %] + +[% IF tracking_flags.size || display_flags %] + <tbody class="expert_fields"> + <tr> + <th>Flags:</th> + <td colspan="3"> + <div id="bug_flags_false" class="bz_default_hidden"> + <input type="button" value="Set [% terms.bug FILTER html %] flags" onClick="handleWantsBugFlags(true)"> + </div> + + <div id="bug_flags_true"> + <input type="button" id="btn_no_bug_flags" value="Don't set [% terms.bug %] flags" + class="bz_default_hidden" onClick="handleWantsBugFlags(false)"> + + <fieldset> + <legend>Set [% terms.bug %] flags</legend> + <table> + <tr> + [% Hook.process('bug_flags') %] + [% IF display_flags %] + <td> + [% PROCESS "flag/list.html.tmpl" flag_types = product.flag_types.bug + any_flags_requesteeble = any_flags_requesteeble + flag_table_id = "bug_flags" + %] + </td> + [% END %] + </tr> + </table> + </fieldset> + </div> + </td> + </tr> + </tbody> +[% END %] <tbody class="expert_fields"> - [% IF product.groups_available.size %] + [%# BMO - exclude the default security from from the groups_available %] + [%# list, as it will be added by the BMO extension %] + [% groups_available = [] %] + [% FOREACH group = product.groups_available %] + [% NEXT IF group.name == product.default_security_group %] + [% groups_available.push(group) %] + [% END %] + [% IF groups_available.size %] <tr> <th> </th> <td colspan="3"> - <br> <strong> Only users in all of the selected groups can view this [%+ terms.bug %]: @@ -662,11 +746,10 @@ TUI_hide_default('attachment_text_field'); (Leave all boxes unchecked to make this a public [% terms.bug %].) </font> <br> - <br> <!-- Checkboxes --> <input type="hidden" name="defined_groups" value="1"> - [% FOREACH group = product.groups_available %] + [% FOREACH group = groups_available %] <input type="checkbox" id="group_[% group.id FILTER html %]" name="groups" value="[% group.name FILTER html %]" [% ' checked="checked"' IF default.groups.contains(group.name) @@ -694,6 +777,13 @@ TUI_hide_default('attachment_text_field'); </td> </tr> </tbody> + [%# "status whiteboard" and "qa contact" are the longest labels + # add them here to avoid shifting the page when toggling advanced fields %] + <tr> + <th class="hidden_text">Status Whiteboard:</th> + <td> </td> + <th class="hidden_text">QA Contact:</th> + </tr> </table> <input type="hidden" name="form_name" value="enter_bug"> </form> @@ -701,6 +791,13 @@ TUI_hide_default('attachment_text_field'); [%# Links or content with more information about the bug being created. %] [% Hook.process("end") %] +<div id="guided"> + <a id="guided_img" href="enter_bug.cgi?format=guided&product=[% product.name FILTER uri %]"><img + src="extensions/BMO/web/images/guided.png" width="16" height="16" border="0" align="absmiddle"></a> + <a id="guided_link" href="enter_bug.cgi?format=guided&product=[% product.name FILTER uri %]" + >Switch to the [% terms.Bugzilla %] Helper</a> +</div> + [% PROCESS global/footer.html.tmpl %] [%############################################################################%] diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl index fbc6e4a96..fe6b27bc7 100644 --- a/template/en/default/bug/edit.html.tmpl +++ b/template/en/default/bug/edit.html.tmpl @@ -30,73 +30,35 @@ [% 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> + [<a href="https://wiki.mozilla.org/BMO/comment_tagging" + target="_blank" title="About Comment Tagging">help</a>] + + </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 %]; + </script> + [% END %] +[% END %] + <script type="text/javascript"> <!-- - /* Outputs a link to call replyToComment(); used to reduce HTML output */ - function addReplyLink(id, real_id) { - /* XXX this should really be updated to use the DOM Core's - * createElement, but finding a container isn't trivial. - */ - [% IF user.settings.quote_replies.value != 'off' %] - document.write('[<a href="#add_comment" onclick="replyToComment(' + - id + ',' + real_id + '); return false;">reply<' + '/a>]'); - [% END %] - } - - /* Adds the reply text to the `comment' textarea */ - function replyToComment(id, real_id) { - var prefix = "(In reply to comment #" + id + ")\n"; - var replytext = ""; - [% IF user.settings.quote_replies.value == 'quoted_reply' %] - /* pre id="comment_name_N" */ - var text_elem = document.getElementById('comment_text_'+id); - var text = getText(text_elem); - replytext = prefix + wrapReplyText(text); - [% ELSIF user.settings.quote_replies.value == 'simple_reply' %] - replytext = prefix; - [% END %] - - [% IF user.is_insider %] - if (document.getElementById('isprivate_' + real_id).checked) { - document.getElementById('newcommentprivacy').checked = 'checked'; - updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment'); - } - [% END %] - - /* <textarea id="comment"> */ - var textarea = document.getElementById('comment'); - textarea.value += replytext; - - textarea.focus(); - } - - if (typeof Node == 'undefined') { - /* MSIE doesn't define Node, so provide a compatibility object */ - window.Node = { - TEXT_NODE: 3, - ENTITY_REFERENCE_NODE: 5 - }; - } - - /* Concatenates all text from element's childNodes. This is used - * instead of innerHTML because we want the actual text (and - * innerText is non-standard). - */ - function getText(element) { - var child, text = ""; - for (var i=0; i < element.childNodes.length; i++) { - child = element.childNodes[i]; - var type = child.nodeType; - if (type == Node.TEXT_NODE || type == Node.ENTITY_REFERENCE_NODE) { - text += child.nodeValue; - } else { - /* recurse into nodes of other types */ - text += getText(child); - } - } - return text; - } - [% IF user.is_timetracker %] var fRemainingTime = [% bug.remaining_time %]; // holds the original value function adjustRemainingTime() { @@ -115,7 +77,6 @@ // if the remaining time is changed manually, update fRemainingTime fRemainingTime = document.changeform.remaining_time.value; } - [% END %] [% IF user.id %] @@ -164,34 +125,48 @@ [% PROCESS section_url_keyword_whiteboard %] [% PROCESS section_spacer %] - - [%# *** Dependencies *** %] + + [%# *** Dependencies and duplicates *** %] + [% PROCESS section_duplicates %] + [% PROCESS section_dependson_blocks %] - + + [% IF user.id %] + <tr> + <td colspan="2"> + <span style="float:left"> + <a href="page.cgi?id=fields.html">What do these fields mean?</a> + </span> + [% PROCESS commit_button id="_top"%] + </td> + </tr> + [% END %] </table> </td> <td> <div class="bz_column_spacer"> </div> </td> [%# 2nd Column %] - <td id="bz_show_bug_column_2" class="bz_show_bug_column"> + <td id="bz_show_bug_column_2" class="bz_show_bug_column_table" valign="top"> <table cellpadding="3" cellspacing="1"> [%# *** 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_flags %] + + [% PROCESS section_see_also %] + [% PROCESS section_spacer %] - + + [% PROCESS section_customfields %] + [% Hook.process("after_custom_fields") %] - - [% PROCESS section_flags %] </table> </td> @@ -220,6 +195,8 @@ [% IF user.settings.comment_box_position.value == 'before_comments' %] [% PROCESS comment_box %] + [% ELSE %] + [% PROCESS summon_comment_box %] [% END %] </td> <td> @@ -238,7 +215,10 @@ [% IF user.settings.comment_box_position.value == 'after_comments' %] <hr> [% PROCESS comment_box %] - [% END %] + [% ELSE %] + [% PROCESS summon_comment_box %] + [% END %] + </form> @@ -249,7 +229,10 @@ [% BLOCK section_title %] [%# That's the main table, which contains all editable fields. %] <div class="bz_alias_short_desc_container edit_form"> - [% PROCESS commit_button id="_top"%] + <span class="last_comment_link"> + <a href="#c[% bug.comments.size - 1 %]" + accesskey="l"><b>L</b>ast Comment</a> + </span> <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"> @@ -351,9 +334,9 @@ %] </tr> <tr> - <td class="field_label"> - <label for="version"><b>Version</b></label>: - </td> + <th class="field_label"> + <label for="version">Version</label>: + </th> [% PROCESS select selname => "version" %] </tr> @@ -361,9 +344,9 @@ [%# PLATFORM #%] [%############%] <tr> - <td class="field_label"> - <label for="rep_platform" accesskey="h"><b>Platform</b></label>: - </td> + <th class="field_label"> + <label for="rep_platform" accesskey="h">Platform</label>: + </th> <td class="field_value"> [% INCLUDE bug/field.html.tmpl bug = bug, field = bug_fields.rep_platform, @@ -373,9 +356,6 @@ bug = bug, field = bug_fields.op_sys, no_tds = 1, value = bug.op_sys editable = bug.check_can_change_field('op_sys', 0, 1) %] - <script type="text/javascript"> - assignToDefaultOnChange(['product', 'component']); - </script> </td> </tr> @@ -389,9 +369,9 @@ [% BLOCK section_status %] <tr> - <td class="field_label"> - <b><a href="page.cgi?id=fields.html#status">Status</a></b>: - </td> + <th class="field_label"> + <a href="page.cgi?id=fields.html#status">Status</a>: + </th> <td id="bz_field_status"> <span id="static_bug_status"> [% display_value("bug_status", bug.bug_status) FILTER html %] @@ -408,6 +388,30 @@ </span> </td> </tr> + [% IF Param('usestatuswhiteboard') %] + <tr> + <th class="field_label"> + <label for="status_whiteboard" accesskey="w"><u>W</u>hiteboard</label>: + </th> + [% PROCESS input inputname => "status_whiteboard" size => "40" colspan => 2 %] + </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 + %] + </td> + </tr> + [% END %] [% END %] [%############################################################################%] @@ -420,10 +424,10 @@ [%# Importance (priority and severity) #%] [%###############################################################%] <tr> - <td class="field_label"> + <th class="field_label"> <label for="priority" accesskey="i"> - <b><a href="page.cgi?id=fields.html#importance"><u>I</u>mportance</a></b></label>: - </td> + <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, @@ -439,11 +443,11 @@ [% IF Param("usetargetmilestone") && bug.target_milestone %] <tr> - <td class="field_label"> + <th class="field_label"> <label for="target_milestone"> - <a href="page.cgi?id=fields.html#target_milestone"> + <a href="page.cgi?id=fields.html#target_milestone"> Target Milestone</a></label>: - </td> + </th> [% PROCESS select selname = "target_milestone" %] </tr> [% END %] @@ -457,9 +461,9 @@ [% BLOCK section_people %] <tr> - <td class="field_label"> - <b><a href="page.cgi?id=fields.html#assigned_to">Assigned To</a></b>: - </td> + <th class="field_label"> + <a href="page.cgi?id=fields.html#assigned_to">Assigned To</a>: + </th> <td> [% IF bug.check_can_change_field("assigned_to", 0, 1) %] <div id="bz_assignee_edit_container" class="bz_default_hidden"> @@ -506,41 +510,46 @@ [% IF Param('useqacontact') %] <tr> - <td class="field_label"> - <label for="qa_contact" accesskey="q"><b><u>Q</u>A Contact</b></label>: - </td> + <th class="field_label"> + <label for="qa_contact" accesskey="q"><u>Q</u>A Contact</label>: + </th> <td> [% IF bug.check_can_change_field("qa_contact", 0, 1) %] - [% IF bug.qa_contact != "" %] - <div id="bz_qa_contact_edit_container" class="bz_default_hidden"> + <div id="bz_qa_contact_edit_container" class="bz_default_hidden"> <span> - <span id="bz_qa_contact_edit_display"> - [% INCLUDE global/user.html.tmpl who = bug.qa_contact %]</span> + [% INCLUDE global/user.html.tmpl who = bug.qa_contact %] (<a href="#" id="bz_qa_contact_edit_action">edit</a>) + [% IF bug.qa_contact.id != user.id %] + (<a title="Change QA contact to yourself" + href="#" id="bz_qa_contact_take_action">take</a>) + [% END %] </span> </div> - [% END %] <div id="bz_qa_contact_input"> [% INCLUDE global/userselect.html.tmpl - id => "qa_contact" - name => "qa_contact" - value => bug.qa_contact.login - size => 30 - classes => ["bz_userfield"] - emptyok => 1 + id => "qa_contact" + name => "qa_contact" + value => bug.qa_contact.login + size => 30 + classes => ["bz_userfield"] + emptyok => 1 %] <br> <input type="checkbox" id="set_default_qa_contact" name="set_default_qa_contact" value="1"> <label for="set_default_qa_contact" id="set_default_qa_contact_label">Reset QA Contact to default</label> </div> <script type="text/javascript"> - [% IF bug.qa_contact != "" %] - hideEditableField('bz_qa_contact_edit_container', - 'bz_qa_contact_input', - 'bz_qa_contact_edit_action', - 'qa_contact', - '[% bug.qa_contact.login FILTER js %]'); - [% END %] + hideEditableField('bz_qa_contact_edit_container', + 'bz_qa_contact_input', + 'bz_qa_contact_edit_action', + 'qa_contact', + '[% bug.qa_contact.login FILTER js %]'); + hideEditableField('bz_qa_contact_edit_container', + 'bz_qa_contact_input', + 'bz_qa_contact_take_action', + 'qa_contact', + '[% bug.qa_contact.login FILTER js %]', + '[% user.login FILTER js %]'); initDefaultCheckbox('qa_contact'); </script> [% ELSE %] @@ -549,6 +558,11 @@ </td> </tr> [% END %] + <script type="text/javascript"> + assignToDefaultOnChange(['product', 'component'], + '[% bug.component_obj.default_assignee.login FILTER js %]', + '[% bug.component_obj.default_qa_contact.login FILTER js %]'); + </script> [% END %] [%############################################################################%] @@ -564,14 +578,17 @@ <td> [% IF bug.check_can_change_field("bug_file_loc", 0, 1) %] <span id="bz_url_edit_container" class="bz_default_hidden"> - [% IF is_safe_url(bug.bug_file_loc) %] - <a href="[% bug.bug_file_loc FILTER html %]" target="_blank" - title="[% bug.bug_file_loc FILTER html %]"> - [% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a> - [% ELSE %] - [% bug.bug_file_loc FILTER html %] - [% END %] - (<a href="#" id="bz_url_edit_action">edit</a>)</span> + <a href="[% bug.bug_file_loc FILTER html %]" target="_blank" + title="[% bug.bug_file_loc FILTER html %]" + [% IF NOT is_safe_url(bug.bug_file_loc) %] + onclick="return confirm( + 'This is considered an unsafe URL and could possibly be harmful. ' + + 'The full URL is:\n\n[% bug.bug_file_loc FILTER js FILTER html %]\n\n' + + 'Continue?')" + [% END %]> + [% bug.bug_file_loc FILTER truncate(40) FILTER html %]</a> + (<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 %] @@ -593,36 +610,34 @@ [% END %] </td> </tr> - - [% IF Param('usestatuswhiteboard') %] - <tr> - <td class="field_label"> - <label for="status_whiteboard" accesskey="w"><b><u>W</u>hiteboard</b></label>: - </td> - [% PROCESS input inputname => "status_whiteboard" size => "40" colspan => 2 %] - </tr> - [% END %] - - [% IF use_keywords %] - <tr> - <td class="field_label"> - <label for="keywords" accesskey="k"> - <b><a href="describekeywords.cgi"><u>K</u>eywords</a></b></label>: - </td> - <td class="field_value" colspan="2"> - [% INCLUDE bug/field.html.tmpl - bug = bug, field = bug_fields.keywords, value = bug.keywords - editable = bug.check_can_change_field("keywords", 0, 1), - no_tds = 1 - %] - </td> - </tr> - [% END %] [% END %] [%############################################################################%] -[%# Block for Depends On / Blocks #%] +[%# Block for Duplicates #%] +[%############################################################################%] + +[% BLOCK section_duplicates %] + [% RETURN UNLESS bug.duplicates.size %] + <tr> + <th class="field_label"> + <label for="duplicates">Duplicates</label>: + </th> + <td class="field_value" colspan="2"> + <span id="duplicates"> + [% FOREACH dupe = bug.duplicates %] + [% dupe.id FILTER bug_link(dupe, use_alias => 1) FILTER none %][% " " %] + [% END %] + </span> + (<a href="buglist.cgi?bug_id=[% bug.duplicate_ids.join(",") FILTER html %]"> + [%-%]view as [% terms.bug %] list</a>) + </td> + </tr> +[% END %] + +[%############################################################################%] +[%# Block for Depends On / Blocks #%] [%############################################################################%] + [% BLOCK section_dependson_blocks %] <tr> [% INCLUDE dependencies @@ -749,20 +764,20 @@ [% BLOCK section_dates %] <tr> - <td class="field_label"> - <b>Reported</b>: - </td> + <th class="field_label"> + 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> <tr> - <td class="field_label"> - <b> Modified</b>: - </td> + <th class="field_label"> + 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> @@ -774,9 +789,9 @@ [%############################################################################%] [% BLOCK section_cclist %] <tr> - <td class="field_label"> - <label for="newcc" accesskey="a"><b>CC List</b>:</label> - </td> + <th class="field_label"> + <label for="newcc" accesskey="a">CC List:</label> + </th> <td> [% IF user.id %] [% IF NOT bug.cc || NOT bug.cc.contains(user.login) %] @@ -808,10 +823,17 @@ [% IF user.id || bug.cc.size %] <span id="cc_edit_area_showhide_container" class="bz_default_hidden"> (<a href="#" id="cc_edit_area_showhide">[% IF user.id %]edit[% ELSE %]show[% END %]</a>) - </span> + [% IF user.id && bug.cc.size %] + <br> + <ul class="cc_list_display"> + [% FOREACH c = bug.cc %] + <li>[% c FILTER email FILTER html %]</li> + [% END %] + </ul> + [% END %] + </span> [% END %] <div id="cc_edit_area"> - <br> [% IF user.id %] <div> <div><label for="cc"><b>Add</b></label></div> @@ -864,6 +886,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 %] @@ -885,26 +930,52 @@ [% BLOCK section_flags %] [%# *** Flags *** %] [% show_bug_flags = 0 %] + [% bug_flags_set = 0 %] + [% show_more_flags = 0 %] [% FOREACH type = bug.flag_types %] [% IF (type.flags && type.flags.size > 0) || (user.id && type.is_active) %] [% show_bug_flags = 1 %] - [% LAST %] [% END %] + [% IF user.id && type.is_active && (type.flags.size == 0 || type.is_multiplicable) %] + [% show_more_flags = 1 %] + [% END %] + [% IF type.flags && type.flags.size > 0 %] + [% bug_flags_set = 1 %] + [% END %] + [% LAST IF show_bug_flags && show_more_flags && bug_flags_set %] [% END %] [% IF show_bug_flags %] <tr> - <td class="field_label flags_label"> - <label><b>Flags:</b></label> - </td> - <td></td> - </tr> - <tr> - <td colspan="2"> + <th class="field_label"> + <label>Flags:</label> + </th> + <td> [% IF bug.flag_types.size > 0 %] [% PROCESS "flag/list.html.tmpl" flag_no_header = 1 flag_types = bug.flag_types any_flags_requesteeble = bug.any_flags_requesteeble %] [% END %] + [% IF show_more_flags && bug.check_can_change_field('flagtypes.name', 0, 1) %] + <span id="bz_flags_more_container" class="bz_default_hidden"> + [% IF !bug_flags_set %]<em>None yet set</em>[% END %] + (<a href="#" id="bz_flags_more_action">[% IF !bug_flags_set %]set[% ELSE %]more[% END %] flags</a>) + </span> + <script type="text/javascript"> + YAHOO.util.Dom.removeClass('bz_flags_more_container', 'bz_default_hidden'); + var table = YAHOO.util.Dom.get("flags"); + var rows = YAHOO.util.Dom.getElementsByClassName('bz_flag_type', 'tbody', table); + for (var i = 0; i < rows.length; i++) { + YAHOO.util.Dom.addClass(rows[i], 'bz_default_hidden'); + } + YAHOO.util.Event.addListener('bz_flags_more_action', 'click', function (e) { + YAHOO.util.Dom.addClass('bz_flags_more_container', 'bz_default_hidden'); + for (var i = 0; i < rows.length; i++) { + YAHOO.util.Dom.removeClass(rows[i], 'bz_default_hidden'); + } + YAHOO.util.Event.preventDefault(e); + }); + </script> + [% END %] </td> </tr> [% END %] @@ -917,7 +988,11 @@ [% BLOCK section_customfields %] [%# *** Custom Fields *** %] [% USE Bugzilla %] - [% FOREACH field = Bugzilla.active_custom_fields %] + [% FOREACH field = Bugzilla.active_custom_fields(product=>bug.product_obj,component=>bug.component_obj) %] + [% NEXT IF field.type == constants.FIELD_TYPE_EXTENSION %] + [% NEXT IF NOT user.id AND field.value == "---" %] + [% Hook.process('custom_field', 'bug/edit.html.tmpl') %] + [% NEXT IF field.hidden %] <tr> [% PROCESS bug/field.html.tmpl value = bug.${field.name} editable = bug.check_can_change_field(field.name, 0, 1) @@ -1068,7 +1143,7 @@ <label for="comment" accesskey="c"><b>Additional <u>C</u>omments</b></label>: - [% IF user.is_insider %] + [% IF user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %] <input type="checkbox" name="comment_is_private" value="1" id="newcommentprivacy" onClick="updateCommentTagControl(this, 'comment')"> @@ -1080,23 +1155,32 @@ <!-- This table keeps the submit button aligned with the box. --> <table><tr><td> - [% INCLUDE global/textarea.html.tmpl - name = 'comment' - id = 'comment' - minrows = 10 - maxrows = 25 - cols = constants.COMMENT_COLS - %] - [% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %] + [% IF bug.check_can_change_field('longdesc', 0, 1) %] + [% INCLUDE bug/comment.html.tmpl + minrows = 10 + maxrows = 25 + cols = constants.COMMENT_COLS + %] + [% Hook.process("after_comment_textarea", 'bug/edit.html.tmpl') %] + [% ELSE %] + <div id="comment"> + <fieldset> + <legend>Note</legend> + You are not allowed to make an additional comment on this [% terms.bug %]. + </fieldset> + </div> + [% END %] <br> [% PROCESS commit_button id=""%] + [% Hook.process("after_comment_commit_button", 'bug/edit.html.tmpl') %] + <table id="bug_status_bottom" class="status" cellspacing="0" cellpadding="0"> <tr> - <td class="field_label"> - <b><a href="page.cgi?id=fields.html#status">Status</a></b>: - </td> + <th class="field_label"> + <a href="page.cgi?id=fields.html#status">Status</a>: + </th> <td> [% PROCESS bug/knob.html.tmpl %] </td> @@ -1123,6 +1207,21 @@ </div> [% END %] +[% BLOCK summon_comment_box %] +<div id="comment_top_hat"> + <script type="text/javascript"> + function summonCommentBox() { + var commentbox = document.getElementById('add_comment'); + document.getElementById('comment_top_hat').appendChild(commentbox); + document.getElementById('wave_wand').style.display = 'none'; + } + </script> + <p id="wave_wand"> + <a href="javascript:summonCommentBox()"><i>Summon comment box</i></a> + </p> +</div> +[% END %] + [%############################################################################%] [%# Block for SELECT fields #%] [%############################################################################%] @@ -1131,6 +1230,7 @@ <td> [% IF bug.check_can_change_field(selname, 0, 1) AND bug.choices.${selname}.size > 1 %] + <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} %] diff --git a/template/en/default/bug/field-help.none.tmpl b/template/en/default/bug/field-help.none.tmpl index a9449fbcd..9985e4172 100644 --- a/template/en/default/bug/field-help.none.tmpl +++ b/template/en/default/bug/field-help.none.tmpl @@ -89,6 +89,10 @@ estimated_time => "The amount of time that has been estimated it will take to resolve this ${terms.bug}.", +importance => + "The importance of $terms.abug is described as the combination of + its $vars.field_descs.priority and ${vars.field_descs.bug_severity}.", + keywords => "You can add keywords from a defined list to $terms.bugs, in order" _ " to easily identify and group them.", diff --git a/template/en/default/bug/field.html.tmpl b/template/en/default/bug/field.html.tmpl index 58f1b0ccc..e9eefd419 100644 --- a/template/en/default/bug/field.html.tmpl +++ b/template/en/default/bug/field.html.tmpl @@ -57,8 +57,9 @@ 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" + [% 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 %] @@ -97,6 +98,7 @@ </script> [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT constants.FIELD_TYPE_MULTI_SELECT ] %] + <input type="hidden" id="[% field.name FILTER html %]_dirty"> <select id="[% field.name FILTER html %]" name="[% field.name FILTER html %]" [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %] @@ -121,6 +123,30 @@ [% END %] [% FOREACH legal_value = legal_values %] [% NEXT IF NOT legal_value.is_active AND NOT value.contains(legal_value.name).size %] + + [%# Purpose: hide field values from those who can't change them %] + [% IF field.name.match("^cf_blocking_") OR + field.name.match("^cf_status_") OR + field.name.match("^cf_tracking_") OR + field.name == "resolution" %] + [% NEXT UNLESS bug.check_can_change_field(field.name, '---', legal_value.name) OR + value.contains(legal_value.name).size %] + [% END %] + + [% IF field.name == "resolution" && + legal_value.name != bug.resolution %] + [% r = legal_value.name %] + [% IF bug.user.canconfirm && + !(bug.user.canedit || bug.user.isreporter) %] + [% NEXT IF r != "WORKSFORME" && r != "INCOMPLETE" %] + [% END %] + [% IF bug.user.isreporter && + !(bug.user.canconfirm || bug.user.canedit) %] + [% NEXT IF r == "INCOMPLETE" %] + [% END %] + [% NEXT IF r == "EXPIRED" %] + [% END %] + <option value="[% legal_value.name FILTER html %]" id="v[% legal_value.id FILTER html %]_ [%- field.name FILTER html %]" @@ -155,36 +181,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> + (<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="keyword_container"> @@ -201,6 +247,8 @@ YAHOO.bugzilla.keywordAutocomplete.init('[% field.name FILTER js %]', 'keyword_autocomplete'); </script> + [% CASE constants.FIELD_TYPE_EXTENSION %] + [% Hook.process('editable') %] [% END %] [% ELSE %] [% SWITCH field.type %] @@ -224,10 +272,18 @@ </li> [% END %] [% '</ul>' IF value.size %] + [% CASE constants.FIELD_TYPE_EXTENSION %] + [% Hook.process('non_editable') %] [% CASE %] [% 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/navigate.html.tmpl b/template/en/default/bug/navigate.html.tmpl index 46b92aec4..95fe5a411 100644 --- a/template/en/default/bug/navigate.html.tmpl +++ b/template/en/default/bug/navigate.html.tmpl @@ -28,19 +28,28 @@ [% bug.bug_id FILTER uri %]">Format For Printing</a></li> <li> - <a href="show_bug.cgi?ctype=xml&id= [% bug.bug_id FILTER uri %]">XML</a></li> - <li> - <a href="enter_bug.cgi?cloned_bug_id= - [% bug.bug_id FILTER uri %]">Clone This + <li> - <a href="enter_bug.cgi?format=__default__&cloned_bug_id= + [% bug.bug_id FILTER uri %]" + id="clone_bug">Clone This [% terms.Bug %]</a></li> [%# Links to more things users can do with this bug. %] [% Hook.process("links") %] <li> - <a href="#">Top of page </a></li> - </ul> -[% END %] - + </ul> + <script type="text/javascript"> + YAHOO.util.Event.onDOMReady(function() { + init_clone_bug_menu( + YAHOO.util.Dom.get('clone_bug'), + '[% bug.bug_id FILTER js %]', + '[% bug.product FILTER js %]', + '[% bug.component FILTER js %]'); + }); + </script> +[% 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> @@ -74,14 +83,5 @@ <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 b0132a2fe..21e4ff7b7 100644 --- a/template/en/default/bug/process/bugmail.html.tmpl +++ b/template/en/default/bug/process/bugmail.html.tmpl @@ -24,37 +24,59 @@ # sent_bugmail: The results of Bugzilla::BugMail::Send(). #%] +[% USE CGI %] [% PROCESS global/variables.none.tmpl %] -<dl> -[% PROCESS emails - description = "Email sent to" - names = sent_bugmail.sent +[%# hide the recipient list by default from new users %] +[% show_recipients = + user.settings.post_bug_submit_action.value == 'nothing' + || CGI.cookie('show_bugmail_recipients') + || !user.can_see_bug(mailing_bugid) %] +[% recipient_count = sent_bugmail.sent.size %] -[% PROCESS emails - description = "Excluding" - names = sent_bugmail.excluded -%] -</dl> +<script> +function toggleBugmailRecipients(bug_id, show) { + if (show) { + YAHOO.util.Dom.removeClass('bugmail_summary_' + bug_id, 'bz_default_hidden'); + YAHOO.util.Dom.addClass('bugmail_summary_' + bug_id + '_short', 'bz_default_hidden'); + } else { + YAHOO.util.Dom.addClass('bugmail_summary_' + bug_id, 'bz_default_hidden'); + YAHOO.util.Dom.removeClass('bugmail_summary_' + bug_id + '_short', 'bz_default_hidden'); + } + YAHOO.util.Cookie.set('show_bugmail_recipients', (show ? 1 : 0), { + expires: new Date("January 12, 2025") + }); + return false; +} +</script> -[%############################################################################%] -[%# Block for a set of email addresses #%] -[%############################################################################%] - -[% BLOCK emails %] - <dt>[% description FILTER html %]:</dt> +<dl id="bugmail_summary_[% mailing_bugid FILTER none %]" + class="[% show_recipients ? "" : "bz_default_hidden" %]"> + <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 > 0 %] + [%+ FOREACH name = sent_bugmail.sent %] <code>[% name FILTER html %]</code>[% ", " UNLESS loop.last() %] [% END %] [% ELSE %] no one [% END %] + (<a href="#" onclick="return toggleBugmailRecipients([% mailing_bugid FILTER none %], false)">hide</a>) [% ELSE %] (list of e-mails not available) [% END %] </dd> -[% END %] +</dl> + +<div id="bugmail_summary_[% mailing_bugid FILTER none %]_short" + class="[% show_recipients ? "bz_default_hidden" : "" %]"> + [% IF recipient_count > 0 %] + Email sent to [% recipient_count FILTER html %] recipient[% 's' UNLESS recipient_count == 1 %]. + (<a href="#" onclick="return toggleBugmailRecipients([% mailing_bugid FILTER none %], true)">show</a>) + [% ELSE %] + No emails were sent. + [% END %] +</div> + diff --git a/template/en/default/bug/process/updates-disabled.html.tmpl b/template/en/default/bug/process/updates-disabled.html.tmpl new file mode 100644 index 000000000..5ea84d476 --- /dev/null +++ b/template/en/default/bug/process/updates-disabled.html.tmpl @@ -0,0 +1,73 @@ +[%# The contents of this file are subject to the Mozilla Public License Version + # 1.1 (the "License"); you may not use this file except in compliance with + # the License. You may obtain a copy of the License at + # http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS IS" basis, + # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + # for the specific language governing rights and limitations under the + # License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is + # the Mozilla Foundation. + # Portions created by the Initial Developer are Copyright (C) 2011 + # the Initial Developer. All Rights Reserved. + # + # Contributor(s): Byron Jones <glob@mozilla.com> + # + #%] +[% PROCESS global/variables.none.tmpl %] +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> +<html> +<head> +<title>[% terms.Bugzilla %] - [% terms.Bug %] Updates Temporarily Suspended</title> +<style type="text/css"> +body { + margin: 2em; + background-color: #455372; + color: #fff; + font-family: verdana, sans-serif; + font-size: small; +} +a { + color: #fff; + text-decoration: underline; +} +#buggie { + float: left; +} +#content { + margin-left: 100px; + max-width: 600px; +} +</style> +</head> +<body> +<img src="images/buggie.png" id="buggie" alt="buggie"> +<div id="content"> +<h1>[% terms.Bug %] Updates Temporarily Suspended</h1> + +<p> +We are currently adding a field to [% terms.Bugzilla %]. This requires us to +prevent updates to [% terms.bugs %] for the duration of the database schema +change to add the field (usually 3 to 5 minutes). +</p> + +<p> +<b>You should be able to leave this page open, wait a minute or two, then hit +reload or refresh in your browser</b> (and OK any request to re-send the form +data) to complete your [% terms.bug %] change. Once this maintenance is +complete, your change will succeed and you won't get this page any more. +</p> + +<p> +Only updates to [% terms.bugs %] are being blocked by this page, any other +activities in [% terms.Bugzilla %] are still fair game. <a href="index.cgi" +target="_blank">Open [% terms.Bugzilla %] in a new tab/window</a> if you'd +like, to continue working on other things while waiting. +</p> +</div> +</body> +</html> 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 c02c26470..1d2e8689f 100644 --- a/template/en/default/bug/process/verify-new-product.html.tmpl +++ b/template/en/default/bug/process/verify-new-product.html.tmpl @@ -120,9 +120,9 @@ [% IF old_groups.size %] <p>These groups are not legal for the '[% product.name FILTER html %]' - product or you are not allowed to restrict [% terms.bugs %] to these groups. - [%+ terms.Bugs %] will no longer be restricted to these groups and may become - public if no other group applies:<br> + product or you are not allowed to restrict [% terms.bugs %] to these groups.<br> + <b>[%+ terms.Bugs %] will no longer be restricted to these groups and may become + public if no other group applies:</b><br> [% FOREACH group = old_groups %] <input type="checkbox" id="group_[% group.id FILTER html %]" name="groups" disabled="disabled" value="[% group.name FILTER html %]"> @@ -150,6 +150,9 @@ [% END %] [% END %] + [%# BMO - check the default product sec-group to avoid accidental removal of all groups %] + [% CALL Bugzilla.check_default_product_security_group(product, old_groups, optional_groups) %] + [% IF optional_groups.size %] <p>These groups are optional. You can decide to restrict [% terms.bugs %] to one or more of the following groups:<br> diff --git a/template/en/default/bug/show-header.html.tmpl b/template/en/default/bug/show-header.html.tmpl index 54570911d..9f2127d23 100644 --- a/template/en/default/bug/show-header.html.tmpl +++ b/template/en/default/bug/show-header.html.tmpl @@ -31,24 +31,46 @@ [% 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" %] +[% title = "$terms.Bug $bug.bug_id – " %] +[% IF bug.alias != '' %] + [% title = title _ "($bug.alias) " %] +[% END %] +[% title = title _ filtered_desc %] [% header = "$terms.Bug $bug.bug_id" %] [% header_addl_info = "Last modified: $filtered_timestamp" %] [% yui = ['autocomplete', 'calendar'] %] +[% yui.push('container') IF user.can_tag_comments %] [% javascript_urls = [ "js/util.js", "js/field.js" ] %] +[% javascript_urls.push('js/comment-tagging.js') + IF user.id && Param('comment_taggers_group') %] [% IF bug.defined %] - [% unfiltered_title = "$terms.Bug $bug.bug_id – $bug.short_desc" %] + [% unfiltered_title = "$terms.Bug $bug.bug_id – " %] + [% IF bug.alias != '' %] + [% unfiltered_title = unfiltered_title _ "($bug.alias) " %] + [% END %] + [% unfiltered_title = unfiltered_title _ bug.short_desc %] [% javascript = BLOCK %] - if( !document.location.href.match(/show_bug\.cgi/) && history && history.replaceState ) { - history.replaceState( null, - "[% unfiltered_title FILTER js %]", - "show_bug.cgi?id=[% bug.bug_id FILTER js %]" ); - document.title = "[% unfiltered_title FILTER js %]"; + if (history && history.replaceState) { + if(!document.location.href.match(/show_bug\.cgi/)) { + history.replaceState( null, + "[% unfiltered_title FILTER js %]", + "show_bug.cgi?id=[% bug.bug_id FILTER js %]" ); + document.title = "[% unfiltered_title FILTER js %]"; + } + if (document.location.href.match(/show_bug\.cgi\?.*list_id=/)) { + var href = document.location.href; + href = href.replace(/[\?&]+list_id=(\d+|cookie)/, ''); + history.replaceState(null, "[% unfiltered_title FILTER js %]", href); + } } + YAHOO.util.Event.onDOMReady(function() { + initDirtyFieldTracking(); + }); [% javascript FILTER none %] [% END %] [% END %] -[% style_urls = [ "skins/standard/show_bug.css" ] %] +[% style_urls = [ "skins/standard/show_bug.css", + "skins/custom/bug_groups.css" ] %] [% doc_section = "bug_page.html" %] [% bodyclasses = ['bz_bug', "bz_status_$bug.bug_status", diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl index 7c2b5345e..cfd0d8e20 100644 --- a/template/en/default/bug/show-multiple.html.tmpl +++ b/template/en/default/bug/show-multiple.html.tmpl @@ -191,7 +191,7 @@ [% USE Bugzilla %] [% field_counter = 0 %] - [% FOREACH field = Bugzilla.active_custom_fields %] + [% FOREACH field = Bugzilla.active_custom_fields(product=>bug.product_obj,component=>bug.component_obj,bug_id=>bug.id) %] [% field_counter = field_counter + 1 %] [%# Odd-numbered fields get an opening <tr> %] [% '<tr>' IF field_counter % 2 %] diff --git a/template/en/default/bug/show.xml.tmpl b/template/en/default/bug/show.xml.tmpl index dae207f26..c0f32d69e 100644 --- a/template/en/default/bug/show.xml.tmpl +++ b/template/en/default/bug/show.xml.tmpl @@ -20,8 +20,10 @@ # #%] [% PROCESS bug/time.html.tmpl %] +[% USE Bugzilla %] +[% cgi = Bugzilla.cgi %] <?xml version="1.0" [% IF Param('utf8') %]encoding="UTF-8" [% END %]standalone="yes" ?> -<!DOCTYPE bugzilla SYSTEM "[% urlbase FILTER html %]bugzilla.dtd"> +<!DOCTYPE bugzilla [% IF cgi.param('dtd') %][[% PROCESS pages/bugzilla.dtd.tmpl %]][% ELSE %]SYSTEM "[% urlbase FILTER xml %]page.cgi?id=bugzilla.dtd"[% END %]> <bugzilla version="[% constants.BUGZILLA_VERSION %]" urlbase="[% urlbase FILTER xml %]" diff --git a/template/en/default/bug/time.html.tmpl b/template/en/default/bug/time.html.tmpl index e070e7de0..c58675b96 100644 --- a/template/en/default/bug/time.html.tmpl +++ b/template/en/default/bug/time.html.tmpl @@ -18,7 +18,7 @@ # Contributor(s): Jeff Hedlund <jeff.hedlund@matrixsi.com> # #%] - + [% BLOCK formattimeunit %] [%# INTERFACE: # time_unit: the number converting, converts to 2 decimal places @@ -26,11 +26,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/config.rdf.tmpl b/template/en/default/config.rdf.tmpl index 15f784ce8..5686d138b 100644 --- a/template/en/default/config.rdf.tmpl +++ b/template/en/default/config.rdf.tmpl @@ -168,12 +168,12 @@ <bz:component rdf:about="[% escaped_urlbase %]component.cgi?name=[% component.name FILTER uri %]&product=[% product.name FILTER uri %]"> <bz:name>[% component.name FILTER html %]</bz:name> + <bz:is_active>[% component.is_active FILTER html %]</bz:is_active> [% IF show_flags %] <bz:flag_types> <Seq> [% flag_types = component.flag_types.bug.merge(component.flag_types.attachment) %] [% FOREACH flag_type = flag_types %] - [% NEXT UNLESS flag_type.is_active %] [% all_visible_flag_types.${flag_type.id} = flag_type %] <li resource="[% escaped_urlbase %]flag.cgi?id=[% flag_type.id FILTER uri %]&name=[% flag_type.name FILTER uri %]" /> @@ -195,6 +195,7 @@ <li> <bz:version rdf:about="[% escaped_urlbase %]version.cgi?name=[% version.name FILTER uri %]"> <bz:name>[% version.name FILTER html %]</bz:name> + <bz:is_active>[% version.is_active FILTER html %]</bz:is_active> </bz:version> </li> [% END %] @@ -210,6 +211,7 @@ <li> <bz:target_milestone rdf:about="[% escaped_urlbase %]milestone.cgi?name=[% milestone.name FILTER uri %]"> <bz:name>[% milestone.name FILTER html %]</bz:name> + <bz:is_active>[% milestone.is_active FILTER html %]</bz:is_active> </bz:target_milestone> </li> [% END %] diff --git a/template/en/default/email/bugmail-header.txt.tmpl b/template/en/default/email/bugmail-header.txt.tmpl index 94559a942..679e705cd 100644 --- a/template/en/default/email/bugmail-header.txt.tmpl +++ b/template/en/default/email/bugmail-header.txt.tmpl @@ -23,25 +23,17 @@ [% PROCESS "global/field-descs.none.tmpl" %] [% PROCESS "global/reason-descs.none.tmpl" %] [% isnew = bug.lastdiffed ? 0 : 1 %] +[% show_new = isnew + && (to_user.settings.bugmail_new_prefix.value == 'on') %] From: [% Param('mailfrom') %] To: [% to_user.email %] -Subject: [[% terms.Bug %] [%+ bug.id %]] [% 'New: ' IF isnew %][%+ bug.short_desc %] +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-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 %] +[%+ INCLUDE "email/header-common.txt.tmpl" %] X-Bugzilla-Changed-Fields: [% changedfields.join(" ") %] +X-Bugzilla-Changed-Field-Names: [% changedfieldnames.join(" ") %] [%+ threadingmarker %] diff --git a/template/en/default/email/bugmail.html.tmpl b/template/en/default/email/bugmail.html.tmpl index d52fe6306..2cd9318c1 100644 --- a/template/en/default/email/bugmail.html.tmpl +++ b/template/en/default/email/bugmail.html.tmpl @@ -34,15 +34,30 @@ <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> + 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 %] + <hr> + <span>Referenced [% terms.Bugs %]:</span> + + <ul> + [% FOREACH ref = referenced_bugs %] + <li> + [<a href="[% urlbase FILTER html %]show_bug.cgi?id=[% ref.id FILTER none %]"> + [% terms.Bug %] [% ref.id FILTER none %]</a>] [% ref.short_desc FILTER html %] + </li> + [% END %] + </ul> + [% END %] + <hr> <span>You are receiving this mail because:</span> - + <ul> [% FOREACH reason = reasons %] [% IF reason_descs.$reason %] @@ -75,7 +90,7 @@ FILTER bug_link(change.blocker, {full_url => 1, user => to_user}) FILTER none %], which changed state. [% ELSE %] - [% INCLUDE global/user.html.tmpl who = change.who %] changed + [% INCLUDE global/user.html.tmpl user = to_user, who = change.who %] changed [%+ "${terms.bug} ${bug.id}" FILTER bug_link(bug, {full_url => 1, user => to_user}) FILTER none %] [% END %] <br> diff --git a/template/en/default/email/bugmail.txt.tmpl b/template/en/default/email/bugmail.txt.tmpl index a3a0b873c..525070d99 100644 --- a/template/en/default/email/bugmail.txt.tmpl +++ b/template/en/default/email/bugmail.txt.tmpl @@ -34,6 +34,15 @@ [% END %] [%+ comment.body_full({ is_bugmail => 1, wrap => 1 }) FILTER strip_control_chars %] [% END %] +[% IF referenced_bugs.size %] + +Referenced [% terms.Bugs %]: + +[% FOREACH ref = referenced_bugs %] +[%+ urlbase %]show_bug.cgi?id=[% ref.id %] +[%+ "[" _ terms.Bug _ " " _ ref.id _ "] " _ ref.short_desc FILTER wrap_comment(76) %] +[% END %] +[% END %] -- [%# Protect the trailing space of the signature marker %] You are receiving this mail because: 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..3f3b7d373 --- /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-ID: [% bug.id %] +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 %] +X-Bugzilla-Target-Milestone: [% bug.target_milestone %] +X-Bugzilla-Flags:[% FOREACH flag = bug.flags %] [%+ flag.name %][% flag.status %][% END %] +X-Bugzilla-OS: [% bug.op_sys %] diff --git a/template/en/default/email/lockout.txt.tmpl b/template/en/default/email/lockout.txt.tmpl index ac6525779..94e9c74cb 100644 --- a/template/en/default/email/lockout.txt.tmpl +++ b/template/en/default/email/lockout.txt.tmpl @@ -22,10 +22,10 @@ From: [% Param('mailfrom') %] To: [% Param('maintainer') %] -Subject: [[% terms.Bugzilla %]] Account Lock-Out: [% locked_user.login %] ([% attempts.0.ip_addr %]) +Subject: [[% terms.Bugzilla %]] Account Lock-Out: [% locked_user.login %] ([% address %]) X-Bugzilla-Type: admin -The IP address [% attempts.0.ip_addr %] failed too many login attempts ( +The address [% address %] failed too many login attempts ( [%- constants.MAX_LOGIN_ATTEMPTS +%]) for the account [% locked_user.login %]. diff --git a/template/en/default/extensions/config.pm.tmpl b/template/en/default/extensions/config.pm.tmpl index 6997ec178..07ac83a41 100644 --- a/template/en/default/extensions/config.pm.tmpl +++ b/template/en/default/extensions/config.pm.tmpl @@ -1,33 +1,20 @@ -[%# -*- mode: perl -*- %] -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ +[%# 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/. # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Everything Solved, Inc. - # Portions created by the Initial Developer are Copyright (C) 2009 the - # Initial Developer. All Rights Reserved. - # - # Contributor(s): - # Max Kanat-Alexander <mkanat@bugzilla.org> + # 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. #%] -[% PROCESS global/variables.none.tmpl %] - [% PROCESS extensions/license.txt.tmpl %] package B[% %]ugzilla::Extension::[% name %]; + +use 5.10.1; use strict; use constant NAME => '[% name %]'; diff --git a/template/en/default/extensions/extension.pm.tmpl b/template/en/default/extensions/extension.pm.tmpl index 249227103..ebeb73719 100644 --- a/template/en/default/extensions/extension.pm.tmpl +++ b/template/en/default/extensions/extension.pm.tmpl @@ -1,35 +1,22 @@ -[%# -*- mode: perl -*- %] -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ +[%# 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/. # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Everything Solved, Inc. - # Portions created by the Initial Developer are Copyright (C) 2009 the - # Initial Developer. All Rights Reserved. - # - # Contributor(s): - # Max Kanat-Alexander <mkanat@bugzilla.org> + # 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. #%] -[% PROCESS global/variables.none.tmpl %] - [% PROCESS extensions/license.txt.tmpl %] package B[% %]ugzilla::Extension::[% name %]; + +use 5.10.1; use strict; -use base qw(B[% %]ugzilla::Extension); +use parent qw(B[% %]ugzilla::Extension); # This code for this is in [% path %]/lib/Util.pm use B[% %]ugzilla::Extension::[% name %]::Util; diff --git a/template/en/default/extensions/hook-readme.txt.tmpl b/template/en/default/extensions/hook-readme.txt.tmpl index efceec136..63e09e419 100644 --- a/template/en/default/extensions/hook-readme.txt.tmpl +++ b/template/en/default/extensions/hook-readme.txt.tmpl @@ -1,25 +1,11 @@ -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ +[%# 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/. # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Everything Solved, Inc. - # Portions created by the Initial Developer are Copyright (C) 2009 the - # Initial Developer. All Rights Reserved. - # - # Contributor(s): - # Max Kanat-Alexander <mkanat@bugzilla.org> + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. #%] -[% PROCESS global/variables.none.tmpl %] - Template hooks go in this directory. Template hooks are called in normal [%+ terms.Bugzilla %] templates like [[% '%' %] Hook.process('some-hook') %]. More information about them can be found in the documentation of diff --git a/template/en/default/extensions/license.txt.tmpl b/template/en/default/extensions/license.txt.tmpl index 964e07505..6acde01e0 100644 --- a/template/en/default/extensions/license.txt.tmpl +++ b/template/en/default/extensions/license.txt.tmpl @@ -1,47 +1,18 @@ -[%# -*- mode: perl -*- %] -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ +[%# 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/. # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Everything Solved, Inc. - # Portions created by the Initial Developer are Copyright (C) 2009 the - # Initial Developer. All Rights Reserved. - # - # Contributor(s): - # Max Kanat-Alexander <mkanat@bugzilla.org> + # 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. #%] -[% PROCESS global/variables.none.tmpl %] - -# -*- Mode: perl; indent-tabs-mode: nil -*- -# -# The contents of this file are subject to the Mozilla Public -# License Version 1.1 (the "License"); you may not use this file -# except in compliance with the License. You may obtain a copy of -# the License at http://www.mozilla.org/MPL/ -# -# Software distributed under the License is distributed on an "AS -# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -# implied. See the License for the specific language governing -# rights and limitations under the License. -# -# The Original Code is the [% name %] [%+ terms.Bugzilla %] Extension. -# -# The Initial Developer of the Original Code is YOUR NAME -# Portions created by the Initial Developer are Copyright (C) [% year %] the -# Initial Developer. All Rights Reserved. +# 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/. # -# Contributor(s): -# YOUR NAME <YOUR EMAIL ADDRESS> +# This Source Code Form is "Incompatible With Secondary Licenses", as +# defined by the Mozilla Public License, v. 2.0. diff --git a/template/en/default/extensions/name-readme.txt.tmpl b/template/en/default/extensions/name-readme.txt.tmpl index 6d25c839e..5403bab7f 100644 --- a/template/en/default/extensions/name-readme.txt.tmpl +++ b/template/en/default/extensions/name-readme.txt.tmpl @@ -1,25 +1,11 @@ -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ +[%# 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/. # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Everything Solved, Inc. - # Portions created by the Initial Developer are Copyright (C) 2009 the - # Initial Developer. All Rights Reserved. - # - # Contributor(s): - # Max Kanat-Alexander <mkanat@bugzilla.org> + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. #%] -[% PROCESS global/variables.none.tmpl %] - Normal templates go in this directory. You can load them in your code like this: diff --git a/template/en/default/extensions/util.pm.tmpl b/template/en/default/extensions/util.pm.tmpl index 32076a665..3493007f4 100644 --- a/template/en/default/extensions/util.pm.tmpl +++ b/template/en/default/extensions/util.pm.tmpl @@ -1,35 +1,22 @@ -[%# -*- mode: perl -*- %] -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ +[%# 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/. # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Everything Solved, Inc. - # Portions created by the Initial Developer are Copyright (C) 2009 the - # Initial Developer. All Rights Reserved. - # - # Contributor(s): - # Max Kanat-Alexander <mkanat@bugzilla.org> + # 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. #%] -[% PROCESS global/variables.none.tmpl %] - [% PROCESS extensions/license.txt.tmpl %] package B[% %]ugzilla::Extension::[% name %]::Util; + +use 5.10.1; use strict; -use base qw(Exporter); +use parent qw(Exporter); our @EXPORT = qw( ); diff --git a/template/en/default/extensions/web-readme.txt.tmpl b/template/en/default/extensions/web-readme.txt.tmpl index 55e593914..41dcd8edf 100644 --- a/template/en/default/extensions/web-readme.txt.tmpl +++ b/template/en/default/extensions/web-readme.txt.tmpl @@ -1,25 +1,11 @@ -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ +[%# 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/. # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Everything Solved, Inc. - # Portions created by the Initial Developer are Copyright (C) 2010 the - # Initial Developer. All Rights Reserved. - # - # Contributor(s): - # Max Kanat-Alexander <mkanat@bugzilla.org> + # This Source Code Form is "Incompatible With Secondary Licenses", as + # defined by the Mozilla Public License, v. 2.0. #%] -[% PROCESS global/variables.none.tmpl %] - Web-accessible files, like JavaScript, CSS, and images go in this directory. You can reference them directly in your HTML. For example, if you have a file called "style.css" and your extension is called diff --git a/template/en/default/filterexceptions.pl b/template/en/default/filterexceptions.pl index 897ab148e..84ff45db7 100644 --- a/template/en/default/filterexceptions.pl +++ b/template/en/default/filterexceptions.pl @@ -52,7 +52,6 @@ ], 'flag/list.html.tmpl' => [ - 'flag.id', 'flag.status', 'type.id', ], @@ -282,8 +281,7 @@ '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")', ], @@ -321,7 +319,6 @@ 'attachment/edit.html.tmpl' => [ 'attachment.id', 'attachment.bug_id', - 'a', 'editable_or_hide', ], diff --git a/template/en/default/flag/list.html.tmpl b/template/en/default/flag/list.html.tmpl index 4467e81ce..0d84e9bff 100644 --- a/template/en/default/flag/list.html.tmpl +++ b/template/en/default/flag/list.html.tmpl @@ -18,7 +18,7 @@ # Contributor(s): Myk Melez <myk@mozilla.org> #%] -[% IF user.id AND !read_only_flags %] +[% 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, @@ -51,85 +51,30 @@ [%-# Step 1a: Display existing flag(s). %] [% FOREACH flag = type.flags %] - <tr> - <td> - <span title="[% flag.setter.identity FILTER html %]">[% flag.setter.nick FILTER html %]</span>: - </td> - <td> - <label title="[% type.description FILTER html %]" - for="flag-[% flag.id %]"> - [%- type.name FILTER html FILTER no_break -%]</label> - </td> - <td> - <select id="flag-[% flag.id %]" name="flag-[% flag.id %]" - title="[% type.description FILTER html %]" - onchange="toggleRequesteeField(this);" - class="flag_select flag_type-[% type.id %]"> - [%# Only display statuses the user is allowed to set. %] - [% IF user.can_request_flag(type) || flag.setter_id == user.id %] - <option value="X"></option> - [% END %] - [% IF type.is_active %] - [% IF (type.is_requestable && user.can_request_flag(type)) || flag.status == "?" %] - <option value="?" [% "selected" IF flag.status == "?" %]>?</option> - [% END %] - [% IF user.can_set_flag(type) || flag.status == "+" %] - <option value="+" [% "selected" IF flag.status == "+" %]>+</option> - [% END %] - [% IF user.can_set_flag(type) || flag.status == "-" %] - <option value="-" [% "selected" IF flag.status == "-" %]>-</option> - [% END %] - [% ELSE %] - <option value="[% flag.status %]" selected="selected">[% flag.status %]</option> - [% END %] - </select> - </td> - [% IF any_flags_requesteeble %] - <td> - [% IF (type.is_active && type.is_requestable && type.is_requesteeble) || flag.requestee %] - <span style="white-space: nowrap;"> - [% SET flag_custom_list = [] %] - [% IF Param('usemenuforusers') %] - [% flag_custom_list = flag.type.grant_list %] - [% IF !(type.is_active && type.is_requestable && type.is_requesteeble) %] - [%# 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. %] - [% flag_custom_list = [flag.requestee] %] - [% END %] - [% END %] - [% INCLUDE global/userselect.html.tmpl - name => "requestee-$flag.id" - id => "requestee-$flag.id" - value => flag.requestee.login - multiple => 0 - emptyok => 1 - classes => ["requestee"] - custom_userlist => flag_custom_list - %] - </span> - [% END %] - </td> - [% END %] - </tr> + [% 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 %] - - [% PROCESS flag_row first_cell_empty = 1 addl_text = "" %] + [% PROCESS flag_row type = type %] [% 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 %] - <tr><td colspan="3"><hr></td></tr> + [% 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"> + <tr><td colspan="3"><hr></td></tr> + </tbody> [% separator_displayed = 1 %] + [% END %] + [% PROCESS flag_row type = type addl_text = "addl." %] [% END %] - - [% PROCESS flag_row first_cell_empty = 0 addl_text = "addl." %] [% END %] </table> @@ -159,58 +104,87 @@ [% END %] [% END %] -[%# Display a table row for unset flags %] +[%# Display a table row for flags %] [% BLOCK flag_row %] - <tr> - [% IF first_cell_empty %] - <td> </td> - <td> - [% ELSE %] - <td colspan="2"> - [% END %] - - [% addl_text FILTER html %] - <label title="[% type.description FILTER html %]" for="flag_type-[% type.id %]"> - [%- type.name FILTER html FILTER no_break %]</label> - </td> - <td> - <select id="flag_type-[% type.id %]" name="flag_type-[% type.id %]" - title="[% type.description FILTER html %]" - [% " disabled=\"disabled\"" UNLESS (type.is_requestable && user.can_request_flag(type)) || user.can_set_flag(type) %] - onchange="toggleRequesteeField(this);" - class="flag_select flag_type-[% type.id %]"> - <option value="X"></option> - [% IF type.is_requestable && user.can_request_flag(type) %] - <option value="?">?</option> - [% END %] - [% IF user.can_set_flag(type) %] - <option value="+">+</option> - <option value="-">-</option> + [% 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> + [% IF flag %] + <span title="[% flag.setter.identity FILTER html %]">[% flag.setter.nick FILTER html %]</span>: + [% ELSE %] + [% addl_text FILTER html %] [% END %] - </select> - </td> - [% IF any_flags_requesteeble %] + </td> + <td> + <label title="[% type.description FILTER html %]" for="[% fid FILTER html %]"> + [%- type.name FILTER html FILTER no_break -%]</label> + </td> <td> - [% IF type.is_requestable && type.is_requesteeble %] - <span style="white-space: nowrap;"> - [% SET grant_list = [] %] - [% IF Param('usemenuforusers') %] - [% grant_list = type.grant_list %] - [% END %] - [% INCLUDE global/userselect.html.tmpl - name => "requestee_type-$type.id" - id => "requestee_type-$type.id" - multiple => type.is_multiplicable * 3 - emptyok => !type.is_multiplicable - value => "" - custom_userlist => grant_list - classes => ["requestee"] - %] - - </span> + <input type="hidden" id="[% fid FILTER html %]_dirty"> + <select id="[% fid FILTER html %]" name="[% fid FILTER html %]" + [% IF !flag && !((type.is_requestable && user.can_request_flag(type)) || user.can_set_flag(type)) %] + disabled="disabled" + [% END %] + title="[% type.description FILTER html %]" + onchange="toggleRequesteeField(this);" + 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 || (can_edit_flag && user.can_request_flag(type)) || flag.setter_id == user.id %] + <option value="X"></option> [% END %] + [% 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 %] + [% IF user.can_set_flag(type) || (flag && flag.status == "+") %] + <option value="+" [% "selected" IF flag && flag.status == "+" %]>+</option> + [% END %] + [% IF user.can_set_flag(type) || (flag && flag.status == "-") %] + <option value="-" [% "selected" IF flag && flag.status == "-" %]>-</option> + [% END %] + [% ELSE %] + <option value="[% flag.status %]" selected="selected">[% flag.status %]</option> + [% END %] + </select> </td> - [% END %] - </tr> + [% IF any_flags_requesteeble %] + <td> + [% IF (type.is_active && type.is_requestable && type.is_requesteeble) || (flag && flag.requestee) %] + <span style="white-space: nowrap;"> + [% SET grant_list = [] %] + [% IF Param('usemenuforusers') %] + [% 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" %] + [% SET flag_requestee = (flag && flag.requestee) ? flag.requestee.login : '' %] + [% SET flag_multiple = flag ? 0 : type.is_multiplicable * 3 %] + [% SET flag_empty_ok = flag ? 1 : !type.is_multiplicable %] + [% INCLUDE global/userselect.html.tmpl + name => flag_name + id => flag_name + value => flag_requestee + multiple => flag_multiple + emptyok => flag_empty_ok + classes => ["requestee"] + custom_userlist => grant_list + disabled => !can_edit_flag + %] + [% Hook.process("requestee", "flag/list.html.tmpl") %] + </span> + [% END %] + </td> + [% END %] + </tr> + </tbody> [% END %] diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl index 877fe8d66..62442c268 100644 --- a/template/en/default/global/code-error.html.tmpl +++ b/template/en/default/global/code-error.html.tmpl @@ -262,7 +262,7 @@ Flags cannot be set for objects of type [% caller FILTER html %]. They can only be set for [% terms.bugs %] and attachments. - [% 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>. @@ -509,31 +509,23 @@ admindocslinks = admindocslinks %] -<tt> - <p> - [% terms.Bugzilla %] has suffered an internal error. Please save this page and send - it to [% Param("maintainer") %] with details of what you were doing at - the time this message appeared. - </p> - <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> +[%# return the generated error_message for sentry %] +[% processed.error_message = error_message %] + +<p> + [% terms.Bugzilla %] has suffered an internal error: +</p> -<p>Traceback:</p> -<pre>[% traceback FILTER html %]</pre> +<p class="throw_error"> + [% error_message FILTER none %] +</p> + +[% IF maintainers_notified %] +<p> + The [% terms.Bugzilla %] maintainers have been notified of this error + [#[% uid FILTER html %]]. +</p> +[% END %] [% IF variables %] <pre> diff --git a/template/en/default/global/common-links.html.tmpl b/template/en/default/global/common-links.html.tmpl index 769d41e7e..53d22df71 100644 --- a/template/en/default/global/common-links.html.tmpl +++ b/template/en/default/global/common-links.html.tmpl @@ -28,7 +28,7 @@ <li><span class="separator">| </span><a href="describecomponents.cgi">Browse</a></li> <li><span class="separator">| </span><a href="query.cgi">Search</a></li> - <li class="form"> + <li class="form quicksearch_form"> <span class="separator">| </span> <form action="buglist.cgi" method="get" onsubmit="if (this.quicksearch.value == '') @@ -39,10 +39,12 @@ <input class="btn" type="submit" value="Search" id="find[% qs_suffix FILTER html %]"> [%-# Work around FF bug: keep this on one line %]</form> - <a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">[?]</a></li> + [<a href="page.cgi?id=quicksearch.html" title="Quicksearch Help">help</a>] + </li> <li><span class="separator">| </span><a href="report.cgi">Reports</a></li> + [% IF user.settings.skin.value != 'Mozilla' %] <li> [% IF Param('shutdownhtml') || Bugzilla.has_flags %] <span class="separator">| </span> @@ -54,7 +56,11 @@ [% END %] [% END %] [%-# Work around FF bug: keep this on one line %]</li> + [% END %] + + [% Hook.process('action-links') %] + [% IF user.settings.skin.value != 'Mozilla' %] [% 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 @@ -104,6 +110,7 @@ [% PROCESS "account/auth/login-small.html.tmpl" %] [% END %] [% END %] + [% END %] </ul> [% Hook.process("link-row") %] diff --git a/template/en/default/global/field-descs.none.tmpl b/template/en/default/global/field-descs.none.tmpl index 3e86e9bad..731ba37ef 100644 --- a/template/en/default/global/field-descs.none.tmpl +++ b/template/en/default/global/field-descs.none.tmpl @@ -49,7 +49,9 @@ "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", @@ -58,7 +60,9 @@ ${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", + ${constants.FIELD_TYPE_EXTENSION} => "Extension", } %] [% IF in_template_var %] diff --git a/template/en/default/global/footer.html.tmpl b/template/en/default/global/footer.html.tmpl index 661f8afe6..29d17bccd 100644 --- a/template/en/default/global/footer.html.tmpl +++ b/template/en/default/global/footer.html.tmpl @@ -24,8 +24,6 @@ # global/useful-links.html.tmpl. #%] -[% INCLUDE "global/help.html.tmpl" %] - </div> [%# Migration note: below this point, this file corresponds to the old Param diff --git a/template/en/default/global/header.html.tmpl b/template/en/default/global/header.html.tmpl index 0dffcb5de..c5b2c126a 100644 --- a/template/en/default/global/header.html.tmpl +++ b/template/en/default/global/header.html.tmpl @@ -110,35 +110,20 @@ [% SET yui = yui_resolve_deps(yui, yui_deps) %] [% SET css_sets = css_files(style_urls, yui, yui_css) %] - [%# CSS cascade, part 1: Standard Bugzilla stylesheet set (persistent). - # Always present. - #%] - [%# This allows people to switch back to the "Classic" skin if they - # are in another skin. - #%] + [%# 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 2 & 3: Third-party stylesheet set (selected and - # selectable). All third-party skins are present as alternate - # stylesheets, even if they are not currently in use. - #%] + [%# 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 %] [% END %] - [% FOREACH alternate_skin = css_sets.alternate.keys %] - [% FOREACH style_url = css_sets.alternate.$alternate_skin %] - [% PROCESS format_css_link css_set_name = alternate_skin %] - [% END %] - [% END %] - - [%# CSS cascade, part 4: page-specific styles. - #%] + [%# CSS cascade, part 4: page-specific styles. %] [% IF style %] <style type="text/css"> [% style %] @@ -239,8 +224,7 @@ [%# Required for the 'Autodiscovery' feature in Firefox 2 and IE 7. %] <link rel="search" type="application/opensearchdescription+xml" - title="[% terms.Bugzilla %]" href="./search_plugin.cgi"> - <link rel="shortcut icon" href="images/favicon.ico" > + title="[% terms.BugzillaTitle %]" href="./search_plugin.cgi"> [% Hook.process("additional_header") %] </head> @@ -250,6 +234,7 @@ <body onload="[% onload %]" class="[% urlbase.replace('^https?://','').replace('/$','').replace('[-~@:/.]+','-') FILTER css_class_quote %] + skin-[% user.settings.skin.value FILTER css_class_quote %] [% FOREACH class = bodyclasses %] [% ' ' %][% class FILTER css_class_quote %] [% END %] yui-skin-sam"> @@ -260,12 +245,94 @@ <div id="header"> +[% IF user.settings.skin.value == 'Mozilla' %] + <div class="wrapper"> + <table border="0" cellspacing="0" cellpadding="0" id="titles"> + <tr> + <td id="title"> + <a href="./" title="Home">[% terms.BugzillaTitle %]</a> + </td> + <td> + [% Hook.process("message") %] + </td> + <td id="moz_login"> + [% IF user.id %] + <ul class="links"> + <li class="dropdown"> + <span class="anchor">[% user.login FILTER html %]</span> + <ul> + [% IF user.showmybugslink %] + [% filtered_username = user.login FILTER uri %] + <li><a href="[% Param('mybugstemplate').replace('%userid%', filtered_username) %]">My [% terms.Bugs %]</a></li> + [% END %] + <li><a href="user_profile">My Profile</a></li> + <li><a href="page.cgi?id=user_activity.html&action=run&sort=when&who=[% user.login FILTER uri %]">My Activity</a></li> + <li><a href="request.cgi?requester=[% user.login FILTER uri %]&requestee=[% user.login FILTER uri %]&do_union=1&group=type&action=queue">My Requests</a></li> + <li><a href="userprefs.cgi">Preferences</a></li> + [% IF user.in_group('tweakparams') || user.in_group('editusers') || user.can_bless + || (Param('useclassification') && user.in_group('editclassifications')) + || user.in_group('editcomponents') || user.in_group('admin') || user.in_group('creategroups') + || user.in_group('editkeywords') || user.in_group('bz_canusewhines') + || user.get_products_by_permission("editcomponents").size %] + <li><a href="admin.cgi">Administration</a></li> + [% END %] + [% IF user.authorizer.can_logout %] + <li><a href="index.cgi?logout=1">Log out</a></li> + [% END %] + [% IF sudoer %] + <li> + <a href="relogin.cgi?action=end-sudo">End sudo session impersonating [% user.login FILTER html %]</a> + </li> + [% END %] + </ul> + </li> + </ul> + [% ELSE %] + <ul class="login-links"> + [% IF Param('createemailregexp') + && user.authorizer.user_can_create_account %] + <li id="moz_new_account_container_top"><a href="createaccount.cgi">New Account</a></li> + [% END %] + + [%# Only display one login form when we're on a LOGIN_REQUIRED page. That + # way, we're guaranteed that the user will use the form that has + # hidden_fields in it (the center form) instead of this one. Also, it's + # less confusing to have one form (as opposed to three) when you're + # required to log in. + #%] + [% IF user.authorizer.can_login && !Bugzilla.page_requires_login %] + [% PROCESS "account/auth/login-small.html.tmpl" qs_suffix = "_top" %] + [% END %] + </ul> + [% END %] + </td> + <td id="moz_tab"> + <a href="https://www.mozilla.org/" title="Mozilla - Home of the Mozilla Project"> + <img src="skins/contrib/Mozilla/tabzilla.png" border="0" height="42" width="154"></a> + </td> + </tr> + </table> + + [%# display the version number on the index page %] + [% IF title == "$terms.Bugzilla Main Page" %] + <div id="bugzilla_version"> + [% header_addl_info FILTER html %] + </div> + [% END %] + + [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %] + + </div> + +[% ELSE %] + [% INCLUDE global/banner.html.tmpl %] <table border="0" cellspacing="0" cellpadding="0" id="titles"> <tr> <td id="title"> - <p>[% terms.Bugzilla %] + <p>[% terms.BugzillaTitle %] + [% Hook.process("message") %] [% " – $header" IF header %]</p> </td> @@ -302,16 +369,28 @@ </td></tr></table> [% PROCESS "global/common-links.html.tmpl" qs_suffix = "_top" %] + +[% END %] + </div> [%# header %] <div id="bugzilla-body"> +[%# in most cases the "header" variable provides redundant information, however + # there are exceptions where not displaying this text is problematic. %] +[% IF user.settings.skin.value == 'Mozilla' + && template.name.match('^attachment/') + && !header.match('^Bug \d+$') +%] + <h2>[% header FILTER none %]</h2> +[% END %] + [% IF Param('announcehtml') %] [% Param('announcehtml') FILTER none %] [% END %] [% IF message %] -<div id="message">[% message %]</div> + <div id="message">[% message %]</div> [% END %] [% BLOCK format_css_link %] @@ -323,26 +402,15 @@ #%] [% END %] - [% IF css_set_name == 'standard' - OR css_set_name == user.settings.skin.value - %] - [% SET css_rel = 'stylesheet' %] - [% SET css_set_display_name = setting_descs.${user.settings.skin.value} - || user.settings.skin.value %] - [% ELSE %] - [% SET css_rel = 'alternate stylesheet' %] - [% SET css_set_display_name = setting_descs.$css_set_name || css_set_name %] - [% END %] - [% IF css_set_name == 'standard' %] [% SET css_title_link = '' %] [% ELSE %] [% css_title_link = BLOCK ~%] - title="[% css_set_display_name FILTER html %]" + title="[% setting_descs.${user.settings.skin.value} || user.settings.skin.value FILTER html %]" [% END %] [% END %] - <link href="[% style_url FILTER html %]" rel="[% css_rel FILTER none %]" + <link href="[% style_url FILTER html %]" rel="stylesheet" type="text/css" [% css_title_link FILTER none %]> [% '<![endif]-->' IF style_url.match('/IE-fixes\.css') %] diff --git a/template/en/default/global/help.html.tmpl b/template/en/default/global/help.html.tmpl deleted file mode 100644 index c0ff819ce..000000000 --- a/template/en/default/global/help.html.tmpl +++ /dev/null @@ -1,33 +0,0 @@ -[%# The contents of this file are subject to the Mozilla Public - # License Version 1.1 (the "License"); you may not use this file - # except in compliance with the License. You may obtain a copy of - # the License at http://www.mozilla.org/MPL/ - # - # Software distributed under the License is distributed on an "AS - # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - # implied. See the License for the specific language governing - # rights and limitations under the License. - # - # The Original Code is the Bugzilla Bug Tracking System. - # - # The Initial Developer of the Original Code is Netscape Communications - # Corporation. Portions created by Netscape are - # Copyright (C) 1998 Netscape Communications Corporation. All - # Rights Reserved. - # - # Contributor(s): Gervase Markham <gerv@gerv.net> - #%] - -[% USE Bugzilla %] -[% cgi = Bugzilla.cgi %] - -[% IF cgi.param("help") %] - <script type="text/javascript"> <!-- - [% FOREACH help_name = help_html.keys %] - g_helpTexts["[% help_name FILTER js %]"] = - "[%- help_html.$help_name FILTER js -%]"; - [% END %] - // --> - </script> -[% END %] - diff --git a/template/en/default/global/setting-descs.none.tmpl b/template/en/default/global/setting-descs.none.tmpl index a0b11f048..37d81039e 100644 --- a/template/en/default/global/setting-descs.none.tmpl +++ b/template/en/default/global/setting-descs.none.tmpl @@ -52,6 +52,8 @@ "email_format" => "Preferred email format", "html" => "HTML", "text_only" => "Text Only", + "bugmail_new_prefix" => "Add 'New:' to subject line of email sent when a new $terms.bug is filed", + "requestee_cc" => "Automatically add me to the CC list of $terms.bugs I am requested to review", } %] diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl index 8de412413..bd8e57a69 100644 --- a/template/en/default/global/user-error.html.tmpl +++ b/template/en/default/global/user-error.html.tmpl @@ -160,6 +160,8 @@ use [% ELSIF action == "approve" %] approve + [% ELSIF action == "admin_activity" %] + view admin activity for [% ELSE %] [%+ Hook.process('auth_failure_action') %] [% END %] @@ -182,6 +184,8 @@ classifications [% ELSIF object == "components" %] components + [% ELSIF object == "comment_tags" %] + comment tags [% ELSIF object == "custom_fields" %] custom fields [% ELSIF object == "field_values" %] @@ -270,6 +274,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> </ul> [% ELSIF reason == 'id' %] There is no valid [% terms.bug %] id in that URL. @@ -322,6 +327,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. @@ -469,6 +493,15 @@ The first letter of your extension's name must be a capital letter. (You specified '[% name FILTER html %]'.) + [% ELSIF error == "feature_disabled" %] + The [% install_string("feature_$feature") FILTER html %] feature is not + available in this [% terms.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 + requirements for this feature. + [% END %] + [% ELSIF error == "field_already_exists" %] [% title = "Field Already Exists" %] The field '[% field.name FILTER html %]' @@ -618,6 +651,11 @@ <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" %] + [% 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 @@ -699,6 +737,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'} %] @@ -943,6 +991,10 @@ Invalid datasets <em>[% datasets.join(":") FILTER html %]</em>. Only digits, letters and colons are allowed. + [% ELSIF error == "invalid_flag_id" %] + [% title = "Invalid Flag ID" %] + The flag id [% flag_id FILTER html %] is invalid. + [% ELSIF error == "invalid_format" %] [% title = "Invalid Format" %] The format "[% format FILTER html %]" is invalid (must be one of @@ -1013,6 +1065,11 @@ [%+ constants.LOGIN_LOCKOUT_INTERVAL FILTER html %] minutes. [% 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 @@ -1037,6 +1094,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. @@ -1350,6 +1414,40 @@ [% END %] </ul> + [% ELSIF error == "password_not_complex" %] + [% title = "Password Fails Requirements" %] + [% passregex = Param('password_complexity') %] + Password must contain at least one: + <ul> + [% IF passregex.search('letters') %] + <li>UPPERCASE letter</li> + <li>lowercase letter</li> + [% END %] + [% IF passregex.search('numbers') %] + <li>digit</li> + [% END %] + [% IF passregex.search('specialchars') %] + <li>special character</li> + [% END %] + </ul> + + [% ELSIF error == "password_not_complex" %] + [% title = "Password Fails Requirements" %] + [% passregex = Param('password_complexity') %] + Password must contain at least one: + <ul> + [% IF passregex.search('letters') %] + <li>UPPERCASE letter</li> + <li>lowercase letter</li> + [% END %] + [% IF passregex.search('numbers') %] + <li>digit</li> + [% END %] + [% IF passregex.search('specialchars') %] + <li>special character</li> + [% END %] + </ul> + [% ELSIF error == "product_access_denied" %] [% title = "Product Access Denied" %] Either the product @@ -1538,6 +1636,17 @@ and the "matches" search can only be used with the "content" field. + [% ELSIF error == "search_grouped_field_invalid" %] + [% terms.Bugzilla %] does not support using the + "[%+ field_descs.$field FILTER html %]" ([% field FILTER html %]) + field with grouped search conditions. + + [% ELSIF error == "search_grouped_invalid_nesting" %] + You cannot nest clauses within grouped search conditions. + + [% ELSIF error == "search_grouped_field_mismatch" %] + All conditions under a groups search must use the same field. + [% ELSIF error == "search_field_operator_invalid" %] [% terms.Bugzilla %] does not support using the "[%+ field_descs.$field FILTER html %]" ([% field FILTER html %]) @@ -1610,7 +1719,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" %] @@ -1707,6 +1816,11 @@ Sorry, but you are not allowed to (un)mark comments or attachments as private. + [% 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. @@ -1764,6 +1878,8 @@ [% error_message FILTER none %] [% END %] [% END %] + + [% Hook.process('error_message') %] [% END %] [%# We only want HTML error messages for ERROR_MODE_WEBPAGE %] diff --git a/template/en/default/global/user.html.tmpl b/template/en/default/global/user.html.tmpl index df902b451..897cbbad6 100644 --- a/template/en/default/global/user.html.tmpl +++ b/template/en/default/global/user.html.tmpl @@ -27,12 +27,19 @@ [% FILTER collapse %] [% IF user.id %] <a class="email" href="mailto:[% who.email FILTER html %]" - title="[% who.identity FILTER html %]"> + onclick="return show_usermenu(event, [% who.id FILTER none %], '[% who.email FILTER js %]', + [% user.in_group('editusers') || user.bless_groups.size > 0 ? "true" : "false" %]);" + title="[% who.identity FILTER html %]"> [%- END -%] - [% IF who.name %] - <span class="fn">[% who.name FILTER html %]</span> - [% ELSE %] - [% who.login FILTER email FILTER html %] + [% IF who %] + [% IF who.name %] + <span class="fn">[% who.name FILTER html %]</span> + [% ELSE %] + <span class="ln">[% who.login FILTER email FILTER html %]</span> + [% END %] + [% IF user.id %] + <span class="arrow_container"><span class="arrow_down"></span></span> + [% END %] [% END %] [% '</a>' IF user.id %] [% END %] diff --git a/template/en/default/global/userselect.html.tmpl b/template/en/default/global/userselect.html.tmpl index 1d0395043..d7b4786f9 100644 --- a/template/en/default/global/userselect.html.tmpl +++ b/template/en/default/global/userselect.html.tmpl @@ -30,6 +30,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 + # placeholder: optional, input only; placeholder attribute value #%] [% IF Param("usemenuforusers") %] @@ -92,6 +93,7 @@ [% IF accesskey %] accesskey="[% accesskey FILTER html %]" [% END %] [% IF field_title %] title="[% field_title FILTER html %]" [% END %] [% IF size %] size="[% size FILTER html %]" [% END %] + [% IF placeholder %] placeholder="[% placeholder FILTER html %]" [% END %] [% IF id %] id="[% id FILTER html %]" [% END %] > [% IF feature_enabled('jsonrpc') && Param('ajax_user_autocompletion') && id %] diff --git a/template/en/default/index.html.tmpl b/template/en/default/index.html.tmpl index 5b9237aa1..fa2a4d126 100644 --- a/template/en/default/index.html.tmpl +++ b/template/en/default/index.html.tmpl @@ -38,40 +38,13 @@ <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 ) { + if (form.quicksearch.value == '') { alert('Please enter one or more search terms first.'); - return false; + return false; } - return true; + 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 %] @@ -125,39 +98,27 @@ YAHOO.util.Event.onDOMReady(onLoadActions); <td> <h1 id="welcome"> Welcome to [% terms.Bugzilla %]</h1> <div class="intro">[% Hook.process('intro') %]</div> - - <div class="bz_common_actions"> - <ul> - <li> - <a id="enter_bug" href="enter_bug.cgi"><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> + <a id="enter_bug" class="bz_common_actions" + href="enter_bug.cgi"><span>File [% terms.aBug %]</span></a> + <a id="query" class="bz_common_actions" + href="query.cgi"><span>Search</span></a> + <a id="account" class="bz_common_actions" + [% 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 %] <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');" - > + placeholder="Enter [% terms.abug %] number or some search terms" + title="Quick Search"> <input id="find" type="submit" value="Quick Search"> <ul class="additional_links" id="quicksearch_links"> <li> diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl index 92e578e8f..6a3269dff 100644 --- a/template/en/default/list/edit-multiple.html.tmpl +++ b/template/en/default/list/edit-multiple.html.tmpl @@ -282,10 +282,17 @@ [% USE Bugzilla %] [%# Show all legal values and all fields, ignoring visibility controls. %] - [% bug = 0 %] - [% FOREACH field = Bugzilla.active_custom_fields %] + [% bug = default.defined ? default : 0 %] + [% custom_fields = [] %] + [% IF one_product.defined %] + [% custom_fields = Bugzilla.active_custom_fields(product=>one_product) %] + [% ELSE %] + [% custom_fields = Bugzilla.active_custom_fields %] + [% END %] + [% FOREACH field = custom_fields %] <tr> - [% PROCESS bug/field.html.tmpl value = dontchange + [% PROCESS bug/field.html.tmpl bug = default + value = dontchange editable = 1 allow_dont_change = 1 %] </tr> @@ -427,6 +434,7 @@ [% FOREACH r = resolutions %] [% NEXT IF !r %] [% NEXT IF r == "DUPLICATE" || r == "MOVED" %] + [% NEXT IF r == "EXPIRED" AND user.login != "gerv@mozilla.org" %] <option value="[% r FILTER html %]">[% display_value("resolution", r) FILTER html %]</option> [% END %] </select> diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl index 4eeff5e64..cda06ac21 100644 --- a/template/en/default/list/list.html.tmpl +++ b/template/en/default/list/list.html.tmpl @@ -42,10 +42,11 @@ [%# Page Header #%] [%############################################################################%] +[% url_filtered_title = title FILTER uri %] [% PROCESS global/header.html.tmpl title = title style = style - atomlink = "buglist.cgi?$urlquerypart&title=$title&ctype=atom" + atomlink = "buglist.cgi?$urlquerypart&title=$url_filtered_title&ctype=atom" yui = [ 'autocomplete', 'calendar' ] javascript_urls = [ "js/util.js", "js/field.js" ] style_urls = [ "skins/standard/buglist.css" ] @@ -58,10 +59,16 @@ </span> [% IF debug %] - <p class="bz_query">[% query FILTER html %]</p> - [% IF query_explain.defined %] - <pre class="bz_query_explain">[% query_explain FILTER html %]</pre> - [% END %] + <div class="bz_query_debug"> + <p>Total execution time: [% query_time FILTER html %] seconds</p> + [% FOREACH query = queries %] + <p>[% query.sql FILTER html %]</p> + <p>Execution time: [% query.time FILTER html %] seconds</p> + [% IF query.explain %] + <pre>[% query.explain FILTER html %]</pre> + [% END %] + [% END %] + </div> [% END %] [% IF user.settings.display_quips.value == 'on' %] @@ -84,7 +91,7 @@ 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq', 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter', 'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords', - 'nowordssubstr', 'notmatches', + 'nowordssubstr', 'notmatches', 'isempty', 'isnotempty' ] %] <ul class="search_description"> [% FOREACH desc_item = search_description %] @@ -205,7 +212,7 @@ [% urlquerypart FILTER html %]&ctype=csv&human=1">CSV</a> | <a href="buglist.cgi? [% urlquerypart FILTER html %]&title= - [%- title FILTER html %]&ctype=atom">Feed</a> | + [%- title FILTER uri %]&ctype=atom">Feed</a> | <a href="buglist.cgi? [% urlquerypart FILTER html %]&ctype=ics">iCalendar</a> | <a href="colchange.cgi? diff --git a/template/en/default/list/table.html.tmpl b/template/en/default/list/table.html.tmpl index a074fcbd0..47dedb3cf 100644 --- a/template/en/default/list/table.html.tmpl +++ b/template/en/default/list/table.html.tmpl @@ -42,6 +42,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" } , @@ -55,19 +56,21 @@ "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 } , + "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 } , "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 %%" } , } %] @@ -80,12 +83,15 @@ [%############################################################################%] [% tableheader = BLOCK %] - <table class="bz_buglist" cellspacing="0" cellpadding="4" width="100%"> + <table class="bz_buglist sortable" cellspacing="0" cellpadding="4" width="100%"> + <thead> <tr class="bz_buglist_header bz_first_buglist_header"> [% IF dotweak %] <th> </th> [% END %] - <th colspan="[% splitheader ? 2 : 1 %]" class="first-child"> + <th colspan="[% splitheader ? 2 : 1 %]" class="first-child + sortable_column_0 + sorted_[% lsearch(order_columns, 'bug_id') FILTER html %]"> <a href="buglist.cgi? [% urlquerypart FILTER html %]&order= [% PROCESS new_order id='bug_id' %] @@ -100,7 +106,7 @@ [% FOREACH id = displaycolumns %] [% NEXT UNLESS loop.count() % 2 == 0 %] [% column = columns.$id %] - [% PROCESS columnheader %] + [% PROCESS columnheader key=loop.count() %] [% END %] </tr><tr class="bz_buglist_header"> @@ -112,7 +118,7 @@ [% FOREACH id = displaycolumns %] [% NEXT IF loop.count() % 2 == 0 %] [% column = columns.$id %] - [% PROCESS columnheader %] + [% PROCESS columnheader key=loop.count() %] [% END %] [% ELSE %] @@ -125,10 +131,13 @@ [% END %] </tr> + </thead> [% END %] [% BLOCK columnheader %] - <th colspan="[% splitheader ? 2 : 1 %]"> + <th colspan="[% splitheader ? 2 : 1 %]" + class="sortable_column_[% key FILTER html %] + sorted_[% lsearch(order_columns, id) FILTER html %]"> <a href="buglist.cgi?[% urlquerypart FILTER html %]&order= [% PROCESS new_order %] [%-#%]&query_based_on= @@ -151,13 +160,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 %] @@ -168,6 +177,7 @@ [% tableheader %] +<tbody class="sorttable_body"> [% FOREACH bug = bugs %] [% count = loop.count() %] @@ -192,13 +202,24 @@ </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 [% 'style="white-space: nowrap"' IF NOT col_abbrev.wrap %] + class="bz_[% column FILTER css_class_quote %]_column" + [% SWITCH column %] + [% CASE 'opendate' %] + sorttable_customkey="[% bug.opentime FILTER html %]" + [% CASE 'changeddate' %] + sorttable_customkey="[% bug.changedtime FILTER html %]" + [% CASE columns_sortkey.keys %] + [% SET sortkey = columns_sortkey.$column.${bug.$column} %] + sorttable_customkey="[% sortkey FILTER html %]" + [% END %] + > + [% 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' %] @@ -206,16 +227,20 @@ [%# Display the login name of the user if their real name is empty. %] [% ELSIF column.match('_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> [% 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> @@ -223,11 +248,12 @@ </tr> - [% IF loop.last() && time_info.time_present == 1 %] + [% IF time_info.time_present %] [% PROCESS time_summary_line %] [% END %] [% END %] +</tbody> </table> diff --git a/template/en/default/pages/bugzilla.dtd.tmpl b/template/en/default/pages/bugzilla.dtd.tmpl new file mode 100644 index 000000000..f7fc1b4ad --- /dev/null +++ b/template/en/default/pages/bugzilla.dtd.tmpl @@ -0,0 +1,179 @@ +[%# The contents of this file are subject to the Mozilla Public + # License Version 1.1 (the "License"); you may not use this file + # except in compliance with the License. You may obtain a copy of + # the License at http://www.mozilla.org/MPL/ + # + # Software distributed under the License is distributed on an "AS + # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + # implied. See the License for the specific language governing + # rights and limitations under the License. + # + # The Original Code is the Bugzilla Bug Tracking System. + # + # The Initial Developer of the Original Code is Netscape Communications + # Corporation. Portions created by Netscape are + # Copyright (C) 1998 Netscape Communications Corporation. All + # Rights Reserved. + # + # Contributor(s): Dawn Endico <endico@mozilla.org> + # Dave Miller <justdave@syndicomm.com> + # Bradley Baetz <bbaetz@student.usyd.edu.au> + # Myk Mylez <myk@mozilla.org> + # Colin Ogilvie <mozilla@colinogilvie.co.uk> + # Joel Peshkin <bugreport@peshkin.net> + # Frédéric Buclin <LpSolit@gmail.com> + # Gervase Markham <gerv@gerv.net> + # Max Kanat-Alexander <mkanat@bugzilla.org> + # David Lawrence <dkl@mozilla.com> + # + #%] +[% USE Bugzilla %] +<!ELEMENT [% "bugzilla" %] (bug+)> +<!ATTLIST [% "bugzilla" %] + version CDATA #REQUIRED + urlbase CDATA #REQUIRED + maintainer CDATA #REQUIRED + exporter CDATA #IMPLIED +> +<!ELEMENT [% "bug" %] (bug_id, + (alias?, + creation_ts, + short_desc, + delta_ts, + reporter_accessible, + cclist_accessible, + classification_id, + classification, + product, + component, + version, + rep_platform, + op_sys, + bug_status, + resolution?, + dup_id?, + see_also*, + bug_file_loc?, + status_whiteboard?, + keywords*, + priority, + bug_severity, + target_milestone?, + dependson*, + blocked*, + everconfirmed, + reporter, + assigned_to, + cc*, + (estimated_time, + remaining_time, + actual_time, + deadline?)?, + qa_contact?, +[% FOREACH field = Bugzilla.active_custom_fields %] + [%+ field.name FILTER xml -%] + [%- IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]*[% ELSE %]?[% END %], +[% END %] + votes?, + token?, + group*, + flag*, + long_desc*, + attachment*)?)> +<!ATTLIST [% "bug" %] + error (NotFound | NotPermitted | InvalidBugId) #IMPLIED +> +<!ELEMENT bug_id (#PCDATA)> +<!ELEMENT alias (#PCDATA)> +<!ELEMENT reporter_accessible (#PCDATA)> +<!ELEMENT cclist_accessible (#PCDATA)> +<!ELEMENT exporter (#PCDATA)> +<!ELEMENT urlbase (#PCDATA)> +<!ELEMENT bug_status (#PCDATA)> +<!ELEMENT classification_id (#PCDATA)> +<!ELEMENT classification (#PCDATA)> +<!ELEMENT product (#PCDATA)> +<!ELEMENT priority (#PCDATA)> +<!ELEMENT version (#PCDATA)> +<!ELEMENT rep_platform (#PCDATA)> +<!ELEMENT assigned_to (#PCDATA)> +<!ATTLIST assigned_to + name CDATA #REQUIRED +> +<!ELEMENT delta_ts (#PCDATA)> +<!ELEMENT component (#PCDATA)> +<!ELEMENT reporter (#PCDATA)> +<!ATTLIST reporter + name CDATA #REQUIRED +> +<!ELEMENT target_milestone (#PCDATA)> +<!ELEMENT bug_severity (#PCDATA)> +<!ELEMENT creation_ts (#PCDATA)> +<!ELEMENT qa_contact (#PCDATA)> +<!ATTLIST qa_contact + name CDATA #REQUIRED +> +<!ELEMENT status_whiteboard (#PCDATA)> +<!ELEMENT op_sys (#PCDATA)> +<!ELEMENT resolution (#PCDATA)> +<!ELEMENT dup_id (#PCDATA)> +<!ELEMENT bug_file_loc (#PCDATA)> +<!ELEMENT short_desc (#PCDATA)> +<!ELEMENT keywords (#PCDATA)> +<!ELEMENT dependson (#PCDATA)> +<!ELEMENT blocked (#PCDATA)> +<!ELEMENT everconfirmed (#PCDATA)> +<!ELEMENT cc (#PCDATA)> +<!ELEMENT see_also (#PCDATA)> +<!ELEMENT votes (#PCDATA)> +<!ELEMENT token (#PCDATA)> +<!ELEMENT group (#PCDATA)> +<!ATTLIST group + id CDATA #REQUIRED +> +<!ELEMENT estimated_time (#PCDATA)> +<!ELEMENT remaining_time (#PCDATA)> +<!ELEMENT actual_time (#PCDATA)> +<!ELEMENT deadline (#PCDATA)> +[% FOREACH field = Bugzilla.active_custom_fields %] +<!ELEMENT [% field.name FILTER xml %] (#PCDATA)> +[% END %] +<!ELEMENT long_desc (commentid, attachid?, who, bug_when, work_time?, thetext)> +<!ATTLIST long_desc + isprivate (0|1) #REQUIRED +> +<!ELEMENT commentid (#PCDATA)> +<!ELEMENT who (#PCDATA)> +<!ATTLIST who + name CDATA #REQUIRED +> +<!ELEMENT bug_when (#PCDATA)> +<!ELEMENT work_time (#PCDATA)> +<!ELEMENT thetext (#PCDATA)> +<!ELEMENT attachment (attachid, date, delta_ts, desc, filename, type, size, attacher, token?, data?, flag*)> +<!ATTLIST attachment + isobsolete (0|1) #REQUIRED + ispatch (0|1) #REQUIRED + isprivate (0|1) #REQUIRED + isurl (0|1) #REQUIRED +> +<!ELEMENT attacher (#PCDATA)> +<!ELEMENT attachid (#PCDATA)> +<!ELEMENT date (#PCDATA)> +<!ELEMENT desc (#PCDATA)> +<!ELEMENT filename (#PCDATA)> +<!ELEMENT type (#PCDATA)> +<!ELEMENT size (#PCDATA)> +<!ELEMENT data (#PCDATA)> +<!ATTLIST data + encoding (base64) #IMPLIED +> +<!ELEMENT flag EMPTY> +<!ATTLIST flag + name CDATA #REQUIRED + id CDATA #REQUIRED + type_id CDATA #REQUIRED + status CDATA #REQUIRED + setter CDATA #REQUIRED + requestee CDATA #IMPLIED +> diff --git a/template/en/default/pages/fields.html.tmpl b/template/en/default/pages/fields.html.tmpl index 2794e1cc4..6c63d851d 100644 --- a/template/en/default/pages/fields.html.tmpl +++ b/template/en/default/pages/fields.html.tmpl @@ -62,34 +62,41 @@ </dt> <dd class="unconfirmed"> This [% terms.bug %] has recently been added to the database. - Nobody has confirmed that this [% terms.bug %] is valid. Users + Nobody has validated that this [% terms.bug %] is true. Users who have the "canconfirm" permission set may confirm - this [% terms.bug %], changing its state to - <b>[% display_value("bug_status", "CONFIRMED") FILTER html %]</b>. - Or, it may be directly resolved and marked + this [% terms.bug %], changing its state to [% display_value("bug_status", "NEW") FILTER html %]. Or, it may be + directly resolved and marked [% display_value("bug_status", "RESOLVED") FILTER html %]. + </dd> + <dt> + <b>[% display_value("bug_status", "NEW") FILTER html %]</b> + </dt> + <dd> + This [% terms.bug %] has recently been added to the assignee's + list of [% terms.bugs %] and must be processed. [% terms.Bugs %] in + this state may be accepted, and become <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b>, passed + on to someone else, and remain <b>[% display_value("bug_status", "NEW") FILTER html %]</b>, or resolved and marked <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>. </dd> - <dt class="confirmed"> - [% display_value("bug_status", "CONFIRMED") FILTER html %] + <dt> + <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b> </dt> - <dd class="confirmed"> - This [% terms.bug %] is valid and has recently been filed. - [%+ terms.Bugs %] in this state become - <b>[% display_value("bug_status", "IN_PROGRESS") FILTER html %]</b> - when somebody is working on them, or become resolved and marked - <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>. + <dd> + This [% terms.bug %] is not yet resolved, but is assigned to the + proper person. From here [% terms.bugs %] can be given to another + person and become <b>[% display_value("bug_status", "NEW") FILTER html %]</b>, or + resolved and become <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>. </dd> - <dt class="in_progress"> - [% display_value("bug_status", "IN_PROGRESS") FILTER html %] + <dt> + <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b> </dt> - <dd class="in_progress"> - This [% terms.bug %] is not yet resolved, but is assigned to the - proper person who is working on the [% terms.bug %]. From here, - [%+ terms.bugs %] can be given to another person and become - <b>[% display_value("bug_status", "CONFIRMED") FILTER html %]</b>, or - resolved and become + <dd> + This [% terms.bug %] was once resolved, but the resolution was + deemed incorrect. For example, a <b>[% display_value("resolution", "WORKSFORME") FILTER html %]</b> [% terms.bug %] is + <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b> when more information shows up and + the [% terms.bug %] is now reproducible. From here [% terms.bugs %] are + either marked <b>[% display_value("bug_status", "ASSIGNED") FILTER html %]</b> or <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>. </dd> @@ -124,9 +131,10 @@ [% display_value("bug_status", "VERIFIED") FILTER html %] </dt> <dd class="verified"> - QA has looked at the [% terms.bug %] and the resolution and - agrees that the appropriate resolution has been taken. This is - the final status for [% terms.bugs %]. + QA has looked at the [% terms.bug %] and the resolution and + agrees that the appropriate resolution has been taken. + Any zombie [% terms.bugs %] who choose to walk the earth again must + do so by becoming <b>[% display_value("bug_status", "REOPENED") FILTER html %]</b>. </dd> [% Hook.process('closed-status') %] @@ -163,10 +171,9 @@ </dt> <dd class="duplicate"> The problem is a duplicate of an existing [% terms.bug %]. - When [% terms.abug %] is marked as a - <b>[% display_value("resolution", "DUPLICATE") FILTER html %]</b>, - you will see which [% terms.bug %] it is a duplicate of, - next to the resolution. + Marking [% terms.abug %] duplicate requires the [% terms.bug %]# + of the duplicating [% terms.bug %] and will at least put + that [% terms.bug %] number in the description field. </dd> <dt class="worksforme"> @@ -195,6 +202,11 @@ field => field } %] [% END %] +[%# This field is not a real one, but its label is visible in bugs. %] + +[% field_help_map.Importance = { help => help_html.importance, + field => "importance" } %] + [%# These are fields that don't need to be documented, either because # they have docs somewhere else in the UI, or they don't show up on bugs. # %] diff --git a/template/en/default/pages/quicksearch.html.tmpl b/template/en/default/pages/quicksearch.html.tmpl index 901f05467..18bf4dfb1 100644 --- a/template/en/default/pages/quicksearch.html.tmpl +++ b/template/en/default/pages/quicksearch.html.tmpl @@ -229,6 +229,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> @@ -303,6 +349,14 @@ <strong>#</strong><em>value</em> </td> </tr> + <tr> + <td class="field_name">Comment Searching</td> + <td class="field_nickname"> + Allows overriding of the comment searching preference.<br> + "<strong>++comments</strong>" will always enable comment searching.<br> + "<strong>--comments</strong>" will always disable searching.<br> + </td> + </tr> [% IF Param('usestatuswhiteboard') %] <tr> <td class="field_name">[% field_descs.short_desc FILTER html %] diff --git a/template/en/default/reports/components.html.tmpl b/template/en/default/reports/components.html.tmpl index ef7d5ae6d..b2a21ccc1 100644 --- a/template/en/default/reports/components.html.tmpl +++ b/template/en/default/reports/components.html.tmpl @@ -22,6 +22,7 @@ [%# INTERFACE: # product: object. The product for which we want to display component # descriptions. + # component: string. The name of the component to hilight in the browser #%] [% title = BLOCK %] @@ -39,6 +40,8 @@ [% numcols = 2 %] [% END %] +<h2>[% mark FILTER html %]</h2> + <table cellpadding="0" cellspacing="0" id="components_header_table"> <tr> <td class="instructions"> @@ -81,9 +84,11 @@ [%############################################################################%] [% BLOCK describe_comp %] - <tr id="[% comp.name FILTER html %]"> + <tr id="[% comp.name FILTER html %]" + [%- IF comp.name == component_mark %] class="component_hilite"[% END %]> <td rowspan="2" class="component_name"> - <a href="buglist.cgi?product= + <a name="[% comp.name FILTER html %]" + href="buglist.cgi?product= [%- product.name FILTER uri %]&component= [%- comp.name FILTER uri %]&resolution=---"> [% comp.name FILTER html %]</a> @@ -97,7 +102,7 @@ </td> [% END %] </tr> - <tr> + <tr[% IF comp.name == component_mark %] class="component_hilite"[% END %]> <td colspan="[% numcols - 1 %]" class="component_description"> [% comp.description FILTER html_light %] </td> diff --git a/template/en/default/reports/report.html.tmpl b/template/en/default/reports/report.html.tmpl index 94725ae81..38b64df0b 100644 --- a/template/en/default/reports/report.html.tmpl +++ b/template/en/default/reports/report.html.tmpl @@ -81,7 +81,9 @@ %] [% IF debug %] - <p>[% query FILTER html %]</p> + [% FOREACH query = queries %] + <p>[% query.sql FILTER html %]</p> + [% END %] [% END %] <div align="center"> diff --git a/template/en/default/request/email.txt.tmpl b/template/en/default/request/email.txt.tmpl index 65946a1e1..17ab12431 100644 --- a/template/en/default/request/email.txt.tmpl +++ b/template/en/default/request/email.txt.tmpl @@ -25,7 +25,8 @@ [% bugidsummary = bug.bug_id _ ': ' _ bug.short_desc %] [% attidsummary = attachment.id _ ': ' _ attachment.description %] [% flagtype_name = flag ? flag.type.name : old_flag.type.name %] -[% statuses = { '+' => "granted" , '-' => 'denied' , 'X' => "canceled" , +[%# Upstreaming: denied (bug 621883) %] +[% statuses = { '+' => "granted" , '-' => 'not granted' , 'X' => "canceled" , '?' => "asked" } %] [% to_identity = "" %] @@ -53,6 +54,10 @@ Subject: [% flagtype_name %] [%+ subject_status %]: [[% terms.Bug %] [%+ bug.bug [Attachment [% attachment.id %]] [% attachment.description FILTER clean_text %][% END %] Date: [% date %] X-Bugzilla-Type: request +[%- IF flag.requestee %] +X-Bugzilla-Flag-Requestee: [% flag.requestee.email %] +[% END %] +[%+ INCLUDE "email/header-common.txt.tmpl" %] [%+ threadingmarker %] [%+ USE wrap -%] 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 57650de55..261db0438 100644 --- a/template/en/default/request/queue.html.tmpl +++ b/template/en/default/request/queue.html.tmpl @@ -25,10 +25,6 @@ [% PROCESS global/header.html.tmpl title="Request Queue" - style = " - table.requests th { text-align: left; } - table#filtering th { text-align: right; } - " 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'] @@ -161,10 +157,22 @@ to some group are shown by default. } %] [% PROCESS "global/select-menu.html.tmpl" name="group" options=groups default=cgi.param('group') %] </td> + </tr> + <tr> + <th></th> + <td> + <label><input type="radio" name="do_union" value="0" + [% 'checked="checked"' IF !cgi.param('do_union') %]>AND *</label> + <label><input type="radio" name="do_union" value="1" + [% 'checked="checked"' IF cgi.param('do_union') %]>OR *</label> + </td> + <td colspan="3"></td> <td><input type="submit" id="filter" value="Filter"></td> </tr> </table> + <p>(* The logical conjunction/disjunction between the requester + and the requestee)</p> </form> [% column_headers = { @@ -198,7 +206,10 @@ to some group are shown by default. [% PROCESS start_new_table %] [% END %] [% buglist.${request.bug_id} = 1 %] - <tr> + + <tr class="bz_bugitem bz_[% request.bug_severity FILTER css_class_quote -%] + bz_[% request.priority FILTER css_class_quote -%] + bz_[% request.bug_status FILTER css_class_quote %]"> [% FOREACH column = display_columns %] [% NEXT IF column == group_field || excluded_columns.contains(column) %] <td> @@ -209,6 +220,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 %] @@ -238,7 +251,7 @@ to some group are shown by default. [% BLOCK display_bug %] <a href="show_bug.cgi?id=[% request.bug_id %]" [%- ' class="bz_secure"' IF request.restricted %]> - [% request.bug_id %]: [%+ request.bug_summary FILTER html %]</a> + [% request.bug_id %] ([% request.priority FILTER html %]/[% request.bug_severity FILTER html %]): [%+ request.bug_summary FILTER html %]</a> [% END %] [% BLOCK display_attachment %] diff --git a/template/en/default/rest.html.tmpl b/template/en/default/rest.html.tmpl new file mode 100644 index 000000000..0b8321dd1 --- /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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" + "http://www.w3.org/TR/html4/loose.dtd"> +<html> + <head> + <title>Bugzilla::REST::API</title> + <link href="[% urlbase FILTER none %][% '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 878589cea..3fb1f8eae 100644 --- a/template/en/default/search/boolean-charts.html.tmpl +++ b/template/en/default/search/boolean-charts.html.tmpl @@ -47,6 +47,8 @@ "changedby", "matches", "notmatches", + "isempty", + "isnotempty", ] %] <div class="bz_section_title" id="custom_search_filter"> @@ -78,6 +80,10 @@ <script type="text/javascript" src="[% 'js/history.js/native.history.js' FILTER mtime %]"></script> <script type="text/javascript"> redirect_html4_browsers(); + [%# These are alternative labels for the AND and OR options in and_all_select %] + var cs_and_label = 'Match ALL of the following:'; + var cs_or_label = 'Match ANY of the following:'; + cs_reconfigure('custom_search_last_row'); </script> </div> @@ -134,7 +140,8 @@ ( [% indent_level = indent_level + 1 %] [% ELSIF condition.f == "CP" %] - <input type="hidden" name="f[% cond_num FILTER html %]" value="CP"> + <input type="hidden" name="f[% cond_num FILTER html %]" + id="f[% cond_num FILTER html %]" value="CP"> ) [% ELSE %] <select name="f[% cond_num FILTER html %]" title="Field" @@ -178,9 +185,11 @@ <div class="any_all_select"> <select name="[% name FILTER html %]" id="[% name FILTER html %]" onchange="fix_query_string(this)"> - <option value="AND">Match ALL of the following:</option> + <option value="AND">Match ALL of the following separately:</option> <option value="OR" [% ' selected="selected"' IF selected == "OR" %]> - Match ANY of the following:</option> + Match ANY of the following separately:</option> + <option value="AND_G" [% ' selected' IF selected == "AND_G" %]> + Match ALL of the following against the same field:</option> </select> [% IF with_advanced_link %] <a id="custom_search_advanced_controller" diff --git a/template/en/default/search/field.html.tmpl b/template/en/default/search/field.html.tmpl index defc94cc3..ae7ca1ad4 100644 --- a/template/en/default/search/field.html.tmpl +++ b/template/en/default/search/field.html.tmpl @@ -71,7 +71,7 @@ YAHOO.bugzilla.keywordAutocomplete.init('[% field.name FILTER js %]', 'keyword_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" @@ -115,7 +115,7 @@ <select name="[% field.name FILTER html%]" id="[% field.name FILTER html %]" [% IF onchange %] onchange="[% onchange FILTER html %]"[% END %] - multiple="multiple" size="7"> + multiple="multiple" size="9"> [% legal_values = ${field.name} %] [% IF field.name == "component" %] [% legal_values = ${"component_"} %] diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl index 241ade088..5a97dd4d3 100644 --- a/template/en/default/search/form.html.tmpl +++ b/template/en/default/search/form.html.tmpl @@ -333,6 +333,7 @@ TUI_hide_default('information_query'); <select name="emailtype[% n %]"> [% FOREACH qv = [ { name => "substring", description => "contains" }, + { name => "notsubstring", description => "doesn't contain" }, { name => "exact", description => "is" }, { name => "notequals", description => "is not" }, { name => "regexp", description => "matches regexp" }, diff --git a/template/en/default/search/search-google.html.tmpl b/template/en/default/search/search-google.html.tmpl new file mode 100644 index 000000000..f363248a5 --- /dev/null +++ b/template/en/default/search/search-google.html.tmpl @@ -0,0 +1,45 @@ +[%# 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/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Search " _ terms.Bugs _ " using Google" +%] + +[% WRAPPER search/tabs.html.tmpl %] + +<p> + Use the <a href="http://www.google.com">Google</a> search engine to search + for [% terms.Bugzilla +%] [%+ terms.bugs %]. Find the [% terms.bugs %] you are + looking for by entering words that best describe it. +</p> + +<p> + For example, if the [% terms.bug %] you are looking for is a browser crash when + you go to a secure web site with an embedded Flash animation, you might search + for "crash secure SSL flash". +</p> + +<p> + <span style="color:red;">*</span> + Google only indexes publicly viewable [% terms.bugs %] and all may not be represented. +<p> + +<form method="get" action="https://www.google.com/search"> +<input type="hidden" name="sitesearch" value="bugzilla.mozilla.org"> + <nobr> + <input type="text" name="q" size="60" maxlength="255" value=""> + <input type="submit" value="Search"> + </nobr> +</form> + +[% END %] + +[% PROCESS global/footer.html.tmpl %] + diff --git a/template/en/default/search/search-instant.html.tmpl b/template/en/default/search/search-instant.html.tmpl new file mode 100644 index 000000000..5d75d1996 --- /dev/null +++ b/template/en/default/search/search-instant.html.tmpl @@ -0,0 +1,85 @@ +[%# 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/variables.none.tmpl %] + +[% PROCESS global/header.html.tmpl + title = "Instant Search" + javascript_urls = [ 'extensions/GuidedBugEntry/web/js/products.js', + 'js/instant-search.js', ] + yui = [ 'datatable', 'container' ] +%] + +[% UNLESS default.exists('product') && default.product.size %] + [% default.product = [ 'Firefox' ] %] +[% END %] + +<script> +YAHOO.bugzilla.instantSearch.setLabels( { + id: "[% field_descs.bug_id FILTER js %]", + summary: "[% field_descs.short_desc FILTER js %]", + component: "[% field_descs.component FILTER js %]", + status: "[% field_descs.bug_status FILTER js %]", +}); +</script> + +[% WRAPPER search/tabs.html.tmpl %] + +<p> + This page provides instant results; however, only the [% terms.bug %]'s summary + is searched. Products related to the selected product may also be searched. +</p> + +<table> + <tr> + <td align="right" valign="baseline"> + <b><label for="product">Product:</label></b> + </td> + <td> + <select name="product" id="product"> + [% 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 lsearch(default.product, p.name) != -1 %]> + [% p.name FILTER html %] + </option> + [% END %] + [% END %] + </optgroup> + [% END %] + [% ELSE %] + [% FOREACH p = product %] + <option value="[% p.name FILTER html %]" + [% " selected" IF lsearch(default.product, p.name) != -1 %]> + [% p.name FILTER html %] + </option> + [% END %] + [% END %] + </select> + </td> + </tr> + <tr> + <td align="right" valign="baseline"> + <b><label for="content">Words:</label></b> + </td> + <td> + <input id="content" spellcheck="true" size="60" + value="[% default.content.0 FILTER html %]"> + </td> + </tr> +</table> +<br> + +<div id="results"></div> + +[% END %] + +[% PROCESS global/footer.html.tmpl %] diff --git a/template/en/default/search/search-specific.html.tmpl b/template/en/default/search/search-specific.html.tmpl index 9ef299425..7e5de2c4a 100644 --- a/template/en/default/search/search-specific.html.tmpl +++ b/template/en/default/search/search-specific.html.tmpl @@ -98,7 +98,7 @@ for "crash secure SSL flash". <label for="content">Words:</label> </th> <td> - <input name="content" size="40" id="content" + <input name="content" size="60" id="content" value="[% default.content.0 FILTER html %]"> <script type="text/javascript"> <!-- document.forms['queryform'].content.focus(); @@ -107,6 +107,15 @@ for "crash secure SSL flash". </td> </tr> <tr> + <td> </td> + <td> + <input type="hidden" name="comments" value="0"> + <input type="checkbox" id="comments" name="comments" + value="1" [% 'checked' IF cgi.param("comments") %]> + <label for="comments">Search comments</label> + </td> + </tr> + <tr> <td></td> <td> diff --git a/template/en/default/search/tabs.html.tmpl b/template/en/default/search/tabs.html.tmpl index 119b30fde..26ad4f39b 100644 --- a/template/en/default/search/tabs.html.tmpl +++ b/template/en/default/search/tabs.html.tmpl @@ -24,10 +24,14 @@ #%] [% WRAPPER global/tabs.html.tmpl - tabs = [ { name => 'specific', label => "Simple Search", + tabs = [ { name => 'instant', label => "Instant Search", + link => "query.cgi?format=instant" }, + { name => 'specific', label => "Simple Search", link => "query.cgi?format=specific" }, { name => 'advanced', label => "Advanced Search", - link => "query.cgi?format=advanced" } ] + link => "query.cgi?format=advanced" }, + { name => 'google', label => 'Google Search', + link => "query.cgi?format=google" } ] 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 c96fc014e..103a2a3f5 100644 --- a/template/en/default/setup/strings.txt.pl +++ b/template/en/default/setup/strings.txt.pl @@ -102,9 +102,11 @@ END 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_updates => 'Automatic Update Notifications', feature_xmlrpc => 'XML-RPC Interface', |