field.html.tmpl 12.8 KB
Newer Older
1 2 3
[%# 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/.
4
  #
5 6
  # This Source Code Form is "Incompatible With Secondary Licenses", as
  # defined by the Mozilla Public License, v. 2.0.
7 8
  #%]

9 10 11
[%# INTERFACE:
  #   field: a Bugzilla::Field object
  #   value: The value of the field for this bug.
12
  #   field_hidden (optional): boolean; if true, the field is hidden by default.
13
  #   override_legal_values (optional): The list of legal values, for select fields.
14 15
  #   editable: Whether the field should be displayed as an editable
  #             <input> or as just the plain text of its value.
16
  #   allow_dont_change: display the --do_not_change-- option for select fields.
17 18
  #   value_span: A colspan for the table cell containing
  #               the field value.
19 20
  #   no_tds: boolean; if true, don't display the label <th> or the 
  #           wrapping <td> for the field.
21 22
  #   bug (optional): The current Bugzilla::Bug being displayed, or a hash 
  #                   with default field values being displayed on a page.
23 24
  #%]

25
[% IF NOT no_tds %]
26 27 28 29 30 31 32
  [% 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 %]"
33 34
      id="field_container_[% field.name FILTER html %]" 
      [% " colspan=\"$value_span\"" FILTER none IF value_span %]>
35
[% END %]
36
[% Hook.process('start_field_column') %]
37
[% IF editable %]
38
  [% SWITCH field.type %]
39 40
    [% CASE [ constants.FIELD_TYPE_FREETEXT
              constants.FIELD_TYPE_INTEGER ] %]
41 42
        <input id="[% field.name FILTER html %]" class="text_input"
               name="[% field.name FILTER html %]"
43
               value="[% value FILTER html %]" size="40"
44
               maxlength="[% constants.MAX_FREETEXT_LENGTH FILTER none %]"
45 46 47 48
               [% 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 %]
49 50 51
               [% IF field.is_mandatory %]
                 data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
               [% END %]>
52 53 54
    [% 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 %]"
55 56
             id="[% field.name FILTER html %]"
             value="[% value FILTER html %]"
57 58 59
             [% IF field.is_mandatory %]
               data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
             [% END %]
60 61 62 63 64 65 66
             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>

67
      <div id="con_calendar_[% field.name FILTER html %]"></div>
68 69

      <script type="text/javascript">
70 71 72
        <!--
          [%+ PROCESS "global/calendar.js.tmpl" id = field.name %]
        //--></script>
73 74 75
    [% 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 %]"
76
                 value="[% value FILTER html %]" size="7"
77 78 79
                 [% IF field.is_mandatory %]
                   data-required="true" [% 'aria-required="true" required' UNLESS field_hidden %]
                 [% END %]>
80 81
        </span>

82 83
        [% IF value %]  
          [% value FILTER bug_link(value, use_alias => 1) FILTER none %]
84 85 86 87 88
        [% 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">
89 90 91 92
        hideEditableField('[% field.name FILTER js %]_edit_container',
                          '[% field.name FILTER js %]_input_area',
                          '[% field.name FILTER js %]_edit_action',
                          '[% field.name FILTER js %]',
93
                          "[% value FILTER js %]");
94
        </script>
95 96
    [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT 
              constants.FIELD_TYPE_MULTI_SELECT ] %]
97 98 99 100 101 102
      [%# 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 %]
103
        <input type="hidden" id="[% field.name FILTER html %]_dirty">
104 105 106
        <select id="[% field.name FILTER html %]" 
                name="[% field.name FILTER html %]" 
                [% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
107 108 109 110 111 112 113 114 115
                  [% 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 %]>
116
          [% IF allow_dont_change %]
117 118
            <option value="[% dontchange FILTER html %]"
                   [% ' selected="selected"' IF value == dontchange %]>
119 120 121
              [% dontchange FILTER html %]
            </option>
          [% END %]
122 123 124 125
          [% IF override_legal_values %]
            [% legal_values = override_legal_values %]
          [% ELSE %]
            [% legal_values = field.legal_values %]
126
          [% END %]
127
          [% FOREACH legal_value = legal_values %]
128
            [% NEXT IF NOT legal_value.is_active AND NOT value.contains(legal_value.name).size %]
129
            <option value="[% legal_value.name FILTER html %]"
130 131
                    id="v[% legal_value.id FILTER html %]_
                        [%- field.name FILTER html %]"
132 133 134 135
              [%# We always show selected values, even if they should be
                # hidden %]
              [% IF value.contains(legal_value.name).size %]
                selected="selected"
136
              [% ELSIF bug AND !legal_value.is_visible_on_bug(bug) %]
137 138
                class="bz_hidden_option" disabled="disabled"
              [% END %]>
139 140
              [%- display_value(field.name, legal_value.name) FILTER html ~%]
            </option>
141 142
          [% END %]
        </select>
143 144 145 146 147 148 149 150 151 152
        [%# 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 %]
153
      [% END %]
154

155
      <script type="text/javascript">
156 157
        <!--
          initHidingOptionsForIE('[% field.name FILTER js %]');
158 159
          [%+ INCLUDE "bug/field-events.js.tmpl"
                      field = field, product = bug.product_obj %]
160
        //-->
161
      </script>
162

163
    [% CASE constants.FIELD_TYPE_TEXTAREA %]
164 165 166 167 168
       <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 %]
169 170
           <pre id="[% field.name FILTER html %]_readonly"
                class="field_textarea_readonly">[% value FILTER html %]</pre>
171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
         [% 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>
187
    [% CASE constants.FIELD_TYPE_BUG_URLS %]
188 189 190 191 192 193 194 195 196 197 198
       [% 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>
199
       [% END %]
200
       [% IF Param('use_see_also') %]
201 202
         <span id="container_showhide_[% field.name FILTER html %]"
               class="bz_default_hidden">
203
           (<a href="#" id="showhide_[% field.name FILTER html %]">add</a>)
204 205 206
         </span>
         <div id="container_[% field.name FILTER html %]">
           <input type="text" id="[% field.name FILTER html %]" size="40"
207 208
                  class="text_input" name="[% field.name FILTER html %]"
                  [% IF !bug.id %]value="[% value FILTER html %]"[% END %]>
209
         </div>
210 211
         [% IF bug.id %]
           <script type="text/javascript">
212
             setupEditLink('[% field.name FILTER js %]');
213 214
           </script>
         [% END %]
215
       [% END %]
216
     [% CASE constants.FIELD_TYPE_KEYWORDS %]
217
       <div id="[% field.name FILTER html %]_container">
218 219 220
         <input type="text" id="[% field.name FILTER html %]" size="40"
                class="text_input" name="[% field.name FILTER html %]"
                value="[% value FILTER html %]">
221
         <div id="[% field.name FILTER html %]_autocomplete"></div>
222
       </div>
223
       <script type="text/javascript">
224 225 226 227 228
         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 %]"
229
             [%- "," IF NOT loop.last %][% END %]];
230 231
         YAHOO.bugzilla.fieldAutocomplete.init('[% field.name FILTER js %]',
                                               '[% field.name FILTER js %]_autocomplete');
232
       </script>
233
  [% END %]
234
[% ELSE %]
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
  [% 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 %]
259
[% END %]
260 261 262 263 264 265

[% IF bug && field.name == 'component' %]
  (<a href="buglist.cgi?component=[% bug.component FILTER uri %]&amp;product=[% bug.product FILTER uri %]&amp;bug_status=__open__"
      target="_blank">show other [% terms.bugs %]</a>)
[% END %]

266
[% Hook.process('end_field_column') %]
267
[% '</td>' IF NOT no_tds %]
268 269 270 271 272 273 274 275 276 277 278 279 280

[%# 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 %]
281 282 283 284 285 286 287 288 289

[% 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 %]