| [%# 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 bug/time.html.tmpl %] |
| |
| <script src="[% 'js/comments.js' FILTER mtime %]" type="text/javascript"> |
| </script> |
| |
| <script type="text/javascript"> |
| <!-- |
| /* Adds the reply text to the 'comment' textarea */ |
| function replyToComment(id, real_id, name) { |
| var prefix = "(In reply to " + name + " from comment #" + id + ")\n"; |
| var replytext = ""; |
| [% IF user.settings.quote_replies.value == 'quoted_reply' %] |
| /* pre id="comment_name_N" */ |
| var text_elem = document.getElementById('comment_text_'+id); |
| var text = getText(text_elem); |
| replytext = prefix + wrapReplyText(text); |
| [% ELSIF user.settings.quote_replies.value == 'simple_reply' %] |
| replytext = prefix; |
| [% END %] |
| |
| [% IF user.is_insider %] |
| if (document.getElementById('isprivate_' + real_id).checked) { |
| document.getElementById('newcommentprivacy').checked = 'checked'; |
| updateCommentTagControl(document.getElementById('newcommentprivacy'), 'comment'); |
| } |
| [% END %] |
| |
| /* <textarea id="comment"> */ |
| var textarea = document.getElementById('comment'); |
| if (textarea.value != replytext) { |
| textarea.value += replytext; |
| } |
| |
| textarea.focus(); |
| } |
| //--> |
| </script> |
| |
| [% DEFAULT mode = "show" %] |
| [% user_cache = template_cache.users %] |
| [% can_edit_comments = bug.check_can_change_field('longdesc', 0, 1) %] |
| [% can_tag_comments = feature_enabled('jsonrpc') AND user.can_tag_comments %] |
| |
| <!-- This auto-sizes the comments and positions the collapse/expand links |
| to the right. --> |
| <table class="bz_comment_table"> |
| <tr> |
| <td> |
| |
| [% PROCESS display_comments %] |
| |
| [% IF mode == "edit" && user.id |
| && user.settings.comment_box_position.value == "before_comments" %] |
| <div class="bz_add_comment"> |
| <a href="#" |
| onclick="return goto_add_comments();"> |
| Add Comment</a> |
| </div> |
| [% END %] |
| |
| [%# Note: this template is used in multiple places; if you use this hook, |
| # make sure you are aware of this fact. |
| #%] |
| [% Hook.process("aftercomments") %] |
| |
| </td> |
| <td> |
| [% IF mode == "edit" %] |
| <ul class="bz_collapse_expand_comments"> |
| <li><a href="#" onclick="toggle_all_comments('collapse'); |
| return false;">Collapse All Comments</a></li> |
| <li><a href="#" onclick="toggle_all_comments('expand'); |
| return false;">Expand All Comments</a></li> |
| [% IF Param('comment_taggers_group') %] |
| <li><div id="comment_tags_collapse_expand_container"></div></li> |
| [% END %] |
| [% IF user.settings.comment_box_position.value == "after_comments" && user.id %] |
| <li class="bz_add_comment"><a href="#" |
| onclick="return goto_add_comments('bug_status_bottom');"> |
| Add Comment</a></li> |
| [% END %] |
| </ul> |
| [% END %] |
| </td> |
| </tr></table> |
| |
| [%############################################################################%] |
| [%# Block for individual comments #%] |
| [%############################################################################%] |
| |
| [% BLOCK display_comments %] |
| [% FOREACH comment = comments %] |
| [% NEXT IF comment.is_private AND NOT (user.is_insider || user.id == comment.author.id) %] |
| [% comment_text = comment.body_full %] |
| [% NEXT IF comment_text == '' AND (comment.work_time - 0) != 0 AND !user.is_timetracker %] |
| |
| <div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %] |
| [% " bz_default_collapsed" IF comment.collapsed %] |
| [% " bz_comment_hilite" IF marks.${comment.count} %] |
| [% " bz_first_comment" IF comment.count == 0 %]"> |
| [% IF comment.count == 0 %] |
| [% class_name = "bz_first_comment_head" %] |
| [% comment_label = "Description" %] |
| [% ELSE %] |
| [% class_name = "bz_comment_head" %] |
| [% comment_label = "Comment " _ comment.count %] |
| [% END %] |
| |
| <div class="[% class_name FILTER html %]"> |
| [% IF mode == "edit" %] |
| <span class="bz_comment_actions"> |
| [% IF comment.collapsed %] |
| <span class="bz_collapsed_actions"> |
| [% END %] |
| [% IF can_edit_comments %] |
| [% IF can_tag_comments %] |
| [<a href="#" |
| onclick="YAHOO.bugzilla.commentTagging.toggle([% comment.id %], [% comment.count %]);return false">tag</a>] |
| [% END %] |
| [<a class="bz_reply_link" href="#add_comment" |
| [% IF user.settings.quote_replies.value != 'off' %] |
| onclick="replyToComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;" |
| [% END %] |
| >reply</a>] |
| [% END %] |
| [% IF comment.collapsed %] |
| </span> |
| [% END %] |
| <script type="text/javascript"> |
| addCollapseLink([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display'); |
| </script> |
| </span> |
| [% ELSIF comment.collapsed %] |
| <span class="bz_comment_actions"> |
| <script type="text/javascript"> |
| addCollapseLink([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display'); |
| </script> |
| </span> |
| [% END %] |
| |
| [% IF mode == "edit" && can_edit_comments && user.is_insider %] |
| <div class="bz_private_checkbox"> |
| <input type="hidden" value="1" |
| name="defined_isprivate_[% comment.id %]"> |
| <input type="checkbox" |
| name="isprivate_[% comment.id %]" value="1" |
| id="isprivate_[% comment.id %]" |
| onClick="updateCommentPrivacy(this, [% comment.count %])" |
| [% " checked=\"checked\"" IF comment.is_private %]> |
| <label for="isprivate_[% comment.id %]">Private</label> |
| </div> |
| [% END %] |
| |
| <span class="bz_comment_number"> |
| <a |
| href="show_bug.cgi?id=[% bug.bug_id %]#c[% comment.count %]"> |
| [%- comment_label FILTER html %]</a> |
| </span> |
| |
| <span class="bz_comment_user"> |
| [%# No need to recreate the exact same template if we already have it. %] |
| [% commenter_id = comment.author.id %] |
| [% UNLESS user_cache.$commenter_id %] |
| [% user_cache.$commenter_id = BLOCK %] |
| [% INCLUDE global/user.html.tmpl who = comment.author %] |
| [% END %] |
| [% END %] |
| [% user_cache.$commenter_id FILTER none %] |
| </span> |
| |
| <span class="bz_comment_user_images"> |
| [% FOREACH group = comment.author.groups_with_icon %] |
| <img src="[% group.icon_url FILTER html %]" |
| alt="[% group.name FILTER html %]" |
| title="[% group.name FILTER html %] - [% group.description FILTER html %]"> |
| [% END %] |
| </span> |
| |
| <span class="bz_comment_time"> |
| [%+ comment.creation_ts FILTER time %] |
| </span> |
| |
| [% IF comment.collapsed %] |
| <span id="cr[% comment.count %]" class="bz_comment_collapse_reason" |
| title="[% comment.author.name || comment.author.login FILTER html %] |
| [%~ %] [[% comment.creation_ts FILTER time %]]"> |
| Comment hidden ([% comment.tags.join(', ') FILTER html %]) |
| </span> |
| [% END %] |
| </div> |
| |
| [% IF user.is_timetracker && |
| (comment.work_time > 0 || comment.work_time < 0) %] |
| <br> |
| Additional hours worked: |
| [% PROCESS formattimeunit time_unit=comment.work_time %] |
| [% END %] |
| |
| [% IF user.id && Param('comment_taggers_group') %] |
| <div id="comment_tag_[% comment.count FILTER html %]" |
| class="bz_comment_tags"> |
| <span id="ct_[% comment.count %]" |
| class="[% 'bz_default_hidden' UNLESS comment.tags.size %]"> |
| [% IF comment.tags.size %] |
| <script> |
| YAHOO.bugzilla.commentTagging.showTags([% comment.id FILTER none %], |
| [% comment.count FILTER none %], [ |
| [% FOREACH tag = comment.tags %] |
| [%~%]'[% tag FILTER js %]'[% "," UNLESS loop.last %] |
| [% END %] |
| [%~%]]); |
| </script> |
| [% END %] |
| </span> |
| </div> |
| [% END %] |
| |
| [%# Don't indent the <pre> block, since then the spaces are displayed in the |
| # generated HTML |
| #%] |
| <pre class="bz_comment_text[% " collapsed" IF comment.collapsed %]" |
| [% IF mode == "edit" || comment.collapsed %] |
| id="comment_text_[% comment.count FILTER none %]" |
| [% END %]> |
| [%- comment_text FILTER quoteUrls(bug, comment) -%] |
| </pre> |
| [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %] |
| </div> |
| [% END %] |
| [% END %] |