blob: bad25f140c646e1fa134d918d83ea65bde30e5cd [file] [log] [blame]
[%# 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>&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 %]
[%# 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 %]&amp;action=prettypatch">Formatted Diff</a>
[% END %]
[%# endif // WEBKIT_CHANGES %]
[% 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( ); // WEBKIT_CHANGES
-->
</script>
[% END %]
[% Hook.process('end') %]
[% PROCESS global/footer.html.tmpl %]