##// END OF EJS Templates
comments: show nicer tooltip about outdated comments.
marcink -
r4382:b8cc803a stable
parent child Browse files
Show More
@@ -1,1215 +1,1215 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 <%
257 257 file_comments = (get_inline_comments(inline_comments, filediff.patch['filename']) or {}).values()
258 258 total_file_comments = [_c for _c in h.itertools.chain.from_iterable(file_comments) if not _c.outdated]
259 259 %>
260 260 <div class="filediff-collapse-indicator icon-"></div>
261 261 <span class="pill-group pull-right" >
262 262 <span class="pill"><i class="icon-comment"></i> ${len(total_file_comments)}</span>
263 263 </span>
264 264 ${diff_ops(filediff)}
265 265
266 266 </label>
267 267
268 268 ${diff_menu(filediff, use_comments=use_comments)}
269 269 <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 '')}">
270 270
271 271 ## new/deleted/empty content case
272 272 % if not filediff.hunks:
273 273 ## Comment container, on "fakes" hunk that contains all data to render comments
274 274 ${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)}
275 275 % endif
276 276
277 277 %if filediff.limited_diff:
278 278 <tr class="cb-warning cb-collapser">
279 279 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
280 280 ${_('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>
281 281 </td>
282 282 </tr>
283 283 %else:
284 284 %if over_lines_changed_limit:
285 285 <tr class="cb-warning cb-collapser">
286 286 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
287 287 ${_('This diff has been collapsed as it changes many lines, (%i lines changed)' % lines_changed)}
288 288 <a href="#" class="cb-expand"
289 289 onclick="$(this).closest('table').removeClass('cb-collapsed'); updateSticky(); return false;">${_('Show them')}
290 290 </a>
291 291 <a href="#" class="cb-collapse"
292 292 onclick="$(this).closest('table').addClass('cb-collapsed'); updateSticky(); return false;">${_('Hide them')}
293 293 </a>
294 294 </td>
295 295 </tr>
296 296 %endif
297 297 %endif
298 298
299 299 % for hunk in filediff.hunks:
300 300 <tr class="cb-hunk">
301 301 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
302 302 ## TODO: dan: add ajax loading of more context here
303 303 ## <a href="#">
304 304 <i class="icon-more"></i>
305 305 ## </a>
306 306 </td>
307 307 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
308 308 @@
309 309 -${hunk.source_start},${hunk.source_length}
310 310 +${hunk.target_start},${hunk.target_length}
311 311 ${hunk.section_header}
312 312 </td>
313 313 </tr>
314 314 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
315 315 % endfor
316 316
317 317 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
318 318
319 319 ## outdated comments that do not fit into currently displayed lines
320 320 % for lineno, comments in unmatched_comments.items():
321 321
322 322 %if c.user_session_attrs["diffmode"] == 'unified':
323 323 % if loop.index == 0:
324 324 <tr class="cb-hunk">
325 325 <td colspan="3"></td>
326 326 <td>
327 327 <div>
328 328 ${_('Unmatched/outdated inline comments below')}
329 329 </div>
330 330 </td>
331 331 </tr>
332 332 % endif
333 333 <tr class="cb-line">
334 334 <td class="cb-data cb-context"></td>
335 335 <td class="cb-lineno cb-context"></td>
336 336 <td class="cb-lineno cb-context"></td>
337 337 <td class="cb-content cb-context">
338 338 ${inline_comments_container(comments, active_pattern_entries=active_pattern_entries)}
339 339 </td>
340 340 </tr>
341 341 %elif c.user_session_attrs["diffmode"] == 'sideside':
342 342 % if loop.index == 0:
343 343 <tr class="cb-comment-info">
344 344 <td colspan="2"></td>
345 345 <td class="cb-line">
346 346 <div>
347 347 ${_('Unmatched/outdated inline comments below')}
348 348 </div>
349 349 </td>
350 350 <td colspan="2"></td>
351 351 <td class="cb-line">
352 352 <div>
353 353 ${_('Unmatched/outdated comments below')}
354 354 </div>
355 355 </td>
356 356 </tr>
357 357 % endif
358 358 <tr class="cb-line">
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('o'):
363 363 ${inline_comments_container(comments, active_pattern_entries=active_pattern_entries)}
364 364 % endif
365 365 </td>
366 366
367 367 <td class="cb-data cb-context"></td>
368 368 <td class="cb-lineno cb-context"></td>
369 369 <td class="cb-content cb-context">
370 370 % if lineno.startswith('n'):
371 371 ${inline_comments_container(comments, active_pattern_entries=active_pattern_entries)}
372 372 % endif
373 373 </td>
374 374 </tr>
375 375 %endif
376 376
377 377 % endfor
378 378
379 379 </table>
380 380 </div>
381 381 %endfor
382 382
383 383 ## outdated comments that are made for a file that has been deleted
384 384 % for filename, comments_dict in (deleted_files_comments or {}).items():
385 385
386 386 <%
387 387 display_state = 'display: none'
388 388 open_comments_in_file = [x for x in comments_dict['comments'] if x.outdated is False]
389 389 if open_comments_in_file:
390 390 display_state = ''
391 391 fid = str(id(filename))
392 392 %>
393 393 <div class="filediffs filediff-outdated" style="${display_state}">
394 394 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state collapse-${diffset_container_id}" id="filediff-collapse-${id(filename)}" type="checkbox" onchange="updateSticky();">
395 395 <div class="filediff" data-f-path="${filename}" id="a_${h.FID(fid, filename)}">
396 396 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
397 397 <div class="filediff-collapse-indicator icon-"></div>
398 398
399 399 <span class="pill">
400 400 ## file was deleted
401 401 ${filename}
402 402 </span>
403 403 <span class="pill-group pull-left" >
404 404 ## file op, doesn't need translation
405 405 <span class="pill" op="removed">unresolved comments</span>
406 406 </span>
407 407 <a class="pill filediff-anchor" href="#a_${h.FID(fid, filename)}">ΒΆ</a>
408 408 <span class="pill-group pull-right">
409 409 <span class="pill" op="deleted">
410 410 % if comments_dict['stats'] >0:
411 411 -${comments_dict['stats']}
412 412 % else:
413 413 ${comments_dict['stats']}
414 414 % endif
415 415 </span>
416 416 </span>
417 417 </label>
418 418
419 419 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
420 420 <tr>
421 421 % if c.user_session_attrs["diffmode"] == 'unified':
422 422 <td></td>
423 423 %endif
424 424
425 425 <td></td>
426 426 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=5')}>
427 427 <strong>${_('This file was removed from diff during updates to this pull-request.')}</strong><br/>
428 428 ${_('There are still outdated/unresolved comments attached to it.')}
429 429 </td>
430 430 </tr>
431 431 %if c.user_session_attrs["diffmode"] == 'unified':
432 432 <tr class="cb-line">
433 433 <td class="cb-data cb-context"></td>
434 434 <td class="cb-lineno cb-context"></td>
435 435 <td class="cb-lineno cb-context"></td>
436 436 <td class="cb-content cb-context">
437 437 ${inline_comments_container(comments_dict['comments'], active_pattern_entries=active_pattern_entries)}
438 438 </td>
439 439 </tr>
440 440 %elif c.user_session_attrs["diffmode"] == 'sideside':
441 441 <tr class="cb-line">
442 442 <td class="cb-data cb-context"></td>
443 443 <td class="cb-lineno cb-context"></td>
444 444 <td class="cb-content cb-context"></td>
445 445
446 446 <td class="cb-data cb-context"></td>
447 447 <td class="cb-lineno cb-context"></td>
448 448 <td class="cb-content cb-context">
449 449 ${inline_comments_container(comments_dict['comments'], active_pattern_entries=active_pattern_entries)}
450 450 </td>
451 451 </tr>
452 452 %endif
453 453 </table>
454 454 </div>
455 455 </div>
456 456 % endfor
457 457
458 458 </div>
459 459 </div>
460 460 </%def>
461 461
462 462 <%def name="diff_ops(filediff)">
463 463 <%
464 464 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
465 465 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
466 466 %>
467 467 <span class="pill">
468 468 <i class="icon-file-text"></i>
469 469 %if filediff.source_file_path and filediff.target_file_path:
470 470 %if filediff.source_file_path != filediff.target_file_path:
471 471 ## file was renamed, or copied
472 472 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
473 473 ${filediff.target_file_path} β¬… <del>${filediff.source_file_path}</del>
474 474 <% final_path = filediff.target_file_path %>
475 475 %elif COPIED_FILENODE in filediff.patch['stats']['ops']:
476 476 ${filediff.target_file_path} β¬… ${filediff.source_file_path}
477 477 <% final_path = filediff.target_file_path %>
478 478 %endif
479 479 %else:
480 480 ## file was modified
481 481 ${filediff.source_file_path}
482 482 <% final_path = filediff.source_file_path %>
483 483 %endif
484 484 %else:
485 485 %if filediff.source_file_path:
486 486 ## file was deleted
487 487 ${filediff.source_file_path}
488 488 <% final_path = filediff.source_file_path %>
489 489 %else:
490 490 ## file was added
491 491 ${filediff.target_file_path}
492 492 <% final_path = filediff.target_file_path %>
493 493 %endif
494 494 %endif
495 495 <i style="color: #aaa" class="on-hover-icon icon-clipboard clipboard-action" data-clipboard-text="${final_path}" title="${_('Copy file path')}" onclick="return false;"></i>
496 496 </span>
497 497 ## anchor link
498 498 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filediff.patch['filename'])}">ΒΆ</a>
499 499
500 500 <span class="pill-group pull-right">
501 501
502 502 ## ops pills
503 503 %if filediff.limited_diff:
504 504 <span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
505 505 %endif
506 506
507 507 %if NEW_FILENODE in filediff.patch['stats']['ops']:
508 508 <span class="pill" op="created">created</span>
509 509 %if filediff['target_mode'].startswith('120'):
510 510 <span class="pill" op="symlink">symlink</span>
511 511 %else:
512 512 <span class="pill" op="mode">${nice_mode(filediff['target_mode'])}</span>
513 513 %endif
514 514 %endif
515 515
516 516 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
517 517 <span class="pill" op="renamed">renamed</span>
518 518 %endif
519 519
520 520 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
521 521 <span class="pill" op="copied">copied</span>
522 522 %endif
523 523
524 524 %if DEL_FILENODE in filediff.patch['stats']['ops']:
525 525 <span class="pill" op="removed">removed</span>
526 526 %endif
527 527
528 528 %if CHMOD_FILENODE in filediff.patch['stats']['ops']:
529 529 <span class="pill" op="mode">
530 530 ${nice_mode(filediff['source_mode'])} ➑ ${nice_mode(filediff['target_mode'])}
531 531 </span>
532 532 %endif
533 533
534 534 %if BIN_FILENODE in filediff.patch['stats']['ops']:
535 535 <span class="pill" op="binary">binary</span>
536 536 %if MOD_FILENODE in filediff.patch['stats']['ops']:
537 537 <span class="pill" op="modified">modified</span>
538 538 %endif
539 539 %endif
540 540
541 541 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
542 542 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
543 543
544 544 </span>
545 545
546 546 </%def>
547 547
548 548 <%def name="nice_mode(filemode)">
549 549 ${(filemode.startswith('100') and filemode[3:] or filemode)}
550 550 </%def>
551 551
552 552 <%def name="diff_menu(filediff, use_comments=False)">
553 553 <div class="filediff-menu">
554 554
555 555 %if filediff.diffset.source_ref:
556 556
557 557 ## FILE BEFORE CHANGES
558 558 %if filediff.operation in ['D', 'M']:
559 559 <a
560 560 class="tooltip"
561 561 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)}"
562 562 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
563 563 >
564 564 ${_('Show file before')}
565 565 </a> |
566 566 %else:
567 567 <span
568 568 class="tooltip"
569 569 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
570 570 >
571 571 ${_('Show file before')}
572 572 </span> |
573 573 %endif
574 574
575 575 ## FILE AFTER CHANGES
576 576 %if filediff.operation in ['A', 'M']:
577 577 <a
578 578 class="tooltip"
579 579 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)}"
580 580 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
581 581 >
582 582 ${_('Show file after')}
583 583 </a>
584 584 %else:
585 585 <span
586 586 class="tooltip"
587 587 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
588 588 >
589 589 ${_('Show file after')}
590 590 </span>
591 591 %endif
592 592
593 593 % if use_comments:
594 594 |
595 595 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
596 596 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
597 597 </a>
598 598 % endif
599 599
600 600 %endif
601 601
602 602 </div>
603 603 </%def>
604 604
605 605
606 606 <%def name="inline_comments_container(comments, active_pattern_entries=None)">
607 607
608 608 <div class="inline-comments">
609 609 %for comment in comments:
610 610 ${commentblock.comment_block(comment, inline=True, active_pattern_entries=active_pattern_entries)}
611 611 %endfor
612 612 % if comments and comments[-1].outdated:
613 613 <span class="btn btn-secondary cb-comment-add-button comment-outdated}" style="display: none;}">
614 614 ${_('Add another comment')}
615 615 </span>
616 616 % else:
617 617 <span onclick="return Rhodecode.comments.createComment(this)" class="btn btn-secondary cb-comment-add-button">
618 618 ${_('Add another comment')}
619 619 </span>
620 620 % endif
621 621
622 622 </div>
623 623 </%def>
624 624
625 625 <%!
626 626
627 627 def get_inline_comments(comments, filename):
628 628 if hasattr(filename, 'unicode_path'):
629 629 filename = filename.unicode_path
630 630
631 631 if not isinstance(filename, (unicode, str)):
632 632 return None
633 633
634 634 if comments and filename in comments:
635 635 return comments[filename]
636 636
637 637 return None
638 638
639 639 def get_comments_for(diff_type, comments, filename, line_version, line_number):
640 640 if hasattr(filename, 'unicode_path'):
641 641 filename = filename.unicode_path
642 642
643 643 if not isinstance(filename, (unicode, str)):
644 644 return None
645 645
646 646 file_comments = get_inline_comments(comments, filename)
647 647 if file_comments is None:
648 648 return None
649 649
650 650 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
651 651 if line_key in file_comments:
652 652 data = file_comments.pop(line_key)
653 653 return data
654 654 %>
655 655
656 656 <%def name="render_hunk_lines_sideside(filediff, hunk, use_comments=False, inline_comments=None, active_pattern_entries=None)">
657 657 %for i, line in enumerate(hunk.sideside):
658 658 <%
659 659 old_line_anchor, new_line_anchor = None, None
660 660
661 661 if line.original.lineno:
662 662 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, line.original.lineno, 'o')
663 663 if line.modified.lineno:
664 664 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, line.modified.lineno, 'n')
665 665 %>
666 666
667 667 <tr class="cb-line">
668 668 <td class="cb-data ${action_class(line.original.action)}"
669 669 data-line-no="${line.original.lineno}"
670 670 >
671 671 <div>
672 672
673 673 <% line_old_comments = None %>
674 674 %if line.original.get_comment_args:
675 675 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
676 676 %endif
677 677 %if line_old_comments:
678 678 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
679 679 % if has_outdated:
680 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
680 <i class="tooltip" title="${_('comments including outdated, click to show them')}:${len(line_old_comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
681 681 % else:
682 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
682 <i class="tooltip" title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
683 683 % endif
684 684 %endif
685 685 </div>
686 686 </td>
687 687 <td class="cb-lineno ${action_class(line.original.action)}"
688 688 data-line-no="${line.original.lineno}"
689 689 %if old_line_anchor:
690 690 id="${old_line_anchor}"
691 691 %endif
692 692 >
693 693 %if line.original.lineno:
694 694 <a name="${old_line_anchor}" href="#${old_line_anchor}">${line.original.lineno}</a>
695 695 %endif
696 696 </td>
697 697 <td class="cb-content ${action_class(line.original.action)}"
698 698 data-line-no="o${line.original.lineno}"
699 699 >
700 700 %if use_comments and line.original.lineno:
701 701 ${render_add_comment_button()}
702 702 %endif
703 703 <span class="cb-code"><span class="cb-action ${action_class(line.original.action)}"></span>${line.original.content or '' | n}</span>
704 704
705 705 %if use_comments and line.original.lineno and line_old_comments:
706 706 ${inline_comments_container(line_old_comments, active_pattern_entries=active_pattern_entries)}
707 707 %endif
708 708
709 709 </td>
710 710 <td class="cb-data ${action_class(line.modified.action)}"
711 711 data-line-no="${line.modified.lineno}"
712 712 >
713 713 <div>
714 714
715 715 %if line.modified.get_comment_args:
716 716 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
717 717 %else:
718 718 <% line_new_comments = None%>
719 719 %endif
720 720 %if line_new_comments:
721 721 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
722 722 % if has_outdated:
723 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
723 <i class="tooltip" title="${_('comments including outdated, click to show them')}:${len(line_new_comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
724 724 % else:
725 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
725 <i class="tooltip" title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
726 726 % endif
727 727 %endif
728 728 </div>
729 729 </td>
730 730 <td class="cb-lineno ${action_class(line.modified.action)}"
731 731 data-line-no="${line.modified.lineno}"
732 732 %if new_line_anchor:
733 733 id="${new_line_anchor}"
734 734 %endif
735 735 >
736 736 %if line.modified.lineno:
737 737 <a name="${new_line_anchor}" href="#${new_line_anchor}">${line.modified.lineno}</a>
738 738 %endif
739 739 </td>
740 740 <td class="cb-content ${action_class(line.modified.action)}"
741 741 data-line-no="n${line.modified.lineno}"
742 742 >
743 743 %if use_comments and line.modified.lineno:
744 744 ${render_add_comment_button()}
745 745 %endif
746 746 <span class="cb-code"><span class="cb-action ${action_class(line.modified.action)}"></span>${line.modified.content or '' | n}</span>
747 747 %if use_comments and line.modified.lineno and line_new_comments:
748 748 ${inline_comments_container(line_new_comments, active_pattern_entries=active_pattern_entries)}
749 749 %endif
750 750 </td>
751 751 </tr>
752 752 %endfor
753 753 </%def>
754 754
755 755
756 756 <%def name="render_hunk_lines_unified(filediff, hunk, use_comments=False, inline_comments=None, active_pattern_entries=None)">
757 757 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
758 758
759 759 <%
760 760 old_line_anchor, new_line_anchor = None, None
761 761 if old_line_no:
762 762 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, old_line_no, 'o')
763 763 if new_line_no:
764 764 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, new_line_no, 'n')
765 765 %>
766 766 <tr class="cb-line">
767 767 <td class="cb-data ${action_class(action)}">
768 768 <div>
769 769
770 770 %if comments_args:
771 771 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
772 772 %else:
773 773 <% comments = None %>
774 774 %endif
775 775
776 776 % if comments:
777 777 <% has_outdated = any([x.outdated for x in comments]) %>
778 778 % if has_outdated:
779 <i title="${_('comments including outdated')}:${len(comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
779 <i class="tooltip" title="${_('comments including outdated, click to show them')}:${len(comments)}" class="icon-comment-toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
780 780 % else:
781 <i title="${_('comments')}: ${len(comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
781 <i class="tooltip" title="${_('comments')}: ${len(comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
782 782 % endif
783 783 % endif
784 784 </div>
785 785 </td>
786 786 <td class="cb-lineno ${action_class(action)}"
787 787 data-line-no="${old_line_no}"
788 788 %if old_line_anchor:
789 789 id="${old_line_anchor}"
790 790 %endif
791 791 >
792 792 %if old_line_anchor:
793 793 <a name="${old_line_anchor}" href="#${old_line_anchor}">${old_line_no}</a>
794 794 %endif
795 795 </td>
796 796 <td class="cb-lineno ${action_class(action)}"
797 797 data-line-no="${new_line_no}"
798 798 %if new_line_anchor:
799 799 id="${new_line_anchor}"
800 800 %endif
801 801 >
802 802 %if new_line_anchor:
803 803 <a name="${new_line_anchor}" href="#${new_line_anchor}">${new_line_no}</a>
804 804 %endif
805 805 </td>
806 806 <td class="cb-content ${action_class(action)}"
807 807 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
808 808 >
809 809 %if use_comments:
810 810 ${render_add_comment_button()}
811 811 %endif
812 812 <span class="cb-code"><span class="cb-action ${action_class(action)}"></span> ${content or '' | n}</span>
813 813 %if use_comments and comments:
814 814 ${inline_comments_container(comments, active_pattern_entries=active_pattern_entries)}
815 815 %endif
816 816 </td>
817 817 </tr>
818 818 %endfor
819 819 </%def>
820 820
821 821
822 822 <%def name="render_hunk_lines(filediff, diff_mode, hunk, use_comments, inline_comments, active_pattern_entries)">
823 823 % if diff_mode == 'unified':
824 824 ${render_hunk_lines_unified(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
825 825 % elif diff_mode == 'sideside':
826 826 ${render_hunk_lines_sideside(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments, active_pattern_entries=active_pattern_entries)}
827 827 % else:
828 828 <tr class="cb-line">
829 829 <td>unknown diff mode</td>
830 830 </tr>
831 831 % endif
832 832 </%def>file changes
833 833
834 834
835 835 <%def name="render_add_comment_button()">
836 836 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
837 837 <span><i class="icon-comment"></i></span>
838 838 </button>
839 839 </%def>
840 840
841 841 <%def name="render_diffset_menu(diffset, range_diff_on=None)">
842 842 <% diffset_container_id = h.md5(diffset.target_ref) %>
843 843
844 844 <div id="diff-file-sticky" class="diffset-menu clearinner">
845 845 ## auto adjustable
846 846 <div class="sidebar__inner">
847 847 <div class="sidebar__bar">
848 848 <div class="pull-right">
849 849 <div class="btn-group">
850 850 <a class="btn tooltip toggle-wide-diff" href="#toggle-wide-diff" onclick="toggleWideDiff(this); return false" title="${h.tooltip(_('Toggle wide diff'))}">
851 851 <i class="icon-wide-mode"></i>
852 852 </a>
853 853 </div>
854 854 <div class="btn-group">
855 855
856 856 <a
857 857 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-active')} tooltip"
858 858 title="${h.tooltip(_('View diff as side by side'))}"
859 859 href="${h.current_route_path(request, diffmode='sideside')}">
860 860 <span>${_('Side by Side')}</span>
861 861 </a>
862 862
863 863 <a
864 864 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-active')} tooltip"
865 865 title="${h.tooltip(_('View diff as unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
866 866 <span>${_('Unified')}</span>
867 867 </a>
868 868
869 869 % if range_diff_on is True:
870 870 <a
871 871 title="${_('Turn off: Show the diff as commit range')}"
872 872 class="btn btn-primary"
873 873 href="${h.current_route_path(request, **{"range-diff":"0"})}">
874 874 <span>${_('Range Diff')}</span>
875 875 </a>
876 876 % elif range_diff_on is False:
877 877 <a
878 878 title="${_('Show the diff as commit range')}"
879 879 class="btn"
880 880 href="${h.current_route_path(request, **{"range-diff":"1"})}">
881 881 <span>${_('Range Diff')}</span>
882 882 </a>
883 883 % endif
884 884 </div>
885 885 <div class="btn-group">
886 886
887 887 <div class="pull-left">
888 888 ${h.hidden('diff_menu_{}'.format(diffset_container_id))}
889 889 </div>
890 890
891 891 </div>
892 892 </div>
893 893 <div class="pull-left">
894 894 <div class="btn-group">
895 895 <div class="pull-left">
896 896 ${h.hidden('file_filter_{}'.format(diffset_container_id))}
897 897 </div>
898 898
899 899 </div>
900 900 </div>
901 901 </div>
902 902 <div class="fpath-placeholder">
903 903 <i class="icon-file-text"></i>
904 904 <strong class="fpath-placeholder-text">
905 905 Context file:
906 906 </strong>
907 907 </div>
908 908 <div class="sidebar_inner_shadow"></div>
909 909 </div>
910 910 </div>
911 911
912 912 % if diffset:
913 913 %if diffset.limited_diff:
914 914 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files} %>
915 915 %else:
916 916 <% 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>',
917 917 diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}) %>
918 918
919 919 %endif
920 920 ## case on range-diff placeholder needs to be updated
921 921 % if range_diff_on is True:
922 922 <% file_placeholder = _('Disabled on range diff') %>
923 923 % endif
924 924
925 925 <script type="text/javascript">
926 926 var feedFilesOptions = function (query, initialData) {
927 927 var data = {results: []};
928 928 var isQuery = typeof query.term !== 'undefined';
929 929
930 930 var section = _gettext('Changed files');
931 931 var filteredData = [];
932 932
933 933 //filter results
934 934 $.each(initialData.results, function (idx, value) {
935 935
936 936 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
937 937 filteredData.push({
938 938 'id': this.id,
939 939 'text': this.text,
940 940 "ops": this.ops,
941 941 })
942 942 }
943 943
944 944 });
945 945
946 946 data.results = filteredData;
947 947
948 948 query.callback(data);
949 949 };
950 950
951 951 var selectionFormatter = function(data, escapeMarkup) {
952 952 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
953 953 var tmpl = '<div><strong>{0}</strong></div>'.format(escapeMarkup(data['text']));
954 954 var pill = '<div class="pill-group" style="position: absolute; top:7px; right: 0">' +
955 955 '<span class="pill" op="added">{0}</span>' +
956 956 '<span class="pill" op="deleted">{1}</span>' +
957 957 '</div>'
958 958 ;
959 959 var added = data['ops']['added'];
960 960 if (added === 0) {
961 961 // don't show +0
962 962 added = 0;
963 963 } else {
964 964 added = '+' + added;
965 965 }
966 966
967 967 var deleted = -1*data['ops']['deleted'];
968 968
969 969 tmpl += pill.format(added, deleted);
970 970 return container.format(tmpl);
971 971 };
972 972 var formatFileResult = function(result, container, query, escapeMarkup) {
973 973 return selectionFormatter(result, escapeMarkup);
974 974 };
975 975
976 976 var formatSelection = function (data, container) {
977 977 return '${file_placeholder}'
978 978 };
979 979
980 980 if (window.preloadFileFilterData === undefined) {
981 981 window.preloadFileFilterData = {}
982 982 }
983 983
984 984 preloadFileFilterData["${diffset_container_id}"] = {
985 985 results: [
986 986 % for filediff in diffset.files:
987 987 {id:"a_${h.FID(filediff.raw_id, filediff.patch['filename'])}",
988 988 text:"${filediff.patch['filename']}",
989 989 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
990 990 % endfor
991 991 ]
992 992 };
993 993
994 994 var diffFileFilterId = "#file_filter_" + "${diffset_container_id}";
995 995 var diffFileFilter = $(diffFileFilterId).select2({
996 996 'dropdownAutoWidth': true,
997 997 'width': 'auto',
998 998
999 999 containerCssClass: "drop-menu",
1000 1000 dropdownCssClass: "drop-menu-dropdown",
1001 1001 data: preloadFileFilterData["${diffset_container_id}"],
1002 1002 query: function(query) {
1003 1003 feedFilesOptions(query, preloadFileFilterData["${diffset_container_id}"]);
1004 1004 },
1005 1005 initSelection: function(element, callback) {
1006 1006 callback({'init': true});
1007 1007 },
1008 1008 formatResult: formatFileResult,
1009 1009 formatSelection: formatSelection
1010 1010 });
1011 1011
1012 1012 % if range_diff_on is True:
1013 1013 diffFileFilter.select2("enable", false);
1014 1014 % endif
1015 1015
1016 1016 $(diffFileFilterId).on('select2-selecting', function (e) {
1017 1017 var idSelector = e.choice.id;
1018 1018
1019 1019 // expand the container if we quick-select the field
1020 1020 $('#'+idSelector).next().prop('checked', false);
1021 1021 // hide the mast as we later do preventDefault()
1022 1022 $("#select2-drop-mask").click();
1023 1023
1024 1024 window.location.hash = '#'+idSelector;
1025 1025 updateSticky();
1026 1026
1027 1027 e.preventDefault();
1028 1028 });
1029 1029
1030 1030 </script>
1031 1031 % endif
1032 1032
1033 1033 <script type="text/javascript">
1034 1034 $(document).ready(function () {
1035 1035
1036 1036 var contextPrefix = _gettext('Context file: ');
1037 1037 ## sticky sidebar
1038 1038 var sidebarElement = document.getElementById('diff-file-sticky');
1039 1039 sidebar = new StickySidebar(sidebarElement, {
1040 1040 topSpacing: 0,
1041 1041 bottomSpacing: 0,
1042 1042 innerWrapperSelector: '.sidebar__inner'
1043 1043 });
1044 1044 sidebarElement.addEventListener('affixed.static.stickySidebar', function () {
1045 1045 // reset our file so it's not holding new value
1046 1046 $('.fpath-placeholder-text').html(contextPrefix + ' - ')
1047 1047 });
1048 1048
1049 1049 updateSticky = function () {
1050 1050 sidebar.updateSticky();
1051 1051 Waypoint.refreshAll();
1052 1052 };
1053 1053
1054 1054 var animateText = function (fPath, anchorId) {
1055 1055 fPath = Select2.util.escapeMarkup(fPath);
1056 1056 $('.fpath-placeholder-text').html(contextPrefix + '<a href="#a_' + anchorId + '">' + fPath + '</a>')
1057 1057 };
1058 1058
1059 1059 ## dynamic file waypoints
1060 1060 var setFPathInfo = function(fPath, anchorId){
1061 1061 animateText(fPath, anchorId)
1062 1062 };
1063 1063
1064 1064 var codeBlock = $('.filediff');
1065 1065
1066 1066 // forward waypoint
1067 1067 codeBlock.waypoint(
1068 1068 function(direction) {
1069 1069 if (direction === "down"){
1070 1070 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
1071 1071 }
1072 1072 }, {
1073 1073 offset: function () {
1074 1074 return 70;
1075 1075 },
1076 1076 context: '.fpath-placeholder'
1077 1077 }
1078 1078 );
1079 1079
1080 1080 // backward waypoint
1081 1081 codeBlock.waypoint(
1082 1082 function(direction) {
1083 1083 if (direction === "up"){
1084 1084 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
1085 1085 }
1086 1086 }, {
1087 1087 offset: function () {
1088 1088 return -this.element.clientHeight + 90;
1089 1089 },
1090 1090 context: '.fpath-placeholder'
1091 1091 }
1092 1092 );
1093 1093
1094 1094 toggleWideDiff = function (el) {
1095 1095 updateSticky();
1096 1096 var wide = Rhodecode.comments.toggleWideMode(this);
1097 1097 storeUserSessionAttr('rc_user_session_attr.wide_diff_mode', wide);
1098 1098 if (wide === true) {
1099 1099 $(el).addClass('btn-active');
1100 1100 } else {
1101 1101 $(el).removeClass('btn-active');
1102 1102 }
1103 1103 return null;
1104 1104 };
1105 1105
1106 1106 var preloadDiffMenuData = {
1107 1107 results: [
1108 1108
1109 1109 ## Whitespace change
1110 1110 % if request.GET.get('ignorews', '') == '1':
1111 1111 {
1112 1112 id: 2,
1113 1113 text: _gettext('Show whitespace changes'),
1114 1114 action: function () {},
1115 1115 url: "${h.current_route_path(request, ignorews=0)|n}"
1116 1116 },
1117 1117 % else:
1118 1118 {
1119 1119 id: 2,
1120 1120 text: _gettext('Hide whitespace changes'),
1121 1121 action: function () {},
1122 1122 url: "${h.current_route_path(request, ignorews=1)|n}"
1123 1123 },
1124 1124 % endif
1125 1125
1126 1126 ## FULL CONTEXT
1127 1127 % if request.GET.get('fullcontext', '') == '1':
1128 1128 {
1129 1129 id: 3,
1130 1130 text: _gettext('Hide full context diff'),
1131 1131 action: function () {},
1132 1132 url: "${h.current_route_path(request, fullcontext=0)|n}"
1133 1133 },
1134 1134 % else:
1135 1135 {
1136 1136 id: 3,
1137 1137 text: _gettext('Show full context diff'),
1138 1138 action: function () {},
1139 1139 url: "${h.current_route_path(request, fullcontext=1)|n}"
1140 1140 },
1141 1141 % endif
1142 1142
1143 1143 ]
1144 1144 };
1145 1145
1146 1146 var diffMenuId = "#diff_menu_" + "${diffset_container_id}";
1147 1147 $(diffMenuId).select2({
1148 1148 minimumResultsForSearch: -1,
1149 1149 containerCssClass: "drop-menu-no-width",
1150 1150 dropdownCssClass: "drop-menu-dropdown",
1151 1151 dropdownAutoWidth: true,
1152 1152 data: preloadDiffMenuData,
1153 1153 placeholder: "${_('...')}",
1154 1154 });
1155 1155 $(diffMenuId).on('select2-selecting', function (e) {
1156 1156 e.choice.action();
1157 1157 if (e.choice.url !== null) {
1158 1158 window.location = e.choice.url
1159 1159 }
1160 1160 });
1161 1161 toggleExpand = function (el, diffsetEl) {
1162 1162 var el = $(el);
1163 1163 if (el.hasClass('collapsed')) {
1164 1164 $('.filediff-collapse-state.collapse-{0}'.format(diffsetEl)).prop('checked', false);
1165 1165 el.removeClass('collapsed');
1166 1166 el.html(
1167 1167 '<i class="icon-minus-squared-alt icon-no-margin"></i>' +
1168 1168 _gettext('Collapse all files'));
1169 1169 }
1170 1170 else {
1171 1171 $('.filediff-collapse-state.collapse-{0}'.format(diffsetEl)).prop('checked', true);
1172 1172 el.addClass('collapsed');
1173 1173 el.html(
1174 1174 '<i class="icon-plus-squared-alt icon-no-margin"></i>' +
1175 1175 _gettext('Expand all files'));
1176 1176 }
1177 1177 updateSticky()
1178 1178 };
1179 1179
1180 1180 toggleCommitExpand = function (el) {
1181 1181 var $el = $(el);
1182 1182 var commits = $el.data('toggleCommitsCnt');
1183 1183 var collapseMsg = _ngettext('Collapse {0} commit', 'Collapse {0} commits', commits).format(commits);
1184 1184 var expandMsg = _ngettext('Expand {0} commit', 'Expand {0} commits', commits).format(commits);
1185 1185
1186 1186 if ($el.hasClass('collapsed')) {
1187 1187 $('.compare_select').show();
1188 1188 $('.compare_select_hidden').hide();
1189 1189
1190 1190 $el.removeClass('collapsed');
1191 1191 $el.html(
1192 1192 '<i class="icon-minus-squared-alt icon-no-margin"></i>' +
1193 1193 collapseMsg);
1194 1194 }
1195 1195 else {
1196 1196 $('.compare_select').hide();
1197 1197 $('.compare_select_hidden').show();
1198 1198 $el.addClass('collapsed');
1199 1199 $el.html(
1200 1200 '<i class="icon-plus-squared-alt icon-no-margin"></i>' +
1201 1201 expandMsg);
1202 1202 }
1203 1203 updateSticky();
1204 1204 };
1205 1205
1206 1206 // get stored diff mode and pre-enable it
1207 1207 if (templateContext.session_attrs.wide_diff_mode === "true") {
1208 1208 Rhodecode.comments.toggleWideMode(null);
1209 1209 $('.toggle-wide-diff').addClass('btn-active');
1210 1210 updateSticky();
1211 1211 }
1212 1212 });
1213 1213 </script>
1214 1214
1215 1215 </%def>
General Comments 0
You need to be logged in to leave comments. Login now