comments.html.tmpl 9.06 KB
Newer Older
1 2 3
[%# 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/.
4
  #
5 6
  # This Source Code Form is "Incompatible With Secondary Licenses", as
  # defined by the Mozilla Public License, v. 2.0.
7 8
  #%]

9 10
[% PROCESS bug/time.html.tmpl %]

11
<script src="[% 'js/comments.js' FILTER mtime %]" type="text/javascript">
12
</script>
13

14 15
<script type="text/javascript">
<!--
16
  /* Adds the reply text to the 'comment' textarea */
17
  function replyToComment(id, real_id, name) {
18 19 20 21
      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" */
22 23
        var text_elem = document.getElementById('comment_text_'+id);
        var text = getText(text_elem);
24 25 26 27 28 29 30 31 32 33 34 35 36 37
        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');
38 39 40
      if (textarea.value != replytext) {
          textarea.value += replytext;
      }
41 42 43 44 45 46

      textarea.focus();
  } 
//-->
</script>

47
[% DEFAULT mode = "show" %]
48
[% user_cache = template_cache.users %]
49
[% can_edit_comments = bug.check_can_change_field('longdesc', 0, 1) %]
50
[% can_tag_comments = feature_enabled('jsonrpc') AND user.can_tag_comments %]
51

52 53
<!-- This auto-sizes the comments and positions the collapse/expand links 
     to the right. -->
54 55
<table class="bz_comment_table">
<tr>
56
<td>
57

58
[% PROCESS display_comments %]
59

60 61
[% IF mode == "edit" && user.id
      && user.settings.comment_box_position.value == "before_comments" %]
62 63 64 65 66 67 68
  <div class="bz_add_comment">
    <a href="#" 
       onclick="return goto_add_comments();">
       Add Comment</a>
  </div>
[% END %]

69 70 71 72 73
[%# Note: this template is used in multiple places; if you use this hook,
  # make sure you are aware of this fact.
  #%]  
[% Hook.process("aftercomments") %]

74 75 76 77
</td>
<td>
  [% IF mode == "edit" %]
    <ul class="bz_collapse_expand_comments">
78
      <li><a href="#" onclick="toggle_all_comments('collapse');
79 80 81
                               return false;">Collapse All Comments</a></li>
      <li><a href="#" onclick="toggle_all_comments('expand');
                               return false;">Expand All Comments</a></li>
82 83 84
      [% IF Param('comment_taggers_group') %]
        <li><div id="comment_tags_collapse_expand_container"></div></li>
      [% END %]
85 86 87 88
      [% 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>
89
      [% END %]
90 91
    </ul>
  [% END %]
92 93 94
</td>
</tr></table>

95 96 97 98
[%############################################################################%]
[%# Block for individual comments                                            #%]
[%############################################################################%]

99 100 101 102 103
[% 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 %]
104

105
    <div id="c[% comment.count %]" class="bz_comment[% " bz_private" IF comment.is_private %]
106
                [% " bz_default_collapsed" IF comment.collapsed %]
107 108 109
                [% " bz_comment_hilite" IF marks.${comment.count} %]
                [% " bz_first_comment" IF comment.count == 0 %]">
      [% IF comment.count == 0 %]
110
        [% class_name = "bz_first_comment_head" %]
111
        [% comment_label = "Description" %]
112
      [% ELSE %]
113
        [% class_name = "bz_comment_head" %]
114
        [% comment_label = "Comment " _ comment.count %]
115
      [% END %]
116

117
      <div class="[% class_name FILTER html %]">
118
        [% IF mode == "edit" %]
119
          <span class="bz_comment_actions">
120 121 122
            [% IF comment.collapsed %]
              <span class="bz_collapsed_actions">
            [% END %]
123
            [% IF can_edit_comments %]
124
              [% IF can_tag_comments %]
125 126 127
                [<a href="#"
                    onclick="YAHOO.bugzilla.commentTagging.toggle([% comment.id %], [% comment.count %]);return false">tag</a>]
              [% END %]
128 129
              [<a class="bz_reply_link" href="#add_comment"
                [% IF user.settings.quote_replies.value != 'off' %]
130
                  onclick="replyToComment('[% comment.count %]', '[% comment.id %]', '[% comment.author.name || comment.author.nick FILTER html FILTER js %]'); return false;"
131 132 133
                [% END %]
              >reply</a>]
            [% END %]
134 135 136 137 138 139 140 141 142
            [% 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">
143 144
            <script type="text/javascript">
              addCollapseLink([% comment.count %], [% comment.collapsed FILTER js %], 'Toggle comment display');
145 146
            </script>
          </span>
147
        [% END %]
148

149
        [% IF mode == "edit" && can_edit_comments && user.is_insider %]
150 151 152 153 154 155
          <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 %]"
156
                   onClick="updateCommentPrivacy(this, [% comment.count %])"
157
                   [% " checked=\"checked\"" IF comment.is_private %]>
158 159 160 161 162
            <label for="isprivate_[% comment.id %]">Private</label>
          </div>
        [% END %]

        <span class="bz_comment_number">
163
          <a 
164
             href="show_bug.cgi?id=[% bug.bug_id %]#c[% comment.count %]">
165 166 167 168
            [%- comment_label FILTER html %]</a>
        </span>

        <span class="bz_comment_user">
169 170 171 172 173 174 175 176
          [%# 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 %]
177 178 179
        </span>

        <span class="bz_comment_user_images">
180
          [% FOREACH group = comment.author.groups_with_icon %]
181 182 183 184 185 186 187
            <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">
188
          [%+ comment.creation_ts FILTER time %]
189
        </span>
190 191 192 193 194 195 196 197

        [% 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 %]
198 199
      </div>

200
      [% IF user.is_timetracker &&
201 202 203 204 205
            (comment.work_time > 0 || comment.work_time < 0) %]
         <br>
         Additional hours worked: 
         [% PROCESS formattimeunit time_unit=comment.work_time %]
      [% END %]
206

207 208
      [% IF user.id && Param('comment_taggers_group') %]
        <div id="comment_tag_[% comment.count FILTER html %]"
209
             class="bz_comment_tags">
210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225
          <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 %]

226 227 228
[%# Don't indent the <pre> block, since then the spaces are displayed in the
  # generated HTML
  #%]
229
<pre class="bz_comment_text[% " collapsed" IF comment.collapsed %]"
230 231 232
  [% IF mode == "edit" || comment.collapsed %]
    id="comment_text_[% comment.count FILTER none %]"
  [% END %]>
233 234
  [%- comment_text FILTER quoteUrls(bug, comment) -%]
</pre>
235
    [% Hook.process('a_comment-end', 'bug/comments.html.tmpl') %]
236
    </div>
237
  [% END %]
238
[% END %]