##// END OF EJS Templates
diffs: improve text on unresolved comments attached to files that no longer exist in the review....
dan -
r4319:d193c5b3 default
parent child Browse files
Show More
@@ -1,1186 +1,1193 b''
1 1 <%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/>
2 2
3 3 <%def name="diff_line_anchor(commit, filename, line, type)"><%
4 4 return '%s_%s_%i' % (h.md5_safe(commit+filename), type, line)
5 5 %></%def>
6 6
7 7 <%def name="action_class(action)">
8 8 <%
9 9 return {
10 10 '-': 'cb-deletion',
11 11 '+': 'cb-addition',
12 12 ' ': 'cb-context',
13 13 }.get(action, 'cb-empty')
14 14 %>
15 15 </%def>
16 16
17 17 <%def name="op_class(op_id)">
18 18 <%
19 19 return {
20 20 DEL_FILENODE: 'deletion', # file deleted
21 21 BIN_FILENODE: 'warning' # binary diff hidden
22 22 }.get(op_id, 'addition')
23 23 %>
24 24 </%def>
25 25
26 26
27 27
28 28 <%def name="render_diffset(diffset, commit=None,
29 29
30 30 # collapse all file diff entries when there are more than this amount of files in the diff
31 31 collapse_when_files_over=20,
32 32
33 33 # collapse lines in the diff when more than this amount of lines changed in the file diff
34 34 lines_changed_limit=500,
35 35
36 36 # add a ruler at to the output
37 37 ruler_at_chars=0,
38 38
39 39 # show inline comments
40 40 use_comments=False,
41 41
42 42 # disable new comments
43 43 disable_new_comments=False,
44 44
45 45 # special file-comments that were deleted in previous versions
46 46 # it's used for showing outdated comments for deleted files in a PR
47 47 deleted_files_comments=None,
48 48
49 49 # for cache purpose
50 50 inline_comments=None,
51 51
52 52 # additional menu for PRs
53 53 pull_request_menu=None,
54 54
55 55 # show/hide todo next to comments
56 56 show_todos=True,
57 57
58 58 )">
59 59
60 60 <%
61 61 diffset_container_id = h.md5(diffset.target_ref)
62 62 collapse_all = len(diffset.files) > collapse_when_files_over
63 63 active_pattern_entries = h.get_active_pattern_entries(getattr(c, 'repo_name', None))
64 64 %>
65 65
66 66 %if use_comments:
67 67
68 68 ## Template for injecting comments
69 69 <div id="cb-comments-inline-container-template" class="js-template">
70 70 ${inline_comments_container([])}
71 71 </div>
72 72
73 73 <div class="js-template" id="cb-comment-inline-form-template">
74 74 <div class="comment-inline-form ac">
75 75
76 76 %if c.rhodecode_user.username != h.DEFAULT_USER:
77 77 ## render template for inline comments
78 78 ${commentblock.comment_form(form_type='inline')}
79 79 %else:
80 80 ${h.form('', class_='inline-form comment-form-login', method='get')}
81 81 <div class="pull-left">
82 82 <div class="comment-help pull-right">
83 83 ${_('You need to be logged in to leave comments.')} <a href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">${_('Login now')}</a>
84 84 </div>
85 85 </div>
86 86 <div class="comment-button pull-right">
87 87 <button type="button" class="cb-comment-cancel" onclick="return Rhodecode.comments.cancelComment(this);">
88 88 ${_('Cancel')}
89 89 </button>
90 90 </div>
91 91 <div class="clearfix"></div>
92 92 ${h.end_form()}
93 93 %endif
94 94 </div>
95 95 </div>
96 96
97 97 %endif
98 98
99 99 %if c.user_session_attrs["diffmode"] == 'sideside':
100 100 <style>
101 101 .wrapper {
102 102 max-width: 1600px !important;
103 103 }
104 104 </style>
105 105 %endif
106 106
107 107 %if ruler_at_chars:
108 108 <style>
109 109 .diff table.cb .cb-content:after {
110 110 content: "";
111 111 border-left: 1px solid blue;
112 112 position: absolute;
113 113 top: 0;
114 114 height: 18px;
115 115 opacity: .2;
116 116 z-index: 10;
117 117 //## +5 to account for diff action (+/-)
118 118 left: ${ruler_at_chars + 5}ch;
119 119 </style>
120 120 %endif
121 121
122 122 <div class="diffset ${disable_new_comments and 'diffset-comments-disabled'}">
123 123
124 124 <div style="height: 20px; line-height: 20px">
125 125 ## expand/collapse action
126 126 <div class="pull-left">
127 127 <a class="${'collapsed' if collapse_all else ''}" href="#expand-files" onclick="toggleExpand(this, '${diffset_container_id}'); return false">
128 128 % if collapse_all:
129 129 <i class="icon-plus-squared-alt icon-no-margin"></i>${_('Expand all files')}
130 130 % else:
131 131 <i class="icon-minus-squared-alt icon-no-margin"></i>${_('Collapse all files')}
132 132 % endif
133 133 </a>
134 134
135 135 </div>
136 136
137 137 ## todos
138 138 % if show_todos and getattr(c, 'at_version', None):
139 139 <div class="pull-right">
140 140 <i class="icon-flag-filled" style="color: #949494">TODOs:</i>
141 141 ${_('not available in this view')}
142 142 </div>
143 143 % elif show_todos:
144 144 <div class="pull-right">
145 145 <div class="comments-number" style="padding-left: 10px">
146 146 % if hasattr(c, 'unresolved_comments') and hasattr(c, 'resolved_comments'):
147 147 <i class="icon-flag-filled" style="color: #949494">TODOs:</i>
148 148 % if c.unresolved_comments:
149 149 <a href="#show-todos" onclick="$('#todo-box').toggle(); return false">
150 150 ${_('{} unresolved').format(len(c.unresolved_comments))}
151 151 </a>
152 152 % else:
153 153 ${_('0 unresolved')}
154 154 % endif
155 155
156 156 ${_('{} Resolved').format(len(c.resolved_comments))}
157 157 % endif
158 158 </div>
159 159 </div>
160 160 % endif
161 161
162 162 ## comments
163 163 <div class="pull-right">
164 164 <div class="comments-number" style="padding-left: 10px">
165 165 % if hasattr(c, 'comments') and hasattr(c, 'inline_cnt'):
166 166 <i class="icon-comment" style="color: #949494">COMMENTS:</i>
167 167 % if c.comments:
168 168 <a href="#comments">${_ungettext("{} General", "{} General", len(c.comments)).format(len(c.comments))}</a>,
169 169 % else:
170 170 ${_('0 General')}
171 171 % endif
172 172
173 173 % if c.inline_cnt:
174 174 <a href="#" onclick="return Rhodecode.comments.nextComment();"
175 175 id="inline-comments-counter">${_ungettext("{} Inline", "{} Inline", c.inline_cnt).format(c.inline_cnt)}
176 176 </a>
177 177 % else:
178 178 ${_('0 Inline')}
179 179 % endif
180 180 % endif
181 181
182 182 % if pull_request_menu:
183 183 <%
184 184 outdated_comm_count_ver = pull_request_menu['outdated_comm_count_ver']
185 185 %>
186 186
187 187 % if outdated_comm_count_ver:
188 188 <a href="#" onclick="showOutdated(); Rhodecode.comments.nextOutdatedComment(); return false;">
189 189 (${_("{} Outdated").format(outdated_comm_count_ver)})
190 190 </a>
191 191 <a href="#" class="showOutdatedComments" onclick="showOutdated(this); return false;"> | ${_('show outdated')}</a>
192 192 <a href="#" class="hideOutdatedComments" style="display: none" onclick="hideOutdated(this); return false;"> | ${_('hide outdated')}</a>
193 193 % else:
194 194 (${_("{} Outdated").format(outdated_comm_count_ver)})
195 195 % endif
196 196
197 197 % endif
198 198
199 199 </div>
200 200 </div>
201 201
202 202 </div>
203 203
204 204 % if diffset.limited_diff:
205 205 <div class="diffset-heading ${(diffset.limited_diff and 'diffset-heading-warning' or '')}">
206 206 <h2 class="clearinner">
207 207 ${_('The requested changes are too big and content was truncated.')}
208 208 <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
209 209 </h2>
210 210 </div>
211 211 ## commit range header for each individual diff
212 212 % elif commit and hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
213 213 <div class="diffset-heading ${(diffset.limited_diff and 'diffset-heading-warning' or '')}">
214 214 <div class="clearinner">
215 215 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=diffset.repo_name,commit_id=commit.raw_id)}">${('r%s:%s' % (commit.idx,h.short_id(commit.raw_id)))}</a>
216 216 </div>
217 217 </div>
218 218 % endif
219 219
220 220 <div id="todo-box">
221 221 % if hasattr(c, 'unresolved_comments') and c.unresolved_comments:
222 222 % for co in c.unresolved_comments:
223 223 <a class="permalink" href="#comment-${co.comment_id}"
224 224 onclick="Rhodecode.comments.scrollToComment($('#comment-${co.comment_id}'))">
225 225 <i class="icon-flag-filled-red"></i>
226 226 ${co.comment_id}</a>${('' if loop.last else ',')}
227 227 % endfor
228 228 % endif
229 229 </div>
230 230 %if diffset.has_hidden_changes:
231 231 <p class="empty_data">${_('Some changes may be hidden')}</p>
232 232 %elif not diffset.files:
233 233 <p class="empty_data">${_('No files')}</p>
234 234 %endif
235 235
236 236 <div class="filediffs">
237 237
238 238 ## initial value could be marked as False later on
239 239 <% over_lines_changed_limit = False %>
240 240 %for i, filediff in enumerate(diffset.files):
241 241
242 242 <%
243 243 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
244 244 over_lines_changed_limit = lines_changed > lines_changed_limit
245 245 %>
246 246 ## anchor with support of sticky header
247 247 <div class="anchor" id="a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></div>
248 248
249 249 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state collapse-${diffset_container_id}" id="filediff-collapse-${id(filediff)}" type="checkbox" onchange="updateSticky();">
250 250 <div
251 251 class="filediff"
252 252 data-f-path="${filediff.patch['filename']}"
253 253 data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}"
254 254 >
255 255 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
256 256 <div class="filediff-collapse-indicator icon-"></div>
257 257 ${diff_ops(filediff)}
258 258 </label>
259 259
260 260 ${diff_menu(filediff, use_comments=use_comments)}
261 261 <table data-f-path="${filediff.patch['filename']}" data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}" class="code-visible-block cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
262 262
263 263 ## new/deleted/empty content case
264 264 % if not filediff.hunks:
265 265 ## Comment container, on "fakes" hunk that contains all data to render comments
266 266 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], filediff.hunk_ops, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
267 267 % endif
268 268
269 269 %if filediff.limited_diff:
270 270 <tr class="cb-warning cb-collapser">
271 271 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
272 272 ${_('The requested commit or file is too big and content was truncated.')} <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
273 273 </td>
274 274 </tr>
275 275 %else:
276 276 %if over_lines_changed_limit:
277 277 <tr class="cb-warning cb-collapser">
278 278 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
279 279 ${_('This diff has been collapsed as it changes many lines, (%i lines changed)' % lines_changed)}
280 280 <a href="#" class="cb-expand"
281 281 onclick="$(this).closest('table').removeClass('cb-collapsed'); updateSticky(); return false;">${_('Show them')}
282 282 </a>
283 283 <a href="#" class="cb-collapse"
284 284 onclick="$(this).closest('table').addClass('cb-collapsed'); updateSticky(); return false;">${_('Hide them')}
285 285 </a>
286 286 </td>
287 287 </tr>
288 288 %endif
289 289 %endif
290 290
291 291 % for hunk in filediff.hunks:
292 292 <tr class="cb-hunk">
293 293 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
294 294 ## TODO: dan: add ajax loading of more context here
295 295 ## <a href="#">
296 296 <i class="icon-more"></i>
297 297 ## </a>
298 298 </td>
299 299 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
300 300 @@
301 301 -${hunk.source_start},${hunk.source_length}
302 302 +${hunk.target_start},${hunk.target_length}
303 303 ${hunk.section_header}
304 304 </td>
305 305 </tr>
306 306 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
307 307 % endfor
308 308
309 309 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
310 310
311 311 ## outdated comments that do not fit into currently displayed lines
312 312 % for lineno, comments in unmatched_comments.items():
313 313
314 314 %if c.user_session_attrs["diffmode"] == 'unified':
315 315 % if loop.index == 0:
316 316 <tr class="cb-hunk">
317 317 <td colspan="3"></td>
318 318 <td>
319 319 <div>
320 320 ${_('Unmatched/outdated inline comments below')}
321 321 </div>
322 322 </td>
323 323 </tr>
324 324 % endif
325 325 <tr class="cb-line">
326 326 <td class="cb-data cb-context"></td>
327 327 <td class="cb-lineno cb-context"></td>
328 328 <td class="cb-lineno cb-context"></td>
329 329 <td class="cb-content cb-context">
330 330 ${inline_comments_container(comments, active_pattern_entries=active_pattern_entries)}
331 331 </td>
332 332 </tr>
333 333 %elif c.user_session_attrs["diffmode"] == 'sideside':
334 334 % if loop.index == 0:
335 335 <tr class="cb-comment-info">
336 336 <td colspan="2"></td>
337 337 <td class="cb-line">
338 338 <div>
339 339 ${_('Unmatched/outdated inline comments below')}
340 340 </div>
341 341 </td>
342 342 <td colspan="2"></td>
343 343 <td class="cb-line">
344 344 <div>
345 345 ${_('Unmatched/outdated comments below')}
346 346 </div>
347 347 </td>
348 348 </tr>
349 349 % endif
350 350 <tr class="cb-line">
351 351 <td class="cb-data cb-context"></td>
352 352 <td class="cb-lineno cb-context"></td>
353 353 <td class="cb-content cb-context">
354 354 % if lineno.startswith('o'):
355 355 ${inline_comments_container(comments, active_pattern_entries=active_pattern_entries)}
356 356 % endif
357 357 </td>
358 358
359 359 <td class="cb-data cb-context"></td>
360 360 <td class="cb-lineno cb-context"></td>
361 361 <td class="cb-content cb-context">
362 362 % if lineno.startswith('n'):
363 363 ${inline_comments_container(comments, active_pattern_entries=active_pattern_entries)}
364 364 % endif
365 365 </td>
366 366 </tr>
367 367 %endif
368 368
369 369 % endfor
370 370
371 371 </table>
372 372 </div>
373 373 %endfor
374 374
375 375 ## outdated comments that are made for a file that has been deleted
376 376 % for filename, comments_dict in (deleted_files_comments or {}).items():
377 377
378 378 <%
379 379 display_state = 'display: none'
380 380 open_comments_in_file = [x for x in comments_dict['comments'] if x.outdated is False]
381 381 if open_comments_in_file:
382 382 display_state = ''
383 383 fid = str(id(filename))
384 384 %>
385 385 <div class="filediffs filediff-outdated" style="${display_state}">
386 386 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state collapse-${diffset_container_id}" id="filediff-collapse-${id(filename)}" type="checkbox" onchange="updateSticky();">
387 387 <div class="filediff" data-f-path="${filename}" id="a_${h.FID(fid, filename)}">
388 388 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
389 389 <div class="filediff-collapse-indicator icon-"></div>
390 390
391 391 <span class="pill">
392 392 ## file was deleted
393 393 ${filename}
394 394 </span>
395 395 <span class="pill-group pull-left" >
396 396 ## file op, doesn't need translation
397 <span class="pill" op="removed">removed in this version</span>
397 <span class="pill" op="removed">unresolved comments</span>
398 398 </span>
399 399 <a class="pill filediff-anchor" href="#a_${h.FID(fid, filename)}">ΒΆ</a>
400 400 <span class="pill-group pull-right">
401 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
401 <span class="pill" op="deleted">
402 % if comments_dict['stats'] >0:
403 -${comments_dict['stats']}
404 % else:
405 ${comments_dict['stats']}
406 % endif
407 </span>
402 408 </span>
403 409 </label>
404 410
405 411 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
406 412 <tr>
407 413 % if c.user_session_attrs["diffmode"] == 'unified':
408 414 <td></td>
409 415 %endif
410 416
411 417 <td></td>
412 418 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=5')}>
413 ${_('File was deleted in this version. There are still outdated/unresolved comments attached to it.')}
419 <strong>${_('This file was removed from diff during updates to this pull-request.')}</strong><br/>
420 ${_('There are still outdated/unresolved comments attached to it.')}
414 421 </td>
415 422 </tr>
416 423 %if c.user_session_attrs["diffmode"] == 'unified':
417 424 <tr class="cb-line">
418 425 <td class="cb-data cb-context"></td>
419 426 <td class="cb-lineno cb-context"></td>
420 427 <td class="cb-lineno cb-context"></td>
421 428 <td class="cb-content cb-context">
422 429 ${inline_comments_container(comments_dict['comments'], active_pattern_entries=active_pattern_entries)}
423 430 </td>
424 431 </tr>
425 432 %elif c.user_session_attrs["diffmode"] == 'sideside':
426 433 <tr class="cb-line">
427 434 <td class="cb-data cb-context"></td>
428 435 <td class="cb-lineno cb-context"></td>
429 436 <td class="cb-content cb-context"></td>
430 437
431 438 <td class="cb-data cb-context"></td>
432 439 <td class="cb-lineno cb-context"></td>
433 440 <td class="cb-content cb-context">
434 441 ${inline_comments_container(comments_dict['comments'], active_pattern_entries=active_pattern_entries)}
435 442 </td>
436 443 </tr>
437 444 %endif
438 445 </table>
439 446 </div>
440 447 </div>
441 448 % endfor
442 449
443 450 </div>
444 451 </div>
445 452 </%def>
446 453
447 454 <%def name="diff_ops(filediff)">
448 455 <%
449 456 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
450 457 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
451 458 %>
452 459 <span class="pill">
453 460 <i class="icon-file-text"></i>
454 461 %if filediff.source_file_path and filediff.target_file_path:
455 462 %if filediff.source_file_path != filediff.target_file_path:
456 463 ## file was renamed, or copied
457 464 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
458 465 ${filediff.target_file_path} β¬… <del>${filediff.source_file_path}</del>
459 466 <% final_path = filediff.target_file_path %>
460 467 %elif COPIED_FILENODE in filediff.patch['stats']['ops']:
461 468 ${filediff.target_file_path} β¬… ${filediff.source_file_path}
462 469 <% final_path = filediff.target_file_path %>
463 470 %endif
464 471 %else:
465 472 ## file was modified
466 473 ${filediff.source_file_path}
467 474 <% final_path = filediff.source_file_path %>
468 475 %endif
469 476 %else:
470 477 %if filediff.source_file_path:
471 478 ## file was deleted
472 479 ${filediff.source_file_path}
473 480 <% final_path = filediff.source_file_path %>
474 481 %else:
475 482 ## file was added
476 483 ${filediff.target_file_path}
477 484 <% final_path = filediff.target_file_path %>
478 485 %endif
479 486 %endif
480 487 <i style="color: #aaa" class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${final_path}" title="${_('Copy file path')}" onclick="return false;"></i>
481 488 </span>
482 489 ## anchor link
483 490 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filediff.patch['filename'])}">ΒΆ</a>
484 491
485 492 <span class="pill-group pull-right">
486 493
487 494 ## ops pills
488 495 %if filediff.limited_diff:
489 496 <span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
490 497 %endif
491 498
492 499 %if NEW_FILENODE in filediff.patch['stats']['ops']:
493 500 <span class="pill" op="created">created</span>
494 501 %if filediff['target_mode'].startswith('120'):
495 502 <span class="pill" op="symlink">symlink</span>
496 503 %else:
497 504 <span class="pill" op="mode">${nice_mode(filediff['target_mode'])}</span>
498 505 %endif
499 506 %endif
500 507
501 508 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
502 509 <span class="pill" op="renamed">renamed</span>
503 510 %endif
504 511
505 512 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
506 513 <span class="pill" op="copied">copied</span>
507 514 %endif
508 515
509 516 %if DEL_FILENODE in filediff.patch['stats']['ops']:
510 517 <span class="pill" op="removed">removed</span>
511 518 %endif
512 519
513 520 %if CHMOD_FILENODE in filediff.patch['stats']['ops']:
514 521 <span class="pill" op="mode">
515 522 ${nice_mode(filediff['source_mode'])} ➑ ${nice_mode(filediff['target_mode'])}
516 523 </span>
517 524 %endif
518 525
519 526 %if BIN_FILENODE in filediff.patch['stats']['ops']:
520 527 <span class="pill" op="binary">binary</span>
521 528 %if MOD_FILENODE in filediff.patch['stats']['ops']:
522 529 <span class="pill" op="modified">modified</span>
523 530 %endif
524 531 %endif
525 532
526 533 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
527 534 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
528 535
529 536 </span>
530 537
531 538 </%def>
532 539
533 540 <%def name="nice_mode(filemode)">
534 541 ${(filemode.startswith('100') and filemode[3:] or filemode)}
535 542 </%def>
536 543
537 544 <%def name="diff_menu(filediff, use_comments=False)">
538 545 <div class="filediff-menu">
539 546
540 547 %if filediff.diffset.source_ref:
541 548
542 549 ## FILE BEFORE CHANGES
543 550 %if filediff.operation in ['D', 'M']:
544 551 <a
545 552 class="tooltip"
546 553 href="${h.route_path('repo_files',repo_name=filediff.diffset.target_repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
547 554 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
548 555 >
549 556 ${_('Show file before')}
550 557 </a> |
551 558 %else:
552 559 <span
553 560 class="tooltip"
554 561 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
555 562 >
556 563 ${_('Show file before')}
557 564 </span> |
558 565 %endif
559 566
560 567 ## FILE AFTER CHANGES
561 568 %if filediff.operation in ['A', 'M']:
562 569 <a
563 570 class="tooltip"
564 571 href="${h.route_path('repo_files',repo_name=filediff.diffset.source_repo_name,commit_id=filediff.diffset.target_ref,f_path=filediff.target_file_path)}"
565 572 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
566 573 >
567 574 ${_('Show file after')}
568 575 </a>
569 576 %else:
570 577 <span
571 578 class="tooltip"
572 579 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
573 580 >
574 581 ${_('Show file after')}
575 582 </span>
576 583 %endif
577 584
578 585 % if use_comments:
579 586 |
580 587 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
581 588 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
582 589 </a>
583 590 % endif
584 591
585 592 %endif
586 593
587 594 </div>
588 595 </%def>
589 596
590 597
591 598 <%def name="inline_comments_container(comments, active_pattern_entries=None)">
592 599
593 600 <div class="inline-comments">
594 601 %for comment in comments:
595 602 ${commentblock.comment_block(comment, inline=True, active_pattern_entries=active_pattern_entries)}
596 603 %endfor
597 604 % if comments and comments[-1].outdated:
598 605 <span class="btn btn-secondary cb-comment-add-button comment-outdated}" style="display: none;}">
599 606 ${_('Add another comment')}
600 607 </span>
601 608 % else:
602 609 <span onclick="return Rhodecode.comments.createComment(this)" class="btn btn-secondary cb-comment-add-button">
603 610 ${_('Add another comment')}
604 611 </span>
605 612 % endif
606 613
607 614 </div>
608 615 </%def>
609 616
610 617 <%!
611 618 def get_comments_for(diff_type, comments, filename, line_version, line_number):
612 619 if hasattr(filename, 'unicode_path'):
613 620 filename = filename.unicode_path
614 621
615 622 if not isinstance(filename, (unicode, str)):
616 623 return None
617 624
618 625 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
619 626
620 627 if comments and filename in comments:
621 628 file_comments = comments[filename]
622 629 if line_key in file_comments:
623 630 data = file_comments.pop(line_key)
624 631 return data
625 632 %>
626 633
627 634 <%def name="render_hunk_lines_sideside(filediff, hunk, use_comments=False, inline_comments=None, active_pattern_entries=None)">
628 635 %for i, line in enumerate(hunk.sideside):
629 636 <%
630 637 old_line_anchor, new_line_anchor = None, None
631 638
632 639 if line.original.lineno:
633 640 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, line.original.lineno, 'o')
634 641 if line.modified.lineno:
635 642 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, line.modified.lineno, 'n')
636 643 %>
637 644
638 645 <tr class="cb-line">
639 646 <td class="cb-data ${action_class(line.original.action)}"
640 647 data-line-no="${line.original.lineno}"
641 648 >
642 649 <div>
643 650
644 651 <% line_old_comments = None %>
645 652 %if line.original.get_comment_args:
646 653 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
647 654 %endif
648 655 %if line_old_comments:
649 656 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
650 657 % if has_outdated:
651 658 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
652 659 % else:
653 660 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
654 661 % endif
655 662 %endif
656 663 </div>
657 664 </td>
658 665 <td class="cb-lineno ${action_class(line.original.action)}"
659 666 data-line-no="${line.original.lineno}"
660 667 %if old_line_anchor:
661 668 id="${old_line_anchor}"
662 669 %endif
663 670 >
664 671 %if line.original.lineno:
665 672 <a name="${old_line_anchor}" href="#${old_line_anchor}">${line.original.lineno}</a>
666 673 %endif
667 674 </td>
668 675 <td class="cb-content ${action_class(line.original.action)}"
669 676 data-line-no="o${line.original.lineno}"
670 677 >
671 678 %if use_comments and line.original.lineno:
672 679 ${render_add_comment_button()}
673 680 %endif
674 681 <span class="cb-code"><span class="cb-action ${action_class(line.original.action)}"></span>${line.original.content or '' | n}</span>
675 682
676 683 %if use_comments and line.original.lineno and line_old_comments:
677 684 ${inline_comments_container(line_old_comments, active_pattern_entries=active_pattern_entries)}
678 685 %endif
679 686
680 687 </td>
681 688 <td class="cb-data ${action_class(line.modified.action)}"
682 689 data-line-no="${line.modified.lineno}"
683 690 >
684 691 <div>
685 692
686 693 %if line.modified.get_comment_args:
687 694 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
688 695 %else:
689 696 <% line_new_comments = None%>
690 697 %endif
691 698 %if line_new_comments:
692 699 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
693 700 % if has_outdated:
694 701 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
695 702 % else:
696 703 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
697 704 % endif
698 705 %endif
699 706 </div>
700 707 </td>
701 708 <td class="cb-lineno ${action_class(line.modified.action)}"
702 709 data-line-no="${line.modified.lineno}"
703 710 %if new_line_anchor:
704 711 id="${new_line_anchor}"
705 712 %endif
706 713 >
707 714 %if line.modified.lineno:
708 715 <a name="${new_line_anchor}" href="#${new_line_anchor}">${line.modified.lineno}</a>
709 716 %endif
710 717 </td>
711 718 <td class="cb-content ${action_class(line.modified.action)}"
712 719 data-line-no="n${line.modified.lineno}"
713 720 >
714 721 %if use_comments and line.modified.lineno:
715 722 ${render_add_comment_button()}
716 723 %endif
717 724 <span class="cb-code"><span class="cb-action ${action_class(line.modified.action)}"></span>${line.modified.content or '' | n}</span>
718 725 %if use_comments and line.modified.lineno and line_new_comments:
719 726 ${inline_comments_container(line_new_comments, active_pattern_entries=active_pattern_entries)}
720 727 %endif
721 728 </td>
722 729 </tr>
723 730 %endfor
724 731 </%def>
725 732
726 733
727 734 <%def name="render_hunk_lines_unified(filediff, hunk, use_comments=False, inline_comments=None, active_pattern_entries=None)">
728 735 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
729 736
730 737 <%
731 738 old_line_anchor, new_line_anchor = None, None
732 739 if old_line_no:
733 740 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, old_line_no, 'o')
734 741 if new_line_no:
735 742 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, new_line_no, 'n')
736 743 %>
737 744 <tr class="cb-line">
738 745 <td class="cb-data ${action_class(action)}">
739 746 <div>
740 747
741 748 %if comments_args:
742 749 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
743 750 %else:
744 751 <% comments = None %>
745 752 %endif
746 753
747 754 % if comments:
748 755 <% has_outdated = any([x.outdated for x in comments]) %>
749 756 % if has_outdated:
750 757 <i title="${_('comments including outdated')}:${len(comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
751 758 % else:
752 759 <i title="${_('comments')}: ${len(comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
753 760 % endif
754 761 % endif
755 762 </div>
756 763 </td>
757 764 <td class="cb-lineno ${action_class(action)}"
758 765 data-line-no="${old_line_no}"
759 766 %if old_line_anchor:
760 767 id="${old_line_anchor}"
761 768 %endif
762 769 >
763 770 %if old_line_anchor:
764 771 <a name="${old_line_anchor}" href="#${old_line_anchor}">${old_line_no}</a>
765 772 %endif
766 773 </td>
767 774 <td class="cb-lineno ${action_class(action)}"
768 775 data-line-no="${new_line_no}"
769 776 %if new_line_anchor:
770 777 id="${new_line_anchor}"
771 778 %endif
772 779 >
773 780 %if new_line_anchor:
774 781 <a name="${new_line_anchor}" href="#${new_line_anchor}">${new_line_no}</a>
775 782 %endif
776 783 </td>
777 784 <td class="cb-content ${action_class(action)}"
778 785 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
779 786 >
780 787 %if use_comments:
781 788 ${render_add_comment_button()}
782 789 %endif
783 790 <span class="cb-code"><span class="cb-action ${action_class(action)}"></span> ${content or '' | n}</span>
784 791 %if use_comments and comments:
785 792 ${inline_comments_container(comments, active_pattern_entries=active_pattern_entries)}
786 793 %endif
787 794 </td>
788 795 </tr>
789 796 %endfor
790 797 </%def>
791 798
792 799
793 800 <%def name="render_hunk_lines(filediff, diff_mode, hunk, use_comments, inline_comments, active_pattern_entries)">
794 801 % if diff_mode == 'unified':
795 802 ${render_hunk_lines_unified(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
796 803 % elif diff_mode == 'sideside':
797 804 ${render_hunk_lines_sideside(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
798 805 % else:
799 806 <tr class="cb-line">
800 807 <td>unknown diff mode</td>
801 808 </tr>
802 809 % endif
803 810 </%def>file changes
804 811
805 812
806 813 <%def name="render_add_comment_button()">
807 814 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
808 815 <span><i class="icon-comment"></i></span>
809 816 </button>
810 817 </%def>
811 818
812 819 <%def name="render_diffset_menu(diffset, range_diff_on=None)">
813 820 <% diffset_container_id = h.md5(diffset.target_ref) %>
814 821
815 822 <div id="diff-file-sticky" class="diffset-menu clearinner">
816 823 ## auto adjustable
817 824 <div class="sidebar__inner">
818 825 <div class="sidebar__bar">
819 826 <div class="pull-right">
820 827 <div class="btn-group">
821 828 <a class="btn tooltip toggle-wide-diff" href="#toggle-wide-diff" onclick="toggleWideDiff(this); return false" title="${h.tooltip(_('Toggle wide diff'))}">
822 829 <i class="icon-wide-mode"></i>
823 830 </a>
824 831 </div>
825 832 <div class="btn-group">
826 833
827 834 <a
828 835 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-active')} tooltip"
829 836 title="${h.tooltip(_('View diff as side by side'))}"
830 837 href="${h.current_route_path(request, diffmode='sideside')}">
831 838 <span>${_('Side by Side')}</span>
832 839 </a>
833 840
834 841 <a
835 842 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-active')} tooltip"
836 843 title="${h.tooltip(_('View diff as unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
837 844 <span>${_('Unified')}</span>
838 845 </a>
839 846
840 847 % if range_diff_on is True:
841 848 <a
842 849 title="${_('Turn off: Show the diff as commit range')}"
843 850 class="btn btn-primary"
844 851 href="${h.current_route_path(request, **{"range-diff":"0"})}">
845 852 <span>${_('Range Diff')}</span>
846 853 </a>
847 854 % elif range_diff_on is False:
848 855 <a
849 856 title="${_('Show the diff as commit range')}"
850 857 class="btn"
851 858 href="${h.current_route_path(request, **{"range-diff":"1"})}">
852 859 <span>${_('Range Diff')}</span>
853 860 </a>
854 861 % endif
855 862 </div>
856 863 <div class="btn-group">
857 864
858 865 <div class="pull-left">
859 866 ${h.hidden('diff_menu_{}'.format(diffset_container_id))}
860 867 </div>
861 868
862 869 </div>
863 870 </div>
864 871 <div class="pull-left">
865 872 <div class="btn-group">
866 873 <div class="pull-left">
867 874 ${h.hidden('file_filter_{}'.format(diffset_container_id))}
868 875 </div>
869 876
870 877 </div>
871 878 </div>
872 879 </div>
873 880 <div class="fpath-placeholder">
874 881 <i class="icon-file-text"></i>
875 882 <strong class="fpath-placeholder-text">
876 883 Context file:
877 884 </strong>
878 885 </div>
879 886 <div class="sidebar_inner_shadow"></div>
880 887 </div>
881 888 </div>
882 889
883 890 % if diffset:
884 891 %if diffset.limited_diff:
885 892 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files} %>
886 893 %else:
887 894 <% file_placeholder = h.literal(_ungettext('%(num)s file changed: <span class="op-added">%(linesadd)s inserted</span>, <span class="op-deleted">%(linesdel)s deleted</span>', '%(num)s files changed: <span class="op-added">%(linesadd)s inserted</span>, <span class="op-deleted">%(linesdel)s deleted</span>',
888 895 diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}) %>
889 896
890 897 %endif
891 898 ## case on range-diff placeholder needs to be updated
892 899 % if range_diff_on is True:
893 900 <% file_placeholder = _('Disabled on range diff') %>
894 901 % endif
895 902
896 903 <script type="text/javascript">
897 904 var feedFilesOptions = function (query, initialData) {
898 905 var data = {results: []};
899 906 var isQuery = typeof query.term !== 'undefined';
900 907
901 908 var section = _gettext('Changed files');
902 909 var filteredData = [];
903 910
904 911 //filter results
905 912 $.each(initialData.results, function (idx, value) {
906 913
907 914 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
908 915 filteredData.push({
909 916 'id': this.id,
910 917 'text': this.text,
911 918 "ops": this.ops,
912 919 })
913 920 }
914 921
915 922 });
916 923
917 924 data.results = filteredData;
918 925
919 926 query.callback(data);
920 927 };
921 928
922 929 var selectionFormatter = function(data, escapeMarkup) {
923 930 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
924 931 var tmpl = '<div><strong>{0}</strong></div>'.format(escapeMarkup(data['text']));
925 932 var pill = '<div class="pill-group" style="position: absolute; top:7px; right: 0">' +
926 933 '<span class="pill" op="added">{0}</span>' +
927 934 '<span class="pill" op="deleted">{1}</span>' +
928 935 '</div>'
929 936 ;
930 937 var added = data['ops']['added'];
931 938 if (added === 0) {
932 939 // don't show +0
933 940 added = 0;
934 941 } else {
935 942 added = '+' + added;
936 943 }
937 944
938 945 var deleted = -1*data['ops']['deleted'];
939 946
940 947 tmpl += pill.format(added, deleted);
941 948 return container.format(tmpl);
942 949 };
943 950 var formatFileResult = function(result, container, query, escapeMarkup) {
944 951 return selectionFormatter(result, escapeMarkup);
945 952 };
946 953
947 954 var formatSelection = function (data, container) {
948 955 return '${file_placeholder}'
949 956 };
950 957
951 958 if (window.preloadFileFilterData === undefined) {
952 959 window.preloadFileFilterData = {}
953 960 }
954 961
955 962 preloadFileFilterData["${diffset_container_id}"] = {
956 963 results: [
957 964 % for filediff in diffset.files:
958 965 {id:"a_${h.FID(filediff.raw_id, filediff.patch['filename'])}",
959 966 text:"${filediff.patch['filename']}",
960 967 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
961 968 % endfor
962 969 ]
963 970 };
964 971
965 972 var diffFileFilterId = "#file_filter_" + "${diffset_container_id}";
966 973 var diffFileFilter = $(diffFileFilterId).select2({
967 974 'dropdownAutoWidth': true,
968 975 'width': 'auto',
969 976
970 977 containerCssClass: "drop-menu",
971 978 dropdownCssClass: "drop-menu-dropdown",
972 979 data: preloadFileFilterData["${diffset_container_id}"],
973 980 query: function(query) {
974 981 feedFilesOptions(query, preloadFileFilterData["${diffset_container_id}"]);
975 982 },
976 983 initSelection: function(element, callback) {
977 984 callback({'init': true});
978 985 },
979 986 formatResult: formatFileResult,
980 987 formatSelection: formatSelection
981 988 });
982 989
983 990 % if range_diff_on is True:
984 991 diffFileFilter.select2("enable", false);
985 992 % endif
986 993
987 994 $(diffFileFilterId).on('select2-selecting', function (e) {
988 995 var idSelector = e.choice.id;
989 996
990 997 // expand the container if we quick-select the field
991 998 $('#'+idSelector).next().prop('checked', false);
992 999 // hide the mast as we later do preventDefault()
993 1000 $("#select2-drop-mask").click();
994 1001
995 1002 window.location.hash = '#'+idSelector;
996 1003 updateSticky();
997 1004
998 1005 e.preventDefault();
999 1006 });
1000 1007
1001 1008 </script>
1002 1009 % endif
1003 1010
1004 1011 <script type="text/javascript">
1005 1012 $(document).ready(function () {
1006 1013
1007 1014 var contextPrefix = _gettext('Context file: ');
1008 1015 ## sticky sidebar
1009 1016 var sidebarElement = document.getElementById('diff-file-sticky');
1010 1017 sidebar = new StickySidebar(sidebarElement, {
1011 1018 topSpacing: 0,
1012 1019 bottomSpacing: 0,
1013 1020 innerWrapperSelector: '.sidebar__inner'
1014 1021 });
1015 1022 sidebarElement.addEventListener('affixed.static.stickySidebar', function () {
1016 1023 // reset our file so it's not holding new value
1017 1024 $('.fpath-placeholder-text').html(contextPrefix + ' - ')
1018 1025 });
1019 1026
1020 1027 updateSticky = function () {
1021 1028 sidebar.updateSticky();
1022 1029 Waypoint.refreshAll();
1023 1030 };
1024 1031
1025 1032 var animateText = function (fPath, anchorId) {
1026 1033 fPath = Select2.util.escapeMarkup(fPath);
1027 1034 $('.fpath-placeholder-text').html(contextPrefix + '<a href="#a_' + anchorId + '">' + fPath + '</a>')
1028 1035 };
1029 1036
1030 1037 ## dynamic file waypoints
1031 1038 var setFPathInfo = function(fPath, anchorId){
1032 1039 animateText(fPath, anchorId)
1033 1040 };
1034 1041
1035 1042 var codeBlock = $('.filediff');
1036 1043
1037 1044 // forward waypoint
1038 1045 codeBlock.waypoint(
1039 1046 function(direction) {
1040 1047 if (direction === "down"){
1041 1048 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
1042 1049 }
1043 1050 }, {
1044 1051 offset: function () {
1045 1052 return 70;
1046 1053 },
1047 1054 context: '.fpath-placeholder'
1048 1055 }
1049 1056 );
1050 1057
1051 1058 // backward waypoint
1052 1059 codeBlock.waypoint(
1053 1060 function(direction) {
1054 1061 if (direction === "up"){
1055 1062 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
1056 1063 }
1057 1064 }, {
1058 1065 offset: function () {
1059 1066 return -this.element.clientHeight + 90;
1060 1067 },
1061 1068 context: '.fpath-placeholder'
1062 1069 }
1063 1070 );
1064 1071
1065 1072 toggleWideDiff = function (el) {
1066 1073 updateSticky();
1067 1074 var wide = Rhodecode.comments.toggleWideMode(this);
1068 1075 storeUserSessionAttr('rc_user_session_attr.wide_diff_mode', wide);
1069 1076 if (wide === true) {
1070 1077 $(el).addClass('btn-active');
1071 1078 } else {
1072 1079 $(el).removeClass('btn-active');
1073 1080 }
1074 1081 return null;
1075 1082 };
1076 1083
1077 1084 var preloadDiffMenuData = {
1078 1085 results: [
1079 1086
1080 1087 ## Whitespace change
1081 1088 % if request.GET.get('ignorews', '') == '1':
1082 1089 {
1083 1090 id: 2,
1084 1091 text: _gettext('Show whitespace changes'),
1085 1092 action: function () {},
1086 1093 url: "${h.current_route_path(request, ignorews=0)|n}"
1087 1094 },
1088 1095 % else:
1089 1096 {
1090 1097 id: 2,
1091 1098 text: _gettext('Hide whitespace changes'),
1092 1099 action: function () {},
1093 1100 url: "${h.current_route_path(request, ignorews=1)|n}"
1094 1101 },
1095 1102 % endif
1096 1103
1097 1104 ## FULL CONTEXT
1098 1105 % if request.GET.get('fullcontext', '') == '1':
1099 1106 {
1100 1107 id: 3,
1101 1108 text: _gettext('Hide full context diff'),
1102 1109 action: function () {},
1103 1110 url: "${h.current_route_path(request, fullcontext=0)|n}"
1104 1111 },
1105 1112 % else:
1106 1113 {
1107 1114 id: 3,
1108 1115 text: _gettext('Show full context diff'),
1109 1116 action: function () {},
1110 1117 url: "${h.current_route_path(request, fullcontext=1)|n}"
1111 1118 },
1112 1119 % endif
1113 1120
1114 1121 ]
1115 1122 };
1116 1123
1117 1124 var diffMenuId = "#diff_menu_" + "${diffset_container_id}";
1118 1125 $(diffMenuId).select2({
1119 1126 minimumResultsForSearch: -1,
1120 1127 containerCssClass: "drop-menu-no-width",
1121 1128 dropdownCssClass: "drop-menu-dropdown",
1122 1129 dropdownAutoWidth: true,
1123 1130 data: preloadDiffMenuData,
1124 1131 placeholder: "${_('...')}",
1125 1132 });
1126 1133 $(diffMenuId).on('select2-selecting', function (e) {
1127 1134 e.choice.action();
1128 1135 if (e.choice.url !== null) {
1129 1136 window.location = e.choice.url
1130 1137 }
1131 1138 });
1132 1139 toggleExpand = function (el, diffsetEl) {
1133 1140 var el = $(el);
1134 1141 if (el.hasClass('collapsed')) {
1135 1142 $('.filediff-collapse-state.collapse-{0}'.format(diffsetEl)).prop('checked', false);
1136 1143 el.removeClass('collapsed');
1137 1144 el.html(
1138 1145 '<i class="icon-minus-squared-alt icon-no-margin"></i>' +
1139 1146 _gettext('Collapse all files'));
1140 1147 }
1141 1148 else {
1142 1149 $('.filediff-collapse-state.collapse-{0}'.format(diffsetEl)).prop('checked', true);
1143 1150 el.addClass('collapsed');
1144 1151 el.html(
1145 1152 '<i class="icon-plus-squared-alt icon-no-margin"></i>' +
1146 1153 _gettext('Expand all files'));
1147 1154 }
1148 1155 updateSticky()
1149 1156 };
1150 1157
1151 1158 toggleCommitExpand = function (el) {
1152 1159 var $el = $(el);
1153 1160 var commits = $el.data('toggleCommitsCnt');
1154 1161 var collapseMsg = _ngettext('Collapse {0} commit', 'Collapse {0} commits', commits).format(commits);
1155 1162 var expandMsg = _ngettext('Expand {0} commit', 'Expand {0} commits', commits).format(commits);
1156 1163
1157 1164 if ($el.hasClass('collapsed')) {
1158 1165 $('.compare_select').show();
1159 1166 $('.compare_select_hidden').hide();
1160 1167
1161 1168 $el.removeClass('collapsed');
1162 1169 $el.html(
1163 1170 '<i class="icon-minus-squared-alt icon-no-margin"></i>' +
1164 1171 collapseMsg);
1165 1172 }
1166 1173 else {
1167 1174 $('.compare_select').hide();
1168 1175 $('.compare_select_hidden').show();
1169 1176 $el.addClass('collapsed');
1170 1177 $el.html(
1171 1178 '<i class="icon-plus-squared-alt icon-no-margin"></i>' +
1172 1179 expandMsg);
1173 1180 }
1174 1181 updateSticky();
1175 1182 };
1176 1183
1177 1184 // get stored diff mode and pre-enable it
1178 1185 if (templateContext.session_attrs.wide_diff_mode === "true") {
1179 1186 Rhodecode.comments.toggleWideMode(null);
1180 1187 $('.toggle-wide-diff').addClass('btn-active');
1181 1188 updateSticky();
1182 1189 }
1183 1190 });
1184 1191 </script>
1185 1192
1186 1193 </%def>
General Comments 0
You need to be logged in to leave comments. Login now