| [%# 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 = BLOCK %]Enter [% terms.Bug %]: [% product.name FILTER html %][% END %] |
| [% use_qa_contact = Param("useqacontact") %] |
| |
| [% PROCESS global/header.html.tmpl |
| title = title |
| generate_api_token = 1 |
| yui = [ 'autocomplete', 'calendar', 'datatable', 'button' ] |
| style_urls = ['skins/standard/bug.css'] |
| javascript_urls = [ "js/attachment.js", "js/util.js", |
| "js/field.js", "js/TUI.js", "js/bug.js" ] |
| onload = "set_assign_to($use_qa_contact); hideElementById('attachment_true'); |
| showElementById('attachment_false'); showElementById('btn_no_attachment');" |
| %] |
| |
| <script type="text/javascript"> |
| <!-- |
| |
| var initialowners = new Array([% product.components.size %]); |
| var last_initialowner; |
| var initialccs = new Array([% product.components.size %]); |
| var components = new Array([% product.components.size %]); |
| var comp_desc = new Array([% product.components.size %]); |
| var flags = new Array([% product.components.size %]); |
| [% IF Param("useqacontact") %] |
| var initialqacontacts = new Array([% product.components.size %]); |
| var last_initialqacontact; |
| [% END %] |
| [% count = 0 %] |
| [%- FOREACH c = product.components %] |
| [% NEXT IF NOT c.is_active %] |
| components[[% count %]] = "[% c.name FILTER js %]"; |
| comp_desc[[% count %]] = "[% c.description FILTER html_light FILTER js %]"; |
| initialowners[[% count %]] = "[% c.default_assignee.login FILTER js %]"; |
| [% flag_list = [] %] |
| [% FOREACH f = c.flag_types.bug %] |
| [% NEXT UNLESS f.is_active %] |
| [% flag_list.push(f.id) %] |
| [% END %] |
| [% FOREACH f = c.flag_types.attachment %] |
| [% NEXT UNLESS f.is_active %] |
| [% flag_list.push(f.id) %] |
| [% END %] |
| flags[[% count %]] = [[% flag_list.join(",") FILTER js %]]; |
| [% IF Param("useqacontact") %] |
| initialqacontacts[[% count %]] = "[% c.default_qa_contact.login FILTER js %]"; |
| [% END %] |
| |
| [% SET initial_cc_list = [] %] |
| [% FOREACH cc_user = c.initial_cc %] |
| [% initial_cc_list.push(cc_user.login) %] |
| [% END %] |
| initialccs[[% count %]] = "[% initial_cc_list.join(', ') FILTER js %]"; |
| |
| [% count = count + 1 %] |
| [%- END %] |
| |
| var status_comment_required = new Array(); |
| [% FOREACH status = bug_status %] |
| status_comment_required['[% status.name FILTER js %]'] = |
| [% status.comment_required_on_change_from() ? 'true' : 'false' %] |
| [% END %] |
| |
| TUI_alternates['expert_fields'] = 'Show Advanced Fields'; |
| // Hide the Advanced Fields by default, unless the user has a cookie |
| // that specifies otherwise. |
| TUI_hide_default('expert_fields'); |
| // Also hide the "Paste text as attachment" textarea by default. |
| TUI_hide_default('attachment_text_field'); |
| --> |
| </script> |
| |
| <form name="Create" id="Create" method="post" action="post_bug.cgi" |
| class="enter_bug_form" enctype="multipart/form-data" |
| onsubmit="return validateEnterBug(this)"> |
| <input type="hidden" name="product" value="[% product.name FILTER html %]"> |
| <input type="hidden" name="token" value="[% token FILTER html %]"> |
| |
| <table> |
| <tbody> |
| <tr> |
| <td colspan="4"> |
| [%# Migration note: The following file corresponds to the old Param |
| # 'entryheaderhtml' |
| #%] |
| [% PROCESS 'bug/create/user-message.html.tmpl' %] |
| </td> |
| </tr> |
| |
| <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> |
| [%# Show the link if the browser supports JS %] |
| <script type="text/javascript"> |
| YAHOO.util.Dom.removeClass('expert_fields_controller', |
| 'bz_default_hidden'); |
| </script> |
| </td> |
| <td colspan="2"> |
| (<span class="required_star">*</span> = |
| <span class="required_explanation">Required Field</span>) |
| </td> |
| </tr> |
| |
| <tr> |
| [% INCLUDE bug/field.html.tmpl |
| bug = default, field = bug_fields.product, editable = 0, |
| value = product.name %] |
| [% INCLUDE bug/field.html.tmpl |
| bug = default, field = bug_fields.reporter, editable = 0, |
| value = user.login %] |
| </tr> |
| |
| [%# We can't use the select block in these two cases for various reasons. %] |
| <tr> |
| [% component_desc_url = BLOCK -%] |
| describecomponents.cgi?product=[% product.name FILTER uri %] |
| [% END %] |
| [% INCLUDE "bug/field-label.html.tmpl" |
| field = bug_fields.component editable = 1 |
| desc_url = component_desc_url |
| %] |
| <td id="field_container_component"> |
| <select name="component" id="component" onchange="set_assign_to([% Param("useqacontact") %]);" |
| size="7" aria-required="true" class="required"> |
| [%# Build the lists of assignees and QA contacts if "usemenuforusers" is enabled. %] |
| [% IF Param("usemenuforusers") %] |
| [% assignees_list = user.get_userlist.clone %] |
| [% qa_contacts_list = user.get_userlist.clone %] |
| [% END %] |
| |
| [%- FOREACH c = product.components %] |
| [% NEXT IF NOT c.is_active %] |
| <option value="[% c.name FILTER html %]" |
| id="v[% c.id FILTER html %]_component" |
| [% IF c.name.lower == default.component_.lower %] |
| [%# This is for bug/field.html.tmpl, for visibility-related |
| # controls. %] |
| [% default.component_id = c.id %] |
| selected="selected" |
| [% END %]> |
| [% c.name FILTER html -%] |
| </option> |
| [% IF Param("usemenuforusers") %] |
| [% INCLUDE build_userlist default_user = c.default_assignee, |
| userlist = assignees_list %] |
| [% INCLUDE build_userlist default_user = c.default_qa_contact, |
| userlist = qa_contacts_list %] |
| [% END %] |
| [%- END %] |
| </select> |
| |
| <script type="text/javascript"> |
| <!-- |
| [%+ INCLUDE "bug/field-events.js.tmpl" |
| field = bug_fields.component, product = product %] |
| //--> |
| </script> |
| </td> |
| |
| <td colspan="2" id="comp_desc_container"> |
| [%# Enclose the fieldset in a nested table so that its width changes based |
| # on the length on the component description. %] |
| <table> |
| <tr> |
| <td> |
| <fieldset> |
| <legend>Component Description</legend> |
| <div id="comp_desc" class="comment">Select a component to read its description.</div> |
| </fieldset> |
| </td> |
| </tr> |
| </table> |
| </td> |
| </tr> |
| |
| <tr> |
| [% INCLUDE "bug/field-label.html.tmpl" |
| field = bug_fields.version editable = 1 rowspan = 4 |
| %] |
| <td rowspan="4"> |
| <select name="version" id="version" size="5" aria-required="true" |
| class="required"> |
| [%- FOREACH v = version %] |
| [% NEXT IF NOT v.is_active %] |
| <option value="[% v.name FILTER html %]" |
| [% ' selected="selected"' IF v.name == default.version %]>[% v.name FILTER html -%] |
| </option> |
| [%- END %] |
| </select> |
| </td> |
| |
| [% INCLUDE bug/field.html.tmpl |
| bug = default, field = bug_fields.bug_severity, editable = 1, |
| value = default.bug_severity %] |
| </tr> |
| |
| <tr class="expert_fields"> |
| [% IF Param('letsubmitterchoosepriority') %] |
| [% INCLUDE bug/field.html.tmpl |
| bug = default, field = bug_fields.priority, editable = 1, |
| value = default.priority %] |
| [% ELSE %] |
| <td colspan="2"> </td> |
| [% END %] |
| </tr> |
| |
| <tr> |
| [% INCLUDE bug/field.html.tmpl |
| bug = default, field = bug_fields.rep_platform, editable = 1, |
| value = default.rep_platform %] |
| </tr> |
| |
| <tr> |
| [% INCLUDE bug/field.html.tmpl |
| bug = default, field = bug_fields.op_sys, editable = 1, |
| value = default.op_sys %] |
| </tr> |
| [% IF (!Param('defaultplatform') || !Param('defaultopsys')) && !cloned_bug_id %] |
| <tr> |
| <td colspan="2" class="expert_fields"> </td> |
| <td> </td> |
| <td id="os_guess_note" class="comment"> |
| <div>We've made a guess at your |
| [% IF Param('defaultplatform') %] |
| operating system. Please check it |
| [% ELSIF Param('defaultopsys') %] |
| platform. Please check it |
| [% ELSE %] |
| operating system and platform. Please check them |
| [% END %] |
| and make any corrections if necessary.</div> |
| </td> |
| </tr> |
| [% END %] |
| </tbody> |
| |
| <tbody class="expert_fields"> |
| <tr> |
| [% IF Param('usetargetmilestone') && Param('letsubmitterchoosemilestone') %] |
| [% INCLUDE select field = bug_fields.target_milestone %] |
| [% ELSE %] |
| <td colspan="2"> </td> |
| [% END %] |
| |
| <td colspan="2"> </td> |
| </tr> |
| </tbody> |
| |
| <tbody class="expert_fields"> |
| <tr> |
| <td colspan="4"> </td> |
| </tr> |
| |
| <tr> |
| [% INCLUDE bug/field.html.tmpl |
| bug = default, field = bug_fields.bug_status, |
| editable = (bug_status.size > 1), value = default.bug_status |
| override_legal_values = bug_status %] |
| |
| <td> </td> |
| [%# Calculate the number of rows we can use for flags %] |
| [% num_rows = 6 + (Param("useqacontact") ? 1 : 0) + |
| (user.is_timetracker ? 3 : 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"> |
| [% INCLUDE global/userselect.html.tmpl |
| id => "assigned_to" |
| name => "assigned_to" |
| value => assigned_to |
| disabled => assigned_to_disabled |
| size => 30 |
| emptyok => 1 |
| custom_userlist => assignees_list |
| %] |
| <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> |
| [% END %] |
| |
| <tr> |
| [% INCLUDE "bug/field-label.html.tmpl" |
| field = bug_fields.cc editable = 1 |
| %] |
| <td colspan="2"> |
| [% INCLUDE global/userselect.html.tmpl |
| id => "cc" |
| name => "cc" |
| value => cc |
| disabled => cc_disabled |
| size => 30 |
| multiple => 5 |
| %] |
| </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 %] |
| |
| <tr> |
| [% INCLUDE "bug/field-label.html.tmpl" |
| field = bug_fields.alias editable = 1 |
| %] |
| <td colspan="2"> |
| <input name="alias" size="20" value="[% alias FILTER html %]"> |
| </td> |
| </tr> |
| |
| <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> |
| |
| <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 |
| %] |
| <td colspan="3" class="field_value"> |
| <input name="short_desc" size="70" value="[% short_desc FILTER html %]" |
| maxlength="255" spellcheck="true" aria-required="true" |
| class="required text_input" id="short_desc"> |
| </td> |
| </tr> |
| |
| [% IF feature_enabled('jsonrpc') AND !cloned_bug_id |
| AND user.settings.possible_duplicates.value == 'on' %] |
| <tr id="possible_duplicates_container" class="bz_default_hidden"> |
| <th>Possible<br>Duplicates:</th> |
| <td colspan="3"> |
| <div id="possible_duplicates"></div> |
| <script type="text/javascript"> |
| var dt_columns = [ |
| { key: "id", label: "[% field_descs.bug_id FILTER js %]", |
| formatter: YAHOO.bugzilla.dupTable.formatBugLink }, |
| { key: "summary", |
| label: "[% field_descs.short_desc FILTER js %]", |
| formatter: "text" }, |
| { key: "status", |
| label: "[% field_descs.bug_status FILTER js %]", |
| formatter: YAHOO.bugzilla.dupTable.formatStatus }, |
| { key: "update_token", label: '', |
| formatter: YAHOO.bugzilla.dupTable.formatCcButton } |
| ]; |
| YAHOO.bugzilla.dupTable.addCcMessage = "Add Me to the CC List"; |
| YAHOO.bugzilla.dupTable.init({ |
| container: 'possible_duplicates', |
| columns: dt_columns, |
| product_name: '[% product.name FILTER js %]', |
| summary_field: 'short_desc', |
| options: { |
| MSG_LOADING: 'Searching for possible duplicates...', |
| MSG_EMPTY: 'No possible duplicates found.', |
| SUMMARY: 'Possible Duplicates' |
| } |
| }); |
| </script> |
| </td> |
| </tr> |
| [% END %] |
| |
| <tr> |
| <th>Description:</th> |
| <td colspan="3"> |
| |
| [% defaultcontent = BLOCK %] |
| [% IF cloned_bug_id %] |
| +++ This [% terms.bug %] was initially created as a clone of [% terms.Bug %] #[% cloned_bug_id %] +++ |
| |
| |
| [% END %] |
| [%-# We are within a BLOCK. The comment will be correctly HTML-escaped |
| # by global/textarea.html.tmpl. So we must not escape the comment here. %] |
| [% comment FILTER none %] |
| [%- END %] |
| [% INCLUDE bug/comment.html.tmpl |
| minrows = 10 |
| maxrows = 25 |
| cols = constants.COMMENT_COLS |
| defaultcontent = defaultcontent |
| %] |
| <br> |
| </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> |
| <script> |
| updateCommentTagControl(document.getElementById('comment_is_private'), 'comment'); |
| </script> |
| [% END %] |
| |
| [% IF Param("maxattachmentsize") || Param("maxlocalattachment") %] |
| <tr> |
| <th>Attachment:</th> |
| <td colspan="3"> |
| <div id="attachment_false" class="bz_default_hidden"> |
| <input type="button" value="Add an attachment" onClick="handleWantsAttachment(true)"> |
| </div> |
| |
| <div id="attachment_true"> |
| <input type="button" id="btn_no_attachment" value="Don't add an attachment" |
| class="bz_default_hidden" onClick="handleWantsAttachment(false)"> |
| <fieldset> |
| <legend>Add an attachment</legend> |
| <table class="attachment_entry"> |
| [% PROCESS attachment/createformcontents.html.tmpl |
| flag_types = product.flag_types.attachment |
| any_flags_requesteeble = 1 |
| flag_table_id ="attachment_flags" %] |
| </table> |
| </fieldset> |
| </div> |
| </td> |
| </tr> |
| [% END %] |
| </tbody> |
| |
| <tbody class="expert_fields"> |
| [% IF use_keywords %] |
| <tr> |
| [% INCLUDE bug/field.html.tmpl |
| bug = default, field = bug_fields.keywords, editable = 1, |
| value = keywords, possible_values = all_keywords, |
| desc_url = "describekeywords.cgi", value_span = 3 |
| %] |
| </tr> |
| [% END %] |
| |
| [% IF user.in_group('editbugs', product.id) %] |
| <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 %]"> |
| </td> |
| </tr> |
| <tr> |
| [% INCLUDE "bug/field-label.html.tmpl" |
| field = bug_fields.blocked editable = 1 |
| %] |
| <td colspan="3"> |
| <input name="blocked" accesskey="b" value="[% blocked FILTER html %]"> |
| </td> |
| </tr> |
| [% END %] |
| |
| [% IF Param('use_see_also') %] |
| <tr> |
| [% INCLUDE bug/field.html.tmpl |
| bug = default |
| field = bug_fields.see_also |
| editable = 1 |
| value = see_also |
| %] |
| </tr> |
| [% END %] |
| </tbody> |
| |
| <tbody class="expert_fields"> |
| [% IF product.groups_available.size %] |
| <tr> |
| <th> </th> |
| <td colspan="3"> |
| <br> |
| <strong> |
| Only users in [%+ IF Param('or_groups') %]at least one[% ELSE %]all[% END %] of the selected groups can view this |
| [%+ terms.bug %]: |
| </strong> |
| <br> |
| <span class="bz_info"> |
| (Leave all boxes unchecked to make this a public [% terms.bug %].) |
| </span> |
| <br> |
| <br> |
| |
| <!-- Checkboxes --> |
| <input type="hidden" name="defined_groups" value="1"> |
| [% FOREACH group = product.groups_available %] |
| <input type="checkbox" id="group_[% group.id FILTER html %]" |
| name="groups" value="[% group.name FILTER html %]" |
| [% ' checked="checked"' IF default.groups.contains(group.name) |
| OR group.is_default %]> |
| <label for="group_[% group.id FILTER html %]"> |
| [%- group.description FILTER html_light %]</label><br> |
| [% END %] |
| </td> |
| </tr> |
| [% END %] |
| </tbody> |
| |
| <tbody> |
| [%# Form controls for entering additional data about the bug being created. %] |
| [% Hook.process("form") %] |
| |
| <tr> |
| <th> </th> |
| <td colspan="3"> |
| <input type="submit" id="commit" value="Submit [% terms.Bug %]"> |
| |
| <input type="submit" name="maketemplate" id="maketemplate" |
| value="Remember values as bookmarkable template" |
| onclick="bz_no_validate_enter_bug=true" class="expert_fields"> |
| </td> |
| </tr> |
| </tbody> |
| </table> |
| <input type="hidden" name="form_name" value="enter_bug"> |
| </form> |
| |
| [%# Links or content with more information about the bug being created. %] |
| [% Hook.process("end") %] |
| |
| [% PROCESS global/footer.html.tmpl %] |
| |
| [%############################################################################%] |
| [%# Block for SELECT fields #%] |
| [%############################################################################%] |
| |
| [% BLOCK select %] |
| |
| [% INCLUDE "bug/field-label.html.tmpl" |
| field = field editable = 1 |
| %] |
| <td> |
| <select name="[% field.name FILTER html %]" |
| id="[% field.name FILTER html %]"> |
| [%- FOREACH x = ${field.name} %] |
| [% NEXT IF NOT x.is_active %] |
| <option value="[% x.name FILTER html %]" |
| [% " selected=\"selected\"" IF x.name == default.${field.name} %]> |
| [% display_value(field.name, x.name) FILTER html %] |
| </option> |
| [% END %] |
| </select> |
| </td> |
| [% END %] |
| |
| [% BLOCK build_userlist %] |
| [% user_found = 0 %] |
| [% default_login = default_user.login %] |
| [% RETURN UNLESS default_login %] |
| |
| [% FOREACH user = userlist %] |
| [% IF user.login == default_login %] |
| [% user_found = 1 %] |
| [% LAST %] |
| [% END %] |
| [% END %] |
| |
| [% userlist.push({login => default_login, |
| identity => default_user.identity, |
| visible => 1}) |
| UNLESS user_found %] |
| [% END %] |