| [%# 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): Chris Lahey <clahey@ximian.com> [javascript fixes] |
| # Christian Reis <kiko@async.com.br> [javascript rewrite] |
| # Gervase Markham <gerv@gerv.net> |
| #%] |
| |
| <script type="text/javascript"> |
| |
| var first_load = true; [%# is this the first time we load the page? %] |
| var last_sel = new Array(); [%# caches last selection %] |
| |
| [% IF Param('useclassification') %] |
| var useclassification = true; |
| var prods = new Array(); |
| [% ELSE %] |
| var useclassification = false; |
| [% END %] |
| var cpts = new Array(); |
| var vers = new Array(); |
| [% IF Param('usetargetmilestone') %] |
| var tms = new Array(); |
| [% END %] |
| |
| [%# Create an array of products, indexed by the classification #%] |
| |
| [% nclass = 0 %] |
| [% FOREACH c = classification %] |
| prods[[% nclass FILTER js %]] = [ |
| [% sep = '' %] |
| [%- FOREACH item = user.get_selectable_products(c.id) -%] |
| [%- IF item.components.size -%] |
| [%- sep FILTER js %]'[% item.name FILTER js %]' |
| [%- sep = ',' -%] |
| [%- END -%] |
| [%- END -%] ]; |
| [% nclass = nclass+1 %] |
| [% END %] |
| |
| [%# Create three arrays of components, versions and target milestones, indexed |
| # numerically according to the product they refer to. #%] |
| |
| [% n = 0 %] |
| [% FOREACH p = product %] |
| [% NEXT IF NOT p.components.size %] |
| [% IF Param('useclassification') %] |
| prods['[% p.name FILTER js %]'] = [% n %] |
| [% END %] |
| cpts[[% n %]] = [ |
| [%- FOREACH item = p.components %]'[% item.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; |
| vers[[% n %]] = [ |
| [%- FOREACH item = p.versions -%]'[% item.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; |
| [% IF Param('usetargetmilestone') %] |
| tms[[% n %]] = [ |
| [%- FOREACH item = p.milestones %]'[% item.name FILTER js %]'[% ", " UNLESS loop.last %] [%- END -%] ]; |
| [% END %] |
| [% n = n+1 %] |
| [% END %] |
| |
| /* |
| * doOnSelectProduct determines which selection should get updated |
| * |
| * - selectmode = 0 - init |
| * selectmode = 1 - classification selected |
| * selectmode = 2 - product selected |
| * |
| * globals: |
| * queryform - string holding the name of the selection form |
| */ |
| function doOnSelectProduct(selectmode) { |
| var f = document.forms[queryform]; |
| var milestone = (typeof(f.target_milestone) == "undefined" ? |
| null : f.target_milestone); |
| if (selectmode == 0) { |
| // If there is no classification selected, give us a chance to fill |
| // the select fields with values from the possibly selected product. |
| if (useclassification && f.classification.selectedIndex > -1) { |
| selectClassification(f.classification, f.product, f.component, f.version, milestone); |
| } else { |
| selectProduct(f.product, f.component, f.version, milestone, null); |
| } |
| } else if (selectmode == 1) { |
| selectClassification(f.classification, f.product, f.component, f.version, milestone); |
| } else { |
| selectProduct(f.product, f.component, f.version, milestone, null); |
| } |
| } |
| |
| </script> |
| |
| |
| [% PROCESS global/variables.none.tmpl %] |
| |
| [% query_variants = [ |
| { value => "allwordssubstr", description => "contains all of the words/strings" }, |
| { value => "anywordssubstr", description => "contains any of the words/strings" }, |
| { value => "substring", description => "contains the string" }, |
| { value => "casesubstring", description => "contains the string (exact case)" }, |
| { value => "allwords", description => "contains all of the words" }, |
| { value => "anywords", description => "contains any of the words" }, |
| { value => "regexp", description => "matches the regexp" }, |
| { value => "notregexp", description => "doesn't match the regexp" } ] %] |
| |
| [% PROCESS "global/field-descs.none.tmpl" %] |
| |
| [%# If we resubmit to ourselves, we need to know if we are using a format. %] |
| [% thisformat = query_format != '' ? query_format : format %] |
| <input type="hidden" name="query_format" value="[% thisformat FILTER html %]"> |
| |
| [%# *** Summary *** %] |
| |
| <table> |
| <tr> |
| <th align="right"> |
| <label for="short_desc" accesskey="s"><u>S</u>ummary</label>: |
| </th> |
| <td> |
| <select name="short_desc_type"> |
| [% FOREACH qv = query_variants %] |
| <option value="[% qv.value %]" |
| [% " selected" IF default.short_desc_type.0 == qv.value %]>[% qv.description %]</option> |
| [% END %] |
| </select> |
| </td> |
| <td> |
| <input name="short_desc" id="short_desc" size="40" |
| value="[% default.short_desc.0 FILTER html %]"> |
| <script type="text/javascript"> <!-- |
| document.forms[queryform].short_desc.focus(); |
| // --> |
| </script> |
| </td> |
| <td> |
| [% IF button_name %] |
| <input type="submit" id="[% button_name FILTER css_class_quote %]_top" |
| value="[% button_name FILTER html %]"> |
| [% END %] |
| </td> |
| </tr> |
| |
| [%# *** Classification Product Component Version Target *** %] |
| <tr> |
| <td colspan="4"> |
| <table> |
| <tr> |
| [% IF Param('useclassification') %] |
| <td valign="top"> |
| <table> |
| <tr valign="bottom"> |
| <th align="left"> |
| <label for="classification">Classification</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| <td align="left"> |
| <select name="classification" multiple="multiple" size="5" id="classification" |
| onchange="doOnSelectProduct(1);"> |
| [% FOREACH cat = classification %] |
| <option value="[% cat.name FILTER html %]" |
| [% " selected" IF lsearch(default.classification, cat.name) != -1 %]> |
| [% cat.name FILTER html %] |
| </option> |
| [% END %] |
| </select> |
| </td> |
| </tr> |
| </table> |
| </td> |
| [% END %] |
| <td valign="top"> |
| <table> |
| <tr valign="bottom"> |
| <th align="left"> |
| <label for="product" accesskey="p"><u>P</u>roduct</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [%# Can't use the select block here because of the onChange %] |
| <td align="left"> |
| <select name="product" multiple="multiple" size="5" id="product" |
| onchange="doOnSelectProduct(2);"> |
| [% FOREACH p = product %] |
| [% IF p.components.size %] |
| <option value="[% p.name FILTER html %]" |
| [% " selected" IF lsearch(default.product, p.name) != -1 %]> |
| [% p.name FILTER html %]</option> |
| [% END %] |
| [% END %] |
| </select> |
| </td> |
| </tr> |
| </table> |
| </td> |
| <td valign="top"> |
| <table> |
| <tr valign="bottom"> |
| <th align="left"> |
| <label for="component" accesskey="m"><a href="describecomponents.cgi">Co<u>m</u>ponent</a></label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [%# Can't use the select block here because 'component' is a toolkit |
| reserved word - we use 'component_' instead. %] |
| <td align="left"> |
| <select name="component" id="component" |
| multiple="multiple" size="5"> |
| [% FOREACH c = component_ %] |
| <option value="[% c FILTER html %]" |
| [% " selected" IF lsearch(default.component, c) != -1 %]> |
| [% c FILTER html %]</option> |
| [% END %] |
| </select> |
| </td> |
| </tr> |
| </table> |
| </td> |
| <td valign="top"> |
| <table> |
| <tr valign="bottom"> |
| <th align="left"> |
| <label for="version">Version</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [% PROCESS select sel = { name => 'version', |
| size => 5 } %] |
| </tr> |
| </table> |
| </td> |
| [% IF Param('usetargetmilestone') %] |
| <td valign="top"> |
| <table> |
| <tr valign="bottom"> |
| <th align="left"> |
| <label for="target_milestone">Target</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [% PROCESS select sel = { name => 'target_milestone', |
| size => 5 } %] |
| </tr> |
| </table> |
| </td> |
| [% END %] |
| </tr> |
| </table> |
| </td> |
| </tr> |
| |
| [%# *** Comment URL Whiteboard Keywords *** %] |
| |
| [% FOREACH field = [ |
| { name => "long_desc", description => "A <u>C</u>omment", |
| accesskey => 'c' }, |
| { name => "bug_file_loc", description => "The <u>U</u>RL", |
| accesskey => 'u' }, |
| { name => "status_whiteboard", description => "<u>W</u>hiteboard", |
| accesskey => 'w' } ] %] |
| |
| [% UNLESS field.name == 'status_whiteboard' AND NOT Param('usestatuswhiteboard') %] |
| <tr> |
| <th align="right"> |
| <label for="[% field.name %]" accesskey="[% field.accesskey %]">[% field.description %]</label>: |
| </th> |
| <td> |
| <select name="[% field.name %]_type"> |
| [% FOREACH qv = query_variants %] |
| [% type = "${field.name}_type" %] |
| <option value="[% qv.value %]" |
| [% " selected" IF default.$type.0 == qv.value %]>[% qv.description %]</option> |
| [% END %] |
| </select> |
| </td> |
| <td><input name="[% field.name %]" id="[% field.name %]" size="40" |
| value="[% default.${field.name}.0 FILTER html %]"> |
| </td> |
| <td></td> |
| </tr> |
| [% END %] |
| [% END %] |
| |
| [% IF have_keywords %] |
| <tr> |
| <th align="right"> |
| <label for="keywords" accesskey="k"><a href="describekeywords.cgi"><u>K</u>eywords</a></label>: |
| </th> |
| <td> |
| <select name="keywords_type"> |
| [% FOREACH qv = [ |
| { name => "allwords", description => "contains all of the keywords" }, |
| { name => "anywords", description => "contains any of the keywords" }, |
| { name => "nowords", description => "contains none of the keywords" } ] %] |
| |
| <option value="[% qv.name %]" |
| [% " selected" IF default.keywords_type.0 == qv.name %]> |
| [% qv.description %]</option> |
| [% END %] |
| </select> |
| </td> |
| <td> |
| <input name="keywords" id="keywords" size="40" |
| value="[% default.keywords.0 FILTER html %]"> |
| </td> |
| </tr> |
| [% END %] |
| |
| [%# Deadline %] |
| [% IF user.in_group(Param("timetrackinggroup")) %] |
| <tr> |
| <th align="right"> |
| <label for="deadlinefrom" accesskey="l">Dead<u>l</u>ine</label>: |
| </th> |
| <td> |
| from <input name="deadlinefrom" id="deadlinefrom" size="10" maxlength="10" |
| value="[% default.deadlinefrom.0 FILTER html %]"> |
| to <input name="deadlineto" size="10" maxlength="10" |
| value="[% default.deadlineto.0 FILTER html %]"> |
| </td> |
| <td> |
| <small>(YYYY-MM-DD)</small> |
| </td> |
| </tr> |
| [% END %] |
| |
| </table> |
| |
| <hr> |
| |
| [%# *** Status Resolution Severity Priority Hardware OS *** %] |
| |
| <table> |
| <tr> |
| <td> |
| <table> |
| <tr> |
| <th align="left"> |
| <label for="bug_status" accesskey="a">St<u>a</u>tus</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [% PROCESS select sel = { name => 'bug_status', |
| size => 7 } %] |
| </tr> |
| </table> |
| </td> |
| <td> |
| <table> |
| <tr> |
| <th align="left"> |
| <label for="resolution" accesskey="r"><u>R</u>esolution</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [% PROCESS select sel = { name => 'resolution', |
| size => 7 } %] |
| </tr> |
| </table> |
| </td> |
| <td> |
| <table> |
| <tr> |
| <th align="left"> |
| <label for="bug_severity">Severity</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [% PROCESS select sel = { name => 'bug_severity', |
| size => 7 }%] |
| </tr> |
| </table> |
| </td> |
| <td> |
| <table> |
| <tr> |
| <th align="left"> |
| <label for="priority" accesskey="i">Pr<u>i</u>ority</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [% PROCESS select sel = { name => 'priority', |
| size => 7 } %] |
| </tr> |
| </table> |
| </td> |
| <td> |
| <table> |
| <tr> |
| <th align="left"> |
| <label for="rep_platform" accesskey="h"><u>H</u>ardware</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [% PROCESS select sel = { name => 'rep_platform', |
| size => 7 } %] |
| </tr> |
| </table> |
| </td> |
| <td> |
| <table> |
| <tr> |
| <th align="left"> |
| <label for="op_sys" accesskey="o"><u>O</u>S</label>: |
| </th> |
| </tr> |
| <tr valign="top"> |
| [% PROCESS select sel = { name => 'op_sys', |
| size => 7 } %] |
| </tr> |
| </table> |
| </td> |
| </tr> |
| </table> |
| |
| [%# *** Email Numbering Votes *** %] |
| |
| <table> |
| <tr> |
| <td> |
| <fieldset> |
| <legend> |
| <strong> |
| [% IF Param('usevotes') %] |
| Email Addresses, [% terms.Bug %] Numbers, and Votes |
| [% ELSE %] |
| Email Addresses and [% terms.Bug %] Numbers |
| [% END %] |
| </strong> |
| </legend> |
| |
| |
| <table> |
| <tr> |
| [% FOREACH n = [1, 2] %] |
| <td> |
| |
| |
| <table cellspacing="0" cellpadding="0"> |
| <tr> |
| <td> |
| Any of: |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <input type="checkbox" name="emailassigned_to[% n %]" |
| id="emailassigned_to[% n %]" value="1" |
| [% " checked" IF default.emailassigned_to.$n %]> |
| <label for="emailassigned_to[% n %]"> |
| the [% terms.bug %] assignee |
| </label> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <input type="checkbox" name="emailreporter[% n %]" |
| id="emailreporter[% n %]" value="1" |
| [% " checked" IF default.emailreporter.$n %]> |
| <label for="emailreporter[% n %]"> |
| the reporter |
| </label> |
| </td> |
| </tr> |
| [% IF Param('useqacontact') %] |
| <tr> |
| <td> |
| <input type="checkbox" name="emailqa_contact[% n %]" |
| id="emailqa_contact[% n %]" value="1" |
| [% " checked" IF default.emailqa_contact.$n %]> |
| <label for="emailqa_contact[% n %]"> |
| the QA contact |
| </label> |
| </td> |
| </tr> |
| [% END %] |
| <tr> |
| <td> |
| <input type="checkbox" name="emailcc[% n %]" |
| id="emailcc[% n %]" value="1" |
| [% " checked" IF default.emailcc.$n %]> |
| <label for="emailcc[% n %]"> |
| a CC list member |
| </label> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <input type="checkbox" name="emaillongdesc[% n %]" |
| id="emaillongdesc[% n %]" value="1" |
| [% " checked" IF default.emaillongdesc.$n %]> |
| <label for="emaillongdesc[% n %]"> |
| a commenter |
| </label> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <select name="emailtype[% n %]"> |
| [% FOREACH qv = [ |
| { name => "substring", description => "contains" }, |
| { name => "exact", description => "is" }, |
| { name => "notequals", description => "is not" }, |
| { name => "regexp", description => "matches regexp" }, |
| { name => "notregexp", description => "doesn't match regexp" } ] %] |
| |
| <option value="[% qv.name %]" |
| [% " selected" IF default.emailtype.$n == qv.name %]>[% qv.description %]</option> |
| [% END %] |
| </select> |
| </td> |
| </tr> |
| <tr> |
| <td> |
| <input name="email[% n %]" size="25" value="[% default.email.$n FILTER html %]"> |
| </td> |
| </tr> |
| </table> |
| |
| |
| </td> |
| [% END %] |
| </tr> |
| </table> |
| <hr> |
| <table> |
| <tr> |
| <td> |
| <select name="bugidtype"> |
| <option value="include"[% " selected" IF default.bugidtype.0 == "include" %]>Only include</option> |
| <option value="exclude"[% " selected" IF default.bugidtype.0 == "exclude" %]>Exclude</option> |
| </select> |
| <label for="bug_id">[% terms.bugs %] numbered</label>: |
| </td> |
| <td> |
| <input type="text" name="bug_id" id="bug_id" |
| value="[% default.bug_id.0 FILTER html %]" size="20"> |
| </td> |
| </tr> |
| <tr> |
| <td></td> |
| <td>(comma-separated list)</td> |
| </tr> |
| [% IF Param('usevotes') %] |
| <tr> |
| <td align="right"> |
| <label for="votes">Only [% terms.bugs %] with at least</label>: |
| </td> |
| <td> |
| <input name="votes" id="votes" size="3" |
| value="[% default.votes.0 FILTER html %]"> |
| votes |
| </td> |
| </tr> |
| [% END %] |
| </table> |
| |
| |
| </fieldset> |
| </td> |
| |
| [%# *** Bug Changes *** %] |
| |
| <td valign="top"> |
| <fieldset> |
| <legend><strong>[% terms.Bug %] Changes</strong></legend> |
| |
| |
| <dl class="bug_changes"> |
| <dt> |
| <label for="chfieldfrom">Only [% terms.bugs %] changed between</label>: |
| </dt> |
| <dd> |
| <input name="chfieldfrom" id="chfieldfrom" |
| size="10" value="[% default.chfieldfrom.0 FILTER html %]"> |
| and <input name="chfieldto" size="10" value="[% default.chfieldto.0 FILTER html %]"> |
| <br>(YYYY-MM-DD or relative dates) |
| </dd> |
| <dt> |
| <label for="chfield">where one or more of the following changed</label>: |
| </dt> |
| <dd> |
| [%# Create array, so we can sort it by description #%] |
| [% chfields = [] %] |
| [% FOREACH field = chfield %] |
| [% chfields.push({value => field, desc => (field_descs.$field || field) }) %] |
| [% END %] |
| |
| <select name="chfield" id="chfield" multiple="multiple" size="4"> |
| [% FOREACH field = chfields.sort('desc') %] |
| <option value="[% field.value FILTER html %]" |
| [% " selected" IF lsearch(default.chfield, field.value) != -1 %]> |
| [% field.desc FILTER html %]</option> |
| [% END %] |
| </select> |
| </dd> |
| <dt>and <label for="chfieldvalue">the new value was</label>:</dt> |
| <dd> |
| <input name="chfieldvalue" id="chfieldvalue" |
| size="20" value="[% default.chfieldvalue.0 FILTER html %]"> |
| </dd> |
| </dl> |
| |
| </fieldset> |
| </td> |
| </tr> |
| </table> |
| |
| [%############################################################################%] |
| [%# Block for SELECT fields #%] |
| [%############################################################################%] |
| |
| [% BLOCK select %] |
| <td align="left"> |
| <select name="[% sel.name %]" id="[% sel.name %]" |
| multiple="multiple" size="[% sel.size %]"> |
| [% FOREACH name = ${sel.name} %] |
| <option value="[% name FILTER html %]" |
| [% " selected" IF lsearch(default.${sel.name}, name) != -1 %]> |
| [% IF sel.name == "bug_status" %] |
| [% get_status(name) FILTER html %] |
| [% ELSIF sel.name == "resolution" %] |
| [% get_resolution(name) FILTER html %] |
| [% ELSE %] |
| [% name FILTER html %] |
| [% END %] |
| </option> |
| [% END %] |
| </select> |
| </td> |
| [% END %] |