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

[% PROCESS global/header.html.tmpl
  title = "$terms.Bug Fields"
  bodyclasses = ['narrow_page']
%]

<p>This page describes the various fields that you see 
  on [% terms.abug %].</p>

<table class="field_value_explanation">
  <thead>
  <tr>
    <td id="bug_status">
      <h2>[% field_descs.bug_status FILTER upper FILTER html %]</h2>
    </td>

    <td id="resolution">
      <h2>[% field_descs.resolution FILTER upper FILTER html %]</h2>
    </td>
  </tr>

  <tr>
    <td>The [% field_descs.bug_status FILTER html %] field indicates the 
      current state of a [% terms.bug %]. Only certain status transitions
      are allowed.</td>

    <td>The [% field_descs.resolution FILTER html %] field indicates what
      happened to this [%+ terms.bug %].</td>
  </tr>
  </thead>

  <tbody>
  <tr class="header_row">
    <td colspan="2">Open [% terms.Bugs %]</td>
  </tr>
  <tr>
    <td>
      <dl>
        <dt class="unconfirmed">
          [% display_value("bug_status", "UNCONFIRMED") FILTER html %]
        </dt>
        <dd class="unconfirmed">
          This [% terms.bug %] has recently been added to the database. 
          Nobody has confirmed that this [% terms.bug %] is valid. Users
          who have the "canconfirm" permission set may confirm
          this [% terms.bug %], changing its state to 
          <b>[% display_value("bug_status", "CONFIRMED") FILTER html %]</b>. 
          Or, it may be directly resolved and marked
          <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
        </dd>

        <dt class="confirmed">
          [% display_value("bug_status", "CONFIRMED") FILTER html %]
        </dt>
        <dd class="confirmed">
          This [% terms.bug %] is valid and has recently been filed.
          [%+ terms.Bugs %] in this state become 
          <b>[% display_value("bug_status", "IN_PROGRESS") FILTER html %]</b>
          when somebody is working on them, or become resolved and marked
          <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
        </dd>

        <dt class="in_progress">
          [% display_value("bug_status", "IN_PROGRESS") FILTER html %]
        </dt>
        <dd class="in_progress">
          This [% terms.bug %] is not yet resolved, but is assigned to the
          proper person who is working on the [% terms.bug %]. From here,
          [%+ terms.bugs %] can be given to another person and become
          <b>[% display_value("bug_status", "CONFIRMED") FILTER html %]</b>, or
          resolved and become 
          <b>[% display_value("bug_status", "RESOLVED") FILTER html %]</b>.
        </dd>
        
        [% Hook.process('open-status') %]
      </dl>
    </td>

    <td>
      No resolution yet. All [% terms.bugs %] which are in one of
      these "open" states have no resolution set.
    </td>
  </tr>

  <tr class="header_row">
    <td colspan="2">Closed [% terms.Bugs %]</td>
  </tr>

  <tr>
    <td>
      <dl>
        <dt class="resolved">
          [% display_value("bug_status", "RESOLVED") FILTER html %]
        </dt>
        <dd class="resolved">
          A resolution has been performed, and it is awaiting verification by
          QA. From here [% terms.bugs %] are either reopened and given some
          open status, or are verified by QA and marked
          <b>[% display_value("bug_status", "VERIFIED") FILTER html %]</b>.
        </dd>

        <dt class="verified">
          [% display_value("bug_status", "VERIFIED") FILTER html %]
        </dt>
        <dd class="verified">
          QA has looked at the [% terms.bug %] and the resolution and
          agrees that the appropriate resolution has been taken. This is
          the final status for [% terms.bugs %].
        </dd>
        
        [% Hook.process('closed-status') %]
      </dl>
    </td>

    <td>
      <dl>
        <dt class="fixed">
          [% display_value("resolution", "FIXED") FILTER html %]
        </dt>
        <dd class="fixed">
          A fix for this [% terms.bug %] is checked into the tree and 
          tested.
        </dd>

        <dt class="invalid">
          [% display_value("resolution", "INVALID") FILTER html %]
        </dt>
        <dd class="invalid">
          The problem described is not [% terms.abug %].
        </dd>

        <dt class="wontfix">
          [% display_value("resolution", "WONTFIX") FILTER html %]
        </dt>
        <dd class="wontfix">
          The problem described is [% terms.abug %] which will never be 
          fixed.
        </dd>

        <dt class="duplicate">
         [% display_value("resolution", "DUPLICATE") FILTER html %]
        </dt>
        <dd class="duplicate">
          The problem is a duplicate of an existing [% terms.bug %].
          When [% terms.abug %] is marked as a
          <b>[% display_value("resolution", "DUPLICATE") FILTER html %]</b>,
          you will see which [% terms.bug %] it is a duplicate of,
          next to the resolution.
        </dd>

        <dt class="worksforme">
          [% display_value("resolution", "WORKSFORME") FILTER html %]
        </dt>
        <dd class="worksforme">
          All attempts at reproducing this [% terms.bug %] were futile, 
          and reading the code produces no clues as to why the described
          behavior would occur. If more information appears later,
          the [% terms.bug %] can be reopened.
        </dd>
        
        [% Hook.process('resolution') %]
      </dl>
    </td>
  </tr>
  </tbody>
</table>

<h2>Other Fields</h2>

[% SET field_help_map = {} %]
[% FOREACH field = bug_fields.keys %]
  [% SET field_desc = field_descs.$field %]
  [% field_help_map.$field_desc = { help  => help_html.$field, 
                                    field => field } %]
[% END %]

[%# This field is not a real one, but its label is visible in bugs. %]

[% field_help_map.Importance = { help  => help_html.importance,
                                 field => "importance" } %]

[%# These are fields that don't need to be documented, either because
  # they have docs somewhere else in the UI, or they don't show up on bugs. 
  # %]
[% SET skip_fields = [ 
  'days_elapsed', 
  'everconfirmed',
  'reporter_accessible',
  'cclist_accessible',
  'bug_group',
  'commenter',
  'owner_idle_time',
  'bug_status',
  'resolution',
] %]

<dl class="field_descriptions">
[% FOREACH field_desc = field_help_map.keys.sort %]
  [% SET field = field_help_map.${field_desc}.field %]
  [% SET field_object = bug_fields.$field %]

  [% NEXT IF field_object.obsolete %]
  [% NEXT IF !user.is_timetracker AND field_object.is_timetracking %]

  [% NEXT IF field == 'status_whiteboard' AND !Param('usestatuswhiteboard') %]
  [% NEXT IF field == 'target_milestone' AND !Param('usetargetmilestone') %]

  [%# For now we don't have help for attachment fields and so on. %]
  [% NEXT IF field.match('\.') %]

  [% NEXT IF skip_fields.contains(field) %]

  <dt id="[% field FILTER html %]">[% field_desc FILTER html %]</dt>
    <dd>
      [% field_help_map.${field_desc}.help FILTER html_light %]
    </dd>
[% END %]
</dl>

[% PROCESS global/footer.html.tmpl %]
