diff options
Diffstat (limited to 'template/en/default/bug')
-rw-r--r-- | template/en/default/bug/comments.html.tmpl | 100 | ||||
-rw-r--r-- | template/en/default/bug/create/comment-guided.txt.tmpl | 2 | ||||
-rw-r--r-- | template/en/default/bug/create/create-guided.html.tmpl | 48 | ||||
-rw-r--r-- | template/en/default/bug/create/create.html.tmpl | 466 | ||||
-rw-r--r-- | template/en/default/bug/edit.html.tmpl | 388 | ||||
-rw-r--r-- | template/en/default/bug/field.html.tmpl | 27 | ||||
-rw-r--r-- | template/en/default/bug/navigate.html.tmpl | 14 | ||||
-rw-r--r-- | template/en/default/bug/process/bugmail.html.tmpl | 31 | ||||
-rw-r--r-- | template/en/default/bug/process/updates-disabled.html.tmpl | 73 | ||||
-rw-r--r-- | template/en/default/bug/show-header.html.tmpl | 23 | ||||
-rw-r--r-- | template/en/default/bug/show-multiple.html.tmpl | 2 | ||||
-rw-r--r-- | template/en/default/bug/show.xml.tmpl | 5 |
12 files changed, 773 insertions, 406 deletions
diff --git a/template/en/default/bug/comments.html.tmpl b/template/en/default/bug/comments.html.tmpl index 170c69349..23f024ae1 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. @@ -52,6 +109,8 @@ [% 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> @@ -65,14 +124,6 @@ [% count = count + increment %] [% END %] -[% IF user.settings.comment_box_position.value == "before_comments" && user.id %] - <div class="bz_add_comment"> - <a href="#" - onclick="return goto_add_comments();"> - Add Comment</a> - </div> -[% END %] - [%# Note: this template is used in multiple places; if you use this hook, # make sure you are aware of this fact. #%] @@ -86,11 +137,6 @@ return false;">Collapse All Comments</a></li> <li><a href="#" onclick="toggle_all_comments('expand'); return false;">Expand All Comments</a></li> - [% IF user.settings.comment_box_position.value == "after_comments" && user.id %] - <li class="bz_add_comment"><a href="#" - onclick="return goto_add_comments('bug_status_bottom');"> - Add Comment</a></li> - [% END %] </ul> [% END %] </td> @@ -101,7 +147,7 @@ [%############################################################################%] [% 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 %] @@ -120,8 +166,16 @@ [% IF mode == "edit" %] <span class="bz_comment_actions"> + [% IF comment_text.search("(?:^>|\n>)") %] + [<a class="bz_wrap_link" href="#" + onclick="return toggleCommentWrap(this, [% count %])">wrap</a>] + [% END %] + [<a class="bz_reply_link" href="#add_comment" + [% IF user.settings.quote_replies.value != 'off' %] + onclick="replyToComment('[% count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;" + [% END %] + >reply</a>] <script type="text/javascript"><!-- - addReplyLink([% count %], [% comment.id %]); addCollapseLink([% count %], 'Toggle comment display'); // --> </script> </span> @@ -147,12 +201,19 @@ </span> <span class="bz_comment_user"> - [% INCLUDE global/user.html.tmpl who = comment.author %] - </span> + [%# 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 %]"> @@ -179,4 +240,5 @@ [%- comment_text FILTER quoteUrls(bug, comment) -%] </pre> </div> + [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %] [% 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 f3dd680df..22ca4ebab 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'); } } } @@ -185,9 +213,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,121 +376,78 @@ 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> [% INCLUDE "bug/field-label.html.tmpl" @@ -474,34 +458,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 @@ -574,21 +533,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 +564,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 +583,193 @@ 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 %] </tbody> +<tbody> +[%# non-tracking flags custom fields %] +[% FOREACH field = Bugzilla.active_custom_fields(product=>product,type=>1) %] + [% 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 %] + +[% tracking_flags = [] %] +[% project_flags = [] %] +[% FOREACH field = Bugzilla.active_custom_fields(product=>product,type=>2) %] + [% NEXT UNLESS field.enter_bug %] + [% IF cf_is_project_flag(field.name) %] + [% project_flags.push(field) %] + [% ELSE %] + [% tracking_flags.push(field) %] + [% END %] +[% 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 project_flags.size || 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 cellpadding="0" cellspacing="0"> + <tr> + [% IF tracking_flags.size %] + <td [% IF project_flags.size %]rowspan="2"[% END %]> + <table id="bug_tracking_flags"> + <tr> + <th colspan="2" style="text-align:left">Tracking Flags:</th> + </tr> + <tr> + [% FOREACH field = tracking_flags %] + [% SET value = ${field.name}.defined ? ${field.name} : "" %] + <tr> + [% INCLUDE bug/field.html.tmpl + bug = default, field = field, value = value, editable = 1, + value_span = 3 %] + </tr> + [% END %] + </tr> + </table> + </td> + [% END %] + [% IF project_flags.size %] + <td> + <table id="bug_project_flags"> + <tr> + <th colspan="2" style="text-align:left">Project Flags:</th> + </tr> + <tr> + [% FOREACH field = project_flags %] + [% SET value = ${field.name}.defined ? ${field.name} : "" %] + <tr> + [% INCLUDE bug/field.html.tmpl + bug = default, field = field, value = value, editable = 1, + value_span = 3 %] + </tr> + [% END %] + </tr> + </table> + </td> + </tr> + <tr> + [% END %] + [% 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 %] <tr> <th> </th> <td colspan="3"> - <br> <strong> Only users in all of the selected groups can view this [%+ terms.bug %]: @@ -662,7 +779,6 @@ 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"> @@ -694,6 +810,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 +824,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 bdee83806..8d40e4ab7 100644 --- a/template/en/default/bug/edit.html.tmpl +++ b/template/en/default/bug/edit.html.tmpl @@ -32,71 +32,6 @@ <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 @@ -116,7 +51,6 @@ // if the remaining time is changed manually, update fRemainingTime fRemainingTime = document.changeform.remaining_time.value; } - [% END %] /* Index all classifications so we can keep track of the classification @@ -164,17 +98,29 @@ [% 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 %] @@ -182,16 +128,16 @@ [% PROCESS section_cclist %] [% PROCESS section_spacer %] - - [% PROCESS section_see_also %] + + [% PROCESS section_flags %] - [% PROCESS section_customfields %] + [% PROCESS section_see_also %] [% PROCESS section_spacer %] + [% PROCESS section_customfields %] + [% Hook.process("after_custom_fields") %] - - [% PROCESS section_flags %] </table> </td> @@ -220,6 +166,8 @@ [% IF user.settings.comment_box_position.value == 'before_comments' %] [% PROCESS comment_box %] + [% ELSE %] + [% PROCESS summon_comment_box %] [% END %] </td> <td> @@ -238,7 +186,10 @@ [% IF user.settings.comment_box_position.value == 'after_comments' %] <hr> [% PROCESS comment_box %] - [% END %] + [% ELSE %] + [% PROCESS summon_comment_box %] + [% END %] + </form> @@ -249,7 +200,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 +305,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 +315,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 +327,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 +340,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 +359,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 +395,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 +414,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 +432,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 +481,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 +529,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 +549,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 +581,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,18 +735,18 @@ [% 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 %] </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 ', ' ')%] (<a href="show_activity.cgi?id=[% bug.bug_id %]">[%# terms.Bug %]History</a>) @@ -774,9 +760,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 +794,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> @@ -885,26 +878,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 %] + <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 +936,8 @@ [% 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,type=>1) %] + [% NEXT IF NOT user.id AND field.value == "---" %] <tr> [% PROCESS bug/field.html.tmpl value = bug.${field.name} editable = bug.check_can_change_field(field.name, 0, 1) @@ -1094,9 +1114,9 @@ <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 +1143,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 +1166,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.html.tmpl b/template/en/default/bug/field.html.tmpl index 58f1b0ccc..2447a240e 100644 --- a/template/en/default/bug/field.html.tmpl +++ b/template/en/default/bug/field.html.tmpl @@ -97,6 +97,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 +122,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 %]" @@ -177,7 +202,7 @@ </span> <div id="container_[% field.name FILTER html %]"> <label for="[% field.name FILTER html %]"> - <strong>Add [% terms.Bug %] URLs:</strong> + Add [% terms.Bug %] URLs: </label><br> <input type="text" id="[% field.name FILTER html %]" size="40" class="text_input" name="[% field.name FILTER html %]"> diff --git a/template/en/default/bug/navigate.html.tmpl b/template/en/default/bug/navigate.html.tmpl index 46b92aec4..56150bec3 100644 --- a/template/en/default/bug/navigate.html.tmpl +++ b/template/en/default/bug/navigate.html.tmpl @@ -29,12 +29,22 @@ <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 + [% 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> + </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 %] diff --git a/template/en/default/bug/process/bugmail.html.tmpl b/template/en/default/bug/process/bugmail.html.tmpl index b0132a2fe..50f6e7aa8 100644 --- a/template/en/default/bug/process/bugmail.html.tmpl +++ b/template/en/default/bug/process/bugmail.html.tmpl @@ -26,7 +26,15 @@ [% PROCESS global/variables.none.tmpl %] -<dl> +[%# hide the recipient list by default from new users %] +[% show_recipients = + user.settings.post_bug_submit_action.value == 'nothing' + || user.in_group('canconfirm') + || !user.can_see_bug(mailing_bugid) +%] + +<dl id="bugmail_summary_[% mailing_bugid FILTER none %]" + [%~ ' class="bz_default_hidden"' UNLESS show_recipients %]> [% PROCESS emails description = "Email sent to" names = sent_bugmail.sent @@ -38,6 +46,27 @@ %] </dl> +[% IF !show_recipients %] + [% recipient_count = sent_bugmail.sent.size %] + <div id="bugmail_summary_placeholder_[% mailing_bugid FILTER none %]" + [%~ ' class="bz_default_hidden"' IF show_recipients %]> + [% IF recipient_count > 0 %] + Email sent to [% recipient_count FILTER html %] + recipient[% 's' UNLESS recipient_count == 1 %]. + [% ELSE %] + No emails were sent. + [% END %] + (<a href="#" onclick=" + YAHOO.util.Dom.removeClass( + 'bugmail_summary_[% mailing_bugid FILTER none %]', + 'bz_default_hidden'); + YAHOO.util.Dom.addClass( + 'bugmail_summary_placeholder_[% mailing_bugid FILTER none %]', + 'bz_default_hidden'); + return false;">show</a>) + </div> +[% END %] + [%############################################################################%] [%# Block for a set of email addresses #%] [%############################################################################%] 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/show-header.html.tmpl b/template/en/default/bug/show-header.html.tmpl index 54570911d..40f35ba7c 100644 --- a/template/en/default/bug/show-header.html.tmpl +++ b/template/en/default/bug/show-header.html.tmpl @@ -39,16 +39,27 @@ [% IF bug.defined %] [% unfiltered_title = "$terms.Bug $bug.bug_id – $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..207b3ed86 100644 --- a/template/en/default/bug/show-multiple.html.tmpl +++ b/template/en/default/bug/show-multiple.html.tmpl @@ -192,6 +192,8 @@ [% USE Bugzilla %] [% field_counter = 0 %] [% FOREACH field = Bugzilla.active_custom_fields %] + [% NEXT IF cf_hidden_in_product(field.name, bug.product, bug.component) %] + [% NEXT IF cf_flag_disabled(field.name, bug) %] [% 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..cb323d229 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 %]" @@ -142,6 +144,7 @@ [% ELSIF field == "see_also" %] [% val = val.name %] [% END %] + [% NEXT IF cf_hidden_in_product(field.name, bug.product, bug.component) %] <[% field %][% IF name != '' %] name="[% name FILTER xml %]"[% END -%]> [%- val FILTER xml %]</[% field %]> [% END %] |