edit.html.tmpl 13.9 KB
[%# 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.
  #%]

[%# Define strings that will serve as the title and header of this page %]
[% title = BLOCK %]
  Attachment [% attachment.id %] Details for [% terms.Bug %] [%+ attachment.bug_id %]
  – [% attachment.description FILTER html %]
[% END %]
[% header = BLOCK %]
  Attachment [% attachment.id %] Details for
  [%+ "$terms.Bug ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]
[% END %]
[% subheader = BLOCK %][% attachment.bug.short_desc FILTER html %][% END %]

[% PROCESS global/header.html.tmpl
  title = title
  header = header
  subheader = subheader
  generate_api_token = 1
  doc_section = "using/editing.html#attachments"
  javascript_urls = ['js/attachment.js', 'js/field.js']
  style_urls = ['skins/standard/bug.css']
  yui = [ 'autocomplete' ]
  bodyclasses = "no_javascript"
%]

[%# No need to display the Diff button and iframe if the attachment is not a patch. %]
[% use_patchviewer = (feature_enabled('patch_viewer') && attachment.ispatch) ? 1 : 0 %]
[% can_edit = attachment.validate_can_edit %]
[% editable_or_hide = can_edit ? "" : " bz_hidden_option" %]

<form method="post" action="attachment.cgi" onsubmit="normalizeComments();">
  <input type="hidden" name="id" value="[% attachment.id %]">
  <input type="hidden" name="action" value="update">
  <input type="hidden" name="contenttypemethod" value="manual">
  <input type="hidden" name="delta_ts" value="[% attachment.modification_time FILTER html %]">
  [% IF user.id %]
    <input type="hidden" name="token" value="[% issue_hash_token([attachment.id, attachment.modification_time]) FILTER html %]">
  [% END %]

  <div id="attachment_info" class="attachment_info [% IF can_edit %] edit[% ELSE %] read[% END%]">
    <div id="attachment_attributes">
      <div id="attachment_information_read_only" class="[% "bz_private" IF attachment.isprivate %]">
        <div class="title">
          [% "[patch]" IF attachment.ispatch%] 
          <span class="[% "bz_obsolete" IF attachment.isobsolete %]" title="[% "obsolete" IF attachment.isobsolete %]">              
            [% attachment.description FILTER html %]
          </span>
          [% IF can_edit %]
            <span class="bz_edit">(<a href="javascript:toggle_attachment_details_visibility()">edit details</a>)</span>
          [% END %]
        </div>
        <div class="details">
          [% attachment.filename FILTER html %] ([% attachment.contenttype FILTER html %]),
          [% IF attachment.datasize %]
            [%+ attachment.datasize FILTER unitconvert %]
          [% ELSE %]
            <em>deleted</em>
          [% END %], created by [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %] on [%+ attachment.attached FILTER time %]
          [% IF attachment.isprivate %];
            <span class="bz_private">only visible to <strong>[% Param('insidergroup') FILTER html %]</strong> members</span>
          [% END %]
        </div>
      </div>
      <div id="attachment_information_edit">
        <span class="bz_hide">
          (<a href="javascript:toggle_attachment_details_visibility();">hide</a>)
        </span>
        <div id="attachment_description">
          <label for="description">Description:</label>&nbsp;
          [% INCLUDE global/textarea.html.tmpl
            id             = 'description'
            name           = 'description'
            minrows        = 3
            cols           = 25
            wrap           = 'soft'
            classes        = 'block' _ editable_or_hide
            defaultcontent = attachment.description
          %]          
        </div>

          <div id="attachment_filename">
            <label for="filename">Filename:</label>
            <input type="text" size="20"  class="text block[% editable_or_hide %]"
                   id="filename" name="filename"
                   value="[% attachment.filename FILTER html %]">     
          </div>

          <div id="attachment_mimetype">
            <label for="contenttypeentry">MIME Type:</label>
            <input type="text" size="20" class="text block[% editable_or_hide %]"
                   id="contenttypeentry" name="contenttypeentry"
                   value="[% attachment.contenttype FILTER html %]">                   
          </div>
          
          <div id="attachment_creator">
            <span class="label">Creator:</span>
            [%+ INCLUDE global/user.html.tmpl who = attachment.attacher %]
          </div>

          <div id="attachment_created">
            <span class="label">Created:</span>
            [%+ attachment.attached FILTER time %]
          </div>

          <div id="attachment_size">
            <span class="label">Size:</span>
            [% IF attachment.datasize %]
              [%+ attachment.datasize FILTER unitconvert %]
            [% ELSE %]
              <em>deleted</em>
            [% END %]
          </div>

          <div id="attachment_ispatch">
            <input type="checkbox" id="ispatch" name="ispatch" value="1"
                   [%+ 'checked="checked"' IF attachment.ispatch %]>
                   <label for="ispatch">patch</label>
          </div>

        <div class="readonly">
          <div class="checkboxes">
            <div id="attachment_isobsolete">
              <input type="checkbox" id="isobsolete" name="isobsolete" value="1"                     
                     [%+ 'checked="checked"' IF attachment.isobsolete %]>
                <label for="isobsolete">obsolete</label>
            </div>

            [% IF user.is_insider %]
              <div id="attachment_isprivate">
                <input type="checkbox" id="isprivate" name="isprivate" value="1"
                       [%+ 'checked="checked"' IF attachment.isprivate %]>
                [% IF can_edit %]
                  <label for="isprivate">private (only visible to
                    <strong>[% Param('insidergroup') FILTER html %]</strong>)
                  </label>
                [% ELSE %]
                  <span class="label">Is Private:</span>
                  [%+ attachment.isprivate ? "yes" : "no" %]
                [% END %]
              </div>
            [% END %]
          </div>
        </div>                    
      </div>

      <div id="attachment_view_window">
        [% IF !attachment.datasize %]
          <div><b>The content of this attachment has been deleted.</b></div>
        [% ELSIF !Param("allow_attachment_display") %]
          <div id="view_disabled">
            <p><b>
              The attachment is not viewable in your browser due to security
              restrictions enabled by your [% terms.Bugzilla %] administrator.
            </b></p>
            <p><b>
              In order to view the attachment, you first have to
              <a href="attachment.cgi?id=[% attachment.id %]">download it</a>.
            </b></p>
          </div>
        [% ELSIF attachment.is_viewable %]
          <div>
            [% INCLUDE global/textarea.html.tmpl
              id      = 'editFrame'
              name    = 'comment'
              classes   = 'bz_default_hidden'
              minrows = 10
              cols    = 80
              wrap    = 'soft'
              disabled = 'disabled'
              defaultcontent = (attachment.contenttype.match('^text\/')) ?
                                 attachment.data.replace('(.*\n|.+)', '>$1') : undef
            %]
            [% IF attachment.contenttype == 'text/plain' AND is_safe_url(attachment.data) %]
              <p>
                <a href="[% attachment.data FILTER html %]">
                  [% IF attachment.datasize < 120 %]
                    [% attachment.data FILTER html %]
                  [% ELSE %]
                    [% attachment.data FILTER truncate(80) FILTER html %]
                    ...
                    [% attachment.data.match('.*(.{20})$').0 FILTER html %]
                  [% END %]
                </a>
              </p>
            [% ELSIF attachment.contenttype == "text/html" %]
              [%# For security reasons (clickjacking, embedded scripts), we never
                # render HTML pages from here. The source code is displayed instead. %]
              [% INCLUDE global/textarea.html.tmpl
                 id      = 'viewFrame'
                 minrows = 10
                 cols    = 80
                 defaultcontent = attachment.data
                 readonly = 'readonly'
              %]
            [% ELSE %]
              <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]" sandbox>
                <b>You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
                <a href="attachment.cgi?id=[% attachment.id %]">View the attachment on a separate page</a>.</b>
              </iframe>
            [% END %]

            [% IF use_patchviewer %]
              <iframe id="viewDiffFrame" class="bz_default_hidden"></iframe>
            [% END %]

            [% IF user.id %]
              <button type="button" id="editButton" class="bz_default_hidden"
                      onclick="editAsComment([% use_patchviewer %]);">Edit Attachment As Comment</button>
              <button type="button" id="undoEditButton" class="bz_default_hidden"
                      onclick="undoEditAsComment([% use_patchviewer %]);">Undo Edit As Comment</button>
              <button type="button" id="redoEditButton" class="bz_default_hidden"
                      onclick="redoEditAsComment([% use_patchviewer %]);">Redo Edit As Comment</button>
            [% END %]

            [% IF use_patchviewer %]
              <button type="button" id="viewDiffButton" class="bz_default_hidden"
                      onclick="viewDiff([% attachment.id %], [% use_patchviewer %]);">View Attachment As Diff</button>
            [% END %]
            <button type="button" id="viewRawButton" class="bz_default_hidden"
                    onclick="viewRaw([% use_patchviewer %]);">View Attachment As Raw</button>

            <script type="text/javascript">
              [% IF user.id %]
                document.getElementById('editFrame').disabled = false;
                YAHOO.util.Dom.removeClass("editButton", "bz_default_hidden");
              [% END %]
              YAHOO.util.Dom.removeClass("viewDiffButton", "bz_default_hidden");
            </script>
          </div>
        [% ELSE %]
          <div id="noview">
            <p><b>
              Attachment is not viewable in your browser because its MIME type 
              ([% attachment.contenttype FILTER html %]) is not one that your browser is 
              able to display.
            </b></p>
            <p><b>
              <a href="attachment.cgi?id=[% attachment.id %]">Download the attachment</a>.
            </b></p>
          </div>
        [% END %]
      </div>
      <div id="attachment_comments_and_flags">
        [% IF user.id %]
          <div id="smallCommentFrame" >
            <label for="comment">Comment (on the [% terms.bug %]):</label>
            [% classNames = 'block' %]
            [% classNames = "$classes bz_private" IF attachment.isprivate %]
            [% INCLUDE bug/comment.html.tmpl
               bug     = attachment.bug
               minrows = 10
               cols    = 80
               classes = classNames
               wrap    = 'soft'
            %]
            [% IF NOT attachment.bug.cc.contains(user.login) %]
              <input type="checkbox" id="addselfcc" name="addselfcc"
                [%~ ' checked="checked"'
                    IF user.settings.state_addselfcc.value == 'always'
                       || (!attachment.bug.user.has_any_role
                           && user.settings.state_addselfcc.value == 'cc_unless_role') %]>
              <label for="addselfcc">Add me to CC list</label>
            [% END %]
            [% Hook.process('after_comment_textarea') %]
          </div>
        [% END %]
        <div id="attachment_flags">
          [% IF attachment.flag_types.size > 0 %]
              [% PROCESS "flag/list.html.tmpl" flag_types = attachment.flag_types
                                               read_only_flags = !can_edit
              %]
     
          [% END %]
        </div>

        [% Hook.process('form_before_submit') %]

        [% IF user.id %]       
          <div id="update_container">
            <input type="submit" value="Submit" id="update">
          </div>
        [% END %]        
      </div>        
    </div>
  </div>
</form>

<div id="attachment_actions">
  <span class="label">Actions:</span>
  <a href="attachment.cgi?id=[% attachment.id %]">View</a>
  [% IF use_patchviewer %]
    | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=diff">Diff</a>
  [% END %]
  [% IF Param("allow_attachment_deletion")
        && user.in_group('admin')
        && attachment.datasize > 0 %]
    | <a href="attachment.cgi?id=[% attachment.id %]&amp;action=delete">Delete</a>
  [% END %]
  [% Hook.process('action') %]
</div>

<div id="attachment_list">
  Attachments on [% "$terms.bug ${attachment.bug_id}" FILTER bug_link(attachment.bug_id) FILTER none %]:
  [% FOREACH a = attachments %]
    [% IF a.isobsolete %]
      <span class="bz_obsolete">
    [% END %]
    [% IF a.id == attachment.id %]
      [%+ a.id FILTER html %]
    [% ELSE %]
      <a href="attachment.cgi?id=[% a.id FILTER uri %]&amp;action=edit"
         title="[% a.description FILTER html %]">[% a.id FILTER html %]</a>
    [% END %]
    [% IF a.isobsolete %]
      </span>
    [% END %]
    [% " |" UNLESS loop.last() %]
  [% END %]
</div>
[% IF can_edit %]
  <script type="text/javascript">
    <!--
      YAHOO.util.Dom.removeClass( document.body, "no_javascript" );
      toggle_attachment_details_visibility( );
    -->
  </script>
[% END %]
[% Hook.process('end') %]

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