| [%# This Source Code Form is subject to the terms of the Mozilla Public |
| # License, v. 2.0. If a copy of the MPL was not distributed with this |
| # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
| # |
| # This Source Code Form is "Incompatible With Secondary Licenses", as |
| # defined by the Mozilla Public License, v. 2.0. |
| #%] |
| |
| [%# INTERFACE: |
| # field: a Bugzilla::Field object |
| # value: The value of the field for this bug. |
| # field_hidden (optional): boolean; if true, the field is hidden by default. |
| # override_legal_values (optional): The list of legal values, for select fields. |
| # editable: Whether the field should be displayed as an editable |
| # <input> or as just the plain text of its value. |
| # allow_dont_change: display the --do_not_change-- option for select fields. |
| # value_span: A colspan for the table cell containing |
| # the field value. |
| # no_tds: boolean; if true, don't display the label <th> or the |
| # wrapping <td> for the field. |
| # bug (optional): The current Bugzilla::Bug being displayed, or a hash |
| # with default field values being displayed on a page. |
| # accesskey: set an accesskey attribute for this string |
| #%] |
| |
| [% IF NOT no_tds %] |
| [% field_hidden = 0 %] |
| [% IF bug AND !field.is_visible_on_bug(bug) %] |
| [% field_hidden = 1 %] |
| [% END %] |
| |
| [% INCLUDE "bug/field-label.html.tmpl" hidden = field_hidden %] |
| <td class="field_value [% ' bz_hidden_field' IF field_hidden %]" |
| id="field_container_[% field.name FILTER html %]" |
| [% " colspan=\"$value_span\"" FILTER none IF value_span %]> |
| [% END %] |
| [% Hook.process('start_field_column') %] |
| [% IF editable %] |
| [% SWITCH field.type %] |
| [% CASE [ constants.FIELD_TYPE_FREETEXT |
| constants.FIELD_TYPE_INTEGER ] %] |
| <input id="[% field.name FILTER html %]" class="text_input" |
| name="[% field.name FILTER html %]" |
| value="[% value FILTER html %]" size="40" |
| [% IF accesskey %] |
| accesskey="[% accesskey FILTER html %]" |
| [% END %] |
| maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]" |
| [% IF field.type == constants.FIELD_TYPE_INTEGER %] |
| pattern="-?\d+[% IF dontchange %]|[% dontchange FILTER html %][% END %]" |
| title="The value must be a valid positive or negative integer" |
| [% END %] |
| [% IF field.is_mandatory %] |
| data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %] |
| [% END %]> |
| [% CASE [constants.FIELD_TYPE_DATETIME, constants.FIELD_TYPE_DATE] %] |
| [% size = (field.type == constants.FIELD_TYPE_DATE) ? 10 : 20 %] |
| <input name="[% field.name FILTER html %]" size="[% size FILTER none %]" |
| id="[% field.name FILTER html %]" |
| value="[% value FILTER html %]" |
| [% IF field.is_mandatory %] |
| data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %] |
| [% END %] |
| onchange="updateCalendarFromField(this)"> |
| <button type="button" class="calendar_button" |
| id="button_calendar_[% field.name FILTER html %]" |
| onclick="showCalendar('[% field.name FILTER js %]')"> |
| <span>Calendar</span> |
| </button> |
| |
| <div id="con_calendar_[% field.name FILTER html %]"></div> |
| |
| <script type="text/javascript"> |
| <!-- |
| [%+ PROCESS "global/calendar.js.tmpl" id = field.name %] |
| //--></script> |
| [% CASE constants.FIELD_TYPE_BUG_ID %] |
| <span id="[% field.name FILTER html %]_input_area"> |
| <input name="[% field.name FILTER html %]" id="[% field.name FILTER html %]" |
| value="[% value FILTER html %]" size="7" |
| [% IF field.is_mandatory %] |
| data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %] |
| [% END %]> |
| </span> |
| |
| [% IF value %] |
| [% value FILTER bug_link(value, use_alias => 1) FILTER none %] |
| [% END %] |
| <span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden"> |
| (<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>) |
| </span> |
| <script type="text/javascript"> |
| hideEditableField('[% field.name FILTER js %]_edit_container', |
| '[% field.name FILTER js %]_input_area', |
| '[% field.name FILTER js %]_edit_action', |
| '[% field.name FILTER js %]', |
| "[% value FILTER js %]"); |
| </script> |
| [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT |
| constants.FIELD_TYPE_MULTI_SELECT ] %] |
| [%# The 'product' field needs its own template if classifications are enabled. %] |
| [% IF field.name == "product" AND Param('useclassification') %] |
| [% INCLUDE "global/product-select.html.tmpl" |
| id = "product", name = "product", value = value |
| products = override_legal_values %] |
| [% ELSE %] |
| <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 %] |
| [% SET field_size = 5 %] |
| [% IF field.legal_values.size < 5 %] |
| [% SET field_size = field.legal_values.size %] |
| [% END %] |
| size="[% field_size FILTER html %]" multiple="multiple" |
| [% IF field.is_mandatory %] |
| data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %] |
| [% END %] |
| [% END %]> |
| [% IF allow_dont_change %] |
| <option value="[% dontchange FILTER html %]" |
| [% ' selected="selected"' IF value == dontchange %]> |
| [% dontchange FILTER html %] |
| </option> |
| [% END %] |
| [% IF override_legal_values %] |
| [% legal_values = override_legal_values %] |
| [% ELSE %] |
| [% legal_values = field.legal_values %] |
| [% END %] |
| [% FOREACH legal_value = legal_values %] |
| [% NEXT IF NOT legal_value.is_active AND NOT value.contains(legal_value.name).size %] |
| <option value="[% legal_value.name FILTER html %]" |
| id="v[% legal_value.id FILTER html %]_ |
| [%- field.name FILTER html %]" |
| [%# We always show selected values, even if they should be |
| # hidden %] |
| [% IF value.contains(legal_value.name).size %] |
| selected="selected" |
| [% ELSIF bug AND !legal_value.is_visible_on_bug(bug) %] |
| class="bz_hidden_option" disabled="disabled" |
| [% END %]> |
| [%- display_value(field.name, legal_value.name) FILTER html ~%] |
| </option> |
| [% END %] |
| </select> |
| [%# When you pass an empty multi-select in the web interface, |
| # it doesn't appear at all in the CGI object. Instead of |
| # forcing all users of process_bug to always specify every |
| # multi-select, we have this field defined if the multi-select |
| # field is defined, and then if this is passed but the multi-select |
| # isn't, we know that the multi-select was emptied. |
| %] |
| [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %] |
| <input type="hidden" name="defined_[% field.name FILTER html %]"> |
| [% END %] |
| [% END %] |
| |
| <script type="text/javascript"> |
| <!-- |
| initHidingOptionsForIE('[% field.name FILTER js %]'); |
| [%+ INCLUDE "bug/field-events.js.tmpl" |
| field = field, product = bug.product_obj %] |
| //--> |
| </script> |
| |
| [% CASE constants.FIELD_TYPE_TEXTAREA %] |
| <div id="[% field.name FILTER html %]_edit_container" class="bz_default_hidden"> |
| <div> |
| (<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>) |
| </div> |
| [% IF value %] |
| <pre id="[% field.name FILTER html %]_readonly" |
| class="field_textarea_readonly">[% value FILTER html %]</pre> |
| [% END %] |
| </div> |
| <div id="[% field.name FILTER html %]_input"> |
| [% INCLUDE global/textarea.html.tmpl |
| id = field.name name = field.name minrows = 4 maxrows = 8 |
| cols = 60 defaultcontent = value mandatory = field.is_mandatory %] |
| </div> |
| <script type="text/javascript"> |
| hideEditableField('[% field.name FILTER js %]_edit_container', |
| '[% field.name FILTER js %]_input', |
| '[% field.name FILTER js %]_edit_action', |
| '[% field.name FILTER js %]', |
| '[% value FILTER js %]', |
| '', |
| true); |
| </script> |
| [% CASE constants.FIELD_TYPE_BUG_URLS %] |
| [% IF bug.id && value.size %] |
| <ul class="bug_urls"> |
| [% FOREACH bug_url = value %] |
| <li> |
| [% PROCESS bug_url_link bug_url = bug_url %] |
| <label><input type="checkbox" value="[% bug_url.name FILTER html %]" |
| name="remove_[% field.name FILTER html %]"> |
| Remove</label> |
| </li> |
| [% END %] |
| </ul> |
| [% END %] |
| [% IF Param('use_see_also') %] |
| <span id="container_showhide_[% field.name FILTER html %]" |
| class="bz_default_hidden"> |
| (<a href="#" id="showhide_[% field.name FILTER html %]">add</a>) |
| </span> |
| <div id="container_[% field.name FILTER html %]"> |
| <input type="text" id="[% field.name FILTER html %]" size="40" |
| class="text_input" name="[% field.name FILTER html %]" |
| [% IF !bug.id %]value="[% value FILTER html %]"[% END %]> |
| </div> |
| [% IF bug.id %] |
| <script type="text/javascript"> |
| setupEditLink('[% field.name FILTER js %]'); |
| </script> |
| [% END %] |
| [% END %] |
| [% CASE constants.FIELD_TYPE_KEYWORDS %] |
| <div id="[% field.name FILTER html %]_container"> |
| <input type="text" id="[% field.name FILTER html %]" size="40" |
| class="text_input" name="[% field.name FILTER html %]" |
| value="[% value FILTER html %]"> |
| <div id="[% field.name FILTER html %]_autocomplete"></div> |
| </div> |
| <script type="text/javascript"> |
| if (typeof YAHOO.bugzilla.field_array === "undefined") |
| YAHOO.bugzilla.field_array = []; |
| YAHOO.bugzilla.field_array["[% field.name FILTER js %]"] = [ |
| [%- FOREACH val = possible_values %] |
| [%-# %]"[% val FILTER js %]" |
| [%- "," IF NOT loop.last %][% END %]]; |
| YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]', |
| '[% field.name FILTER js %]_autocomplete'); |
| </script> |
| [% END %] |
| [% ELSE %] |
| [% SWITCH field.type %] |
| [% CASE constants.FIELD_TYPE_TEXTAREA %] |
| <div class="uneditable_textarea">[% value FILTER html %]</div> |
| [% CASE constants.FIELD_TYPE_BUG_ID %] |
| [% IF value %] |
| [% value FILTER bug_link(value, use_alias => 1) FILTER none %] |
| [% END %] |
| [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT |
| constants.FIELD_TYPE_MULTI_SELECT ] %] |
| [% FOREACH val = value %] |
| [% display_value(field.name, val) FILTER html %] |
| [% ', ' UNLESS loop.last() %] |
| [% END %] |
| [% CASE constants.FIELD_TYPE_BUG_URLS %] |
| [% '<ul class="bug_urls">' IF value.size %] |
| [% FOREACH bug_url = value %] |
| <li> |
| [% PROCESS bug_url_link bug_url = bug_url %] |
| </li> |
| [% END %] |
| [% '</ul>' IF value.size %] |
| [% CASE %] |
| [% value.join(', ') FILTER html %] |
| [% END %] |
| [% END %] |
| |
| [% IF bug && field.name == 'component' %] |
| (<a href="buglist.cgi?component=[% bug.component FILTER uri %]&product=[% bug.product FILTER uri %]&bug_status=__open__" |
| target="_blank">show other [% terms.bugs %]</a>) |
| [% END %] |
| |
| [% Hook.process('end_field_column') %] |
| [% '</td>' IF NOT no_tds %] |
| |
| [%# for reverse relationships, we show this pseudo-field after the main field %] |
| [% IF bug.id && field.is_relationship %] |
| [% extra_field_item = {} %] |
| [% extra_field_item.header = field.reverse_desc _ ":" FILTER html %] |
| [% extra_field_item.data = BLOCK %] |
| [% FOREACH depbug = bug.related_bugs(field) %] |
| [% depbug.id FILTER bug_link(depbug, use_alias => 1) FILTER none %][% " " %] |
| [% END %] |
| [% END %] |
| [% ELSE %] |
| [% extra_field_item = '' %] |
| [% END %] |
| |
| [% BLOCK bug_url_link %] |
| [% IF bug_url.isa('Bugzilla::BugUrl::Bugzilla::Local') %] |
| [% bug_url.target_bug_id FILTER bug_link(bug_url.target_bug_id, use_alias => 1) FILTER none %] |
| [% ELSE %] |
| <a href="[% bug_url.name FILTER html %]"> |
| [% bug_url.name FILTER html %]</a> |
| [% END %] |
| [% END %] |