| [%# 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" %] |
| |
| <script src="[% 'js/status-bubble.js' FILTER mtime %]"></script> |
| <script> |
| window.addEventListener('message', handleStatusBubbleMessage, false); |
| </script> |
| |
| <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> |
| [% 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 %] |
| [%# if WEBKIT_CHANGES %] |
| [% IF attachment.ispatch %] |
| <button type="button" id="viewPrettyPatchButton" |
| onclick="viewPrettyPatch([% attachment.id %]);">View Formatted Diff</button> |
| [% END %] |
| [%# endif // WEBKIT_CHANGES %] |
| <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 %] |
| [%# if WEBKIT_CHANGES %] |
| [% IF attachment.ispatch %] |
| Bot Status: |
| |
| <div class="statusBubble"> |
| <iframe src="https://webkit-queues.webkit.org/status-bubble/[% attachment.id %]" |
| style="width: 0px; height: 20px; border: none;" scrolling="no" onload="handleStatusBubbleLoad(this)"> |
| </iframe> |
| <iframe src="https://ews.webkit.org/status-bubble/[% attachment.id %]?hide_icons=True" |
| style="width: 0px; height: 20px; border: none;" scrolling="no" onload="handleStatusBubbleLoadNewEWS(this)"> |
| </iframe> |
| </div> |
| <br> |
| [% END %] |
| [%# endif // WEBKIT_CHANGES %] |
| <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 WEBKIT_CHANGES %] |
| [% IF attachment.ispatch %] |
| | <a href="attachment.cgi?id=[% attachment.id %]&action=prettypatch">Formatted Diff</a> |
| [% END %] |
| [%# endif // WEBKIT_CHANGES %] |
| [% IF use_patchviewer %] |
| | <a href="attachment.cgi?id=[% attachment.id %]&action=diff">Diff</a> |
| [% END %] |
| [% IF Param("allow_attachment_deletion") |
| && user.in_group('admin') |
| && attachment.datasize > 0 %] |
| | <a href="attachment.cgi?id=[% attachment.id %]&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 %]&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( ); // WEBKIT_CHANGES |
| --> |
| </script> |
| [% END %] |
| [% Hook.process('end') %] |
| |
| [% PROCESS global/footer.html.tmpl %] |