| [%# 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): Myk Melez <myk@mozilla.org> |
| #%] |
| |
| <script type="text/javascript"> |
| <!-- |
| // Enables or disables a requestee field depending on whether or not |
| // the user is requesting the corresponding flag. |
| function toggleRequesteeField(flagField, no_focus) |
| { |
| // Convert the ID of the flag field into the ID of its corresponding |
| // requestee field and then use the ID to get the field. |
| var id = flagField.name.replace(/flag(_type)?-(\d+)/, "requestee$1-$2"); |
| var requesteeField = document.getElementById(id); |
| if (!requesteeField) return; |
| |
| // Enable or disable the requestee field based on the value |
| // of the flag field. |
| if (flagField.value == "?") { |
| requesteeField.disabled = false; |
| if (!no_focus) requesteeField.focus(); |
| } else |
| requesteeField.disabled = true; |
| } |
| |
| // Disables requestee fields when the window is loaded since they shouldn't |
| // be enabled until the user requests that flag type. |
| function disableRequesteeFields() |
| { |
| var inputElements = document.getElementsByTagName("input"); |
| var selectElements = document.getElementsByTagName("select"); |
| //You cannot update Node lists, so you must create an array to combine the NodeLists |
| var allElements = []; |
| for( var i=0; i < inputElements.length; i++ ) { |
| allElements[allElements.length] = inputElements.item(i); |
| } |
| for( var i=0; i < selectElements.length; i++ ) { //Combine inputs with selects |
| allElements[allElements.length] = selectElements.item(i); |
| } |
| var inputElement, id, flagField; |
| for ( var i=0 ; i<allElements.length ; i++ ) |
| { |
| inputElement = allElements[i]; |
| if (inputElement.name.search(/^requestee(_type)?-(\d+)$/) != -1) |
| { |
| // Convert the ID of the requestee field into the ID of its corresponding |
| // flag field and then use the ID to get the field. |
| id = inputElement.name.replace(/requestee(_type)?-(\d+)/, "flag$1-$2"); |
| flagField = document.getElementById(id); |
| if (flagField && flagField.value != "?") |
| inputElement.disabled = true; |
| } |
| } |
| } |
| window.onload = disableRequesteeFields; |
| // --> |
| </script> |
| |
| [%# We list flags by looping twice over the flag types relevant for the bug. |
| # In the first loop, we display existing flags and then, for active types, |
| # we display UI for adding new flags. In the second loop, we display UI |
| # for adding additional new flags for those types for which a flag already |
| # exists but which are multiplicable (can have multiple flags of the type |
| # on a single bug/attachment). |
| #%] |
| |
| [% DEFAULT flag_table_id = "flags" %] |
| |
| <table id="[% flag_table_id FILTER html %]"> |
| [% UNLESS flag_no_header %] |
| <tr> |
| <th colspan="3"> |
| Flags: |
| </th> |
| [% IF any_flags_requesteeble %] |
| <th> |
| Requestee: |
| </th> |
| [% END %] |
| </tr> |
| [% END %] |
| |
| [%# Step 1: Display every flag type (except inactive types with no flags). %] |
| [% FOREACH type = flag_types %] |
| |
| [%# Step 1a: Display existing flag(s). %] |
| [% FOREACH flag = type.flags %] |
| <tr> |
| <td> |
| [% flag.setter.nick FILTER html %]: |
| </td> |
| <td> |
| <label title="[% type.description FILTER html %]" |
| for="flag-[% flag.id %]"> |
| [%- type.name FILTER html FILTER no_break -%]</label> |
| </td> |
| <td> |
| <select id="flag-[% flag.id %]" name="flag-[% flag.id %]" |
| title="[% type.description FILTER html %]" |
| onchange="toggleRequesteeField(this);" |
| class="flag_select"> |
| [%# Only display statuses the user is allowed to set. %] |
| [% IF user.can_request_flag(type) %] |
| <option value="X"></option> |
| [% END %] |
| [% IF type.is_active %] |
| [% IF (type.is_requestable && user.can_request_flag(type)) || flag.status == "?" %] |
| <option value="?" [% "selected" IF flag.status == "?" %]>?</option> |
| [% END %] |
| [% IF user.can_set_flag(type) || flag.status == "+" %] |
| <option value="+" [% "selected" IF flag.status == "+" %]>+</option> |
| [% END %] |
| [% IF user.can_set_flag(type) || flag.status == "-" %] |
| <option value="-" [% "selected" IF flag.status == "-" %]>-</option> |
| [% END %] |
| [% ELSE %] |
| <option value="[% flag.status %]" selected="selected">[% flag.status %]</option> |
| [% END %] |
| </select> |
| </td> |
| [% IF any_flags_requesteeble %] |
| <td> |
| [% IF (type.is_active && type.is_requestable && type.is_requesteeble) || flag.requestee %] |
| <span style="white-space: nowrap;"> |
| [% IF Param('usemenuforusers') %] |
| [% flag_custom_list = flag.type.grant_list %] |
| [% IF !(type.is_active && type.is_requestable && type.is_requesteeble) %] |
| [%# We are here only because there was already a requestee. In this case, |
| the only valid action is to remove the requestee or leave it alone; |
| nothing else. %] |
| [% flag_custom_list = [flag.requestee] %] |
| [% END %] |
| [% INCLUDE global/userselect.html.tmpl |
| name => "requestee-$flag.id" |
| id => "requestee-$flag.id" |
| value => flag.requestee.login |
| multiple => 0 |
| emptyok => 1 |
| custom_userlist => flag_custom_list |
| %] |
| [% ELSE %] |
| (<input type="text" size="30" maxlength="255" |
| id="requestee-[% flag.id %]" |
| name="requestee-[% flag.id %]" |
| [% IF flag.status == "?" && flag.requestee %] |
| value="[% flag.requestee.login FILTER html %]" |
| [% END %]>) |
| [% END %] |
| </span> |
| [% END %] |
| </td> |
| [% END %] |
| </tr> |
| [% END %] |
| |
| [%# Step 1b: Display UI for setting flag. %] |
| [% IF (!type.flags || type.flags.size == 0) && type.is_active %] |
| <tr> |
| <td> </td> |
| <td> |
| <label title="[% type.description FILTER html %]" |
| for="flag_type-[% type.id %]"> |
| [%- type.name FILTER html FILTER no_break %]</label> |
| </td> |
| <td> |
| <select id="flag_type-[% type.id %]" name="flag_type-[% type.id %]" |
| title="[% type.description FILTER html %]" |
| [% " disabled=\"disabled\"" UNLESS (type.is_requestable && user.can_request_flag(type)) || user.can_set_flag(type) %] |
| onchange="toggleRequesteeField(this);" |
| class="flag_select"> |
| <option value="X"></option> |
| [% IF type.is_requestable && user.can_request_flag(type) %] |
| <option value="?">?</option> |
| [% END %] |
| [% IF user.can_set_flag(type) %] |
| <option value="+">+</option> |
| <option value="-">-</option> |
| [% END %] |
| </select> |
| </td> |
| [% IF any_flags_requesteeble %] |
| <td> |
| [% IF type.is_requestable && type.is_requesteeble %] |
| <span style="white-space: nowrap;"> |
| [% IF Param('usemenuforusers') %] |
| [% INCLUDE global/userselect.html.tmpl |
| name => "requestee_type-$type.id" |
| id => "requestee_type-$type.id" |
| multiple => type.is_multiplicable * 3 |
| emptyok => !type.is_multiplicable |
| value => "" |
| custom_userlist => type.grant_list |
| %] |
| [% ELSE %] |
| (<input type="text" size="30" maxlength="255" |
| id="requestee_type-[% type.id %]" |
| name="requestee_type-[% type.id %]">) |
| [% END %] |
| </span> |
| [% END %] |
| </td> |
| [% END %] |
| </tr> |
| [% END %] |
| [% END %] |
| |
| [%# Step 2: Display flag type again (if type is multiplicable). %] |
| [% FOREACH type = flag_types %] |
| [% NEXT UNLESS type.flags && type.flags.size > 0 && type.is_multiplicable && type.is_active %] |
| [% IF !separator_displayed %] |
| <tr><td colspan="3"><hr></td></tr> |
| [% separator_displayed = 1 %] |
| [% END %] |
| <tr> |
| <td colspan="2"> |
| addl. <label title="[% type.description FILTER html %]" |
| for="flag_type-[% type.id %]"> |
| [%- type.name FILTER html FILTER no_break %]</label> |
| </td> |
| <td> |
| <select id="flag_type-[% type.id %]" name="flag_type-[% type.id %]" |
| title="[% type.description FILTER html %]" |
| [% " disabled=\"disabled\"" UNLESS (type.is_requestable && user.can_request_flag(type)) || user.can_set_flag(type) %] |
| onchange="toggleRequesteeField(this);" |
| class="flag_select"> |
| <option value="X"></option> |
| [% IF type.is_requestable && user.can_request_flag(type) %] |
| <option value="?">?</option> |
| [% END %] |
| [% IF user.can_set_flag(type) %] |
| <option value="+">+</option> |
| <option value="-">-</option> |
| [% END %] |
| </select> |
| </td> |
| [% IF any_flags_requesteeble %] |
| <td> |
| [% IF type.is_requestable && type.is_requesteeble %] |
| <span style="white-space: nowrap;"> |
| [% IF Param('usemenuforusers') %] |
| [% INCLUDE global/userselect.html.tmpl |
| name => "requestee_type-$type.id" |
| id => "requestee_type-$type.id" |
| multiple => type.is_multiplicable * 3 |
| emptyok => !type.is_multiplicable |
| value => "" |
| custom_userlist => type.grant_list |
| %] |
| [% ELSE %] |
| (<input type="text" size="30" maxlength="255" |
| id="requestee_type-[% type.id %]" |
| name="requestee_type-[% type.id %]">) |
| [% END %] |
| </span> |
| [% END %] |
| </td> |
| [% END %] |
| </tr> |
| [% END %] |
| |
| </table> |